![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /opt/mattermost/client/ |
Upload File : |
{"version":3,"file":"226.0e4a288ca7c7b45acf03.js","mappings":"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B,EAChBxB,YAAa,CACT,CAACnuH,KAAM,0BACP,CAACA,KAAM,wBACP,CAACA,KAAM,6BACP,CAACA,KAAM,4BACP,CAACA,KAAM,2BACP,CAACA,KAAM,oBACP,CAACA,KAAM,wCACP,CAACA,KAAM,iCACP,CAACA,KAAM,6BACP,CAACA,KAAM,uBACP,CAACA,KAAM,+BACP,CAACA,KAAM,sCACP,CAACA,KAAM,2BAGf,CACIA,KAAM,OACN2vH,gBAAgB,EAChBxB,YAAa,CACT,CAACnuH,KAAM,sBACP,CAACA,KAAM,qBACP,CAACA,KAAM,wBACP,CAACA,KAAM,sBACP,CAACA,KAAM,4BACP,CAACA,KAAM,cACP,CAACA,KAAM,cACP,CAACA,KAAM,mCACP,CAACA,KAAM,qBACP,CAACA,KAAM,kBAGf,CACIA,KAAM,iBACN2vH,gBAAgB,EAChBxB,YAAa,CACT,CAACnuH,KAAM,yBACP,CAACA,KAAM,wBACP,CAACA,KAAM,2BACP,CAACA,KAAM,sBACP,CAACA,KAAM,uBACP,CAACA,KAAM,uBACP,CAACA,KAAM,yBACP,CAACA,KAAM,iCAGf,CACIA,KAAM,UACN2vH,gBAAgB,EAChBxB,YAAa,IAEjB,CACInuH,KAAM,eACN2vH,gBAAgB,EAChBxB,YAAa,CACT,CAACnuH,KAAM,uCACP,CAACA,KAAM,6BACP,CAACA,KAAM,oBACP,CAACA,KAAM,uBAGf,CACIA,KAAM,aACN2vH,gBAAgB,EAChBxB,YAAa,CACT,CAACnuH,KAAM,oCACP,CAACA,KAAM,gCACP,CAACA,KAAM,oCACP,CAACA,KAAM,wCAGf,CACIA,KAAM,eACN2vH,gBAAgB,EAChBxB,YAAa,CACT,CAACnuH,KAAM,yBACP,CAACA,KAAM,8BACP,CAACA,KAAM,yBAKbqwH,GAA6D,CAC/D,CAACj0H,EAAAA,GAAUk0H,iCAAkC,CACzC9F,iBAAiB,EACjBgC,gBAAgB,IAIlB+D,IAAoBC,EAAAA,GAAAA,KAAe/xG,GAC9BA,EAAYxI,QAAO,CAACi5G,EAAgBnzG,KACvCmzG,EAAenzG,IAAc,EACtBmzG,IACR,CAAC,KA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","sources":["webpack://mattermost-webapp/./src/actions/views/admin.ts","webpack://mattermost-webapp/./src/components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx","webpack://mattermost-webapp/./src/components/add_groups_to_channel_modal/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/constants/permissions_sysconsole.ts","webpack://mattermost-webapp/./src/components/admin_console/set_by_env.tsx","webpack://mattermost-webapp/./src/components/admin_console/setting_set.tsx","webpack://mattermost-webapp/./src/components/admin_console/boolean_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/color_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/dropdown_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/file_upload_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/generated_setting.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/jobs.ts","webpack://mattermost-webapp/./src/components/admin_console/jobs/job_cancel_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/jobs/job_download_link.tsx","webpack://mattermost-webapp/./src/components/admin_console/jobs/job_finish_at.tsx","webpack://mattermost-webapp/./src/components/admin_console/jobs/job_run_length.tsx","webpack://mattermost-webapp/./src/components/admin_console/jobs/job_status.tsx","webpack://mattermost-webapp/./src/components/admin_console/jobs/table.tsx","webpack://mattermost-webapp/./src/components/admin_console/jobs/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/multiselect_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/radio_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/remove_file_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/request_button/request_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/schema_text.tsx","webpack://mattermost-webapp/./src/components/admin_console/settings_group.tsx","webpack://mattermost-webapp/./src/components/admin_console/text_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/user_autocomplete_setting/user_autocomplete_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/user_autocomplete_setting/index.tsx","webpack://mattermost-webapp/./src/components/widgets/admin_console/admin_header.tsx","webpack://mattermost-webapp/./src/utils/policy_roles_adapter.ts","webpack://mattermost-webapp/./src/components/admin_console/schema_admin_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/custom_plugin_settings/custom_plugin_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/custom_plugin_settings/enable_plugin_setting.ts","webpack://mattermost-webapp/./src/components/admin_console/custom_plugin_settings/index.ts","webpack://mattermost-webapp/./src/components/admin_console/old_admin_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/plugin_management/plugin_management.tsx","webpack://mattermost-webapp/./src/components/admin_console/plugin_management/index.ts","webpack://mattermost-webapp/./src/components/analytics/statistic_count.tsx","webpack://mattermost-webapp/./src/components/analytics/activated_users_card/title.tsx","webpack://mattermost-webapp/./src/components/analytics/activated_users_card/index.tsx","webpack://mattermost-webapp/./src/components/analytics/doughnut_chart.tsx","webpack://mattermost-webapp/./src/components/analytics/format.tsx","webpack://mattermost-webapp/./src/components/analytics/line_chart.tsx","webpack://mattermost-webapp/./src/components/analytics/system_analytics/system_analytics.tsx","webpack://mattermost-webapp/./src/components/analytics/system_analytics/index.ts","webpack://mattermost-webapp/./src/components/admin_console/banner.tsx","webpack://mattermost-webapp/./src/components/analytics/table_chart.tsx","webpack://mattermost-webapp/./src/components/analytics/team_analytics/team_analytics.tsx","webpack://mattermost-webapp/./src/components/analytics/team_analytics/index.ts","webpack://mattermost-webapp/./src/components/admin_console/admin_definition_constants.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_reload_icon.tsx","webpack://mattermost-webapp/./src/components/admin_console/compliance_reports/compliance_reports.tsx","webpack://mattermost-webapp/./src/components/admin_console/compliance_reports/index.ts","webpack://mattermost-webapp/./src/components/admin_console/audits/audits.tsx","webpack://mattermost-webapp/./src/components/admin_console/audits/index.ts","webpack://mattermost-webapp/./src/components/cloud_fetch_error/index.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/empty_billing_history_svg.tsx","webpack://mattermost-webapp/./src/components/cloud_invoice_preview/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/invoice_user_count.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_history_table.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_history.tsx","webpack://mattermost-webapp/./src/components/widgets/links/upgrade_link.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_subscriptions/cloud_trial_banner.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/cloud_trial_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/private_cloud_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_subscriptions/contact_sales_card.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/upgrade_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_summary/billing_summary.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_summary/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/plan_details/feature_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/plan_details/plan_details.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/plan_details/plan_pricing.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/plan_details/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_subscriptions/index.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/company_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/company_info_display.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/company_info.tsx","webpack://mattermost-webapp/./src/utils/states.ts","webpack://mattermost-webapp/./src/components/payment_form/state_selector.tsx","webpack://mattermost-webapp/./src/components/admin_console/bleve_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/brand_image_setting/brand_image_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/cluster_table.tsx","webpack://mattermost-webapp/./src/components/admin_console/cluster_table_container.tsx","webpack://mattermost-webapp/./src/components/admin_console/cluster_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/custom_enable_disable_guest_accounts_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/custom_terms_of_service_settings/custom_terms_of_service_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/custom_terms_of_service_settings/index.ts","webpack://mattermost-webapp/./src/components/admin_console/custom_url_schemes_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_grid/data_grid_header.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_grid/data_grid_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/filter/filter_checkbox.tsx","webpack://mattermost-webapp/./src/components/admin_console/filter/filter_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/filter/filter.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_grid/data_grid_search.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_grid/data_grid.tsx","webpack://mattermost-webapp/./src/components/card/card_header.tsx","webpack://mattermost-webapp/./src/components/card/card.tsx","webpack://mattermost-webapp/./src/components/card/card_body.tsx","webpack://mattermost-webapp/./src/components/card/title_and_button_card_header/title_and_button_card_header.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/data_retention_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/index.ts","webpack://mattermost-webapp/./src/components/admin_console/filter/team_filter_dropdown/team_filter_dropdown.tsx","webpack://mattermost-webapp/./src/components/admin_console/filter/team_filter_dropdown/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/channel_list/channel_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/channel_list/index.ts","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/dropdown_options/dropdown_options.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/team_list/team_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/team_list/index.ts","webpack://mattermost-webapp/./src/components/channel_selector_modal/channel_selector_modal.tsx","webpack://mattermost-webapp/./src/components/channel_selector_modal/index.ts","webpack://mattermost-webapp/./src/components/team_selector_modal/team_selector_modal.tsx","webpack://mattermost-webapp/./src/components/team_selector_modal/index.ts","webpack://mattermost-webapp/./src/components/widgets/inputs/dropdown_input_hybrid.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/custom_policy_form/custom_policy_form.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/custom_policy_form/index.ts","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/global_policy_form/global_policy_form.tsx","webpack://mattermost-webapp/./src/components/admin_console/data_retention_settings/global_policy_form/index.ts","webpack://mattermost-webapp/./src/components/admin_console/database/migrations_table.tsx","webpack://mattermost-webapp/./src/components/admin_console/database/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/database_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/elasticsearch_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/announcement_banner_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/trial_banner/trial_banner.tsx","webpack://mattermost-webapp/./src/components/common/hocs/cloud/with_open_start_trial_form_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/feature_discovery.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/compliance_export_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/custom_terms_of_service_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/data_retention_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/groups_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/guest_access_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/system_roles.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_flags.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_profile.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/line_switch.tsx","webpack://mattermost-webapp/./src/components/widgets/admin_console/admin_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_profile_and_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_teams_and_channels_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_teams_and_channels.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_users_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_users.tsx","webpack://mattermost-webapp/./src/components/admin_console/blockable_button/blockable_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/blockable_button/index.ts","webpack://mattermost-webapp/./src/components/admin_console/save_changes_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/group_details.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_details/index.ts","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/groups_list/groups_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/group_settings/groups_list/index.ts","webpack://mattermost-webapp/./src/components/admin_console/group_settings/group_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/add_edit_ip_filter_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/ip_filtering_utils.ts","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/delete_confirmation.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/edit_section/edit_section_edit_table_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/edit_section/edit_section_ip_not_in_range_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/edit_section/edit_section_header.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/ip_filtering_earth_svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/edit_section/edit_section_no_filters_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/edit_section/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/enable_section.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/save_confirmation_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/contact_sales/contact_us.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/setup_system.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_right_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/modals/confirm_license_removal_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/modals/ee_license_modal.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/file_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/upload_license.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/modals/upload_license_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/renew_license_card/renew_license_card.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/starter_edition/starter_left_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/starter_edition/starter_right_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/team_edition/team_edition_left_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/team_edition/team_edition_right_panel.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/trial_license_card/trial_license_card.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/license_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/license_settings/index.ts","webpack://mattermost-webapp/./src/components/admin_console/message_export_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/openid_convert/openid_convert.tsx","webpack://mattermost-webapp/./src/components/admin_console/openid_convert/index.ts","webpack://mattermost-webapp/./src/components/admin_console/checkbox_setting.tsx","webpack://mattermost-webapp/./src/components/admin_console/password_settings.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/schemes.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/schemes.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/constants/schemes.ts","webpack://mattermost-webapp/./src/components/widgets/admin_console/admin_panel_with_link.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permissions_scheme_summary/permissions_scheme_summary.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permissions_scheme_summary/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_schemes_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/index.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/accordion_toggle_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/admin_console/admin_panel_togglable.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/edit_post_time_limit_button/edit_post_time_limit_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/edit_post_time_limit_button/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/edit_post_time_limit_modal/edit_post_time_limit_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/edit_post_time_limit_modal/index.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/checkbox_partial_icon.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_checkbox.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/strings/roles.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_description.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/strings/permissions.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/strings/groups.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_group.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/guest_permissions_tree/guest_permissions_tree.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/guest_permissions_tree/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permissions_tree/permissions_tree.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permissions_tree/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permissions_tree_playbooks.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_system_scheme_settings/permission_system_scheme_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_system_scheme_settings/index.tsx","webpack://mattermost-webapp/./src/components/widgets/admin_console/admin_panel_with_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_team_scheme_settings/team_in_list/team_in_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_team_scheme_settings/team_in_list/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_team_scheme_settings/permission_team_scheme_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/permission_schemes_settings/permission_team_scheme_settings/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/push_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/building.svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/utils.ts","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/controls.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/team_selector.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/modals/secure_connection_accept_invite_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/modals/secure_connection_create_invite_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/modals/secure_connection_delete_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/modals/shared_channels_add_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/modals/shared_channels_remove_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/secure_connection_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/modals/modal_utils.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/secure_connections.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/chat.svg.tsx","webpack://mattermost-webapp/./src/components/admin_console/list_table/pagination.tsx","webpack://mattermost-webapp/./src/components/admin_console/list_table/list_table.tsx","webpack://mattermost-webapp/./src/components/admin_console/list_table/elapsed_duration_cell.tsx","webpack://mattermost-webapp/./src/components/admin_console/secure_connections/secure_connection_detail.tsx","webpack://mattermost-webapp/./src/components/admin_console/full_log_event_modal/full_log_event_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/full_log_event_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/server_logs/log_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/server_logs/plain_log_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/server_logs/logs.tsx","webpack://mattermost-webapp/./src/components/admin_console/server_logs/index.ts","webpack://mattermost-webapp/./src/components/admin_console/session_length_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_properties/controls.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_properties/user_properties_delete_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_properties/section_utils.ts","webpack://mattermost-webapp/./src/components/admin_console/system_properties/user_properties_utils.ts","webpack://mattermost-webapp/./src/components/admin_console/system_properties/user_properties_table.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_properties/system_properties.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_properties/index.ts","webpack://mattermost-webapp/./src/components/admin_console/system_roles/strings.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_roles.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/strings.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/types.ts","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/system_role_permission_dropdown.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/system_role_permission.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/system_role_permissions.tsx","webpack://mattermost-webapp/./src/components/admin_console/user_grid/user_grid_name.tsx","webpack://mattermost-webapp/./src/components/admin_console/user_grid/user_grid_remove.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/add_users_to_role_modal/add_users_to_role_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/add_users_to_role_modal/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/system_role_users/system_role_users.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/system_role_users/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/system_role.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_roles/system_role/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_user_card/admin_user_card.tsx","webpack://mattermost-webapp/./src/components/admin_console/reset_password_modal/reset_password_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/reset_password_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/team_list/abstract_list.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/ellipsis_h_icon.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/team_list/team_list_dropdown.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/team_list/team_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/team_list/team_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/team_list/index.ts","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/confirm_manage_user_settings_modal.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/at_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/email_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/shield_outline_icon.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/system_user_detail.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_user_detail/index.ts","webpack://mattermost-webapp/./src/components/admin_console/system_users/constants/index.ts","webpack://mattermost-webapp/./src/components/admin_console/system_users/revoke_sessions_button/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_column_toggler_menu/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_date_range_menu/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_export/export_error_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_export/export_user_data_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_export/upgrade_export_data_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/utils/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_export/index.tsx","webpack://mattermost-webapp/./src/components/styled_popover_container/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_filters_popover/styled_users_filters_status/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_filters_popover/system_users_filter_role/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_filters_popover/system_users_filter_team/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_filters_popover/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/manage_roles_modal/manage_roles_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/manage_roles_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/manage_teams_modal/manage_teams_dropdown.tsx","webpack://mattermost-webapp/./src/components/admin_console/manage_teams_modal/remove_from_team_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/manage_teams_modal/manage_teams_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/manage_teams_modal/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/revoke_token_button/revoke_token_button.tsx","webpack://mattermost-webapp/./src/components/admin_console/revoke_token_button/index.ts","webpack://mattermost-webapp/./src/components/admin_console/manage_tokens_modal/manage_tokens_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/manage_tokens_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/reset_email_modal/reset_email_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/reset_email_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/create_group_syncables_membership_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/deactivate_member_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/demote_to_guest_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/promote_to_member_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/revoke_sessions_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_list_actions/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users_search/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/system_users.tsx","webpack://mattermost-webapp/./src/components/admin_console/system_users/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/abstract_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/list/channel_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/list/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/channel_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/index.ts","webpack://mattermost-webapp/./src/components/admin_console/member_list_group/member_list_group.tsx","webpack://mattermost-webapp/./src/components/admin_console/member_list_group/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_members_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_row.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_groups.tsx","webpack://mattermost-webapp/./src/components/admin_console/user_grid/user_grid_role_dropdown.tsx","webpack://mattermost-webapp/./src/components/admin_console/user_grid/user_grid.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_members/channel_members.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_members/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_moderation.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_modes.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_profile.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/convert_and_remove_confirm_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/convert_confirm_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_users/users_to_remove_groups.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_users/users_to_remove_role.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_users/users_to_remove.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/group/group_users/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/users_to_be_removed_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/errors.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/remove_confirm_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/channel_details.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/channel/details/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/list/team_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/list/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/team_settings.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/team_groups.tsx","webpack://mattermost-webapp/./src/components/add_users_to_team_modal/add_users_to_team_modal.tsx","webpack://mattermost-webapp/./src/components/add_users_to_team_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/team_members/team_members.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/team_members/index.ts","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/team_modes.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/team_profile.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/team_details.tsx","webpack://mattermost-webapp/./src/components/admin_console/team_channel_settings/team/details/index.ts","webpack://mattermost-webapp/./src/components/admin_console/validation.tsx","webpack://mattermost-webapp/./src/components/common/accordion/accordion_card.tsx","webpack://mattermost-webapp/./src/components/common/accordion/accordion.tsx","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard.type.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/chips_list.tsx","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/cta_buttons.tsx","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard_checks/access.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard_checks/config.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard_checks/data_privacy.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard_checks/easy_management.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard_checks/performance.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard_checks/updates.ts","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard.data.tsx","webpack://mattermost-webapp/./src/components/common/circular_chart/circular_chart.tsx","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/overall-score.tsx","webpack://mattermost-webapp/./src/components/admin_console/workspace-optimization/dashboard.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_definition.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/company_info_edit.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/groups.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/announcement_banner.tsx","webpack://mattermost-webapp/./src/components/admin_console/ip_filtering/index.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/ldap.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/saml.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/openid_custom.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/openid.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/guest_access.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/data_retention.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/compliance_export.tsx","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/custom_terms_of_service.tsx","webpack://mattermost-webapp/./src/selectors/admin_console.jsx","webpack://mattermost-webapp/./src/components/admin_console/search_keyword_marking.tsx","webpack://mattermost-webapp/./src/components/discard_changes_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_sidebar/admin_sidebar_category.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_sidebar/admin_sidebar_section.tsx","webpack://mattermost-webapp/./src/components/commercial_support_modal/commercial_support_modal.tsx","webpack://mattermost-webapp/./src/components/commercial_support_modal/index.ts","webpack://mattermost-webapp/./src/components/admin_console/admin_navbar_dropdown/menu_item_blockable_link.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_navbar_dropdown/admin_navbar_dropdown.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_navbar_dropdown/index.ts","webpack://mattermost-webapp/./src/components/admin_console/admin_sidebar_header/admin_sidebar_header.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_sidebar_header/index.ts","webpack://mattermost-webapp/./src/utils/admin_console_plugin_index.ts","webpack://mattermost-webapp/./src/utils/admin_console_index.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_sidebar/admin_sidebar.tsx","webpack://mattermost-webapp/./src/components/admin_console/admin_sidebar/index.ts","webpack://mattermost-webapp/./src/components/admin_console/admin_console.tsx","webpack://mattermost-webapp/./src/components/admin_console/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/fa_back_icon.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_navbar.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useCopyText.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetUsageDeltas.ts","webpack://mattermost-webapp/./src/components/common/svg_images_components/alert_svg.tsx","webpack://mattermost-webapp/./src/components/file_info_preview/file_info_preview.tsx","webpack://mattermost-webapp/./src/components/file_info_preview/index.ts","webpack://mattermost-webapp/./src/components/localized_placeholder_input.tsx","webpack://mattermost-webapp/./src/components/modal_controller/modal_controller.tsx","webpack://mattermost-webapp/./src/components/modal_controller/index.ts","webpack://mattermost-webapp/./src/components/pdf_preview.tsx","webpack://mattermost-webapp/./src/components/system_notice/notices.tsx","webpack://mattermost-webapp/./src/components/system_notice/system_notice.tsx","webpack://mattermost-webapp/./src/components/system_notice/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/checkbox_checked_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_next_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_previous_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_search_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/globe_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/lock_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/mentions_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/menu_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/search_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/inputs/channels_input.tsx","webpack://mattermost-webapp/./src/components/widgets/team_icon/team_icon.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/bots.ts","webpack://mattermost-webapp/./src/types/actions.ts","webpack://mattermost-webapp/./src/utils/http_utils.ts","webpack://mattermost-webapp/../platform/types/lib/admin.js","webpack://mattermost-webapp/../platform/types/lib/cloud.js","webpack://mattermost-webapp/../platform/types/lib/remote_clusters.js"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserReportOptions, UserReport, UserReportFilter} from '@mattermost/types/reports';\n\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {ActionTypes} from 'utils/constants';\n\nimport type {ActionFuncAsync} from 'types/store';\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nexport function setNeedsLoggedInLimitReachedCheck(data: boolean) {\n return {\n type: ActionTypes.NEEDS_LOGGED_IN_LIMIT_REACHED_CHECK,\n data,\n };\n}\n\n/**\n * Action to set the properties of the admin console user management table. Only pass the properties you want to set/modify. If you pass no properties, the table properties will be cleared.\n */\nexport function setAdminConsoleUsersManagementTableProperties(data?: Partial<AdminConsoleUserManagementTableProperties>) {\n if (!data) {\n return {\n type: ActionTypes.CLEAR_ADMIN_CONSOLE_USER_MANAGEMENT_TABLE_PROPERTIES,\n data: null,\n };\n }\n\n return {\n type: ActionTypes.SET_ADMIN_CONSOLE_USER_MANAGEMENT_TABLE_PROPERTIES,\n data,\n };\n}\n\nexport function getUserReports(options = {} as UserReportOptions): ActionFuncAsync<UserReport[]> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getUsersForReporting(options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error: error as ServerError};\n }\n\n return {data};\n };\n}\n\nexport function getUserCountForReporting(filter = {} as UserReportFilter): ActionFuncAsync<number> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getUserCountForReporting(filter);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error: error as ServerError};\n }\n\n return {data};\n };\n}\n\nexport function startUsersBatchExport(tableFilters = {} as UserReportOptions): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.startUsersBatchExport(tableFilters);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error: error as ServerError};\n }\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {Group, SyncablePatch} from '@mattermost/types/groups';\nimport {SyncableType} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\n\nimport groupsAvatar from 'images/groups-avatar.png';\nimport Constants from 'utils/constants';\n\nconst GROUPS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 10;\n\ntype GroupValue = (Group & Value);\n\nexport type Props = {\n currentChannelName: string;\n currentChannelId: string;\n intl: IntlShape;\n teamID: string;\n searchTerm: string;\n groups: Group[];\n excludeGroups?: Group[];\n includeGroups?: Group[];\n onExited: () => void;\n skipCommit?: boolean;\n onAddCallback?: (groupIDs: string[]) => void;\n\n actions: {\n getGroupsNotAssociatedToChannel: (channelID: string, q?: string, page?: number, perPage?: number, filterParentTeamPermitted?: boolean) => Promise<ActionResult>;\n setModalSearchTerm: (term: string) => void;\n linkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: Partial<SyncablePatch>) => Promise<ActionResult>;\n getAllGroupsAssociatedToChannel: (channelID: string, filterAllowReference: boolean, includeMemberCount: boolean) => Promise<ActionResult>;\n getTeam: (teamId: string) => Promise<ActionResult>;\n getAllGroupsAssociatedToTeam: (teamID: string, filterAllowReference: boolean, includeMemberCount: boolean) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n values: GroupValue[];\n show: boolean;\n search: boolean;\n saving: boolean;\n addError: string | null;\n loadingGroups: boolean;\n}\n\nexport class AddGroupsToChannelModal extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n private selectedItemRef: React.RefObject<HTMLDivElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n values: [],\n show: true,\n search: false,\n saving: false,\n addError: null,\n loadingGroups: true,\n };\n\n this.selectedItemRef = React.createRef();\n }\n\n componentDidMount() {\n Promise.all([\n this.props.actions.getTeam(this.props.teamID),\n this.props.actions.getAllGroupsAssociatedToTeam(this.props.teamID, false, true),\n this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, '', 0, GROUPS_PER_PAGE + 1, true),\n this.props.actions.getAllGroupsAssociatedToChannel(this.props.currentChannelId, false, true),\n ]).then(() => {\n this.setGroupsLoadingState(false);\n });\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.searchTerm !== prevProps.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n\n const searchTerm = this.props.searchTerm;\n if (searchTerm === '') {\n return;\n }\n\n this.searchTimeoutId = window.setTimeout(\n async () => {\n this.setGroupsLoadingState(true);\n await this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, searchTerm, undefined, undefined, true);\n this.setGroupsLoadingState(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n }\n }\n\n handleHide = () => {\n this.props.actions.setModalSearchTerm('');\n this.setState({show: false});\n };\n\n handleResponse = (err?: ServerError) => {\n let addError = null;\n if (err && err.message) {\n addError = err.message;\n }\n\n this.setState({\n saving: false,\n addError,\n });\n };\n\n handleSubmit = async () => {\n const groupIDs = this.state.values.map((v) => v.id);\n if (groupIDs.length === 0) {\n return;\n }\n\n if (this.props.skipCommit) {\n if (this.props.onAddCallback) {\n this.props.onAddCallback(groupIDs);\n }\n this.handleHide();\n return;\n }\n\n this.setState({saving: true});\n\n await Promise.all(groupIDs.map(async (groupID) => {\n const {error} = await this.props.actions.linkGroupSyncable(groupID, this.props.currentChannelId, SyncableType.Channel, {auto_add: true});\n this.handleResponse(error);\n if (!error) {\n this.handleHide();\n }\n }));\n };\n\n addValue = (value: GroupValue) => {\n const values = Object.assign([], this.state.values);\n const userIds = values.map((v: Group) => v.id);\n if (value && value.id && userIds.indexOf(value.id) === -1) {\n values.push(value);\n }\n\n this.setState({values});\n };\n\n setGroupsLoadingState = (loadingState: boolean) => {\n this.setState({\n loadingGroups: loadingState,\n });\n };\n\n handlePageChange = (page: number, prevPage: number) => {\n if (page > prevPage) {\n this.setGroupsLoadingState(true);\n this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, this.props.searchTerm, page, GROUPS_PER_PAGE + 1, true).then(() => {\n this.setGroupsLoadingState(false);\n });\n }\n };\n\n handleDelete = (values: GroupValue[]) => {\n this.setState({values});\n };\n\n search = (term: string) => {\n this.props.actions.setModalSearchTerm(term);\n };\n\n renderOption = (option: GroupValue, isSelected: boolean, onAdd: (value: GroupValue) => void, onMouseMove?: (value: GroupValue) => void) => {\n const rowSelected = isSelected ? 'more-modal__row--selected' : '';\n\n return (\n <div\n key={option.id}\n ref={isSelected ? this.selectedItemRef : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => (onMouseMove ? onMouseMove(option) : undefined)}\n >\n <img\n className='more-modal__image'\n src={groupsAvatar}\n alt='group picture'\n width='32'\n height='32'\n />\n <div\n className='more-modal__details'\n >\n <div className='more-modal__name'>\n {option.display_name}{'\\u00A0-\\u00A0'}<span className='more-modal__name_sub'>\n <FormattedMessage\n id='numMembers'\n defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n values={{\n num: option.member_count,\n }}\n />\n </span>\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i className='icon icon-plus'/>\n </div>\n </div>\n </div>\n );\n };\n\n renderValue(props: { data: Partial<Value> }) {\n return props.data.display_name;\n }\n\n render() {\n const numRemainingText = (\n <div id='numGroupsRemaining'>\n <FormattedMessage\n id='multiselect.numGroupsRemaining'\n defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {group} other {groups}}. '\n values={{\n num: MAX_SELECTABLE_VALUES - this.state.values.length,\n }}\n />\n </div>\n );\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n const buttonSubmitLoadingText = defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'});\n\n let addError = null;\n if (this.state.addError) {\n addError = (<div className='has-error col-sm-12'><label className='control-label font-weight--normal'>{this.state.addError}</label></div>);\n }\n let groupsToShow = this.props.groups;\n if (this.props.excludeGroups) {\n const hasGroup = (og: Group) => !this.props.excludeGroups!.find((g) => g.id === og.id);\n groupsToShow = groupsToShow.filter(hasGroup);\n }\n if (this.props.includeGroups) {\n const hasGroup = (og: Group) => this.props.includeGroups!.find((g) => g.id === og.id);\n groupsToShow = [...groupsToShow, ...this.props.includeGroups.filter(hasGroup)];\n }\n const groupsToShowValues = groupsToShow.map((group) => {\n return {label: group.display_name, value: group.id, ...group};\n });\n\n return (\n <Modal\n id='addGroupsToChannelModal'\n dialogClassName={'a11y__modal more-modal more-direct-channels'}\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.props.onExited}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title componentClass='h1'>\n <FormattedMessage\n id='add_groups_to_channel.title'\n defaultMessage='Add New Groups to {channelName} Channel'\n values={{\n channelName: (\n <strong>{this.props.currentChannelName}</strong>\n ),\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {addError}\n <MultiSelect\n key='addGroupsToChannelKey'\n options={groupsToShowValues}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n values={this.state.values}\n valueRenderer={this.renderValue}\n perPage={GROUPS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.addValue}\n handleSubmit={this.handleSubmit}\n maxValues={MAX_SELECTABLE_VALUES}\n numRemainingText={numRemainingText}\n buttonSubmitText={buttonSubmitText}\n buttonSubmitLoadingText={buttonSubmitLoadingText}\n saving={this.state.saving}\n loading={this.state.loadingGroups}\n placeholderText={defineMessage({id: 'multiselect.addGroupsPlaceholder', defaultMessage: 'Search and add groups'})}\n />\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nexport default injectIntl(AddGroupsToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Group} from '@mattermost/types/groups';\n\nimport {getGroupsNotAssociatedToChannel, linkGroupSyncable, getAllGroupsAssociatedToChannel, getAllGroupsAssociatedToTeam} from 'mattermost-redux/actions/groups';\nimport {getTeam} from 'mattermost-redux/actions/teams';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getGroupsNotAssociatedToChannel as selectGroupsNotAssociatedToChannel} from 'mattermost-redux/selectors/entities/groups';\n\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddGroupsToChannelModal from './add_groups_to_channel_modal';\n\ntype OwnProps = {\n channel: Channel;\n skipCommit: boolean;\n onAddCallback: (groupIDs: string[]) => void;\n excludeGroups: Group[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const searchTerm = state.views.search.modalSearch;\n\n const channel = ownProps.channel || getCurrentChannel(state) || {};\n\n let groups = selectGroupsNotAssociatedToChannel(state, channel.id, channel.team_id);\n if (searchTerm) {\n const regex = RegExp(searchTerm, 'i');\n groups = groups.filter((group) => regex.test(group.display_name) || regex.test(group.name));\n }\n\n return {\n currentChannelName: channel.display_name,\n currentChannelId: channel.id,\n skipCommit: ownProps.skipCommit,\n onAddCallback: ownProps.onAddCallback,\n excludeGroups: ownProps.excludeGroups,\n searchTerm,\n groups,\n teamID: channel.team_id,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getGroupsNotAssociatedToChannel,\n setModalSearchTerm,\n linkGroupSyncable,\n getAllGroupsAssociatedToChannel,\n getTeam,\n getAllGroupsAssociatedToTeam,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddGroupsToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport Permissions from './permissions';\n\nexport const RESOURCE_KEYS = {\n ABOUT: {\n EDITION_AND_LICENSE: 'about.edition_and_license',\n },\n REPORTING: {\n SITE_STATISTICS: 'reporting.site_statistics',\n TEAM_STATISTICS: 'reporting.team_statistics',\n SERVER_LOGS: 'reporting.server_logs',\n },\n USER_MANAGEMENT: {\n USERS: 'user_management.users',\n GROUPS: 'user_management.groups',\n TEAMS: 'user_management.teams',\n CHANNELS: 'user_management.channels',\n PERMISSIONS: 'user_management.permissions',\n SYSTEM_ROLES: 'user_management.system_roles',\n },\n AUTHENTICATION: {\n SIGNUP: 'authentication.signup',\n EMAIL: 'authentication.email',\n PASSWORD: 'authentication.password',\n MFA: 'authentication.mfa',\n LDAP: 'authentication.ldap',\n SAML: 'authentication.saml',\n OPENID: 'authentication.openid',\n GUEST_ACCESS: 'authentication.guest_access',\n },\n INTEGRATIONS: {\n INTEGRATION_MANAGEMENT: 'integrations.integration_management',\n BOT_ACCOUNTS: 'integrations.bot_accounts',\n GIF: 'integrations.gif',\n CORS: 'integrations.cors',\n },\n COMPLIANCE: {\n DATA_RETENTION_POLICY: 'compliance.data_retention_policy',\n COMPLIANCE_EXPORT: 'compliance.compliance_export',\n COMPLIANCE_MONITORING: 'compliance.compliance_monitoring',\n CUSTOM_TERMS_OF_SERVICE: 'compliance.custom_terms_of_service',\n },\n PRODUCTS: {\n BOARDS: 'boards',\n },\n SITE: {\n CUSTOMIZATION: 'site.customization',\n LOCALIZATION: 'site.localization',\n USERS_AND_TEAMS: 'site.users_and_teams',\n NOTIFICATIONS: 'site.notifications',\n ANNOUNCEMENT_BANNER: 'site.announcement_banner',\n EMOJI: 'site.emoji',\n POSTS: 'site.posts',\n FILE_SHARING_AND_DOWNLOADS: 'site.file_sharing_and_downloads',\n PUBLIC_LINKS: 'site.public_links',\n NOTICES: 'site.notices',\n IP_FILTERING: 'site.ip_filters',\n },\n EXPERIMENTAL: {\n FEATURES: 'experimental.features',\n FEATURE_FLAGS: 'experimental.feature_flags',\n BLEVE: 'experimental.bleve',\n },\n ENVIRONMENT: {\n WEB_SERVER: 'environment.web_server',\n DATABASE: 'environment.database',\n ELASTICSEARCH: 'environment.elasticsearch',\n FILE_STORAGE: 'environment.file_storage',\n IMAGE_PROXY: 'environment.image_proxy',\n SMTP: 'environment.smtp',\n PUSH_NOTIFICATION_SERVER: 'environment.push_notification_server',\n HIGH_AVAILABILITY: 'environment.high_availability',\n RATE_LIMITING: 'environment.rate_limiting',\n LOGGING: 'environment.logging',\n SESSION_LENGTHS: 'environment.session_lengths',\n PERFORMANCE_MONITORING: 'environment.performance_monitoring',\n DEVELOPER: 'environment.developer',\n },\n};\n\nexport const ResourceToSysConsolePermissionsTable: Record<string, string[]> = {\n [RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE]: [Permissions.SYSCONSOLE_READ_ABOUT_EDITION_AND_LICENSE, Permissions.SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE],\n billing: [Permissions.SYSCONSOLE_READ_BILLING, Permissions.SYSCONSOLE_WRITE_BILLING],\n [RESOURCE_KEYS.REPORTING.SITE_STATISTICS]: [Permissions.SYSCONSOLE_READ_REPORTING_SITE_STATISTICS, Permissions.SYSCONSOLE_WRITE_REPORTING_SITE_STATISTICS],\n [RESOURCE_KEYS.REPORTING.TEAM_STATISTICS]: [Permissions.SYSCONSOLE_READ_REPORTING_TEAM_STATISTICS, Permissions.SYSCONSOLE_WRITE_REPORTING_TEAM_STATISTICS],\n [RESOURCE_KEYS.REPORTING.SERVER_LOGS]: [Permissions.SYSCONSOLE_READ_REPORTING_SERVER_LOGS, Permissions.SYSCONSOLE_WRITE_REPORTING_SERVER_LOGS],\n [RESOURCE_KEYS.USER_MANAGEMENT.USERS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_USERS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_USERS],\n [RESOURCE_KEYS.USER_MANAGEMENT.GROUPS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_GROUPS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS],\n [RESOURCE_KEYS.USER_MANAGEMENT.TEAMS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_TEAMS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_TEAMS],\n [RESOURCE_KEYS.USER_MANAGEMENT.CHANNELS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS],\n [RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_PERMISSIONS],\n [RESOURCE_KEYS.USER_MANAGEMENT.SYSTEM_ROLES]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_SYSTEM_ROLES, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_SYSTEM_ROLES],\n [RESOURCE_KEYS.SITE.CUSTOMIZATION]: [Permissions.SYSCONSOLE_READ_SITE_CUSTOMIZATION, Permissions.SYSCONSOLE_WRITE_SITE_CUSTOMIZATION],\n [RESOURCE_KEYS.SITE.LOCALIZATION]: [Permissions.SYSCONSOLE_READ_SITE_LOCALIZATION, Permissions.SYSCONSOLE_WRITE_SITE_LOCALIZATION],\n [RESOURCE_KEYS.SITE.USERS_AND_TEAMS]: [Permissions.SYSCONSOLE_READ_SITE_USERS_AND_TEAMS, Permissions.SYSCONSOLE_WRITE_SITE_USERS_AND_TEAMS],\n [RESOURCE_KEYS.SITE.NOTIFICATIONS]: [Permissions.SYSCONSOLE_READ_SITE_NOTIFICATIONS, Permissions.SYSCONSOLE_WRITE_SITE_NOTIFICATIONS],\n [RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER]: [Permissions.SYSCONSOLE_READ_SITE_ANNOUNCEMENT_BANNER, Permissions.SYSCONSOLE_WRITE_SITE_ANNOUNCEMENT_BANNER],\n [RESOURCE_KEYS.SITE.EMOJI]: [Permissions.SYSCONSOLE_READ_SITE_EMOJI, Permissions.SYSCONSOLE_WRITE_SITE_EMOJI],\n [RESOURCE_KEYS.SITE.POSTS]: [Permissions.SYSCONSOLE_READ_SITE_POSTS, Permissions.SYSCONSOLE_WRITE_SITE_POSTS],\n [RESOURCE_KEYS.SITE.FILE_SHARING_AND_DOWNLOADS]: [Permissions.SYSCONSOLE_READ_SITE_FILE_SHARING_AND_DOWNLOADS, Permissions.SYSCONSOLE_WRITE_SITE_FILE_SHARING_AND_DOWNLOADS],\n [RESOURCE_KEYS.SITE.PUBLIC_LINKS]: [Permissions.SYSCONSOLE_READ_SITE_PUBLIC_LINKS, Permissions.SYSCONSOLE_WRITE_SITE_PUBLIC_LINKS],\n [RESOURCE_KEYS.SITE.NOTICES]: [Permissions.SYSCONSOLE_READ_SITE_NOTICES, Permissions.SYSCONSOLE_WRITE_SITE_NOTICES],\n [RESOURCE_KEYS.SITE.IP_FILTERING]: [Permissions.SYSCONSOLE_READ_SITE_IP_FILTERS, Permissions.SYSCONSOLE_WRITE_SITE_IP_FILTERS],\n [RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_WEB_SERVER, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_WEB_SERVER],\n [RESOURCE_KEYS.ENVIRONMENT.DATABASE]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_DATABASE, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_DATABASE],\n [RESOURCE_KEYS.ENVIRONMENT.ELASTICSEARCH]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_ELASTICSEARCH, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_ELASTICSEARCH],\n [RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_FILE_STORAGE, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_FILE_STORAGE],\n [RESOURCE_KEYS.ENVIRONMENT.IMAGE_PROXY]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_IMAGE_PROXY, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_IMAGE_PROXY],\n [RESOURCE_KEYS.ENVIRONMENT.SMTP]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_SMTP, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_SMTP],\n [RESOURCE_KEYS.ENVIRONMENT.PUSH_NOTIFICATION_SERVER]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_PUSH_NOTIFICATION_SERVER, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_PUSH_NOTIFICATION_SERVER],\n [RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_HIGH_AVAILABILITY, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_HIGH_AVAILABILITY],\n [RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_RATE_LIMITING, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_RATE_LIMITING],\n [RESOURCE_KEYS.ENVIRONMENT.LOGGING]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_LOGGING, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_LOGGING],\n [RESOURCE_KEYS.ENVIRONMENT.SESSION_LENGTHS]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_SESSION_LENGTHS, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_SESSION_LENGTHS],\n [RESOURCE_KEYS.ENVIRONMENT.PERFORMANCE_MONITORING]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_PERFORMANCE_MONITORING, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_PERFORMANCE_MONITORING],\n [RESOURCE_KEYS.ENVIRONMENT.DEVELOPER]: [Permissions.SYSCONSOLE_READ_ENVIRONMENT_DEVELOPER, Permissions.SYSCONSOLE_WRITE_ENVIRONMENT_DEVELOPER],\n [RESOURCE_KEYS.AUTHENTICATION.SIGNUP]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_SIGNUP, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_SIGNUP],\n [RESOURCE_KEYS.AUTHENTICATION.EMAIL]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_EMAIL, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_EMAIL],\n [RESOURCE_KEYS.AUTHENTICATION.PASSWORD]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_PASSWORD, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_PASSWORD],\n [RESOURCE_KEYS.AUTHENTICATION.MFA]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_MFA, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_MFA],\n [RESOURCE_KEYS.AUTHENTICATION.LDAP]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_LDAP, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_LDAP],\n [RESOURCE_KEYS.AUTHENTICATION.SAML]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_SAML, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_SAML],\n [RESOURCE_KEYS.AUTHENTICATION.OPENID]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_OPENID, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_OPENID],\n [RESOURCE_KEYS.AUTHENTICATION.GUEST_ACCESS]: [Permissions.SYSCONSOLE_READ_AUTHENTICATION_GUEST_ACCESS, Permissions.SYSCONSOLE_WRITE_AUTHENTICATION_GUEST_ACCESS],\n plugins: [Permissions.SYSCONSOLE_READ_PLUGINS, Permissions.SYSCONSOLE_WRITE_PLUGINS],\n [RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT]: [Permissions.SYSCONSOLE_READ_INTEGRATIONS_INTEGRATION_MANAGEMENT, Permissions.SYSCONSOLE_WRITE_INTEGRATIONS_INTEGRATION_MANAGEMENT],\n [RESOURCE_KEYS.PRODUCTS.BOARDS]: [Permissions.SYSCONSOLE_READ_PRODUCTS_BOARDS, Permissions.SYSCONSOLE_WRITE_PRODUCTS_BOARDS],\n [RESOURCE_KEYS.INTEGRATIONS.BOT_ACCOUNTS]: [Permissions.SYSCONSOLE_READ_INTEGRATIONS_BOT_ACCOUNTS, Permissions.SYSCONSOLE_WRITE_INTEGRATIONS_BOT_ACCOUNTS],\n [RESOURCE_KEYS.INTEGRATIONS.GIF]: [Permissions.SYSCONSOLE_READ_INTEGRATIONS_GIF, Permissions.SYSCONSOLE_WRITE_INTEGRATIONS_GIF],\n [RESOURCE_KEYS.INTEGRATIONS.CORS]: [Permissions.SYSCONSOLE_READ_INTEGRATIONS_CORS, Permissions.SYSCONSOLE_WRITE_INTEGRATIONS_CORS],\n [RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY]: [Permissions.SYSCONSOLE_READ_COMPLIANCE_DATA_RETENTION_POLICY, Permissions.SYSCONSOLE_WRITE_COMPLIANCE_DATA_RETENTION_POLICY],\n [RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_EXPORT]: [Permissions.SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_EXPORT, Permissions.SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_EXPORT],\n [RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_MONITORING]: [Permissions.SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_MONITORING, Permissions.SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_MONITORING],\n [RESOURCE_KEYS.COMPLIANCE.CUSTOM_TERMS_OF_SERVICE]: [Permissions.SYSCONSOLE_READ_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE, Permissions.SYSCONSOLE_WRITE_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE],\n [RESOURCE_KEYS.EXPERIMENTAL.FEATURES]: [Permissions.SYSCONSOLE_READ_EXPERIMENTAL_FEATURES, Permissions.SYSCONSOLE_WRITE_EXPERIMENTAL_FEATURES],\n [RESOURCE_KEYS.EXPERIMENTAL.FEATURE_FLAGS]: [Permissions.SYSCONSOLE_READ_EXPERIMENTAL_FEATURE_FLAGS, Permissions.SYSCONSOLE_WRITE_EXPERIMENTAL_FEATURE_FLAGS],\n [RESOURCE_KEYS.EXPERIMENTAL.BLEVE]: [Permissions.SYSCONSOLE_READ_EXPERIMENTAL_BLEVE, Permissions.SYSCONSOLE_WRITE_EXPERIMENTAL_BLEVE],\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport default function SetByEnv(): JSX.Element {\n return (\n <div className='alert alert-warning'>\n <FormattedMessage\n id='admin.set_by_env'\n defaultMessage='This setting has been set through an environment variable. It cannot be changed through the System Console.'\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport SetByEnv from './set_by_env';\nimport type {Props} from './setting';\n\nexport default function SettingSet({\n children,\n helpText,\n inputId,\n label,\n setByEnv,\n}: Props) {\n return (\n <fieldset\n data-testid={inputId}\n id={inputId}\n className='form-group'\n >\n <legend className='control-label form-legend col-sm-4'>\n {label}\n </legend>\n <div className='col-sm-8'>\n {children}\n {helpText ? (\n <div\n data-testid={inputId + 'help-text'}\n className='help-text'\n >\n {helpText}\n </div>\n ) : null}\n {setByEnv ? <SetByEnv/> : null}\n </div>\n </fieldset>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nimport * as Utils from 'utils/utils';\n\nimport SettingSet from './setting_set';\n\nconst Label = styled.label<{isDisabled: boolean}>`\n display: inline-flex;\n opacity: ${({isDisabled}) => (isDisabled ? 0.5 : 1)};\n margin-top: 8px;\n margin-right: 24px;\n width: fit-content;\n flex-direction: row;\n align-items: center;\n margin-bottom: 0;\n cursor: pointer;\n font-size: 14px;\n font-weight: 400;\n gap: 8px;\n line-height: 20px;\n\n span {\n cursor: pointer;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n }\n\n input {\n display: grid;\n width: 1.6rem;\n height: 1.6rem;\n border: 1px solid rgba(var(--center-channel-color-rgb), 0.24);\n border-radius: 50%;\n margin: 0;\n -webkit-appearance: none;\n appearance: none;\n background-color: white;\n color: rgba(var(--center-channel-color-rgb), 0.24);\n cursor: pointer;\n font: inherit;\n place-content: center;\n\n &:checked {\n border-color: var(--denim-button-bg);\n }\n\n &:checked::before {\n transform: scale(1);\n }\n\n &::before {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--denim-button-bg);\n content: \"\";\n transform: scale(0);\n transform-origin: center center;\n transition: 200ms transform ease-in-out;\n }\n }\n`;\n\ntype Props = {\n id: string;\n label: React.ReactNode;\n value: boolean;\n onChange: (id: string, value: boolean) => void;\n trueText?: React.ReactNode;\n falseText?: React.ReactNode;\n disabled?: boolean;\n setByEnv: boolean;\n disabledText?: React.ReactNode;\n helpText: React.ReactNode;\n}\n\nconst BooleanSetting = ({\n id,\n label,\n value,\n onChange,\n trueText = (\n <FormattedMessage\n id='admin.true'\n defaultMessage='True'\n />\n ),\n falseText = (\n <FormattedMessage\n id='admin.false'\n defaultMessage='False'\n />\n ),\n disabled = false,\n setByEnv,\n disabledText,\n helpText,\n}: Props) => {\n const helptext = useMemo(() => {\n if (disabled && disabledText) {\n return (\n <div>\n <span className='admin-console__disabled-text'>\n {disabledText}\n </span>\n {helpText}\n </div>\n );\n }\n return helpText;\n }, [helpText, disabled, disabledText]);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(id, e.target.value === 'true');\n }, [id, onChange]);\n\n return (\n <SettingSet\n helpText={helptext}\n inputId={id}\n label={label}\n setByEnv={setByEnv}\n >\n <Label isDisabled={disabled || setByEnv}>\n <input\n data-testid={id + 'true'}\n type='radio'\n value='true'\n id={Utils.createSafeId(id) + 'true'}\n name={id}\n checked={value}\n onChange={handleChange}\n disabled={disabled || setByEnv}\n />\n {trueText}\n </Label>\n <Label isDisabled={disabled || setByEnv}>\n <input\n data-testid={id + 'false'}\n type='radio'\n value='false'\n id={Utils.createSafeId(id) + 'false'}\n name={id}\n checked={!value}\n onChange={handleChange}\n disabled={disabled || setByEnv}\n />\n {falseText}\n </Label>\n </SettingSet>\n );\n};\n\nexport default React.memo(BooleanSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport SetByEnv from './set_by_env';\n\nexport type Props = {\n inputId?: string;\n label: React.ReactNode;\n children?: React.ReactNode;\n helpText?: React.ReactNode;\n setByEnv?: boolean;\n}\n\nconst Settings = ({children, setByEnv, helpText, inputId, label}: Props) => {\n return (\n <div\n data-testid={inputId}\n className='form-group'\n >\n <label\n className='control-label col-sm-4'\n htmlFor={inputId}\n >\n {label}\n </label>\n <div\n className='col-sm-8'\n >\n {children}\n <div\n data-testid={inputId + 'help-text'}\n className='help-text'\n >\n {helpText}\n </div>\n {setByEnv ? <SetByEnv/> : null}\n </div>\n </div>\n );\n};\n\nexport default React.memo(Settings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\n\nimport ColorInput from 'components/color_input';\n\nimport Setting from './setting';\n\ntype Props = {\n id: string;\n label: React.ReactNode;\n helpText?: React.ReactNode;\n value: string;\n onChange?: (id: string, color: string) => void;\n disabled?: boolean;\n}\n\nconst ColorSetting = (props: Props) => {\n const handleChange = useCallback((color: string) => {\n if (props.onChange) {\n props.onChange(props.id, color);\n }\n }, [props.id, props.onChange]);\n\n return (\n <Setting\n label={props.label}\n helpText={props.helpText}\n inputId={props.id}\n >\n <ColorInput\n id={props.id}\n value={props.value}\n onChange={handleChange}\n isDisabled={props.disabled}\n />\n </Setting>\n );\n};\n\nexport default React.memo(ColorSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useMemo} from 'react';\nimport type {ReactNode, ChangeEvent} from 'react';\n\nimport type {EmailSettings} from '@mattermost/types/config';\n\nimport Setting from './setting';\n\ntype Props = {\n id: string;\n values: Array<{text: string; value: string}>;\n label: ReactNode;\n value: string;\n onChange: (id: string, value: string | EmailSettings['PushNotificationServerType'] | EmailSettings['PushNotificationServerLocation']) => void;\n disabled?: boolean;\n setByEnv: boolean;\n helpText?: ReactNode;\n}\n\nconst DropdownSetting = ({\n id,\n values,\n label,\n value,\n onChange,\n disabled = false,\n setByEnv,\n helpText,\n}: Props) => {\n const handleChange = useCallback((e: ChangeEvent<HTMLSelectElement>) => {\n onChange(id, e.target.value);\n }, [onChange, id]);\n\n const options = useMemo(() =>\n values.map(({value: val, text}) => (\n <option\n value={val}\n key={val}\n >\n {text}\n </option>\n )), [values]);\n\n return (\n <Setting\n label={label}\n inputId={id}\n helpText={helpText}\n setByEnv={setByEnv}\n >\n <select\n data-testid={id + 'dropdown'}\n className='form-control'\n id={id}\n value={value}\n onChange={handleChange}\n disabled={disabled || setByEnv}\n >\n {options}\n </select>\n </Setting>\n );\n};\n\nexport default memo(DropdownSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport * as Utils from 'utils/utils';\n\nimport Setting from './setting';\n\ntype Props = {\n id: string;\n label: React.ReactNode;\n helpText?: React.ReactNode;\n uploadingText?: React.ReactNode;\n onSubmit: (id: string, file: File, errorCallback: (error?: string) => void) => void;\n disabled: boolean;\n fileType: string;\n error?: string;\n}\n\ntype State = {\n fileName: null|string;\n fileSelected: boolean;\n serverError?: string;\n uploading: boolean;\n}\n\nexport default class FileUploadSetting extends React.PureComponent<Props, State> {\n fileInputRef = React.createRef<HTMLInputElement>();\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n fileName: null,\n serverError: props.error,\n uploading: false,\n fileSelected: false,\n };\n }\n\n handleChooseClick = () => {\n this.fileInputRef.current?.click();\n };\n\n handleChange = () => {\n const files = this.fileInputRef.current?.files;\n if (files && files.length > 0) {\n this.setState({fileSelected: true, fileName: files[0].name});\n }\n };\n\n handleSubmit = (e: React.MouseEvent) => {\n e.preventDefault();\n\n this.setState({uploading: true});\n const file = this.fileInputRef.current?.files?.[0];\n if (file) {\n this.props.onSubmit(this.props.id, file, (error) => {\n this.setState({uploading: false});\n if (error && this.fileInputRef.current) {\n Utils.clearFileInput(this.fileInputRef.current);\n }\n });\n }\n };\n\n render() {\n let serverError;\n if (this.state.serverError) {\n serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>;\n }\n\n let fileName;\n if (this.state.fileName) {\n fileName = this.state.fileName;\n } else {\n fileName = (\n <FormattedMessage\n id='admin.file_upload.noFile'\n defaultMessage='No file uploaded'\n />\n );\n }\n\n return (\n <Setting\n label={this.props.label}\n helpText={this.props.helpText}\n inputId={this.props.id}\n >\n <div>\n <div className='file__upload'>\n <button\n type='button'\n className='btn btn-tertiary'\n disabled={this.props.disabled}\n onClick={this.handleChooseClick}\n >\n <FormattedMessage\n id='admin.file_upload.chooseFile'\n defaultMessage='Choose File'\n />\n </button>\n <input\n ref={this.fileInputRef}\n type='file'\n disabled={this.props.disabled}\n accept={this.props.fileType}\n onChange={this.handleChange}\n />\n </div>\n <button\n type='button'\n className='btn btn-primary'\n disabled={!this.state.fileSelected}\n onClick={this.handleSubmit}\n >\n {this.state.uploading && (\n <>\n <span className='glyphicon glyphicon-refresh glyphicon-refresh-animate'/>\n {this.props.uploadingText}\n </>)}\n {!this.state.uploading &&\n <FormattedMessage\n id='admin.file_upload.uploadFile'\n defaultMessage='Upload'\n />}\n </button>\n <div className='help-text m-0'>\n {fileName}\n </div>\n {serverError}\n </div>\n </Setting>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport crypto from 'crypto';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport SetByEnv from './set_by_env';\n\ntype Props = {\n id: string;\n label: React.ReactNode;\n placeholder?: string;\n value: string;\n onChange: (id: string, s: string) => void;\n disabled: boolean;\n setByEnv: boolean;\n disabledText?: React.ReactNode;\n helpText: React.ReactNode;\n regenerateText: React.ReactNode;\n regenerateHelpText?: React.ReactNode;\n}\n\nexport default class GeneratedSetting extends React.PureComponent<Props> {\n public static get defaultProps() {\n return {\n disabled: false,\n regenerateText: (\n <FormattedMessage\n id='admin.regenerate'\n defaultMessage='Regenerate'\n />\n ),\n };\n }\n\n private regenerate = (e: React.MouseEvent) => {\n e.preventDefault();\n\n // Pure base64 implementation can contain characters that are not URL safe without additional\n // encoding. Adopt a URL/Filename safer alphabet as noted in https://datatracker.ietf.org/doc/html/rfc4648#section-5\n // where: 62 - (minus) , 63 _ (underscore)\n const value = crypto.randomBytes(256).toString('base64').substring(0, 32);\n this.props.onChange(this.props.id, value.replaceAll('+', '-').replaceAll('/', '_'));\n };\n\n public render() {\n let disabledText = null;\n if (this.props.disabled && this.props.disabledText) {\n disabledText = (\n <div className='admin-console__disabled-text'>\n {this.props.disabledText}\n </div>\n );\n }\n\n let regenerateHelpText = null;\n if (this.props.regenerateHelpText) {\n regenerateHelpText = (\n <div className='help-text'>\n {this.props.regenerateHelpText}\n </div>\n );\n }\n\n let text: React.ReactNode = this.props.value;\n if (!text) {\n text = (\n <span className='placeholder-text'>{this.props.placeholder}</span>\n );\n }\n\n return (\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor={this.props.id}\n >\n {this.props.label}\n </label>\n <div className='col-sm-8'>\n <div\n className='form-control disabled'\n id={this.props.id}\n >\n {text}\n </div>\n {disabledText}\n <div className='help-text'>\n {this.props.helpText}\n </div>\n <div className='help-text'>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.regenerate}\n disabled={this.props.disabled || this.props.setByEnv}\n >\n {this.props.regenerateText}\n </button>\n </div>\n {regenerateHelpText}\n {this.props.setByEnv ? <SetByEnv/> : null}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {JobType, Job, JobsByType} from '@mattermost/types/jobs';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\n\nexport function getAllJobs(state: GlobalState): IDMappedObjects<Job> {\n return state.entities.jobs.jobs;\n}\n\nexport function getJobsByType(state: GlobalState): JobsByType {\n return state.entities.jobs.jobsByTypeList;\n}\n\nexport function makeGetJobsByType(type: JobType): (state: GlobalState) => Job[] {\n return createSelector(\n 'makeGetJobsByType',\n getJobsByType,\n (jobsByType) => {\n return jobsByType[type] || [];\n },\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Job} from '@mattermost/types/jobs';\n\nimport {JobStatuses} from 'utils/constants';\n\nimport './job_cancel_button.scss';\n\ntype Props = {\n job: Job;\n disabled: boolean;\n onClick: (id: string) => void;\n};\n\nconst JobCancelButton = (props: Props): JSX.Element|null => {\n const {job, disabled, onClick} = props;\n const intl = useIntl();\n let cancelButton = null;\n\n const handleClick = useCallback((e) => {\n e.preventDefault();\n onClick(job.id);\n }, [onClick, job.id]);\n\n if (!disabled && (job.status === JobStatuses.PENDING || job.status === JobStatuses.IN_PROGRESS)) {\n cancelButton = (\n <span\n onClick={handleClick}\n className='JobCancelButton'\n title={intl.formatMessage({id: 'admin.jobTable.cancelButton', defaultMessage: 'Cancel'})}\n >\n {'×'}\n </span>\n );\n }\n\n return cancelButton;\n};\n\nexport default React.memo(JobCancelButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Job} from '@mattermost/types/jobs';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport ExternalLink from 'components/external_link';\n\nimport {exportFormats} from 'utils/constants';\n\nconst JobDownloadLink = React.memo(({job}: {job: Job}): JSX.Element => {\n if (job.data?.is_downloadable === 'true' && parseInt(job.data?.messages_exported, 10) > 0 && job.data?.export_type !== exportFormats.EXPORT_FORMAT_GLOBALRELAY) {\n return (\n <ExternalLink\n key={job.id}\n location='job_download_link'\n href={`${Client4.getJobsRoute()}/${job.id}/download`}\n className='JobDownloadLink'\n >\n <FormattedMessage\n id='admin.jobTable.downloadLink'\n defaultMessage='Download'\n />\n </ExternalLink>\n );\n }\n\n return <>{'--'}</>;\n});\n\nexport default JobDownloadLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedTime, FormattedDate} from 'react-intl';\n\nimport type {JobStatus} from '@mattermost/types/jobs';\n\nimport {JobStatuses} from 'utils/constants';\n\ntype Props = {\n status: JobStatus;\n millis: number;\n}\n\nconst JobFinishAt = React.memo(({status, millis}: Props): JSX.Element => {\n if (millis === 0 || status === JobStatuses.PENDING || status === JobStatuses.IN_PROGRESS || status === JobStatuses.CANCEL_REQUESTED) {\n return (\n <span className='JobFinishAt whitespace--nowrap'>{'--'}</span>\n );\n }\n\n const date = new Date(millis);\n\n return (\n <span className='JobFinishAt whitespace--nowrap'>\n <FormattedDate\n value={date}\n day='2-digit'\n month='short'\n year='numeric'\n />\n {' - '}\n <FormattedTime\n value={date}\n hour='2-digit'\n minute='2-digit'\n />\n </span>\n );\n});\n\nexport default JobFinishAt;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Job} from '@mattermost/types/jobs';\n\nimport {JobStatuses} from 'utils/constants';\n\nconst JobRunLength = React.memo(({job}: {job: Job}): JSX.Element => {\n const intl = useIntl();\n let millis = job.last_activity_at - job.start_at;\n if (job.status === JobStatuses.IN_PROGRESS) {\n const runningMillis = Date.now() - job.start_at;\n if (runningMillis > millis) {\n millis = runningMillis;\n }\n }\n\n let lastActivity = intl.formatMessage({id: 'admin.jobTable.lastActivityAt', defaultMessage: 'Last Activity: '}) + '--';\n\n if (job.last_activity_at > 0) {\n lastActivity = intl.formatMessage({id: 'admin.jobTable.lastActivityAt', defaultMessage: 'Last Activity: '}) +\n intl.formatDate(new Date(job.last_activity_at), {\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n }) + ' - ' +\n intl.formatTime(new Date(job.last_activity_at), {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n }\n\n const seconds = Math.round(millis / 1000);\n const minutes = Math.round(millis / (1000 * 60));\n\n if (millis <= 0 || job.status === JobStatuses.CANCELED) {\n return (\n <span className='JobRunLength whitespace--nowrap'>{'--'}</span>\n );\n }\n\n if (seconds <= 120) {\n return (\n <span\n className='JobRunLength whitespace--nowrap'\n title={lastActivity}\n >\n {seconds + intl.formatMessage({id: 'admin.jobTable.runLengthSeconds', defaultMessage: ' seconds'})}\n </span>\n );\n }\n\n return (\n <span\n className='JobRunLength whitespace--nowrap'\n title={lastActivity}\n >\n {minutes + intl.formatMessage({id: 'admin.jobTable.runLengthMinutes', defaultMessage: ' minutes'})}\n </span>\n );\n});\n\nexport default JobRunLength;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Job} from '@mattermost/types/jobs';\n\nimport {JobStatuses} from 'utils/constants';\n\nconst JobStatus = React.memo(({job}: {job: Job}) => {\n const intl = useIntl();\n if (job.status === JobStatuses.PENDING) {\n return (\n <span\n className='JobStatus status-icon-warning'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusPending'\n defaultMessage='Pending'\n />\n </span>\n );\n } else if (job.status === JobStatuses.IN_PROGRESS) {\n return (\n <span\n className='JobStatus status-icon-warning'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusInProgress'\n defaultMessage='In Progress'\n />\n </span>\n );\n } else if (job.status === JobStatuses.SUCCESS) {\n return (\n <span\n className='JobStatus status-icon-success'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusSuccess'\n defaultMessage='Success'\n />\n </span>\n );\n } else if (job.status === JobStatuses.WARNING) {\n return (\n <span\n className='JobStatus status-icon-warning'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusWarning'\n defaultMessage='Warning'\n />\n </span>\n );\n } else if (job.status === JobStatuses.ERROR) {\n return (\n <span\n className='JobStatus status-icon-error'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusError'\n defaultMessage='Error'\n />\n </span>\n );\n } else if (job.status === JobStatuses.CANCEL_REQUESTED) {\n return (\n <span\n className='JobStatus status-icon-warning'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusCanceling'\n defaultMessage='Canceling...'\n />\n </span>\n );\n } else if (job.status === JobStatuses.CANCELED) {\n return (\n <span\n className='JobStatus status-icon-error'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n <FormattedMessage\n id='admin.jobTable.statusCanceled'\n defaultMessage='Canceled'\n />\n </span>\n );\n }\n\n return (\n <span\n className='JobStatus'\n title={intl.formatMessage({id: 'admin.jobTable.jobId', defaultMessage: 'Job ID: '}) + job.id}\n >\n {job.status}\n </span>\n );\n});\n\nexport default JobStatus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Job, JobType} from '@mattermost/types/jobs';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {JobTypes} from 'utils/constants';\n\nimport JobCancelButton from './job_cancel_button';\nimport JobDownloadLink from './job_download_link';\nimport JobFinishAt from './job_finish_at';\nimport JobRunLength from './job_run_length';\nimport JobStatus from './job_status';\n\nimport './table.scss';\n\nexport type Props = {\n jobs: Job[];\n getExtraInfoText?: (job: Job) => React.ReactNode;\n disabled: boolean;\n createJobHelpText: React.ReactElement;\n jobType: JobType;\n downloadExportResults?: boolean;\n className?: string;\n hideJobCreateButton?: boolean;\n createJobButtonText: React.ReactNode;\n hideTable?: boolean;\n jobData?: any;\n actions: {\n getJobsByType: (jobType: JobType) => void;\n cancelJob: (jobId: string) => Promise<ActionResult>;\n createJob: (job: {type: JobType}) => Promise<ActionResult>;\n };\n}\n\nclass JobTable extends React.PureComponent<Props> {\n interval: ReturnType<typeof setInterval>|null = null;\n\n componentDidMount() {\n this.props.actions.getJobsByType(this.props.jobType);\n this.interval = setInterval(this.reload, 15000);\n }\n\n componentWillUnmount() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n getExtraInfoText = (job: Job) => {\n if (job.data && job.data.error && job.data.error.length > 0) {\n return <span title={job.data.error}>{job.data.error}</span>;\n }\n\n if (this.props.getExtraInfoText) {\n return this.props.getExtraInfoText(job);\n }\n\n return <span/>;\n };\n\n reload = () => {\n this.props.actions.getJobsByType(this.props.jobType);\n };\n\n handleCancelJob = async (jobId: string) => {\n await this.props.actions.cancelJob(jobId);\n this.reload();\n };\n\n handleCreateJob = async (e: React.MouseEvent) => {\n e.preventDefault();\n const job = {\n type: this.props.jobType,\n data: this.props.jobData,\n };\n\n await this.props.actions.createJob(job);\n this.reload();\n };\n\n render() {\n const showFilesColumn = this.props.jobType === JobTypes.MESSAGE_EXPORT && this.props.downloadExportResults;\n const items = this.props.jobs.map((job) => {\n return (\n <tr\n key={job.id}\n >\n <td className='cancel-button-field whitespace--nowrap text-center'>\n <JobCancelButton\n job={job}\n onClick={this.handleCancelJob}\n disabled={this.props.disabled}\n />\n </td>\n <td className='whitespace--nowrap'><JobStatus job={job}/></td>\n {showFilesColumn &&\n <td className='whitespace--nowrap'><JobDownloadLink job={job}/></td>\n }\n <td className='whitespace--nowrap'>\n <JobFinishAt\n status={job.status}\n millis={job.last_activity_at}\n />\n </td>\n <td className='whitespace--nowrap'><JobRunLength job={job}/></td>\n <td>{this.getExtraInfoText(job)}</td>\n </tr>\n );\n });\n\n return (\n <div className={classNames('JobTable', 'job-table__panel', this.props.className)}>\n <div className='job-table__create-button'>\n {\n !this.props.hideJobCreateButton &&\n <div>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.handleCreateJob}\n disabled={this.props.disabled}\n >\n {this.props.createJobButtonText}\n </button>\n </div>\n }\n <div className='help-text'>\n {this.props.createJobHelpText}\n </div>\n </div>\n {\n !this.props.hideTable &&\n <div className='job-table__table'>\n <table\n className='table'\n data-testid='jobTable'\n >\n <thead>\n <tr>\n <th className='cancel-button-field'/>\n <th>\n <FormattedMessage\n id='admin.jobTable.headerStatus'\n defaultMessage='Status'\n />\n </th>\n {showFilesColumn &&\n <th>\n <FormattedMessage\n id='admin.jobTable.headerFiles'\n defaultMessage='Files'\n />\n </th>\n }\n <th>\n <FormattedMessage\n id='admin.jobTable.headerFinishAt'\n defaultMessage='Finish Time'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.jobTable.headerRunTime'\n defaultMessage='Run Time'\n />\n </th>\n <th colSpan={3}>\n <FormattedMessage\n id='admin.jobTable.headerExtraInfo'\n defaultMessage='Details'\n />\n </th>\n </tr>\n </thead>\n <tbody>\n {items}\n </tbody>\n </table>\n </div>\n }\n </div>\n );\n }\n}\n\nexport default JobTable;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getJobsByType, createJob, cancelJob} from 'mattermost-redux/actions/jobs';\nimport {getConfig} from 'mattermost-redux/selectors/entities/admin';\nimport {makeGetJobsByType} from 'mattermost-redux/selectors/entities/jobs';\n\nimport type {GlobalState} from 'types/store';\n\nimport Table from './table';\nimport type {Props} from './table';\n\ntype OwnProps = Omit<Props, 'actions'|'jobs'|'downloadExportRresults'>;\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n return {\n jobs: makeGetJobsByType(ownProps.jobType)(state),\n downloadExportResults: getConfig(state).MessageExportSettings?.DownloadExportResults,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getJobsByType,\n createJob,\n cancelJob,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Table);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useCallback, useMemo} from 'react';\nimport type {ValueType} from 'react-select';\nimport ReactSelect from 'react-select';\n\nimport FormError from 'components/form_error';\n\nimport Setting from './setting';\n\ninterface Option {\n value: string;\n text: string;\n}\n\ninterface Props {\n id: string;\n values: Option[];\n label: React.ReactNode;\n selected: string[];\n onChange: (id: string, values: string[]) => void;\n disabled?: boolean;\n setByEnv: boolean;\n helpText?: React.ReactNode;\n noResultText?: React.ReactNode;\n}\n\nconst getOptionLabel = ({text}: { text: string}) => text;\n\nconst MultiSelectSetting: React.FC<Props> = ({\n id,\n values,\n label,\n selected,\n onChange,\n disabled = false,\n setByEnv,\n helpText,\n noResultText,\n}) => {\n const [error, setError] = useState(false);\n\n const handleChange = useCallback((newValue: ValueType<Option>) => {\n const updatedValues = newValue ? (newValue as Option[]).map((n) => {\n return n.value;\n }) : [];\n\n onChange(id, updatedValues);\n setError(false);\n }, [id, onChange]);\n\n const valuesMap = useMemo(() => {\n return values.reduce((map, v) => {\n map[v.value] = v;\n return map;\n }, {} as Record<string, Option>);\n }, [values]);\n\n const calculatedValue = useMemo(() => {\n return selected.reduce<Option[]>((result, item) => {\n const found = valuesMap[item];\n if (found) {\n result.push(found);\n }\n return result;\n }, []);\n }, [selected, valuesMap]);\n\n return (\n <Setting\n label={label}\n inputId={id}\n helpText={helpText}\n setByEnv={setByEnv}\n >\n <ReactSelect\n id={id}\n isMulti={true}\n getOptionLabel={getOptionLabel}\n options={values}\n delimiter={','}\n clearable={false}\n isDisabled={disabled || setByEnv}\n noResultsText={noResultText}\n onChange={handleChange}\n value={calculatedValue}\n />\n <FormError error={error}/>\n </Setting>\n );\n};\n\nexport default React.memo(MultiSelectSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Setting from './setting';\n\ninterface Props {\n id: string;\n label: React.ReactNode;\n values: Array<{ text: string; value: string }>;\n value: string;\n setByEnv: boolean;\n disabled?: boolean;\n helpText?: React.ReactNode;\n onChange(id: string, value: any): void;\n}\nconst RadioSetting = ({\n id,\n label,\n values,\n value,\n setByEnv,\n disabled = false,\n helpText,\n onChange,\n}: Props) => {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(id, e.target.value);\n };\n\n const options = values.map(({value: optionValue, text}) => (\n <div\n className='radio'\n key={optionValue}\n >\n <label>\n <input\n type='radio'\n value={optionValue}\n name={id}\n checked={optionValue === value}\n onChange={handleChange}\n disabled={disabled || setByEnv}\n />\n {text}\n </label>\n </div>\n ));\n\n return (\n <Setting\n label={label}\n inputId={id}\n helpText={helpText}\n setByEnv={setByEnv}\n >\n {options}\n </Setting>\n );\n};\n\nexport default React.memo(RadioSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useState} from 'react';\nimport type {FC, MouseEvent} from 'react';\n\nimport Setting from './setting';\nimport type {Props as SettingsProps} from './setting';\n\ntype Props = SettingsProps & {\n id: string;\n label: React.ReactNode;\n helpText?: React.ReactNode;\n removeButtonText: React.ReactNode;\n removingText?: React.ReactNode;\n fileName: string;\n onSubmit: (arg0: string, arg1: () => void) => void;\n disabled?: boolean;\n}\n\nconst RemoveFileSetting: FC<Props> = ({\n id,\n label,\n helpText,\n removeButtonText,\n removingText,\n fileName,\n onSubmit,\n disabled,\n}) => {\n const [removing, setRemoving] = useState(false);\n\n const handleRemove = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n setRemoving(true);\n onSubmit(id, () => {\n setRemoving(false);\n });\n }, [id, onSubmit]);\n\n return (\n <Setting\n label={label}\n helpText={helpText}\n inputId={id}\n >\n <div>\n <div className='help-text remove-filename'>\n {fileName}\n </div>\n <button\n type='button'\n className='btn btn-danger'\n onClick={handleRemove}\n disabled={disabled}\n >\n {removing && (\n <>\n <span className='glyphicon glyphicon-refresh glyphicon-refresh-animate'/>\n {removingText}\n </>)}\n {!removing && removeButtonText}\n </button>\n </div>\n </Setting>\n );\n};\n\nexport default memo(RemoveFileSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport SuccessIcon from 'components/widgets/icons/fa_success_icon';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\n/**\n * A button which, when clicked, performs an action and displays\n * its outcome as either success, or failure accompanied by the\n * `message` property of the `err` object.\n */\ntype Props = {\n\n /**\n * ID to assign to the form\n */\n id?: string;\n\n /**\n * The action to be called to carry out the request.\n */\n requestAction: (\n success: () => void,\n error: (error: {message: string; detailed_error?: string}) => void\n ) => void;\n\n /**\n * A component that displays help text for the request button.\n *\n * Typically, this will be a <FormattedMessage />.\n */\n helpText?: React.ReactNode;\n\n /**\n * A component to be displayed on the button.\n *\n * Typically, this will be a <FormattedMessage />\n */\n loadingText?: React.ReactNode;\n\n /**\n * A component to be displayed on the button.\n *\n * Typically, this will be a <FormattedMessage />\n */\n buttonText: React.ReactNode;\n\n /**\n * The element to display as the field label.\n *\n * Typically, this will be a <FormattedMessage />\n */\n label?: React.ReactNode;\n\n /**\n * True if the button form control should be disabled, otherwise false.\n */\n disabled?: boolean;\n\n /**\n * True if the config needs to be saved before running the request, otherwise false.\n *\n * If set to true, the action provided in the `saveConfigAction` property will be\n * called before the action provided in the `requestAction` property, with the later\n * only being called if the former is successful.\n */\n saveNeeded?: boolean;\n\n /**\n * Action to be called to save the config, if saveNeeded is set to true.\n */\n saveConfigAction?: (callback: () => void) => void;\n\n /**\n * True if the success message should be shown when the request completes successfully,\n * otherwise false.\n */\n showSuccessMessage?: boolean;\n\n /**\n * The message to show when the request completes successfully.\n */\n successMessage: string | MessageDescriptor;\n\n /**\n * The message to show when the request returns an error.\n */\n errorMessage: string | MessageDescriptor;\n\n /**\n * True if the {error} placeholder for the `errorMessage` property should include both\n * the `message` and `detailed_error` properties of the error returned from the server,\n * otherwise false to include only the `message` property.\n */\n includeDetailedError?: boolean;\n\n /**\n * An element to display adjacent to the request button.\n */\n alternativeActionElement?: React.ReactNode;\n};\n\ntype State = {\n busy: boolean;\n fail: string;\n success: boolean;\n}\n\nexport default class RequestButton extends React.PureComponent<Props, State> {\n static defaultProps: Partial<Props> = {\n disabled: false,\n saveNeeded: false,\n showSuccessMessage: true,\n includeDetailedError: false,\n successMessage: defineMessage({\n id: 'admin.requestButton.requestSuccess',\n defaultMessage: 'Test Successful',\n }),\n errorMessage: defineMessage({\n id: 'admin.requestButton.requestFailure',\n defaultMessage: 'Test Failure: {error}',\n }),\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n busy: false,\n fail: '',\n success: false,\n };\n }\n\n handleRequest = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n this.setState({\n busy: true,\n fail: '',\n success: false,\n });\n\n const doRequest = () => this.props.requestAction(\n () => {\n this.setState({\n busy: false,\n success: true,\n });\n },\n (err) => {\n let errMsg = err.message;\n if (this.props.includeDetailedError && err.detailed_error) {\n errMsg += ' - ' + err.detailed_error;\n }\n\n this.setState({\n busy: false,\n fail: errMsg,\n });\n },\n );\n\n if (this.props.saveNeeded && this.props.saveConfigAction) {\n this.props.saveConfigAction(doRequest);\n } else {\n doRequest();\n }\n };\n\n render() {\n let message = null;\n if (this.state.fail) {\n const text = typeof this.props.errorMessage === 'string' ?\n this.props.errorMessage :\n (\n <FormattedMessage\n {...this.props.errorMessage}\n values={{\n error: this.state.fail,\n }}\n />\n );\n message = (\n <div>\n <div className='alert alert-warning'>\n <WarningIcon/>\n {text}\n </div>\n </div>\n );\n } else if (this.state.success && this.props.showSuccessMessage) {\n const text = typeof this.props.successMessage === 'string' ?\n this.props.successMessage :\n (<FormattedMessage {...this.props.successMessage}/>);\n message = (\n <div>\n <div className='alert alert-success'>\n <SuccessIcon/>\n {text}\n </div>\n </div>\n );\n }\n\n let widgetClassNames = 'col-sm-8';\n let label = null;\n if (this.props.label) {\n label = (\n <label className='control-label col-sm-4'>\n {this.props.label}\n </label>\n );\n } else {\n widgetClassNames = 'col-sm-offset-4 ' + widgetClassNames;\n }\n\n return (\n <div\n className='form-group'\n id={this.props.id}\n >\n {label}\n <div className={widgetClassNames}>\n <div>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.handleRequest}\n disabled={this.props.disabled}\n >\n <LoadingWrapper\n loading={this.state.busy}\n text={\n this.props.loadingText ||\n (\n <FormattedMessage\n id={'admin.requestButton.loading'}\n defaultMessage={'Loading...'}\n />\n )\n }\n >\n {this.props.buttonText}\n </LoadingWrapper>\n </button>\n {this.props.alternativeActionElement}\n {message}\n </div>\n <div className='help-text'>{this.props.helpText}</div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport marked from 'marked';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage, {CustomRenderer} from 'components/formatted_markdown_message';\n\ntype Props = {\n isMarkdown?: boolean;\n text: string | MessageDescriptor | JSX.Element;\n textValues?: Record<string, string | (() => React.ReactNode)>;\n}\n\nconst SchemaText = ({\n isMarkdown,\n text,\n textValues,\n}: Props) => {\n if (typeof text === 'string') {\n if (isMarkdown) {\n const html = marked(text, {\n breaks: true,\n sanitize: true,\n renderer: new CustomRenderer(),\n });\n\n return <span dangerouslySetInnerHTML={{__html: html}}/>;\n }\n\n return <span>{text}</span>;\n }\n\n if ('id' in text) {\n if (isMarkdown) {\n return (\n <FormattedMarkdownMessage\n {...text}\n values={textValues}\n />\n );\n }\n\n return (\n <FormattedMessage\n {...text}\n values={textValues}\n />\n );\n }\n\n return text as JSX.Element;\n};\n\nexport default SchemaText;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\ntype Props = {\n id?: string;\n show?: boolean;\n header?: React.ReactNode;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n children?: React.ReactNode;\n container?: boolean;\n};\n\nconst SettingsGroup = ({\n show = true,\n container = true,\n header,\n title,\n subtitle,\n children,\n}: Props) => {\n let wrapperClass = '';\n let contentClass = '';\n\n if (!show) {\n return null;\n }\n\n if (container) {\n wrapperClass = 'admin-console__wrapper';\n contentClass = 'admin-console__content';\n }\n\n let sectionTitle = null;\n if (!header && title) {\n sectionTitle = <div className={'section-title'}>{title}</div>;\n }\n\n let sectionSubtitle = null;\n if (!header && subtitle) {\n sectionSubtitle = (\n <div className={'section-subtitle'}>{subtitle}</div>\n );\n }\n\n let sectionHeader = null;\n if (sectionTitle || sectionSubtitle) {\n sectionHeader = (\n <div className={'section-header'}>\n {sectionTitle}\n {sectionSubtitle}\n </div>\n );\n }\n\n return (\n <div className={wrapperClass}>\n <div className={contentClass}>\n {header ? <h4>{header}</h4> : null}\n {sectionHeader}\n {children}\n </div>\n </div>\n );\n};\n\nexport default memo(SettingsGroup);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport TextSetting from 'components/widgets/settings/text_setting';\nimport type {Props as WidgetTextSettingProps} from 'components/widgets/settings/text_setting';\n\nimport SetByEnv from './set_by_env';\n\ninterface Props extends Omit<WidgetTextSettingProps, 'placeholder'> {\n setByEnv: boolean;\n disabled?: boolean;\n placeholder?: string | MessageDescriptor;\n}\n\nconst AdminTextSetting: React.FunctionComponent<Props> = (props: Props): JSX.Element => {\n const {setByEnv, disabled, footer, placeholder, ...sharedProps} = props;\n const isTextDisabled = disabled || setByEnv;\n const intl = useIntl();\n\n let placeholderToUse;\n if (placeholder) {\n if (typeof placeholder === 'string') {\n placeholderToUse = placeholder;\n } else {\n placeholderToUse = intl.formatMessage(placeholder);\n }\n }\n\n return (\n <TextSetting\n {...sharedProps}\n labelClassName='col-sm-4'\n inputClassName='col-sm-8'\n disabled={isTextDisabled}\n footer={setByEnv ? <SetByEnv/> : footer}\n placeholder={placeholderToUse}\n />\n );\n};\n\nexport default AdminTextSetting;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useRef} from 'react';\n\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport Setting from 'components/admin_console/setting';\nimport GenericUserProvider from 'components/suggestion/generic_user_provider';\nimport SuggestionBox from 'components/suggestion/suggestion_box';\nimport SuggestionList from 'components/suggestion/suggestion_list';\n\nexport type Props = {\n id: string;\n label: string;\n placeholder: string;\n helpText: React.ReactNode;\n value: string;\n onChange: (id: string, value: string) => void;\n disabled: boolean;\n actions: {\n autocompleteUsers: (username: string) => Promise<UserAutocomplete>;\n };\n}\n\nconst UserAutocompleteSetting = ({id, label, placeholder, helpText, value, onChange, disabled, actions}: Props) => {\n const userSuggestionProvidersRef = useRef([new GenericUserProvider(actions.autocompleteUsers)]);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(id, e.target.value);\n }, [onChange, id]);\n\n const handleUserSelected = useCallback((user: UserProfile) => {\n onChange(id, user.username);\n }, [id, onChange]);\n\n return (\n <Setting\n label={label}\n helpText={helpText}\n inputId={id}\n >\n <div\n className='admin-setting-user__dropdown'\n >\n <SuggestionBox\n id={'admin_user_setting_' + id}\n className='form-control'\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n onItemSelected={handleUserSelected}\n listComponent={SuggestionList}\n listPosition='bottom'\n providers={userSuggestionProvidersRef.current}\n disabled={disabled}\n requiredCharacters={0}\n openOnFocus={true}\n />\n </div>\n </Setting>\n );\n};\n\nexport default UserAutocompleteSetting;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {autocompleteUsers} from 'actions/user_actions';\n\nimport UserAutocompleteSetting from './user_autocomplete_setting';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n autocompleteUsers,\n }, dispatch),\n };\n}\nexport default connect(null, mapDispatchToProps)(UserAutocompleteSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode} from 'react';\n\ntype Props = {\n withBackButton?: boolean;\n children: ReactNode;\n};\n\nconst AdminHeader = (props: Props) => {\n return (\n <div\n className={\n classNames(\n 'admin-console__header',\n {'with-back': props.withBackButton},\n )\n }\n >\n {props.children}\n </div>\n );\n};\n\nexport default AdminHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Role} from '@mattermost/types/roles';\n\nimport {Permissions} from 'mattermost-redux/constants/index';\n\nconst trueString = 'true';\nconst falseString = 'false';\n\nconst MAPPING = {\n enableTeamCreation: {\n [trueString]: [{roleName: 'system_user', permission: Permissions.CREATE_TEAM, shouldHave: true}],\n [falseString]: [{roleName: 'system_user', permission: Permissions.CREATE_TEAM, shouldHave: false}],\n },\n\n editOthersPosts: {\n [trueString]: [\n {roleName: 'system_admin', permission: Permissions.EDIT_OTHERS_POSTS, shouldHave: true},\n {roleName: 'team_admin', permission: Permissions.EDIT_OTHERS_POSTS, shouldHave: true},\n ],\n [falseString]: [\n {roleName: 'team_admin', permission: Permissions.EDIT_OTHERS_POSTS, shouldHave: false},\n {roleName: 'system_admin', permission: Permissions.EDIT_OTHERS_POSTS, shouldHave: true},\n ],\n },\n\n enableOnlyAdminIntegrations: {\n [trueString]: [\n {roleName: 'team_user', permission: Permissions.MANAGE_INCOMING_WEBHOOKS, shouldHave: false},\n {roleName: 'team_user', permission: Permissions.MANAGE_OUTGOING_WEBHOOKS, shouldHave: false},\n {roleName: 'team_user', permission: Permissions.MANAGE_SLASH_COMMANDS, shouldHave: false},\n {roleName: 'system_user', permission: Permissions.MANAGE_OAUTH, shouldHave: false},\n ],\n [falseString]: [\n {roleName: 'team_user', permission: Permissions.MANAGE_INCOMING_WEBHOOKS, shouldHave: true},\n {roleName: 'team_user', permission: Permissions.MANAGE_OUTGOING_WEBHOOKS, shouldHave: true},\n {roleName: 'team_user', permission: Permissions.MANAGE_SLASH_COMMANDS, shouldHave: true},\n {roleName: 'system_user', permission: Permissions.MANAGE_OAUTH, shouldHave: true},\n ],\n },\n};\ntype MappingKeyTypes = 'enableTeamCreation' | 'editOthersPosts' | 'enableOnlyAdminIntegrations';\ntype MappingValueTypes = {roleName: string;\n permission: string;\n shouldHave: boolean;\n};\n\n/**\n * Get the roles that were changed (but unsaved) for given mapping key/values.\n *\n * @param {object} mappingValues key/value to indicate which mapping items to use to update the roles.\n * @param {object} roles same structure as returned by mattermost-redux `getRoles`.\n * @return {object} the updated roles (only) in the same structure as returned by mattermost-redux `getRoles`.\n */\nexport function rolesFromMapping(mappingValues: Record<string, string>, roles: Record<string, Role>): Record<string, Role> {\n const rolesClone: Record<string, Role> = JSON.parse(JSON.stringify(roles));\n\n // Purge roles that aren't present in MAPPING, we don't care about them.\n purgeNonPertinentRoles(rolesClone);\n\n Object.keys(MAPPING).forEach((mappingKey) => {\n const value = mappingValues[mappingKey];\n if (value) {\n mutateRolesBasedOnMapping(mappingKey as MappingKeyTypes, value as any, rolesClone);\n }\n });\n\n // Purge roles that didn't have permissions changes, we don't care about them.\n Object.entries(rolesClone).forEach(([roleName, roleClone]) => {\n const originalPermissionSet = new Set(roles[roleName].permissions);\n const newPermissionSet = new Set(roleClone.permissions);\n const difference = [...newPermissionSet].filter((x) => !originalPermissionSet.has(x));\n\n if (originalPermissionSet.size === newPermissionSet.size && difference.length === 0) {\n delete rolesClone[roleName];\n }\n });\n\n return rolesClone;\n}\n\n/**\n * Get the mapping value that matches for a given set of roles.\n *\n * @param {string} key to match under in the mapping.\n * @param {object} roles same structure as returned by mattermost-redux `getRoles`.\n * @return {string} the value that the roles/permissions assignment match in the mapping.\n */\nexport function mappingValueFromRoles(key: MappingKeyTypes, roles: Record<string, Role>): string {\n for (const o of mappingPartIterator(MAPPING[key], roles)) {\n if (o.allConditionsAreMet) {\n return o.value;\n }\n }\n throw new Error(`No matching mapping value found for key '${key}' with the given roles.`);\n}\n\nfunction purgeNonPertinentRoles(roles: Record<string, Role>) {\n const pertinentRoleNames = roleNamesInMapping();\n\n Object.keys(roles).forEach((key) => {\n if (!pertinentRoleNames.includes(key)) {\n delete roles[key];\n }\n });\n}\n\nfunction mutateRolesBasedOnMapping(mappingKey: MappingKeyTypes, value: 'true' | 'false', roles: Record<string, Role>) {\n const roleRules = MAPPING[mappingKey][value];\n\n if (typeof roleRules === 'undefined') {\n throw new Error(`Value '${value}' not present in MAPPING for key '${mappingKey}'.`);\n }\n\n roleRules.forEach((item) => {\n const role = roles[item.roleName];\n if (item.shouldHave) {\n addPermissionToRole(item.permission, role);\n } else {\n removePermissionFromRole(item.permission, role);\n }\n });\n}\n\n// Returns a set of the role names present in MAPPING.\nfunction roleNamesInMapping() {\n let roleNames: string[] = [];\n\n Object.values(MAPPING).forEach((v1) => {\n Object.values(v1).forEach((v2) => {\n const names = v2.map((item) => item.roleName);\n roleNames = roleNames.concat(names);\n });\n });\n\n return [...new Set(roleNames.map((item) => item))];\n}\n\nfunction* mappingPartIterator(mappingPart: Record<string, MappingValueTypes[]>, roles: Record<string, Role>) {\n for (const value in mappingPart) {\n if (Object.hasOwn(mappingPart, value)) {\n const roleRules = mappingPart[value];\n\n const hasUnmetCondition = roleRules.some((item: MappingValueTypes) => {\n const role = roles[item.roleName];\n return (item.shouldHave && !role.permissions.includes(item.permission)) || (!item.shouldHave && role.permissions.includes(item.permission));\n });\n\n yield {value, allConditionsAreMet: !hasUnmetCondition};\n }\n }\n}\n\nfunction addPermissionToRole(permission: string, role: Role) {\n if (!role.permissions.includes(permission)) {\n role.permissions.push(permission);\n }\n}\n\nfunction removePermissionFromRole(permission: string, role: Role) {\n const permissionIndex = role.permissions.indexOf(permission);\n if (permissionIndex !== -1) {\n role.permissions.splice(permissionIndex, 1);\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape, MessageDescriptor, WrappedComponentProps} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {CloudState} from '@mattermost/types/cloud';\nimport type {AdminConfig, ClientLicense, EnvironmentConfig} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BooleanSetting from 'components/admin_console/boolean_setting';\nimport ColorSetting from 'components/admin_console/color_setting';\nimport DropdownSetting from 'components/admin_console/dropdown_setting';\nimport FileUploadSetting from 'components/admin_console/file_upload_setting';\nimport GeneratedSetting from 'components/admin_console/generated_setting';\nimport JobsTable from 'components/admin_console/jobs';\nimport MultiSelectSetting from 'components/admin_console/multiselect_settings';\nimport RadioSetting from 'components/admin_console/radio_setting';\nimport RemoveFileSetting from 'components/admin_console/remove_file_setting';\nimport RequestButton from 'components/admin_console/request_button/request_button';\nimport SchemaText from 'components/admin_console/schema_text';\nimport SettingsGroup from 'components/admin_console/settings_group';\nimport TextSetting from 'components/admin_console/text_setting';\nimport UserAutocompleteSetting from 'components/admin_console/user_autocomplete_setting';\nimport FormError from 'components/form_error';\nimport Markdown from 'components/markdown';\nimport SaveButton from 'components/save_button';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport * as I18n from 'i18n/i18n.jsx';\nimport Constants from 'utils/constants';\nimport {mappingValueFromRoles, rolesFromMapping} from 'utils/policy_roles_adapter';\n\nimport Setting from './setting';\nimport type {AdminDefinitionSetting, AdminDefinitionSettingBanner, AdminDefinitionSettingDropdownOption, AdminDefinitionSubSectionSchema, ConsoleAccess} from './types';\n\nimport './schema_admin_settings.scss';\n\nconst emptyList: string[] = [];\n\ntype Props = {\n config: Partial<AdminConfig>;\n environmentConfig: Partial<EnvironmentConfig>;\n setNavigationBlocked: (blocked: boolean) => void;\n schema: AdminDefinitionSubSectionSchema | null;\n roles: Record<string, Role>;\n license: ClientLicense;\n editRole: (role: Role) => void;\n patchConfig: (config: DeepPartial<AdminConfig>) => Promise<ActionResult>;\n isDisabled: boolean;\n consoleAccess: ConsoleAccess;\n cloud: CloudState;\n isCurrentUserSystemAdmin: boolean;\n enterpriseReady: boolean;\n} & WrappedComponentProps\n\ntype State = {\n [x: string]: any;\n saveNeeded: false | 'both' | 'permissions' | 'config';\n saving: boolean;\n serverError: null;\n customComponentWrapperClass: string;\n confirmNeededId: string;\n showConfirmId: string;\n clientWarning: string;\n prevSchemaId?: string;\n}\n\n// Some path parts may contain periods (e.g. plugin ids), but path walking the configuration\n// relies on splitting by periods. Use this pair of functions to allow such path parts.\n//\n// It is assumed that no path contains the symbol '+'.\nexport function escapePathPart(pathPart: string) {\n return pathPart.replace(/\\./g, '+');\n}\n\nexport function unescapePathPart(pathPart: string) {\n return pathPart.replace(/\\+/g, '.');\n}\n\nfunction descriptorOrStringToString(text: string | MessageDescriptor | undefined, intl: IntlShape, values?: {[key: string]: any}): string | undefined {\n if (!text) {\n return undefined;\n }\n\n return typeof text === 'string' ? text : intl.formatMessage(text, values);\n}\n\nexport class SchemaAdminSettings extends React.PureComponent<Props, State> {\n private isPlugin: boolean;\n private saveActions: Array<() => Promise<{error?: {message?: string}}>>;\n private buildSettingFunctions: {[x: string]: (setting: any) => JSX.Element};\n\n constructor(props: Props) {\n super(props);\n this.isPlugin = false;\n\n this.saveActions = [];\n\n this.buildSettingFunctions = {\n [Constants.SettingsTypes.TYPE_TEXT]: this.buildTextSetting,\n [Constants.SettingsTypes.TYPE_LONG_TEXT]: this.buildTextSetting,\n [Constants.SettingsTypes.TYPE_NUMBER]: this.buildTextSetting,\n [Constants.SettingsTypes.TYPE_COLOR]: this.buildColorSetting,\n [Constants.SettingsTypes.TYPE_BOOL]: this.buildBoolSetting,\n [Constants.SettingsTypes.TYPE_PERMISSION]: this.buildPermissionSetting,\n [Constants.SettingsTypes.TYPE_DROPDOWN]: this.buildDropdownSetting,\n [Constants.SettingsTypes.TYPE_RADIO]: this.buildRadioSetting,\n [Constants.SettingsTypes.TYPE_BANNER]: this.buildBannerSetting,\n [Constants.SettingsTypes.TYPE_GENERATED]: this.buildGeneratedSetting,\n [Constants.SettingsTypes.TYPE_USERNAME]: this.buildUsernameSetting,\n [Constants.SettingsTypes.TYPE_BUTTON]: this.buildButtonSetting,\n [Constants.SettingsTypes.TYPE_LANGUAGE]: this.buildLanguageSetting,\n [Constants.SettingsTypes.TYPE_JOBSTABLE]: this.buildJobsTableSetting,\n [Constants.SettingsTypes.TYPE_FILE_UPLOAD]: this.buildFileUploadSetting,\n [Constants.SettingsTypes.TYPE_ROLES]: this.buildRolesSetting,\n [Constants.SettingsTypes.TYPE_CUSTOM]: this.buildCustomSetting,\n };\n this.state = {\n saveNeeded: false,\n saving: false,\n serverError: null,\n customComponentWrapperClass: '',\n confirmNeededId: '',\n showConfirmId: '',\n clientWarning: '',\n };\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.schema && props.schema.id !== state.prevSchemaId) {\n return {\n prevSchemaId: props.schema.id,\n saveNeeded: false,\n saving: false,\n serverError: null,\n ...SchemaAdminSettings.getStateFromConfig(props.config, props.schema, props.roles),\n };\n }\n return null;\n }\n\n handleSubmit = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent> | React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (this.state.confirmNeededId) {\n this.setState({\n showConfirmId: this.state.confirmNeededId,\n });\n return;\n }\n\n this.setState({\n saving: true,\n serverError: null,\n });\n\n if (this.state.saveNeeded === 'both' || this.state.saveNeeded === 'permissions') {\n const settings = (this.props.schema && 'settings' in this.props.schema && this.props.schema.settings) || [];\n const rolesBinding = settings.reduce<Record<string, string>>((acc, val) => {\n if (val.type === Constants.SettingsTypes.TYPE_PERMISSION) {\n acc[val.permissions_mapping_name] = this.state[val.key].toString();\n }\n return acc;\n }, {});\n const updatedRoles = rolesFromMapping(rolesBinding, this.props.roles);\n\n let success = true;\n\n await Promise.all(Object.values(updatedRoles).map(async (item) => {\n try {\n await this.props.editRole(item);\n } catch (err) {\n success = false;\n this.setState({\n saving: false,\n serverError: err.message,\n });\n }\n }));\n\n if (!success) {\n return;\n }\n }\n\n if (this.state.saveNeeded === 'both' || this.state.saveNeeded === 'config') {\n this.doSubmit(SchemaAdminSettings.getStateFromConfig);\n } else {\n this.setState({\n saving: false,\n saveNeeded: false,\n serverError: null,\n });\n this.props.setNavigationBlocked(false);\n }\n };\n\n getConfigFromState(config: Partial<AdminConfig>) {\n const schema = this.props.schema;\n\n if (schema) {\n let settings: AdminDefinitionSetting[] = [];\n\n if ('settings' in schema && schema.settings) {\n settings = schema.settings;\n } else if ('sections' in schema && schema.sections) {\n schema.sections.map((section) => section.settings).forEach((sectionSettings) => settings.push(...sectionSettings));\n }\n\n settings.forEach((setting) => {\n if (!setting.key) {\n return;\n }\n\n if (setting.type === Constants.SettingsTypes.TYPE_PERMISSION) {\n this.setConfigValue(config, setting.key, null);\n return;\n }\n\n let value = this.getSettingValue(setting);\n const previousValue = SchemaAdminSettings.getConfigValue(config, setting.key);\n\n if ('onConfigSave' in setting && setting.onConfigSave) {\n value = setting.onConfigSave(value, previousValue);\n }\n\n this.setConfigValue(config, setting.key, value);\n });\n\n if ('onConfigSave' in schema && schema.onConfigSave) {\n return schema.onConfigSave(config);\n }\n }\n\n return config;\n }\n\n static getStateFromConfig(config: Partial<AdminConfig>, schema: AdminDefinitionSubSectionSchema, roles?: Record<string, Role>) {\n let state: Partial<State> = {};\n\n if (schema) {\n let settings: AdminDefinitionSetting[] = [];\n\n if ('settings' in schema && schema.settings) {\n settings = schema.settings;\n } else if ('sections' in schema && schema.sections) {\n schema.sections.map((section) => section.settings).forEach((sectionSettings) => settings.push(...sectionSettings));\n }\n\n settings.forEach((setting) => {\n if (!setting.key) {\n return;\n }\n\n if (setting.type === Constants.SettingsTypes.TYPE_PERMISSION) {\n try {\n state[setting.key] = mappingValueFromRoles(setting.permissions_mapping_name, roles!) === 'true';\n } catch (e) {\n state[setting.key] = false;\n }\n return;\n }\n\n let value = SchemaAdminSettings.getConfigValue(config, setting.key);\n\n if ('onConfigLoad' in setting && setting.onConfigLoad) {\n value = setting.onConfigLoad(value, config);\n }\n\n state[setting.key] = value == null ? undefined : value;\n });\n\n if ('onConfigLoad' in schema && schema.onConfigLoad) {\n state = {...state, ...schema.onConfigLoad(config)};\n }\n }\n\n return state;\n }\n\n getSetting(key: string) {\n if (!this.props.schema) {\n return null;\n }\n\n if ('settings' in this.props.schema && this.props.schema.settings) {\n for (const setting of this.props.schema.settings) {\n if (setting.key === key) {\n return setting;\n }\n }\n }\n\n return null;\n }\n\n getSettingValue(setting: AdminDefinitionSetting) {\n // Force boolean values to false when disabled.\n if (setting.type === Constants.SettingsTypes.TYPE_BOOL) {\n if (this.isDisabled(setting)) {\n return false;\n }\n }\n if (!setting.key) {\n return undefined;\n }\n\n if (setting.type === Constants.SettingsTypes.TYPE_TEXT && setting.dynamic_value) {\n return setting.dynamic_value(this.state[setting.key], this.props.config, this.state);\n }\n\n return this.state[setting.key];\n }\n\n renderTitle = () => {\n if (!this.props.schema) {\n return '';\n }\n\n let name: string | MessageDescriptor = this.props.schema.id;\n if (('name' in this.props.schema)) {\n name = this.props.schema.name;\n }\n\n if (typeof name === 'string') {\n return (\n <AdminHeader>\n {name}\n </AdminHeader>\n );\n }\n\n return (\n <AdminHeader>\n <FormattedMessage\n {...name}\n />\n </AdminHeader>\n );\n };\n\n renderBanner = (setting: AdminDefinitionSettingBanner) => {\n if (!this.props.schema || !('label' in setting)) {\n return <span>{''}</span>;\n }\n\n if (typeof setting.label === 'string') {\n if (setting.label_markdown) {\n return (<Markdown message={setting.label}/>);\n }\n return <span>{setting.label}</span>;\n }\n\n return (\n <FormattedMessage\n {...setting.label}\n values={setting.label_values}\n />\n );\n };\n\n renderSettingHelpText = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || setting.type === 'banner' || !setting.help_text) {\n return <span>{''}</span>;\n }\n\n let helpText;\n let isMarkdown;\n let helpTextValues;\n if ('disabled_help_text' in setting && setting.disabled_help_text && this.isDisabled(setting)) {\n helpText = setting.disabled_help_text;\n isMarkdown = setting.disabled_help_text_markdown;\n helpTextValues = setting.disabled_help_text_values;\n } else {\n helpText = setting.help_text;\n isMarkdown = setting.help_text_markdown;\n helpTextValues = setting.help_text_values;\n }\n\n return (\n <SchemaText\n isMarkdown={isMarkdown}\n text={helpText}\n textValues={helpTextValues}\n />\n );\n };\n\n renderDropdownOptionHelpText = (option: AdminDefinitionSettingDropdownOption) => {\n if (!option.help_text) {\n return <span>{''}</span>;\n }\n\n return (\n <SchemaText\n isMarkdown={option.help_text_markdown}\n text={option.help_text}\n textValues={option.help_text_values}\n />\n );\n };\n\n renderLabel = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.label) {\n return '';\n }\n\n if (typeof setting.label === 'string') {\n return setting.label;\n }\n\n return this.props.intl.formatMessage(setting.label);\n };\n\n isDisabled = (setting: AdminDefinitionSetting) => {\n if (typeof setting.isDisabled === 'function') {\n return setting.isDisabled(this.props.config, this.state, this.props.license, this.props.enterpriseReady, this.props.consoleAccess, this.props.cloud, this.props.isCurrentUserSystemAdmin);\n }\n return Boolean(setting.isDisabled);\n };\n\n isHidden = (setting: AdminDefinitionSetting) => {\n if (typeof setting.isHidden === 'function') {\n return setting.isHidden(this.props.config, this.state, this.props.license);\n }\n return Boolean(setting.isHidden);\n };\n\n buildButtonSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || setting.type !== 'button') {\n return (<></>);\n }\n\n const handleRequestAction = (success: () => void, error: (error: {message: string}) => void) => {\n if (!setting.skipSaveNeeded && this.state.saveNeeded !== false) {\n error({\n message: this.props.intl.formatMessage({id: 'admin_settings.save_unsaved_changes', defaultMessage: 'Please save unsaved changes first'}),\n });\n return;\n }\n const successCallback = (data: any) => {\n const metadata = new Map(Object.entries(data));\n const settings = (this.props.schema && 'settings' in this.props.schema && this.props.schema.settings) || [];\n settings.forEach((tsetting) => {\n if (tsetting.key && 'setFromMetadataField' in tsetting && tsetting.setFromMetadataField) {\n const inputData = metadata.get(tsetting.setFromMetadataField);\n\n if (tsetting.type === Constants.SettingsTypes.TYPE_TEXT) {\n this.setState({[tsetting.key]: inputData, [`${tsetting.key}Error`]: null});\n } else if (tsetting.type === Constants.SettingsTypes.TYPE_FILE_UPLOAD) {\n if (this.buildSettingFunctions[tsetting.type] && this.buildSettingFunctions[tsetting.type](tsetting)?.props.onSetData) {\n this.buildSettingFunctions[tsetting.type](tsetting)?.props.onSetData(tsetting.key, inputData);\n }\n }\n }\n });\n\n if (success && typeof success === 'function') {\n success();\n }\n };\n\n let sourceUrlKey = 'ServiceSettings.SiteURL';\n if (setting.sourceUrlKey) {\n sourceUrlKey = setting.sourceUrlKey;\n }\n\n setting.action(successCallback, error, this.state[sourceUrlKey]);\n };\n\n return (\n <RequestButton\n id={setting.key}\n key={this.props.schema.id + '_text_' + setting.key}\n requestAction={handleRequestAction}\n helpText={this.renderSettingHelpText(setting)}\n loadingText={descriptorOrStringToString(setting.loading, this.props.intl)}\n buttonText={<span>{this.renderLabel(setting)}</span>}\n showSuccessMessage={Boolean(setting.success_message)}\n includeDetailedError={true}\n disabled={this.isDisabled(setting)}\n errorMessage={setting.error_message}\n successMessage={setting.success_message}\n />\n );\n };\n\n buildTextSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || (setting.type !== 'text' && setting.type !== 'longtext' && setting.type !== 'number')) {\n return (<></>);\n }\n\n let inputType: 'text' | 'number' | 'textarea' = 'text';\n if (setting.type === Constants.SettingsTypes.TYPE_NUMBER) {\n inputType = 'number';\n } else if (setting.type === Constants.SettingsTypes.TYPE_LONG_TEXT) {\n inputType = 'textarea';\n }\n\n let value = '';\n if (setting.dynamic_value) {\n value = setting.dynamic_value(value, this.props.config, this.state);\n } else if (setting.multiple) {\n value = this.state[setting.key] ? this.state[setting.key].join(',') : '';\n } else {\n value = this.state[setting.key] ?? (setting.default || '');\n }\n\n let footer = null;\n if (setting.validate) {\n const err = setting.validate(value).error(this.props.intl);\n footer = err ? (\n <FormError\n type='backstrage'\n error={err}\n />\n ) : footer;\n }\n\n return (\n <TextSetting\n key={this.props.schema.id + '_text_' + setting.key}\n id={setting.key}\n multiple={setting.multiple}\n type={inputType}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n placeholder={descriptorOrStringToString(setting.placeholder, this.props.intl, setting.placeholder_values)}\n value={value}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n maxLength={setting.max_length}\n footer={footer}\n />\n );\n };\n\n buildColorSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'color') {\n return (<></>);\n }\n return (\n <ColorSetting\n key={this.props.schema.id + '_text_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key] || ''}\n disabled={this.isDisabled(setting)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildBoolSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'bool') {\n return (<></>);\n }\n\n return (\n <BooleanSetting\n key={this.props.schema.id + '_bool_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key] ?? (setting.default || false)}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildPermissionSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'permission') {\n return (<></>);\n }\n\n return (\n <BooleanSetting\n key={this.props.schema.id + '_bool_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key] || false}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handlePermissionChange}\n />\n );\n };\n\n buildDropdownSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'dropdown') {\n return (<></>);\n }\n\n const options: AdminDefinitionSettingDropdownOption[] = [];\n setting.options.forEach((option) => {\n if (!option.isHidden || (typeof option.isHidden === 'function' && !option.isHidden(this.props.config, this.state, this.props.license, this.props.enterpriseReady))) {\n options.push(option);\n }\n });\n\n const values = options.map((o) => ({value: o.value, text: descriptorOrStringToString(o.display_name, this.props.intl)!}));\n const selectedValue = this.state[setting.key] ?? values[0].value;\n\n let selectedOptionForHelpText = null;\n for (const option of options) {\n if (option.help_text && option.value === selectedValue) {\n selectedOptionForHelpText = option;\n break;\n }\n }\n\n // used to hide help in case of cloud-starter and open-id selection to show upgrade notice.\n let hideHelp = false;\n if (setting.isHelpHidden) {\n if (typeof (setting.isHelpHidden) === 'function') {\n hideHelp = setting.isHelpHidden(this.props.config, this.state, this.props.license, this.props.enterpriseReady);\n } else {\n hideHelp = setting.isHelpHidden;\n }\n }\n\n let helpText: string | JSX.Element = '';\n if (!hideHelp) {\n helpText = selectedOptionForHelpText ? this.renderDropdownOptionHelpText(selectedOptionForHelpText) : this.renderSettingHelpText(setting);\n }\n return (\n <DropdownSetting\n key={this.props.schema.id + '_dropdown_' + setting.key}\n id={setting.key}\n values={values}\n label={this.renderLabel(setting)}\n helpText={helpText}\n value={selectedValue}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildRolesSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'roles') {\n return (<></>);\n }\n const {roles} = this.props;\n\n const values = Object.keys(roles).map((r) => {\n return {\n value: roles[r].name,\n text: roles[r].name,\n };\n });\n\n if (setting.multiple) {\n const noResultText = typeof setting.no_result === 'object' ? (\n <FormattedMessage {...setting.no_result}/>\n ) : setting.no_result;\n return (\n <MultiSelectSetting\n key={this.props.schema.id + '_language_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n values={values}\n helpText={this.renderSettingHelpText(setting)}\n selected={(this.state[setting.key] || emptyList)}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n noResultText={noResultText}\n />\n );\n }\n return (\n <DropdownSetting\n key={this.props.schema.id + '_language_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n values={values}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key] ?? values[0].value}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildLanguageSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'language') {\n return (<></>);\n }\n const locales = I18n.getAllLanguages();\n const values: Array<{value: string; text: string; order: number}> = [];\n for (const l of Object.values(locales)) {\n values.push({value: l.value, text: l.name, order: l.order});\n }\n values.sort((a, b) => a.order - b.order);\n\n if (setting.multiple) {\n return (\n <MultiSelectSetting\n key={this.props.schema.id + '_language_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n values={values}\n helpText={this.renderSettingHelpText(setting)}\n selected={(this.state[setting.key] && this.state[setting.key].split(',')) || []}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={(changedId, value) => this.handleChange(changedId, value.join(','))}\n noResultText={descriptorOrStringToString(setting.no_result, this.props.intl)}\n />\n );\n }\n return (\n <DropdownSetting\n key={this.props.schema.id + '_language_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n values={values}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key] ?? values[0].value}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildRadioSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'radio') {\n return (<></>);\n }\n\n const options = setting.options || [];\n const values = options.map((o) => ({value: o.value, text: descriptorOrStringToString(o.display_name, this.props.intl)!}));\n const defaultOption = values.find((v) => v.value === setting.default)?.value || values[0].value;\n\n return (\n <RadioSetting\n key={this.props.schema.id + '_radio_' + setting.key}\n id={setting.key}\n values={values}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key] ?? defaultOption}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildBannerSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || setting.type !== 'banner' || this.isDisabled(setting)) {\n return (<></>);\n }\n\n return (\n <div\n className={'banner ' + setting.banner_type}\n key={this.props.schema.id + '_bool_' + setting.key}\n >\n <div className='banner__content'>\n <span>\n { setting.banner_type === 'warning' ? <WarningIcon additionalClassName='banner__icon'/> : null}\n {this.renderBanner(setting)}\n </span>\n </div>\n </div>\n );\n };\n\n buildGeneratedSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== 'generated') {\n return (<></>);\n }\n\n return (\n <GeneratedSetting\n key={this.props.schema.id + '_generated_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n regenerateHelpText={setting.regenerate_help_text}\n placeholder={descriptorOrStringToString(setting.placeholder, this.props.intl)}\n value={this.state[setting.key] ?? (setting.default || '')}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleGeneratedChange}\n />\n );\n };\n\n handleGeneratedChange = (id: string, s: string) => {\n this.handleChange(id, s.replace(/\\+/g, '-').replace(/\\//g, '_'));\n };\n\n handleChange = (id: string, value: any, confirm = false, doSubmit = false, warning = false) => {\n let saveNeeded: State['saveNeeded'] = this.state.saveNeeded === 'permissions' ? 'both' : 'config';\n\n // Exception: Since OpenId-Custom is treated as feature discovery for Cloud Starter licenses, save button is disabled.\n const isCloudStarter = this.props.license.Cloud === 'true' && this.props.license.SkuShortName === 'starter';\n if (id === 'openidType' && value === 'openid' && isCloudStarter) {\n saveNeeded = false;\n }\n\n const clientWarning = warning === false ? this.state.clientWarning : warning;\n\n let confirmNeededId = confirm ? id : this.state.confirmNeededId;\n if (id === this.state.confirmNeededId && !confirm) {\n confirmNeededId = '';\n }\n\n this.setState({\n saveNeeded,\n confirmNeededId,\n clientWarning,\n [id]: value,\n });\n\n if (doSubmit) {\n this.doSubmit(SchemaAdminSettings.getStateFromConfig);\n }\n\n this.props.setNavigationBlocked(true);\n };\n\n handlePermissionChange = (id: string, value: any) => {\n let saveNeeded = 'permissions';\n if (this.state.saveNeeded === 'config') {\n saveNeeded = 'both';\n }\n this.setState({\n saveNeeded,\n [id]: value,\n });\n\n this.props.setNavigationBlocked(true);\n };\n\n buildUsernameSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !setting.key || setting.type !== Constants.SettingsTypes.TYPE_USERNAME) {\n return (<></>);\n }\n\n return (\n <UserAutocompleteSetting\n key={this.props.schema.id + '_userautocomplete_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n placeholder={setting.placeholder}\n value={this.state[setting.key] ?? (setting.default || '')}\n disabled={this.isDisabled(setting)}\n onChange={this.handleChange}\n />\n );\n };\n\n buildJobsTableSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || setting.type !== 'jobstable') {\n return (<></>);\n }\n\n return (\n <JobsTable\n key={this.props.schema.id + '_jobstable_' + setting.key}\n jobType={setting.job_type}\n getExtraInfoText={setting.render_job}\n disabled={this.isDisabled(setting)}\n createJobButtonText={descriptorOrStringToString(setting.label, this.props.intl)}\n createJobHelpText={this.renderSettingHelpText(setting)}\n />\n );\n };\n\n buildFileUploadSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || setting.type !== 'fileupload' || !setting.key) {\n return (<></>);\n }\n\n if (this.state[setting.key]) {\n const removeFile = (id: string, callback: () => void) => {\n const successCallback = () => {\n this.handleChange(setting.key!, '');\n this.setState({[setting.key!]: null, [`${setting.key}Error`]: null});\n };\n const errorCallback = (error: any) => {\n callback();\n this.setState({[setting.key!]: null, [`${setting.key}Error`]: error.message});\n };\n setting.remove_action(successCallback, errorCallback);\n };\n return (\n <RemoveFileSetting\n id={this.props.schema.id}\n key={this.props.schema.id + '_fileupload_' + setting.key}\n label={this.renderLabel(setting)}\n helpText={descriptorOrStringToString(setting.remove_help_text, this.props.intl)}\n removeButtonText={descriptorOrStringToString(setting.remove_button_text, this.props.intl)}\n removingText={descriptorOrStringToString(setting.removing_text, this.props.intl)}\n fileName={this.state[setting.key]}\n onSubmit={removeFile}\n disabled={this.isDisabled(setting)}\n setByEnv={this.isSetByEnv(setting.key)}\n />\n );\n }\n const uploadFile = (id: string, file: File, callback: (error?: string) => void) => {\n const successCallback = (filename: string) => {\n this.handleChange(id, filename);\n this.setState({[setting.key!]: filename, [`${setting.key}Error`]: null});\n if (callback && typeof callback === 'function') {\n callback();\n }\n };\n const errorCallback = (error: any) => {\n if (callback && typeof callback === 'function') {\n callback(error.message);\n }\n };\n setting.upload_action(file, successCallback, errorCallback);\n };\n\n return (\n <FileUploadSetting\n id={setting.key}\n key={this.props.schema.id + '_fileupload_' + setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n uploadingText={descriptorOrStringToString(setting.uploading_text, this.props.intl)}\n disabled={this.isDisabled(setting)}\n fileType={setting.fileType}\n onSubmit={uploadFile}\n error={this.state.idpCertificateFileError}\n />\n );\n };\n\n buildCustomSetting = (setting: AdminDefinitionSetting) => {\n if (!this.props.schema || !(setting.type === 'custom')) {\n return (<></>);\n }\n\n const CustomComponent = setting.component;\n\n const componentInstance = (\n <CustomComponent\n key={this.props.schema.id + '_custom_' + setting.key}\n id={setting.key}\n label={this.renderLabel(setting)}\n helpText={this.renderSettingHelpText(setting)}\n value={this.state[setting.key]}\n disabled={this.isDisabled(setting)}\n config={this.props.config}\n license={this.props.license}\n setByEnv={this.isSetByEnv(setting.key)}\n onChange={this.handleChange}\n registerSaveAction={this.registerSaveAction}\n setSaveNeeded={this.setSaveNeeded}\n unRegisterSaveAction={this.unRegisterSaveAction}\n cancelSubmit={this.cancelSubmit}\n showConfirm={this.state.showConfirmId === setting.key}\n />);\n\n // Show the plugin custom setting title\n // consistently as other settings with the Setting component\n if (setting.showTitle) {\n return (\n <Setting\n label={setting.label}\n inputId={setting.key}\n helpText={setting.help_text}\n >\n {componentInstance}\n </Setting>\n );\n }\n return componentInstance;\n };\n\n unRegisterSaveAction = (saveAction: () => Promise<{error?: {message?: string}}>) => {\n const indexOfSaveAction = this.saveActions.indexOf(saveAction);\n this.saveActions.splice(indexOfSaveAction, 1);\n };\n\n registerSaveAction = (saveAction: () => Promise<{error?: {message?: string}}>) => {\n this.saveActions.push(saveAction);\n };\n\n setSaveNeeded = () => {\n this.setState({saveNeeded: 'config'});\n this.props.setNavigationBlocked(true);\n };\n\n renderSettings = () => {\n const schema = this.props.schema;\n if (!schema) {\n return null;\n }\n\n if ('settings' in schema && schema.settings) {\n const settingsList: React.ReactNode[] = [];\n if (schema.settings) {\n schema.settings.forEach((setting) => {\n if (this.buildSettingFunctions[setting.type] && !this.isHidden(setting)) {\n settingsList.push(this.buildSettingFunctions[setting.type](setting));\n }\n });\n }\n\n let header;\n if (schema.header) {\n header = (\n <div className='banner'>\n <SchemaText\n text={schema.header}\n isMarkdown={true}\n />\n </div>\n );\n }\n\n let footer;\n if (schema.footer) {\n footer = (\n <div className='banner'>\n <SchemaText\n text={schema.footer}\n isMarkdown={true}\n />\n </div>\n );\n }\n\n return (\n <SettingsGroup container={false}>\n {header}\n {settingsList}\n {footer}\n </SettingsGroup>\n );\n } else if ('sections' in schema && schema.sections) {\n const sections: React.ReactNode[] = [];\n\n schema.sections.forEach((section) => {\n const settingsList: React.ReactNode[] = [];\n if (section.settings) {\n section.settings.forEach((setting) => {\n if (this.buildSettingFunctions[setting.type] && !this.isHidden(setting)) {\n settingsList.push(this.buildSettingFunctions[setting.type](setting));\n }\n });\n }\n\n if (section.component) {\n const CustomComponent = section.component;\n sections.push((\n <CustomComponent\n settingsList={settingsList}\n key={section.key}\n />\n ));\n return;\n }\n\n let header;\n if (section.header) {\n header = (\n <div className='banner'>\n <SchemaText\n text={section.header}\n isMarkdown={true}\n />\n </div>\n );\n }\n\n let footer;\n if (section.footer) {\n footer = (\n <div className='banner'>\n <SchemaText\n text={section.footer}\n isMarkdown={true}\n />\n </div>\n );\n }\n\n // This is a bit of special case since designs for plugin config expect the Enable/Disable setting\n // to be on top and out of the sections.\n if (section.key.startsWith('PluginSettings.PluginStates') && section.key.endsWith('Enable.Section')) {\n sections.push(\n <SettingsGroup\n container={false}\n key={section.key}\n >\n {header}\n {settingsList}\n {footer}\n </SettingsGroup>,\n );\n\n return;\n }\n\n sections.push(\n <div\n className={'config-section'}\n key={section.key}\n >\n <SettingsGroup\n show={true}\n title={section.title}\n subtitle={section.subtitle}\n >\n <div className={'section-body'}>\n {header}\n {settingsList}\n {footer}\n </div>\n </SettingsGroup>\n </div>,\n );\n });\n\n return (\n <div>\n {sections}\n </div>\n );\n }\n\n return null;\n };\n\n doSubmit = async (getStateFromConfig: (config: Partial<AdminConfig>, schema: AdminDefinitionSubSectionSchema, roles?: Record<string, Role>) => Partial<State>) => {\n if (!this.props.schema) {\n return;\n }\n\n // clone config so that we aren't modifying data in the stores\n let config = JSON.parse(JSON.stringify(this.props.config));\n config = this.getConfigFromState(config);\n\n const {error} = await this.props.patchConfig(config);\n if (error) {\n this.setState({\n serverError: error.message,\n serverErrorId: error.id,\n });\n } else {\n this.setState(getStateFromConfig(config, this.props.schema));\n }\n\n const results = [];\n for (const saveAction of this.saveActions) {\n results.push(saveAction());\n }\n\n const hasSaveActionError = await Promise.all(results).then((values) => values.some(((value) => value.error && value.error.message)));\n\n const hasError = this.state.serverError || hasSaveActionError;\n if (hasError) {\n this.setState({saving: false});\n } else {\n this.setState({saving: false, saveNeeded: false, confirmNeededId: '', showConfirmId: '', clientWarning: ''});\n this.props.setNavigationBlocked(false);\n }\n };\n\n cancelSubmit = () => {\n this.setState({\n showConfirmId: '',\n });\n };\n\n static getConfigValue(config: any, path: string) {\n const pathParts = path.split('.');\n\n return pathParts.reduce((obj, pathPart) => {\n if (!obj) {\n return null;\n }\n\n return obj[unescapePathPart(pathPart)];\n }, config);\n }\n\n setConfigValue(config: any, path: string, value: any) {\n function setValue(obj: any, pathParts: string[]) {\n const part = unescapePathPart(pathParts[0]);\n\n if (pathParts.length === 1) {\n obj[part] = value;\n } else {\n if (obj[part] == null) {\n obj[part] = {};\n }\n\n setValue(obj[part], pathParts.slice(1));\n }\n }\n\n setValue(config, path.split('.'));\n }\n\n isSetByEnv = (path: string) => {\n return Boolean(SchemaAdminSettings.getConfigValue(this.props.environmentConfig, path));\n };\n\n hybridSchemaAndComponent = () => {\n const schema = this.props.schema;\n if (schema && 'component' in schema && schema.component) {\n const CustomComponent = schema.component;\n return (\n <CustomComponent\n {...this.props}\n disabled={this.props.isDisabled}\n />\n );\n }\n return null;\n };\n\n canSave = () => {\n if (!this.props.schema || !('settings' in this.props.schema) || !this.props.schema.settings) {\n return true;\n }\n\n for (const setting of this.props.schema.settings) {\n // Some settings are actually not settings (banner)\n // and don't have a key, skip those ones\n if (!('key' in setting) || !setting.key) {\n continue;\n }\n\n // don't validate elements set by env.\n if (this.isSetByEnv(setting.key)) {\n continue;\n }\n\n if ('validate' in setting && setting.validate) {\n if ('isHidden' in setting) {\n let hidden = false;\n if (typeof setting.isHidden === 'function') {\n hidden = setting.isHidden?.(this.props.config, this.state, this.props.license, this.props.enterpriseReady, this.props.consoleAccess, this.props.cloud, this.props.isCurrentUserSystemAdmin);\n } else {\n hidden = Boolean(setting.isHidden);\n }\n\n // MM-50952\n // If the setting is hidden, then it is not being set in state so there is\n // nothing to validate, and validation would fail anyways and prevent saving\n // In practice, this only happens in custom cloud setup environments like RFQA\n // where it sets things in the config file directly instead of in the environment\n // (like cloud Mattermost does)\n if (hidden) {\n continue;\n }\n }\n const result = setting.validate(this.state[setting.key]);\n if (!result.isValid()) {\n return false;\n }\n }\n }\n\n return true;\n };\n\n render = () => {\n const schema = this.props.schema;\n if (schema && 'component' in schema && schema.component && (!('settings' in schema))) {\n const CustomComponent = schema.component;\n return (\n <CustomComponent\n {...this.props}\n disabled={this.props.isDisabled}\n />\n );\n }\n\n if (!schema) {\n return (\n <div className={'wrapper--fixed'}>\n <AdminHeader>\n <FormattedMessage\n id='error.plugin_not_found.title'\n defaultMessage='Plugin Not Found'\n />\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <p>\n <FormattedMessage\n id='error.plugin_not_found.desc'\n defaultMessage='The plugin you are looking for does not exist.'\n />\n </p>\n <Link\n to={'plugin_management'}\n >\n <FormattedMessage\n id='admin.plugin.backToPlugins'\n defaultMessage='Go back to the Plugins'\n />\n </Link>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={'wrapper--fixed ' + this.state.customComponentWrapperClass}>\n {this.renderTitle()}\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <form\n className='form-horizontal'\n role='form'\n onSubmit={this.handleSubmit}\n >\n {this.renderSettings()}\n </form>\n {this.hybridSchemaAndComponent()}\n </div>\n </div>\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.saving}\n disabled={!this.state.saveNeeded || (this.canSave && !this.canSave())}\n onClick={this.handleSubmit}\n savingMessage={this.props.intl.formatMessage({id: 'admin.saving', defaultMessage: 'Saving Config...'})}\n />\n <WithTooltip\n title={this.state?.serverError ?? ''}\n >\n <div\n className='error-message'\n data-testid='errorMessage'\n >\n <FormError\n iconClassName='fa-exclamation-triangle'\n textClassName='has-warning'\n error={this.state.clientWarning}\n />\n\n <FormError error={this.state.serverError}/>\n </div>\n </WithTooltip>\n </div>\n </div>\n );\n };\n}\n\nexport default injectIntl(SchemaAdminSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport SchemaAdminSettings from 'components/admin_console/schema_admin_settings';\n\n// No changes required to the base SchemaAdminSettings, except to inject custom props.\nconst CustomPluginSettings = SchemaAdminSettings;\n\nexport default CustomPluginSettings;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessage} from 'react-intl';\n\nimport type {PluginRedux, PluginSetting} from '@mattermost/types/plugins';\n\nimport {escapePathPart} from '../schema_admin_settings';\nimport type {AdminDefinitionSetting} from '../types';\n\nexport default function getEnablePluginSetting(plugin: PluginRedux): Partial<AdminDefinitionSetting & PluginSetting> {\n const escapedPluginId = escapePathPart(plugin.id);\n const pluginEnabledConfigKey = 'PluginSettings.PluginStates.' + escapedPluginId + '.Enable';\n\n return {\n type: 'bool',\n key: pluginEnabledConfigKey,\n label: defineMessage({id: 'admin.plugin.enable_plugin', defaultMessage: 'Enable Plugin: '}),\n help_text: defineMessage({id: 'admin.plugin.enable_plugin.help', defaultMessage: 'When true, this plugin is enabled.'}),\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessage} from 'react-intl';\nimport {connect} from 'react-redux';\n\nimport type {PluginRedux, PluginSetting, PluginSettingSection} from '@mattermost/types/plugins';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {appsFeatureFlagEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles';\n\nimport {getAdminConsoleCustomComponents, getAdminConsoleCustomSections} from 'selectors/admin_console';\n\nimport {appsPluginID} from 'utils/apps';\nimport {Constants} from 'utils/constants';\n\nimport type {AdminConsolePluginComponent, AdminConsolePluginCustomSection} from 'types/store/plugins';\n\nimport CustomPluginSettings from './custom_plugin_settings';\nimport getEnablePluginSetting from './enable_plugin_setting';\n\nimport {it} from '../admin_definition';\nimport {escapePathPart} from '../schema_admin_settings';\nimport type {AdminDefinitionSetting, AdminDefinitionSubSectionSchema, AdminDefinitionConfigSchemaSection} from '../types';\n\ntype OwnProps = { match: { params: { plugin_id: string } } }\n\nfunction makeGetPluginSchema() {\n return createSelector(\n 'makeGetPluginSchema',\n (state: GlobalState, pluginId: string) => state.entities.admin.plugins?.[pluginId],\n (state: GlobalState, pluginId: string) => getAdminConsoleCustomComponents(state, pluginId),\n (state: GlobalState, pluginId: string) => getAdminConsoleCustomSections(state, pluginId),\n (state) => appsFeatureFlagEnabled(state),\n isCurrentLicenseCloud,\n (plugin: PluginRedux | undefined, customComponents: Record<string, AdminConsolePluginComponent>, customSections: Record<string, AdminConsolePluginCustomSection>, appsFeatureFlagIsEnabled, isCloudLicense) => {\n if (!plugin) {\n return null;\n }\n\n const escapedPluginId = escapePathPart(plugin.id);\n const pluginEnabledConfigKey = 'PluginSettings.PluginStates.' + escapedPluginId + '.Enable';\n\n const parsePluginSettings = (settings: PluginSetting[]) => {\n return settings.map((setting) => {\n const key = setting.key.toLowerCase();\n let component = null;\n let bannerType = '';\n let type = setting.type;\n let displayName: string | MessageDescriptor = setting.display_name;\n let isDisabled = it.any(it.stateIsFalse(pluginEnabledConfigKey), it.not(it.userHasWritePermissionOnResource('plugins')));\n\n if (customComponents[key]) {\n component = customComponents[key].component;\n type = Constants.SettingsTypes.TYPE_CUSTOM;\n } else if (setting.type === Constants.SettingsTypes.TYPE_CUSTOM) {\n // Show a warning banner to enable the plugin in order to display the custom component.\n type = Constants.SettingsTypes.TYPE_BANNER;\n displayName = defineMessage({id: 'admin.plugin.customSetting.pluginDisabledWarning', defaultMessage: 'In order to view this setting, enable the plugin and click Save.'});\n bannerType = 'warning';\n isDisabled = it.any(it.stateIsTrue(pluginEnabledConfigKey), it.not(it.userHasWritePermissionOnResource('plugins')));\n }\n\n const isHidden = () => {\n return (isCloudLicense && setting.hosting === 'on-prem') ||\n (!isCloudLicense && setting.hosting === 'cloud');\n };\n\n return {\n ...setting,\n type,\n key: 'PluginSettings.Plugins.' + escapedPluginId + '.' + key,\n help_text_markdown: true,\n label: displayName,\n translate: Boolean(plugin.translate),\n isDisabled,\n isHidden,\n banner_type: bannerType,\n component,\n showTitle: customComponents[key] ? customComponents[key].options.showTitle : false,\n } as Partial<AdminDefinitionSetting>;\n });\n };\n\n const parsePluginSettingSections = (sections: PluginSettingSection[]) => {\n return sections.map((section) => {\n const key = section.key.toLowerCase();\n let component;\n let settings: Array<Partial<AdminDefinitionSetting>> = [];\n if (section.custom) {\n if (customSections[key]) {\n component = customSections[key]?.component;\n settings = parsePluginSettings(section.settings);\n } else if (section.fallback) {\n settings = parsePluginSettings(section.settings);\n } else {\n // Show warning banner for custom sections when the plugin is disabled and there's no fallback.\n settings = [{\n key: key + 'disabledWarning',\n type: Constants.SettingsTypes.TYPE_BANNER,\n label: defineMessage({\n id: 'admin.plugin.customSection.pluginDisabledWarning',\n defaultMessage: 'In order to view this section, enable the plugin and click Save.',\n }),\n banner_type: 'warning',\n }];\n }\n } else {\n settings = parsePluginSettings(section.settings);\n }\n\n return {\n key,\n title: section.title,\n subtitle: section.subtitle,\n settings,\n header: section.header,\n footer: section.footer,\n component,\n } as AdminDefinitionConfigSchemaSection;\n });\n };\n\n let sections: AdminDefinitionConfigSchemaSection[] = [];\n let settings: Array<Partial<AdminDefinitionSetting>> = [];\n if (plugin.settings_schema && plugin.settings_schema.sections) {\n sections = parsePluginSettingSections(plugin.settings_schema.sections);\n } else if (plugin.settings_schema && plugin.settings_schema.settings) {\n settings = parsePluginSettings(plugin.settings_schema.settings);\n }\n\n if (plugin.id !== appsPluginID || appsFeatureFlagIsEnabled) {\n const pluginEnableSetting = getEnablePluginSetting(plugin) as AdminDefinitionSetting;\n\n const hasAllCustomSectionsDisabled = plugin.settings_schema?.sections?.every((s) => s.custom && !customSections[s.key.toLowerCase()]);\n const allCustomSectionsAllowFallback = plugin.settings_schema?.sections?.every((s) => s.custom && s.fallback);\n\n if (plugin.settings_schema && hasAllCustomSectionsDisabled && !allCustomSectionsAllowFallback) {\n // If the plugin is composed of purely custom sections (e.g. Calls), it's disabled (custom components are not found), and they don't allow a fallback, we show a single warning.\n const warningBanner = {\n key: 'admin.plugin.customSections.pluginDisabledWarning',\n type: Constants.SettingsTypes.TYPE_BANNER,\n label: defineMessage({id: 'admin.plugin.customSections.pluginDisabledWarning', defaultMessage: 'In order to view and configure plugin settings, enable the plugin and click Save.'}),\n banner_type: 'warning' as const,\n };\n\n sections = [{\n key: pluginEnabledConfigKey + '.Section',\n header: plugin.settings_schema?.header,\n footer: plugin.settings_schema?.footer,\n settings: [pluginEnableSetting, warningBanner],\n }];\n } else if (sections.length > 0) {\n // Have a separate section on top with the plugin enable/disable setting.\n sections.unshift({\n key: pluginEnabledConfigKey + '.Section',\n header: plugin.settings_schema?.header,\n footer: plugin.settings_schema?.footer,\n settings: [pluginEnableSetting],\n });\n } else {\n // Otherwise we retain existing behaviour and add the setting in front.\n settings.unshift(pluginEnableSetting);\n }\n }\n\n const checkDisableSetting = (s: Partial<AdminDefinitionSetting>) => {\n if (s.isDisabled) {\n s.isDisabled = it.any(s.isDisabled, it.not(it.userHasWritePermissionOnResource('plugins')));\n } else {\n s.isDisabled = it.not(it.userHasWritePermissionOnResource('plugins'));\n }\n };\n\n if (sections.length > 0) {\n sections.forEach((section) => section.settings.forEach(checkDisableSetting));\n } else {\n settings.forEach(checkDisableSetting);\n }\n\n return {\n ...plugin.settings_schema,\n id: plugin.id,\n name: plugin.name,\n settings: sections.length > 0 ? undefined : settings,\n sections: sections.length > 0 ? sections : undefined,\n translate: Boolean(plugin.translate),\n } as AdminDefinitionSubSectionSchema;\n },\n );\n}\n\nfunction makeMapStateToProps() {\n const getPluginSchema = makeGetPluginSchema();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const pluginId = ownProps.match.params.plugin_id;\n\n return {\n schema: getPluginSchema(state, pluginId),\n roles: getRoles(state),\n };\n };\n}\n\nexport default connect(makeMapStateToProps)(CustomPluginSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {AdminConfig, EnvironmentConfig} from '@mattermost/types/config';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport FormError from 'components/form_error';\nimport SaveButton from 'components/save_button';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport WithTooltip from 'components/with_tooltip';\n\nexport type BaseProps = {\n config?: DeepPartial<AdminConfig>;\n environmentConfig?: EnvironmentConfig;\n setNavigationBlocked?: (blocked: boolean) => void;\n isDisabled?: boolean;\n patchConfig?: (config: DeepPartial<AdminConfig>) => {data: AdminConfig; error: ClientErrorPlaceholder};\n}\n\nexport type BaseState = {\n saveNeeded: boolean;\n saving: boolean;\n serverError: string|null;\n serverErrorId?: string;\n}\n\n// Placeholder type until ClientError is exported from redux.\n// TODO: remove ClientErrorPlaceholder and change the return type of patchConfig\ntype ClientErrorPlaceholder = {\n message: string;\n server_error_id: string;\n}\n\nexport default abstract class OLDAdminSettings <Props extends BaseProps, State extends BaseState> extends React.Component<Props, State> {\n public constructor(props: Props) {\n super(props);\n const stateInit = {\n saveNeeded: false,\n saving: false,\n serverError: null,\n };\n if (props.config) {\n this.state = Object.assign(this.getStateFromConfig(props.config), stateInit) as Readonly<State>;\n } else {\n this.state = stateInit as Readonly<State>;\n }\n }\n\n protected abstract getStateFromConfig(config: DeepPartial<AdminConfig>): Partial<State>;\n\n protected abstract getConfigFromState(config: DeepPartial<AdminConfig>): unknown;\n\n protected abstract renderTitle(): React.ReactElement;\n\n protected abstract renderSettings(): React.ReactElement;\n\n protected handleSaved?: ((config: AdminConfig) => React.ReactElement | void);\n\n protected canSave?: () => boolean;\n\n protected handleChange = (id: string, value: unknown) => {\n this.setState((prevState) => ({\n ...prevState,\n saveNeeded: true,\n [id]: value,\n }));\n\n if (this.props.setNavigationBlocked) {\n this.props.setNavigationBlocked(true);\n }\n };\n\n private handleSubmit = (e: React.SyntheticEvent) => {\n e.preventDefault();\n\n this.doSubmit();\n };\n\n protected doSubmit = async (callback?: () => void) => {\n this.setState({\n saving: true,\n serverError: null,\n });\n\n // clone config so that we aren't modifying data in the stores\n let config = JSON.parse(JSON.stringify(this.props.config));\n config = this.getConfigFromState(config);\n\n if (this.props.patchConfig) {\n const {data, error} = await this.props.patchConfig(config);\n\n if (data) {\n this.setState(this.getStateFromConfig(data) as State);\n\n this.setState({\n saveNeeded: false,\n saving: false,\n });\n\n if (this.props.setNavigationBlocked) {\n this.props.setNavigationBlocked(false);\n }\n\n if (callback) {\n callback();\n }\n\n if (this.handleSaved) {\n this.handleSaved(config);\n }\n } else if (error) {\n this.setState({\n saving: false,\n serverError: error.message,\n serverErrorId: error.server_error_id,\n });\n\n if (callback) {\n callback();\n }\n\n if (this.handleSaved) {\n this.handleSaved(config);\n }\n }\n }\n };\n\n private parseInt = (str: string, defaultValue?: number) => {\n const n = parseInt(str, 10);\n\n if (isNaN(n)) {\n if (defaultValue) {\n return defaultValue;\n }\n return 0;\n }\n\n return n;\n };\n\n protected parseIntNonNegative = (str: string | number, defaultValue?: number) => {\n const n = typeof str === 'string' ? parseInt(str, 10) : str;\n\n if (isNaN(n) || n < 0) {\n if (defaultValue) {\n return defaultValue;\n }\n return 0;\n }\n\n return n;\n };\n\n protected parseIntZeroOrMin = (str: string | number, minimumValue = 1) => {\n const n = typeof str === 'string' ? parseInt(str, 10) : str;\n\n if (isNaN(n) || n < 0) {\n return 0;\n }\n if (n > 0 && n < minimumValue) {\n return minimumValue;\n }\n\n return n;\n };\n\n protected parseIntNonZero = (str: string | number, defaultValue?: number, minimumValue = 1) => {\n const n = typeof str === 'string' ? parseInt(str, 10) : str;\n\n if (isNaN(n) || n < minimumValue) {\n if (defaultValue) {\n return defaultValue;\n }\n return 1;\n }\n\n return n;\n };\n\n private getConfigValue(config: AdminConfig | EnvironmentConfig, path: string) {\n const pathParts = path.split('.');\n\n return pathParts.reduce((obj: object | null, pathPart) => {\n if (!obj) {\n return null;\n }\n return obj[(pathPart as keyof object)];\n }, config);\n }\n\n private setConfigValue(config: AdminConfig, path: string, value: any) {\n function setValue(obj: object, pathParts: string[]) {\n const part = pathParts[0] as keyof object;\n\n if (pathParts.length === 1) {\n Object.assign(obj, {[part]: value});\n } else {\n if (obj[part] == null) {\n Object.assign(obj, {[part]: {}});\n }\n\n setValue(obj[part], pathParts.slice(1));\n }\n }\n\n setValue(config, path.split('.'));\n }\n\n protected isSetByEnv = (path: string) => {\n return Boolean(this.props.environmentConfig && this.getConfigValue(this.props.environmentConfig!, path));\n };\n\n public render() {\n return (\n <form\n className='form-horizontal'\n role='form'\n onSubmit={this.handleSubmit}\n >\n <div className='wrapper--fixed'>\n <AdminHeader>\n {this.renderTitle()}\n </AdminHeader>\n {this.renderSettings()}\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.saving}\n disabled={this.props.isDisabled || !this.state.saveNeeded || (this.canSave && !this.canSave())}\n onClick={this.handleSubmit}\n savingMessage={\n <FormattedMessage\n id='admin.saving'\n defaultMessage='Saving Config...'\n />\n }\n />\n <WithTooltip\n title={this.state?.serverError ?? ''}\n >\n <div\n className='error-message'\n >\n <FormError error={this.state.serverError}/>\n </div>\n </WithTooltip>\n </div>\n </div>\n </form>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessages, injectIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport PluginState from 'mattermost-redux/constants/plugins';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport ExternalLink from 'components/external_link';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {appsPluginID} from 'utils/apps';\nimport {DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport BooleanSetting from '../boolean_setting';\nimport OLDAdminSettings from '../old_admin_settings';\nimport type {BaseProps, BaseState} from '../old_admin_settings';\nimport SettingSet from '../setting_set';\nimport SettingsGroup from '../settings_group';\nimport TextSetting from '../text_setting';\n\nconst PluginItemState = ({state}: {state: number}) => {\n switch (state) {\n case PluginState.PLUGIN_STATE_NOT_RUNNING:\n return (\n <FormattedMessage\n id='admin.plugin.state.not_running'\n defaultMessage='Not running'\n />\n );\n case PluginState.PLUGIN_STATE_STARTING:\n return (\n <FormattedMessage\n id='admin.plugin.state.starting'\n defaultMessage='Starting'\n />\n );\n case PluginState.PLUGIN_STATE_RUNNING:\n return (\n <FormattedMessage\n id='admin.plugin.state.running'\n defaultMessage='Running'\n />\n );\n case PluginState.PLUGIN_STATE_FAILED_TO_START:\n return (\n <FormattedMessage\n id='admin.plugin.state.failed_to_start'\n defaultMessage='Failed to start'\n />\n );\n case PluginState.PLUGIN_STATE_FAILED_TO_STAY_RUNNING:\n return (\n <FormattedMessage\n id='admin.plugin.state.failed_to_stay_running'\n defaultMessage='Crashing'\n />\n );\n case PluginState.PLUGIN_STATE_STOPPING:\n return (\n <FormattedMessage\n id='admin.plugin.state.stopping'\n defaultMessage='Stopping'\n />\n );\n default:\n return (\n <FormattedMessage\n id='admin.plugin.state.unknown'\n defaultMessage='Unknown'\n />\n );\n }\n};\n\nconst PluginItemStateDescription = ({state, error}: {state: number; error?: string}) => {\n switch (state) {\n case PluginState.PLUGIN_STATE_NOT_RUNNING:\n return (\n <div className='alert alert-info'>\n <i className='fa fa-ban'/>\n <FormattedMessage\n id='admin.plugin.state.not_running.description'\n defaultMessage='This plugin is not enabled.'\n />\n </div>\n );\n case PluginState.PLUGIN_STATE_STARTING:\n return (\n <div className='alert alert-success'>\n <i className='fa fa-info'/>\n <FormattedMessage\n id='admin.plugin.state.starting.description'\n defaultMessage='This plugin is starting.'\n />\n </div>\n );\n case PluginState.PLUGIN_STATE_RUNNING:\n return (\n <div className='alert alert-success'>\n <i className='fa fa-check'/>\n <FormattedMessage\n id='admin.plugin.state.running.description'\n defaultMessage='This plugin is running.'\n />\n </div>\n );\n case PluginState.PLUGIN_STATE_FAILED_TO_START: {\n const errorMessage = error || (\n <FormattedMessage\n id='admin.plugin.state.failed_to_start.check_logs'\n defaultMessage='Check your system logs for errors.'\n />\n );\n\n return (\n <div className='alert alert-warning'>\n <i className='fa fa-warning'/>\n <FormattedMessage\n id='admin.plugin.state.failed_to_start.description'\n defaultMessage='This plugin failed to start. {error}'\n values={{\n error: errorMessage,\n }}\n />\n </div>\n );\n }\n case PluginState.PLUGIN_STATE_FAILED_TO_STAY_RUNNING:\n return (\n <div className='alert alert-warning'>\n <i className='fa fa-warning'/>\n <FormattedMessage\n id='admin.plugin.state.failed_to_stay_running.description'\n defaultMessage='This plugin crashed multiple times and is no longer running. Check your system logs for errors.'\n />\n </div>\n );\n case PluginState.PLUGIN_STATE_STOPPING:\n return (\n <div className='alert alert-info'>\n <i className='fa fa-info'/>\n <FormattedMessage\n id='admin.plugin.state.stopping.description'\n defaultMessage='This plugin is stopping.'\n />\n </div>\n );\n default:\n return null;\n }\n};\n\ntype PluginStatus = {\n state: number;\n error?: string;\n active: boolean;\n id: string;\n description: string;\n version: string;\n name: string;\n instances: any[];\n settings_schema?: {\n header: string;\n footer: string;\n settings?: unknown[];\n };\n}\n\ntype PluginItemProps = {\n pluginStatus: PluginStatus;\n removing: boolean;\n handleEnable: (e: any) => any;\n handleDisable: (e: any) => any;\n handleRemove: (e: any) => any;\n showInstances: boolean;\n hasSettings: boolean;\n appsFeatureFlagEnabled: boolean;\n isDisabled?: boolean;\n};\n\nconst messages = defineMessages({\n title: {id: 'admin.plugin.management.title', defaultMessage: 'Management'},\n enable: {id: 'admin.plugins.settings.enable', defaultMessage: 'Enable Plugins: '},\n enableDesc: {id: 'admin.plugins.settings.enableDesc', defaultMessage: 'When true, enables plugins on your Mattermost server. Use plugins to integrate with third-party systems, extend functionality, or customize the user interface of your Mattermost server. See <link>documentation</link> to learn more.'},\n uploadTitle: {id: 'admin.plugin.uploadTitle', defaultMessage: 'Upload Plugin: '},\n installedTitle: {id: 'admin.plugin.installedTitle', defaultMessage: 'Installed Plugins: '},\n installedDesc: {id: 'admin.plugin.installedDesc', defaultMessage: 'Installed plugins on your Mattermost server.'},\n uploadDesc: {id: 'admin.plugin.uploadDesc', defaultMessage: 'Upload a plugin for your Mattermost server. See <link>documentation</link> to learn more.'},\n uploadDisabledDesc: {id: 'admin.plugin.uploadDisabledDesc', defaultMessage: 'Enable plugin uploads in config.json. See <link>documentation</link> to learn more.'},\n enableMarketplace: {id: 'admin.plugins.settings.enableMarketplace', defaultMessage: 'Enable Marketplace:'},\n enableMarketplaceDesc: {id: 'admin.plugins.settings.enableMarketplaceDesc', defaultMessage: 'When true, enables System Administrators to install plugins from the <link>marketplace</link>.'},\n enableRemoteMarketplace: {id: 'admin.plugins.settings.enableRemoteMarketplace', defaultMessage: 'Enable Remote Marketplace:'},\n enableRemoteMarketplaceDesc: {id: 'admin.plugins.settings.enableRemoteMarketplaceDesc', defaultMessage: 'When true, marketplace fetches latest plugins from the configured Marketplace URL.'},\n automaticPrepackagedPlugins: {id: 'admin.plugins.settings.automaticPrepackagedPlugins', defaultMessage: 'Enable Automatic Prepackaged Plugins:'},\n automaticPrepackagedPluginsDesc: {id: 'admin.plugins.settings.automaticPrepackagedPluginsDesc', defaultMessage: 'When true, automatically installs any prepackaged plugin found to be enabled in the server configuration.'},\n marketplaceUrl: {id: 'admin.plugins.settings.marketplaceUrl', defaultMessage: 'Marketplace URL:'},\n marketplaceUrlDesc: {id: 'admin.plugins.settings.marketplaceUrlDesc', defaultMessage: 'URL of the marketplace server.'},\n});\n\nexport const searchableStrings = [\n messages.title,\n messages.enable,\n messages.enableDesc,\n messages.uploadTitle,\n messages.installedTitle,\n messages.installedDesc,\n messages.uploadDesc,\n messages.uploadDisabledDesc,\n messages.enableMarketplace,\n messages.enableMarketplaceDesc,\n messages.enableRemoteMarketplace,\n messages.enableRemoteMarketplaceDesc,\n messages.automaticPrepackagedPlugins,\n messages.automaticPrepackagedPluginsDesc,\n messages.marketplaceUrl,\n messages.marketplaceUrlDesc,\n];\n\nconst PluginItem = ({\n pluginStatus,\n removing,\n handleEnable,\n handleDisable,\n handleRemove,\n showInstances,\n hasSettings,\n appsFeatureFlagEnabled,\n isDisabled,\n}: PluginItemProps) => {\n let activateButton: React.ReactNode;\n const activating = pluginStatus.state === PluginState.PLUGIN_STATE_STARTING;\n const deactivating = pluginStatus.state === PluginState.PLUGIN_STATE_STOPPING;\n\n if (pluginStatus.active) {\n activateButton = (\n <a\n data-plugin-id={pluginStatus.id}\n className={deactivating || isDisabled ? 'disabled' : ''}\n onClick={handleDisable}\n >\n {deactivating ? (\n <FormattedMessage\n id='admin.plugin.disabling'\n defaultMessage='Disabling...'\n />\n ) : (\n <FormattedMessage\n id='admin.plugin.disable'\n defaultMessage='Disable'\n />\n )}\n </a>\n );\n } else {\n activateButton = (\n <a\n data-plugin-id={pluginStatus.id}\n className={activating || isDisabled ? 'disabled' : ''}\n onClick={handleEnable}\n >\n {activating ? (\n <FormattedMessage\n id='admin.plugin.enabling'\n defaultMessage='Enabling...'\n />\n ) : (\n <FormattedMessage\n id='admin.plugin.enable'\n defaultMessage='Enable'\n />\n )}\n </a>\n );\n }\n\n let settingsButton = null;\n if (hasSettings) {\n settingsButton = (\n <span>\n {' - '}\n <Link\n to={'/admin_console/plugins/plugin_' + pluginStatus.id}\n >\n <FormattedMessage\n id='admin.plugin.settingsButton'\n defaultMessage='Settings'\n />\n </Link>\n </span>\n );\n }\n\n let removeButtonText;\n if (removing) {\n removeButtonText = (\n <FormattedMessage\n id='admin.plugin.removing'\n defaultMessage='Removing...'\n />\n );\n } else {\n removeButtonText = (\n <FormattedMessage\n id='admin.plugin.remove'\n defaultMessage='Remove'\n />\n );\n }\n let removeButton: React.ReactNode = (\n <span>\n {' - '}\n <a\n data-plugin-id={pluginStatus.id}\n className={removing || isDisabled ? 'disabled' : ''}\n onClick={handleRemove}\n >\n {removeButtonText}\n </a>\n </span>\n );\n\n let description;\n if (pluginStatus.description) {\n description = (\n <div className='pt-2'>\n {pluginStatus.description}\n </div>\n );\n }\n\n const notices = [];\n if (pluginStatus.instances.some((instance) => instance.version !== pluginStatus.version)) {\n notices.push(\n <div\n key='multiple-versions'\n className='alert alert-warning'\n >\n <i className='fa fa-warning'/>\n <FormattedMessage\n id='admin.plugin.multiple_versions_warning'\n defaultMessage='There are multiple versions of this plugin installed across your cluster. Re-install this plugin to ensure it works consistently.'\n />\n </div>,\n );\n }\n\n notices.push(\n <PluginItemStateDescription\n key='state-description'\n state={pluginStatus.state}\n error={pluginStatus.error}\n />,\n );\n\n const instances = pluginStatus.instances.slice();\n instances.sort((a, b) => {\n if (a.cluster_id < b.cluster_id) {\n return -1;\n } else if (a.cluster_id > b.cluster_id) {\n return 1;\n }\n\n return 0;\n });\n\n let clusterSummary;\n if (showInstances) {\n clusterSummary = (\n <div className='pt-3 pb-3'>\n <div className='row'>\n <div className='col-md-6'>\n <strong>\n <FormattedMessage\n id='admin.plugin.cluster_instance'\n defaultMessage='Cluster Instance'\n />\n </strong>\n </div>\n <div className='col-md-3'>\n <strong>\n <FormattedMessage\n id='admin.plugin.version_title'\n defaultMessage='Version'\n />\n </strong>\n </div>\n <div className='col-md-3'>\n <strong>\n <FormattedMessage\n id='admin.plugin.state'\n defaultMessage='State'\n />\n </strong>\n </div>\n </div>\n {instances.map((instance) => (\n <div\n key={instance.cluster_id}\n className='row'\n >\n <div className='col-md-6'>\n {instance.cluster_id}\n </div>\n <div className='col-md-3'>\n {instance.version}\n </div>\n <div className='col-md-3'>\n <PluginItemState state={instance.state}/>\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (pluginStatus.id === appsPluginID && !appsFeatureFlagEnabled) {\n activateButton = (<>{'Plugin disabled by feature flag'}</>);\n removeButton = null;\n }\n\n return (\n <div data-testid={pluginStatus.id}>\n <div>\n <strong>{pluginStatus.name}</strong>\n {' ('}\n {pluginStatus.id}\n {' - '}\n {pluginStatus.version}\n {')'}\n </div>\n {description}\n <div className='pt-2'>\n {activateButton}\n {removeButton}\n {settingsButton}\n </div>\n <div>\n {notices}\n </div>\n <div>\n {clusterSummary}\n </div>\n <hr/>\n </div>\n );\n};\n\ntype Props = BaseProps & {\n config: DeepPartial<AdminConfig>;\n pluginStatuses: Record<string, PluginStatus>;\n plugins: any;\n appsFeatureFlagEnabled: boolean;\n actions: {\n uploadPlugin: (fileData: File, force: boolean) => Promise<ActionResult>;\n removePlugin: (pluginId: string) => Promise<ActionResult>;\n getPlugins: () => Promise<ActionResult>;\n getPluginStatuses: () => Promise<ActionResult>;\n enablePlugin: (pluginId: string) => Promise<ActionResult>;\n disablePlugin: (pluginId: string) => Promise<ActionResult>;\n installPluginFromUrl: (url: string, force: boolean) => Promise<ActionResult>;\n };\n} & WrappedComponentProps;\n\ntype State = BaseState & {\n loading: boolean;\n fileSelected: boolean;\n file: File | null;\n pluginDownloadUrl: string;\n serverError: JSX.Element | string | null ;\n lastMessage: string | null;\n uploading: boolean;\n installing: boolean;\n overwritingUpload: boolean;\n confirmOverwriteUploadModal: boolean;\n overwritingInstall?: boolean;\n confirmOverwriteInstallModal: boolean;\n showRemoveModal: boolean;\n resolveRemoveModal: string| null;\n enable: boolean;\n enableUploads: boolean;\n allowInsecureDownloadUrl: boolean;\n enableMarketplace: boolean;\n enableRemoteMarketplace: boolean;\n automaticPrepackagedPlugins: boolean;\n marketplaceUrl: string;\n requirePluginSignature: boolean;\n removing: string | null;\n}\nclass PluginManagement extends OLDAdminSettings<Props, State> {\n private fileInput: React.RefObject<HTMLInputElement>;\n constructor(props: Props) {\n super(props);\n\n this.state = Object.assign(this.state, {\n loading: true,\n fileSelected: false,\n file: null,\n pluginDownloadUrl: '',\n serverError: null,\n lastMessage: null,\n uploading: false,\n installing: false,\n overwritingUpload: false,\n confirmOverwriteUploadModal: false,\n overwritingInstall: false,\n confirmOverwriteInstallModal: false,\n showRemoveModal: false,\n resolveRemoveModal: null,\n });\n this.fileInput = React.createRef();\n }\n getConfigFromState = (config: Props['config']) => {\n if (config && config.PluginSettings) {\n config.PluginSettings.Enable = this.state.enable;\n config.PluginSettings.EnableUploads = this.state.enableUploads;\n config.PluginSettings.AllowInsecureDownloadURL = this.state.allowInsecureDownloadUrl;\n config.PluginSettings.EnableMarketplace = this.state.enableMarketplace;\n config.PluginSettings.EnableRemoteMarketplace = this.state.enableRemoteMarketplace;\n config.PluginSettings.AutomaticPrepackagedPlugins = this.state.automaticPrepackagedPlugins;\n config.PluginSettings.MarketplaceURL = this.state.marketplaceUrl;\n config.PluginSettings.RequirePluginSignature = this.state.requirePluginSignature;\n }\n\n return config;\n };\n\n getStateFromConfig(config: Props['config']) {\n const state = {\n enable: config?.PluginSettings?.Enable,\n enableUploads: config?.PluginSettings?.EnableUploads,\n allowInsecureDownloadUrl: config?.PluginSettings?.AllowInsecureDownloadURL,\n enableMarketplace: config?.PluginSettings?.EnableMarketplace,\n enableRemoteMarketplace: config?.PluginSettings?.EnableRemoteMarketplace,\n automaticPrepackagedPlugins: config?.PluginSettings?.AutomaticPrepackagedPlugins,\n marketplaceUrl: config?.PluginSettings?.MarketplaceURL,\n requirePluginSignature: config?.PluginSettings?.RequirePluginSignature,\n };\n\n return state;\n }\n\n componentDidMount() {\n if (this.state.enable) {\n this.props.actions.getPluginStatuses().then(\n () => this.setState({loading: false}),\n );\n }\n }\n\n handleChooseFileClick = () => {\n this.fileInput.current?.click();\n };\n\n handleUpload = () => {\n this.setState({lastMessage: null, serverError: null});\n const element = this.fileInput.current as HTMLInputElement;\n if (element.files && element.files.length > 0) {\n this.setState({fileSelected: true, file: element.files[0]});\n }\n };\n\n helpSubmitUpload = async (file: File, force: boolean) => {\n this.setState({uploading: true});\n const {error} = await this.props.actions.uploadPlugin(file, force);\n\n if (error) {\n if (error.server_error_id === 'app.plugin.install_id.app_error' && !force) {\n this.setState({confirmOverwriteUploadModal: true, overwritingUpload: true});\n return;\n }\n this.setState({\n file: null,\n fileSelected: false,\n uploading: false,\n });\n if (error.server_error_id === 'app.plugin.activate.app_error') {\n this.setState({serverError: this.props.intl.formatMessage({id: 'admin.plugin.error.activate', defaultMessage: 'Unable to upload the plugin. It may conflict with another plugin on your server.'})});\n } else if (error.server_error_id === 'app.plugin.extract.app_error') {\n this.setState({serverError: this.props.intl.formatMessage({id: 'admin.plugin.error.extract', defaultMessage: 'Encountered an error when extracting the plugin. Review your plugin file content and try again.'})});\n } else {\n this.setState({serverError: error.message});\n }\n this.setState({file: null, fileSelected: false});\n return;\n }\n\n this.setState({loading: true});\n await this.props.actions.getPlugins();\n\n let msg = `Successfully uploaded plugin from ${file?.name}`;\n if (this.state.overwritingUpload) {\n msg = `Successfully updated plugin from ${file?.name}`;\n }\n\n this.setState({\n file: null,\n fileSelected: false,\n serverError: null,\n lastMessage: msg,\n overwritingUpload: false,\n uploading: false,\n loading: false,\n });\n };\n\n handleSubmitUpload = (e: React.SyntheticEvent) => {\n e.preventDefault();\n\n const element = this.fileInput.current as HTMLInputElement;\n if (element.files?.length === 0) {\n return;\n }\n const file = element.files && element.files[0];\n if (file) {\n this.helpSubmitUpload(file, false);\n }\n Utils.clearFileInput(element);\n };\n\n handleOverwriteUploadPluginCancel = () => {\n this.setState({\n file: null,\n fileSelected: false,\n serverError: null,\n confirmOverwriteUploadModal: false,\n lastMessage: null,\n uploading: false,\n });\n };\n\n handleOverwriteUploadPlugin = () => {\n this.setState({confirmOverwriteUploadModal: false});\n if (this.state.file) {\n this.helpSubmitUpload(this.state.file, true);\n }\n };\n\n onPluginDownloadUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n pluginDownloadUrl: e.target.value,\n });\n };\n\n installFromUrl = async (force: boolean) => {\n const {pluginDownloadUrl} = this.state;\n\n this.setState({\n installing: true,\n serverError: null,\n lastMessage: null,\n });\n const {error} = await this.props.actions.installPluginFromUrl(pluginDownloadUrl, force);\n\n if (error) {\n if (error.server_error_id === 'app.plugin.install_id.app_error' && !force) {\n this.setState({confirmOverwriteInstallModal: true, overwritingInstall: true});\n return;\n }\n\n this.setState({\n installing: false,\n });\n\n if (error.server_error_id === 'app.plugin.extract.app_error') {\n this.setState({serverError: this.props.intl.formatMessage({id: 'admin.plugin.error.extract', defaultMessage: 'Encountered an error when extracting the plugin. Review your plugin file content and try again.'})});\n } else {\n this.setState({serverError: error.message});\n }\n return;\n }\n\n this.setState({loading: true});\n await this.props.actions.getPlugins();\n\n let msg = `Successfully installed plugin from ${pluginDownloadUrl}`;\n if (this.state.overwritingInstall) {\n msg = `Successfully updated plugin from ${pluginDownloadUrl}`;\n }\n\n this.setState({\n serverError: null,\n lastMessage: msg,\n overwritingInstall: false,\n installing: false,\n loading: false,\n });\n };\n\n getMarketplaceURLHelpText = (url: string, enableUploads: boolean) => {\n return (\n <div>\n {\n url === '' && enableUploads &&\n <div className='alert-warning'>\n <i className='fa fa-warning'/>\n <FormattedMessage\n id='admin.plugins.settings.marketplaceUrlDesc.empty'\n defaultMessage=' Marketplace URL is a required field.'\n />\n </div>\n }\n {\n url !== '' && enableUploads &&\n <FormattedMessage {...messages.marketplaceUrlDesc}/>\n }\n {\n !enableUploads &&\n <FormattedMessage\n {...messages.uploadDisabledDesc}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PLUGINS}\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n </div>\n );\n };\n\n canSave = () => {\n return this.state.marketplaceUrl !== '';\n };\n\n handleSubmitInstall = (e: React.SyntheticEvent) => {\n e.preventDefault();\n return this.installFromUrl(false);\n };\n\n handleOverwriteInstallPluginCancel = () => {\n this.setState({\n confirmOverwriteInstallModal: false,\n installing: false,\n serverError: null,\n lastMessage: null,\n });\n };\n\n handleOverwriteInstallPlugin = () => {\n this.setState({confirmOverwriteInstallModal: false});\n return this.installFromUrl(true);\n };\n\n showRemovePluginModal = (e: React.SyntheticEvent) => {\n if (this.props.isDisabled) {\n return;\n }\n e.preventDefault();\n const pluginId = e.currentTarget.getAttribute('data-plugin-id');\n this.setState({showRemoveModal: true, removing: pluginId});\n };\n\n handleRemovePluginCancel = () => {\n this.setState({showRemoveModal: false, removing: null});\n };\n\n handleRemovePlugin = () => {\n this.setState({showRemoveModal: false});\n this.handleRemove();\n };\n\n handleRemove = async () => {\n this.setState({lastMessage: null, serverError: null});\n if (this.state.removing !== null) {\n const {error} = await this.props.actions.removePlugin(this.state.removing);\n this.setState({removing: null});\n\n if (error) {\n this.setState({serverError: error.message});\n }\n }\n };\n\n handleEnable = async (e: React.KeyboardEvent) => {\n e.preventDefault();\n if (this.props.isDisabled) {\n return;\n }\n this.setState({lastMessage: null, serverError: null});\n const pluginId = e.currentTarget.getAttribute('data-plugin-id');\n\n if (pluginId) {\n const {error} = await this.props.actions.enablePlugin(pluginId);\n\n if (error) {\n this.setState({serverError: error.message});\n }\n }\n };\n\n handleDisable = async (e: React.KeyboardEvent) => {\n this.setState({lastMessage: null, serverError: null});\n e.preventDefault();\n if (this.props.isDisabled) {\n return;\n }\n this.setState({lastMessage: null, serverError: null});\n const pluginId = e.currentTarget.getAttribute('data-plugin-id');\n if (pluginId) {\n const {error} = await this.props.actions.disablePlugin(pluginId);\n\n if (error) {\n this.setState({serverError: error.message});\n }\n }\n };\n\n renderTitle() {\n return (<FormattedMessage {...messages.title}/>);\n }\n\n renderOverwritePluginModal = (\n {show, onConfirm, onCancel}:\n {show: boolean; onConfirm: (checked: boolean) => void; onCancel: (checked: boolean) => void }) => {\n const title = (\n <FormattedMessage\n id='admin.plugin.upload.overwrite_modal.title'\n defaultMessage='Overwrite existing plugin?'\n />\n );\n\n const message = (\n <FormattedMessage\n id='admin.plugin.upload.overwrite_modal.desc'\n defaultMessage='A plugin with this ID already exists. Would you like to overwrite it?'\n />\n );\n\n const overwriteButton = (\n <FormattedMessage\n id='admin.plugin.upload.overwrite_modal.overwrite'\n defaultMessage='Overwrite'\n />\n );\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n confirmButtonClass='btn btn-danger'\n confirmButtonText={overwriteButton}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n );\n };\n\n renderRemovePluginModal = (\n show: boolean, onConfirm: (checked: boolean) => void, onCancel: (checked: boolean) => void) => {\n const title = (\n <FormattedMessage\n id='admin.plugin.remove_modal.title'\n defaultMessage='Remove plugin?'\n />\n );\n\n const message = (\n <FormattedMessage\n id='admin.plugin.remove_modal.desc'\n defaultMessage='Are you sure you would like to remove the plugin?'\n />\n );\n\n const removeButton = (\n <FormattedMessage\n id='admin.plugin.remove_modal.overwrite'\n defaultMessage='Remove'\n />\n );\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n confirmButtonClass='btn btn-danger'\n confirmButtonText={removeButton}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n );\n };\n\n renderEnablePluginsSetting = () => {\n const hideEnablePlugins = this.props.config.ExperimentalSettings && this.props.config.ExperimentalSettings.RestrictSystemAdmin;\n if (!hideEnablePlugins) {\n return (\n <BooleanSetting\n id='enable'\n label={<FormattedMessage {...messages.enable}/>}\n helpText={\n <FormattedMessage\n {...messages.enableDesc}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PLUGINS}\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.enable}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PluginSettings.Enable')}\n disabled={this.props.isDisabled}\n />\n );\n }\n return null;\n };\n\n renderSettings = () => {\n const {enableUploads} = this.state;\n const enable = this.props.config?.PluginSettings?.Enable;\n let serverError = <></>;\n let lastMessage = <></>;\n\n // Using props values to make sure these are set on the server and not just locally\n const enableUploadButton = enableUploads && enable && !(this.props.config.PluginSettings && this.props.config.PluginSettings.RequirePluginSignature);\n\n if (this.state.serverError) {\n serverError = <div className='col-sm-12'><div className='form-group has-error half'><label className='control-label'>{this.state.serverError}</label></div></div>;\n }\n if (this.state.lastMessage) {\n lastMessage = <div className='col-sm-12'><div className='form-group half'>{this.state.lastMessage}</div></div>;\n }\n\n let btnClass = 'btn btn-primary';\n if (this.state.fileSelected) {\n btnClass = 'btn btn-primary';\n }\n\n let fileName;\n if (this.state.file) {\n fileName = this.state.file.name;\n }\n\n let uploadButtonText;\n if (this.state.uploading) {\n uploadButtonText = (\n <FormattedMessage\n id='admin.plugin.uploading'\n defaultMessage='Uploading...'\n />\n );\n } else {\n uploadButtonText = (\n <FormattedMessage\n id='admin.plugin.upload'\n defaultMessage='Upload'\n />\n );\n }\n\n let pluginsList;\n let pluginsContainer;\n let pluginsListContainer;\n const plugins = Object.values(this.props.pluginStatuses);\n if (this.state.loading) {\n pluginsList = <LoadingScreen/>;\n } else if (plugins.length === 0) {\n pluginsListContainer = (\n <FormattedMessage\n id='admin.plugin.no_plugins'\n defaultMessage='No installed plugins.'\n />\n );\n } else {\n const showInstances = plugins.some((pluginStatus) => pluginStatus.instances.length > 1);\n plugins.sort((a, b) => {\n const nameCompare = a.name.localeCompare(b.name);\n if (nameCompare !== 0) {\n return nameCompare;\n }\n\n return a.id.localeCompare(b.id);\n });\n pluginsList = plugins.map((pluginStatus: PluginStatus) => {\n const p = this.props.plugins[pluginStatus.id];\n const hasSettings = Boolean(p && p.settings_schema && (p.settings_schema.header || p.settings_schema.footer || (p.settings_schema.settings && p.settings_schema.settings.length > 0)));\n return (\n <PluginItem\n key={pluginStatus.id}\n pluginStatus={pluginStatus}\n removing={this.state.removing === pluginStatus.id}\n handleEnable={this.handleEnable}\n handleDisable={this.handleDisable}\n handleRemove={this.showRemovePluginModal}\n showInstances={showInstances}\n hasSettings={hasSettings}\n appsFeatureFlagEnabled={this.props.appsFeatureFlagEnabled}\n isDisabled={this.props.isDisabled}\n />\n );\n });\n\n pluginsListContainer = (\n <div className='alert alert-transparent'>\n {pluginsList}\n </div>\n );\n }\n\n if (enable) {\n pluginsContainer = (\n <SettingSet\n label={<FormattedMessage {...messages.installedTitle}/>}\n >\n <p className='help-text'>\n <FormattedMessage {...messages.installedDesc}/>\n </p>\n <br/>\n {pluginsListContainer}\n </SettingSet>\n );\n }\n\n let uploadHelpText;\n\n if (enableUploads && enable) {\n uploadHelpText = (\n <FormattedMessage\n {...messages.uploadDesc}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PLUGINS}\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n } else if (enable && !enableUploads) {\n uploadHelpText = (\n <FormattedMessage\n {...messages.uploadDisabledDesc}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PLUGINS}\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n } else {\n uploadHelpText = (\n <FormattedMessage\n id='admin.plugin.uploadAndPluginDisabledDesc'\n defaultMessage='To enable plugins, set **Enable Plugins** to true. See <link>documentation</link> to learn more.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PLUGINS}\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n }\n\n const overwriteUploadPluginModal = this.state.confirmOverwriteUploadModal && this.renderOverwritePluginModal({\n show: this.state.confirmOverwriteUploadModal,\n onConfirm: this.handleOverwriteUploadPlugin,\n onCancel: this.handleOverwriteUploadPluginCancel,\n });\n\n const removePluginModal = this.state.showRemoveModal && this.renderRemovePluginModal(\n this.state.showRemoveModal,\n this.handleRemovePlugin,\n this.handleRemovePluginCancel,\n );\n\n return (\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <SettingsGroup\n id={'PluginSettings'}\n container={false}\n >\n {this.renderEnablePluginsSetting()}\n\n { !this.props.config.ExperimentalSettings?.RestrictSystemAdmin && (\n <>\n <BooleanSetting\n id='requirePluginSignature'\n label={\n <FormattedMessage\n id='admin.plugins.settings.requirePluginSignature'\n defaultMessage='Require Plugin Signature:'\n />\n }\n helpText={\n <FormattedMessage\n id='admin.plugins.settings.requirePluginSignatureDesc'\n defaultMessage='When true, uploading plugins is disabled and may only be installed through the Marketplace. Plugins are always verified during Mattermost server startup and initialization. See <link>documentation</link> to learn more.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PLUGIN_SIGNING}\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.requirePluginSignature}\n disabled={this.props.isDisabled || !this.state.enable}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PluginSettings.RequirePluginSignature')}\n />\n <BooleanSetting\n id='automaticPrepackagedPlugins'\n label={<FormattedMessage {...messages.automaticPrepackagedPlugins}/>}\n helpText={<FormattedMessage {...messages.automaticPrepackagedPluginsDesc}/>}\n value={this.state.automaticPrepackagedPlugins}\n disabled={this.props.isDisabled || !this.state.enable}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PluginSettings.AutomaticPrepackagedPlugins')}\n />\n <SettingSet\n helpText={uploadHelpText}\n label={<FormattedMessage {...messages.uploadTitle}/>}\n >\n <div className='file__upload'>\n <button\n type='button'\n className={classNames(['btn', {'btn-tertiary': enableUploads}])}\n onClick={this.handleChooseFileClick}\n disabled={!enableUploadButton || this.props.isDisabled}\n >\n <FormattedMessage\n id='admin.plugin.choose'\n defaultMessage='Choose File'\n />\n </button>\n <input\n ref={this.fileInput}\n type='file'\n accept='.gz'\n onChange={this.handleUpload}\n disabled={!enableUploadButton || this.props.isDisabled}\n />\n </div>\n <button\n className={btnClass}\n id='uploadPlugin'\n disabled={!this.state.fileSelected}\n onClick={this.handleSubmitUpload}\n >\n {uploadButtonText}\n </button>\n <div className='help-text m-0'>\n {fileName}\n </div>\n {serverError}\n {lastMessage}\n </SettingSet>\n <BooleanSetting\n id='enableMarketplace'\n label={<FormattedMessage {...messages.enableMarketplace}/>}\n helpText={\n <FormattedMessage\n {...messages.enableMarketplaceDesc}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://mattermost.com/pl/default-mattermost-marketplace.html'\n location='plugin_management'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.enableMarketplace}\n disabled={this.props.isDisabled || !this.state.enable}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PluginSettings.EnableMarketplace')}\n />\n <BooleanSetting\n id='enableRemoteMarketplace'\n label={<FormattedMessage {...messages.enableRemoteMarketplace}/>}\n helpText={<FormattedMessage {...messages.enableRemoteMarketplaceDesc}/>}\n value={this.state.enableRemoteMarketplace}\n disabled={this.props.isDisabled || !this.state.enable || !this.state.enableUploads || !this.state.enableMarketplace}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PluginSettings.EnableRemoteMarketplace')}\n />\n <TextSetting\n id={'marketplaceUrl'}\n label={<FormattedMessage {...messages.marketplaceUrl}/>}\n helpText={this.getMarketplaceURLHelpText(this.state.marketplaceUrl, this.state.enableUploads)}\n value={this.state.marketplaceUrl}\n disabled={this.props.isDisabled || !this.state.enable || !this.state.enableUploads || !this.state.enableMarketplace || !this.state.enableRemoteMarketplace}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PluginSettings.MarketplaceURL')}\n />\n </>\n )}\n {pluginsContainer}\n </SettingsGroup>\n {overwriteUploadPluginModal}\n {removePluginModal}\n </div>\n </div>\n );\n };\n}\n\nexport default injectIntl(PluginManagement);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {\n getPlugins,\n getPluginStatuses,\n removePlugin,\n uploadPlugin,\n installPluginFromUrl,\n enablePlugin,\n disablePlugin,\n} from 'mattermost-redux/actions/admin';\nimport {appsFeatureFlagEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport PluginManagement from './plugin_management';\n\nfunction mapStateToProps(state: any) {\n return {\n plugins: state.entities.admin.plugins,\n pluginStatuses: state.entities.admin.pluginStatuses,\n appsFeatureFlagEnabled: appsFeatureFlagEnabled(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n uploadPlugin,\n installPluginFromUrl,\n removePlugin,\n getPlugins,\n getPluginStatuses,\n enablePlugin,\n disablePlugin,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PluginManagement);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n title: ReactNode;\n icon: string;\n count?: number;\n id?: string;\n children?: React.ReactNode;\n status?: 'warning' | 'error';\n}\n\nconst StatisticCount = ({\n title,\n icon,\n count,\n id,\n children,\n status,\n}: Props) => {\n const loading = (\n <FormattedMessage\n id='analytics.chart.loading'\n defaultMessage='Loading...'\n />\n );\n\n return (\n <div className='grid-statistics__card'>\n <div\n className={classNames({\n 'total-count': true,\n 'total-count--has-message': Boolean(status),\n })}\n >\n <div\n data-testid={`${id}Title`}\n className={classNames({\n title: true,\n 'team_statistics--warning': status === 'warning',\n 'team_statistics--error': status === 'error',\n })}\n >\n {title}\n <i className={'fa ' + icon}/>\n </div>\n <div\n data-testid={id}\n className={classNames({\n content: true,\n 'team_statistics--warning': status === 'warning',\n 'team_statistics--error': status === 'error',\n })}\n >\n {typeof count === 'undefined' || isNaN(count) ? loading : count}\n </div>\n </div>\n {children}\n </div>\n );\n};\n\nexport default React.memo(StatisticCount);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, defineMessages, useIntl} from 'react-intl';\n\nimport {InformationOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport ExternalLink from 'components/external_link';\nimport WithTooltip from 'components/with_tooltip';\n\nexport const messages = defineMessages({\n totalUsers: {id: 'analytics.team.totalUsers', defaultMessage: 'Total Activated Users'},\n});\n\nconst Title = () => {\n const intl = useIntl();\n return (\n <WithTooltip\n title={defineMessage({id: 'analytics.team.totalUsers.title.tooltip.title', defaultMessage: 'Activated users on this server'})}\n hint={defineMessage({id: 'analytics.team.totalUsers.title.tooltip.hint', defaultMessage: 'Also called Registered Users'})}\n >\n <span>\n <ExternalLink\n location='activated_users_card.title'\n href='https://mattermost.com/pl/site-statistics-definitions'\n >\n {intl.formatMessage(messages.totalUsers)}\n <InformationOutlineIcon size='16'/>\n </ExternalLink>\n </span>\n </WithTooltip>\n );\n};\n\nexport default Title;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {AlertOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport StatisticCount from 'components/analytics/statistic_count';\n\nimport {calculateOverageUserActivated} from 'utils/overage_team';\n\nimport Title from './title';\n\ntype ActivatedUserCardProps = {\n seatsPurchased: number;\n activatedUsers: number | undefined;\n isCloud: boolean;\n}\n\nconst ActivatedUserCard = ({activatedUsers, seatsPurchased, isCloud}: ActivatedUserCardProps) => {\n const {isBetween5PercerntAnd10PercentPurchasedSeats, isOver10PercerntPurchasedSeats} = calculateOverageUserActivated({seatsPurchased, activeUsers: activatedUsers || 0});\n const showOverageWarning = !isCloud && (isBetween5PercerntAnd10PercentPurchasedSeats || isOver10PercerntPurchasedSeats);\n\n let activeUserStatus: 'warning' | 'error' | undefined;\n if (!isCloud && isBetween5PercerntAnd10PercentPurchasedSeats) {\n activeUserStatus = 'warning';\n }\n\n if (!isCloud && isOver10PercerntPurchasedSeats) {\n activeUserStatus = 'error';\n }\n\n return (\n <StatisticCount\n title={<Title/>}\n icon='fa-users'\n status={activeUserStatus}\n count={activatedUsers}\n id='totalActiveUsers'\n >\n {showOverageWarning &&\n <div\n className={classNames({\n team_statistics__message: true,\n 'team_statistics--warning': isBetween5PercerntAnd10PercentPurchasedSeats,\n 'team_statistics--error': isOver10PercerntPurchasedSeats,\n })}\n >\n <AlertOutlineIcon\n size={14}\n />\n <FormattedMessage\n id='analytics.team.overageUsersSeats'\n defaultMessage='This exceeds total paid seats'\n >\n {(text) => <span>{text}</span>}\n </FormattedMessage>\n </div>}\n </StatisticCount>\n );\n};\n\nexport default ActivatedUserCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChartData} from 'chart.js';\nimport Chart from 'chart.js/auto';\nimport deepEqual from 'fast-deep-equal';\nimport React, {useEffect, useRef} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n title: React.ReactNode;\n width: number;\n height: number;\n data?: ChartData;\n};\n\nconst DoughnutChart: React.FC<Props> = ({title, width, height, data}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const chartRef = useRef<Chart<'doughnut'> | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current || !data) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n\n if (!ctx) {\n return;\n }\n\n if (chartRef.current) {\n if (!deepEqual(chartRef.current.data, data)) {\n chartRef.current.data = JSON.parse(JSON.stringify(data));\n chartRef.current.update();\n }\n } else {\n chartRef.current = new Chart(ctx, {\n type: 'doughnut',\n data: JSON.parse(JSON.stringify(data)),\n options: {},\n });\n }\n }, [data]);\n\n useEffect(() => {\n return () => {\n chartRef.current?.destroy();\n chartRef.current = null;\n };\n }, []);\n\n let content;\n if (typeof data == 'undefined') {\n content = (\n <FormattedMessage\n id='analytics.chart.loading'\n defaultMessage='Loading...'\n />\n );\n } else {\n content = (\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n />\n );\n }\n\n return (\n <div className='col-sm-6'>\n <div className='total-count'>\n <div className='title'>{title}</div>\n <div className='content'>{content}</div>\n </div>\n </div>\n );\n};\n\nexport default DoughnutChart;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as Utils from 'utils/utils';\n\nexport function formatChannelDoughtnutData(totalPublic: any, totalPrivate: any) {\n const channelTypeData = {\n labels: [\n Utils.localizeMessage({id: 'analytics.system.publicChannels', defaultMessage: 'Public Channels'}),\n Utils.localizeMessage({id: 'analytics.system.privateGroups', defaultMessage: 'Private Channels'}),\n ],\n datasets: [{\n data: [totalPublic, totalPrivate],\n backgroundColor: ['#46BFBD', '#FDB45C'],\n hoverBackgroundColor: ['#5AD3D1', '#FFC870'],\n }],\n };\n\n return channelTypeData;\n}\n\nexport function formatPostDoughtnutData(filePosts: any, hashtagPosts: any, totalPosts: any) {\n const postTypeData = {\n labels: [\n Utils.localizeMessage({id: 'analytics.system.totalFilePosts', defaultMessage: 'Posts with Files'}),\n Utils.localizeMessage({id: 'analytics.system.totalHashtagPosts', defaultMessage: 'Posts with Hashtags'}),\n Utils.localizeMessage({id: 'analytics.system.textPosts', defaultMessage: 'Posts with Text-only'}),\n ],\n datasets: [{\n data: [filePosts, hashtagPosts, (totalPosts - filePosts - hashtagPosts)],\n backgroundColor: ['#46BFBD', '#F7464A', '#FDB45C'],\n hoverBackgroundColor: ['#5AD3D1', '#FF5A5E', '#FFC870'],\n }],\n };\n\n return postTypeData;\n}\n\nexport function formatPostsPerDayData(labels: string[], data: any) {\n const chartData = {\n labels: [] as string[],\n datasets: [{\n fillColor: 'rgba(151,187,205,0.2)',\n borderColor: 'rgba(151,187,205,1)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: '#fff',\n pointHoverBackgroundColor: '#fff',\n pointHoverBorderColor: 'rgba(151,187,205,1)',\n data: [] as any,\n }],\n };\n return fillChartData(chartData, labels, data);\n}\n\n// synchronizeChartLabels converges on a uniform set of labels for all entries in the given chart data.\n// If a given label wasn't already present in the chart data, a 0-valued data point at that label is added.\nexport function synchronizeChartLabels(...datas: any) {\n const labels: Set<string> = new Set();\n datas.forEach((data: any) => {\n if (data?.length) {\n data.forEach((e: any) => labels.add(e.name));\n }\n });\n return Array.from(labels).sort();\n}\n\nexport function formatUsersWithPostsPerDayData(labels: string[], data: any) {\n const chartData = {\n labels: [] as string[],\n datasets: [{\n label: '',\n fillColor: 'rgba(151,187,205,0.2)',\n borderColor: 'rgba(151,187,205,1)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: '#fff',\n pointHoverBackgroundColor: '#fff',\n pointHoverBorderColor: 'rgba(151,187,205,1)',\n data: [] as any,\n }],\n };\n return fillChartData(chartData, labels, data);\n}\n\nfunction fillChartData(chartData: any, labels: any, data: any) {\n if (data?.length) {\n chartData.labels = labels;\n\n //labels are in order, add in label order...\n chartData.labels.forEach((label: string) => {\n const element = data.find((e: any) => e.name === label);\n const val = element ? element.value : 0;\n chartData.datasets[0].data.push(val);\n });\n }\n return chartData;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChartOptions} from 'chart.js';\nimport Chart from 'chart.js/auto';\nimport deepEqual from 'fast-deep-equal';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n title: React.ReactNode;\n width?: number;\n height?: number;\n data?: any;\n id: string;\n options?: ChartOptions;\n}\n\nexport default class LineChart extends React.PureComponent<Props> {\n private canvasRef = React.createRef<HTMLCanvasElement>();\n public static propTypes = {\n\n /*\n * Chart title\n */\n title: PropTypes.node.isRequired,\n\n /*\n * Chart width\n */\n width: PropTypes.number,\n\n /*\n * Chart height\n */\n height: PropTypes.number,\n\n /*\n * Chart data\n */\n data: PropTypes.object,\n\n /*\n * Chart options\n */\n options: PropTypes.object,\n };\n\n public chart: Chart | null = null;\n public chartOptions: ChartOptions = {\n plugins: {\n legend: {\n display: false,\n },\n },\n };\n\n public componentDidMount(): void {\n this.initChart();\n window.addEventListener('resize', this.resizeChart);\n }\n\n public componentDidUpdate(prevProps: Props): void {\n const currentData = this.props.data && this.props.data.labels.length > 0;\n\n if (!currentData && this.chart) {\n // Clean up the rendered chart before we render and destroy its context\n this.chart.destroy();\n this.chart = null;\n }\n\n if (deepEqual(prevProps.data, this.props.data)) {\n return;\n }\n\n const hasData = this.props.data && this.props.data.labels.length > 0;\n const hasChart = Boolean(this.chart);\n\n if (hasData) {\n // Update the rendered chart or initialize it as necessary\n this.initChart(hasChart);\n }\n }\n\n public componentWillUnmount(): void {\n if (this.chart) {\n this.chart.destroy();\n }\n window.removeEventListener('resize', this.resizeChart);\n }\n\n private resizeChart = () => {\n if (this.chart && this.canvasRef.current && this.chart.options.responsive) {\n this.canvasRef.current.style.width = '100%';\n }\n };\n\n public initChart = (update?: boolean): void => {\n if (!this.canvasRef.current) {\n return;\n }\n\n const ctx = this.canvasRef.current.getContext('2d') as CanvasRenderingContext2D;\n const dataCopy: any = JSON.parse(JSON.stringify(this.props.data));\n let options = this.chartOptions || {};\n if (this.props.options) {\n options = {...options, ...this.props.options};\n }\n\n if (update) {\n this.chart?.update();\n } else {\n this.chart = new Chart(ctx, {type: 'line', data: dataCopy, options: options || {}});\n }\n };\n\n public render(): JSX.Element {\n let content;\n if (this.props.data == null) {\n content = (\n <FormattedMessage\n id='analytics.chart.loading'\n defaultMessage='Loading...'\n />\n );\n } else if (this.props.data.labels.length === 0) {\n content = (\n <h5>\n <FormattedMessage\n id='analytics.chart.meaningful'\n defaultMessage='Not enough data for a meaningful representation.'\n />\n </h5>\n );\n } else {\n content = (\n <canvas\n data-testid={this.props.id}\n ref={this.canvasRef}\n width={this.props.width}\n height={this.props.height}\n data-labels={this.props.data.labels}\n />\n );\n }\n\n return (\n <div className='col-sm-12'>\n <div className='total-count by-day'>\n <div className='title'>\n {this.props.title}\n </div>\n <div className='content'>\n {content}\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {AnalyticsRow, PluginAnalyticsRow, IndexedPluginAnalyticsRow, AnalyticsState} from '@mattermost/types/admin';\nimport {AnalyticsVisualizationType} from '@mattermost/types/admin';\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport * as AdminActions from 'actions/admin_actions.jsx';\n\nimport ActivatedUserCard from 'components/analytics/activated_users_card';\nimport ExternalLink from 'components/external_link';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport DoughnutChart from '../doughnut_chart';\nimport {\n formatPostsPerDayData,\n formatUsersWithPostsPerDayData,\n formatChannelDoughtnutData,\n formatPostDoughtnutData,\n synchronizeChartLabels,\n} from '../format';\nimport LineChart from '../line_chart';\nimport StatisticCount from '../statistic_count';\n\nconst StatTypes = Constants.StatTypes;\n\ntype Props = {\n isLicensed: boolean;\n stats?: AnalyticsState;\n license: ClientLicense;\n pluginStatHandlers: GlobalState['plugins']['siteStatsHandlers'];\n}\n\ntype State = {\n pluginSiteStats: Record<string, PluginAnalyticsRow>;\n}\n\nconst messages = defineMessages({\n title: {id: 'analytics.system.title', defaultMessage: 'System Statistics'},\n totalPosts: {id: 'analytics.system.totalPosts', defaultMessage: 'Total Posts'},\n activeUsers: {id: 'analytics.system.activeUsers', defaultMessage: 'Active Users With Posts'},\n totalSessions: {id: 'analytics.system.totalSessions', defaultMessage: 'Total Sessions'},\n totalCommands: {id: 'analytics.system.totalCommands', defaultMessage: 'Total Commands'},\n totalIncomingWebhooks: {id: 'analytics.system.totalIncomingWebhooks', defaultMessage: 'Incoming Webhooks'},\n totalOutgoingWebhooks: {id: 'analytics.system.totalOutgoingWebhooks', defaultMessage: 'Outgoing Webhooks'},\n totalWebsockets: {id: 'analytics.system.totalWebsockets', defaultMessage: 'WebSocket Conns'},\n totalMasterDbConnections: {id: 'analytics.system.totalMasterDbConnections', defaultMessage: 'Master DB Conns'},\n totalReadDbConnections: {id: 'analytics.system.totalReadDbConnections', defaultMessage: 'Replica DB Conns'},\n postTypes: {id: 'analytics.system.postTypes', defaultMessage: 'Posts, Files and Hashtags'},\n channelTypes: {id: 'analytics.system.channelTypes', defaultMessage: 'Channel Types'},\n totalTeams: {id: 'analytics.system.totalTeams', defaultMessage: 'Total Teams'},\n totalChannels: {id: 'analytics.system.totalChannels', defaultMessage: 'Total Channels'},\n dailyActiveUsers: {id: 'analytics.system.dailyActiveUsers', defaultMessage: 'Daily Active Users'},\n monthlyActiveUsers: {id: 'analytics.system.monthlyActiveUsers', defaultMessage: 'Monthly Active Users'},\n});\n\nexport const searchableStrings = [\n messages.title,\n messages.totalPosts,\n messages.activeUsers,\n messages.totalSessions,\n messages.totalCommands,\n messages.totalIncomingWebhooks,\n messages.totalOutgoingWebhooks,\n messages.totalWebsockets,\n messages.totalMasterDbConnections,\n messages.totalReadDbConnections,\n messages.postTypes,\n messages.channelTypes,\n messages.totalTeams,\n messages.totalChannels,\n messages.dailyActiveUsers,\n messages.monthlyActiveUsers,\n];\n\nexport default class SystemAnalytics extends React.PureComponent<Props, State> {\n state = {\n pluginSiteStats: {} as Record<string, PluginAnalyticsRow>,\n };\n\n public async componentDidMount() {\n AdminActions.getStandardAnalytics();\n AdminActions.getPostsPerDayAnalytics();\n AdminActions.getBotPostsPerDayAnalytics();\n AdminActions.getUsersPerDayAnalytics();\n\n if (this.props.isLicensed) {\n AdminActions.getAdvancedAnalytics();\n }\n this.fetchPluginStats();\n }\n\n // fetchPluginStats does a call for each one of the registered handlers,\n // wait and set the data in the state\n private async fetchPluginStats() {\n const pluginKeys = Object.keys(this.props.pluginStatHandlers);\n if (!pluginKeys.length) {\n return;\n }\n\n const allHandlers = Object.values(this.props.pluginStatHandlers).map((handler) => handler());\n const allStats = await Promise.all(allHandlers);\n\n const allStatsIndexed: IndexedPluginAnalyticsRow = {};\n allStats.forEach((pluginStats, idx) => {\n Object.entries(pluginStats).forEach(([name, value]) => {\n const key = `${pluginKeys[idx]}.${name}`;\n allStatsIndexed[key] = value;\n });\n });\n\n this.setState({pluginSiteStats: allStatsIndexed});\n }\n\n private getStatValue(stat: number | AnalyticsRow[] | undefined): number | undefined {\n if (typeof stat === 'number') {\n return stat;\n }\n if (!stat || stat.length === 0) {\n return undefined;\n }\n return stat[0].value;\n }\n\n public render() {\n const stats = this.props.stats!;\n const isLicensed = this.props.isLicensed;\n const skippedIntensiveQueries = stats[StatTypes.TOTAL_POSTS] === -1;\n\n const labels = synchronizeChartLabels(stats[StatTypes.POST_PER_DAY], stats[StatTypes.BOT_POST_PER_DAY], stats[StatTypes.USERS_WITH_POSTS_PER_DAY]);\n const postCountsDay = formatPostsPerDayData(labels, stats[StatTypes.POST_PER_DAY]);\n const botPostCountsDay = formatPostsPerDayData(labels, stats[StatTypes.BOT_POST_PER_DAY]);\n const userCountsWithPostsDay = formatUsersWithPostsPerDayData(labels, stats[StatTypes.USERS_WITH_POSTS_PER_DAY]);\n\n let banner;\n let postCount;\n let postTotalGraph;\n let botPostTotalGraph;\n let activeUserGraph;\n if (skippedIntensiveQueries) {\n banner = (\n <div className='banner'>\n <div className='banner__content'>\n <FormattedMessage\n id='analytics.system.skippedIntensiveQueries'\n defaultMessage='To maximize performance, some statistics are disabled. You can <link>re-enable them in config.json</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://docs.mattermost.com/administration/statistics.html'\n location='system_analytics'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n );\n } else {\n postCount = (\n <StatisticCount\n id='totalPosts'\n title={<FormattedMessage {...messages.totalPosts}/>}\n icon='fa-comment'\n count={this.getStatValue(stats[StatTypes.TOTAL_POSTS])}\n />\n );\n\n botPostTotalGraph = (\n <div className='row'>\n <LineChart\n title={\n <FormattedMessage\n id='analytics.system.totalBotPosts'\n defaultMessage='Total Posts from Bots'\n />\n }\n data={botPostCountsDay}\n id='totalPostsFromBotsLineChart'\n width={740}\n height={225}\n />\n </div>\n );\n\n postTotalGraph = (\n <div className='row'>\n <LineChart\n title={<FormattedMessage {...messages.totalPosts}/>}\n id='totalPostsLineChart'\n data={postCountsDay}\n width={740}\n height={225}\n />\n </div>\n );\n\n activeUserGraph = (\n <div className='row'>\n <LineChart\n title={<FormattedMessage {...messages.activeUsers}/>}\n id='activeUsersWithPostsLineChart'\n data={userCountsWithPostsDay}\n width={740}\n height={225}\n />\n </div>\n );\n }\n\n let advancedStats;\n let advancedGraphs;\n let sessionCount;\n let commandCount;\n let incomingCount;\n let outgoingCount;\n if (this.props.isLicensed) {\n sessionCount = (\n <StatisticCount\n id='totalSessions'\n title={<FormattedMessage {...messages.totalSessions}/>}\n icon='fa-signal'\n count={this.getStatValue(stats[StatTypes.TOTAL_SESSIONS])}\n />\n );\n\n commandCount = (\n <StatisticCount\n id='totalCommands'\n title={<FormattedMessage {...messages.totalCommands}/>}\n icon='fa-terminal'\n count={this.getStatValue(stats[StatTypes.TOTAL_COMMANDS])}\n />\n );\n\n incomingCount = (\n <StatisticCount\n id='incomingWebhooks'\n title={<FormattedMessage {...messages.totalIncomingWebhooks}/>\n }\n icon='fa-arrow-down'\n count={this.getStatValue(stats[StatTypes.TOTAL_IHOOKS])}\n />\n );\n\n outgoingCount = (\n <StatisticCount\n id='outgoingWebhooks'\n title={<FormattedMessage {...messages.totalOutgoingWebhooks}/>\n }\n icon='fa-arrow-up'\n count={this.getStatValue(stats[StatTypes.TOTAL_OHOOKS])}\n />\n );\n\n advancedStats = (\n <>\n <StatisticCount\n id='websocketConns'\n title={<FormattedMessage {...messages.totalWebsockets}/>\n }\n icon='fa-user'\n count={this.getStatValue(stats[StatTypes.TOTAL_WEBSOCKET_CONNECTIONS])}\n />\n <StatisticCount\n id='masterDbConns'\n title={<FormattedMessage {...messages.totalMasterDbConnections}/>\n }\n icon='fa-terminal'\n count={this.getStatValue(stats[StatTypes.TOTAL_MASTER_DB_CONNECTIONS])}\n />\n <StatisticCount\n id='replicaDbConns'\n title={<FormattedMessage {...messages.totalReadDbConnections}/>\n }\n icon='fa-terminal'\n count={this.getStatValue(stats[StatTypes.TOTAL_READ_DB_CONNECTIONS])}\n />\n </>\n );\n\n const channelTypeData = formatChannelDoughtnutData(stats[StatTypes.TOTAL_PUBLIC_CHANNELS], stats[StatTypes.TOTAL_PRIVATE_GROUPS]);\n const postTypeData = formatPostDoughtnutData(stats[StatTypes.TOTAL_FILE_POSTS], stats[StatTypes.TOTAL_HASHTAG_POSTS], stats[StatTypes.TOTAL_POSTS]);\n\n let postTypeGraph;\n if (stats[StatTypes.TOTAL_POSTS] !== -1) {\n postTypeGraph = (\n <DoughnutChart\n title={<FormattedMessage {...messages.postTypes}/>\n }\n data={postTypeData}\n width={300}\n height={225}\n />\n );\n }\n\n advancedGraphs = (\n <div className='row'>\n <DoughnutChart\n title={<FormattedMessage {...messages.channelTypes}/>\n }\n data={channelTypeData}\n width={300}\n height={225}\n />\n {postTypeGraph}\n </div>\n );\n }\n\n const isCloud = this.props.license.Cloud === 'true';\n const userCount = (\n <ActivatedUserCard\n activatedUsers={this.getStatValue(stats[StatTypes.TOTAL_USERS])}\n seatsPurchased={parseInt(this.props.license.Users, 10)}\n isCloud={isCloud}\n />\n );\n\n const seatsPurchased = (\n <StatisticCount\n id='seatPurchased'\n title={\n <FormattedMessage\n id='analytics.system.seatsPurchased'\n defaultMessage='Licensed Seats'\n />\n }\n icon='fa-users'\n count={parseInt(this.props.license.Users, 10)}\n />\n );\n\n const teamCount = (\n <StatisticCount\n id='totalTeams'\n title={<FormattedMessage {...messages.totalTeams}/>\n }\n icon='fa-users'\n count={this.getStatValue(stats[StatTypes.TOTAL_TEAMS])}\n />\n );\n const totalPublicChannelsCount = this.getStatValue(stats[StatTypes.TOTAL_PUBLIC_CHANNELS]);\n const totalPrivateGroupsCount = this.getStatValue(stats[StatTypes.TOTAL_PRIVATE_GROUPS]);\n const totalChannelCount = () => {\n if (totalPublicChannelsCount && totalPrivateGroupsCount) {\n return totalPublicChannelsCount + totalPrivateGroupsCount;\n } else if (!totalPublicChannelsCount && totalPrivateGroupsCount) {\n return totalPrivateGroupsCount;\n } else if (totalPublicChannelsCount && !totalPrivateGroupsCount) {\n return totalPublicChannelsCount;\n }\n return undefined;\n };\n const channelCount = (\n <StatisticCount\n id='totalChannels'\n title={<FormattedMessage {...messages.totalChannels}/>\n }\n icon='fa-globe'\n count={totalChannelCount()}\n />\n );\n\n const dailyActiveUsers = (\n <StatisticCount\n id='dailyActiveUsers'\n title={<FormattedMessage {...messages.dailyActiveUsers}/>\n }\n icon='fa-users'\n count={this.getStatValue(stats[StatTypes.DAILY_ACTIVE_USERS])}\n />\n );\n\n const monthlyActiveUsers = (\n <StatisticCount\n id='monthlyActiveUsers'\n title={<FormattedMessage {...messages.monthlyActiveUsers}/>\n }\n icon='fa-users'\n count={this.getStatValue(stats[StatTypes.MONTHLY_ACTIVE_USERS])}\n />\n );\n\n // Extract plugin stats that should be displayed and pass them to widget\n const pluginCounts = [];\n const pluginLineCharts = [];\n const pluginDoughnutCharts = [];\n\n for (const [key, stat] of Object.entries(this.state.pluginSiteStats)) {\n switch (stat.visualizationType) {\n case AnalyticsVisualizationType.LineChart:\n pluginLineCharts.push((\n <LineChart\n id={key}\n key={'pluginstat.' + key}\n title={stat.name}\n data={stat.value}\n width={740}\n height={225}\n />\n ));\n break;\n case AnalyticsVisualizationType.DoughnutChart:\n pluginDoughnutCharts.push((\n <DoughnutChart\n key={'pluginstat.' + key}\n title={stat.name}\n data={stat.value}\n width={300}\n height={225}\n />\n ));\n break;\n case AnalyticsVisualizationType.Count:\n default:\n pluginCounts.push((\n <StatisticCount\n id={key}\n key={'pluginstat.' + key}\n title={stat.name}\n icon={stat.icon!}\n count={stat.value}\n />\n ));\n }\n }\n\n let systemCards;\n if (isLicensed) {\n systemCards = (\n <>\n {userCount}\n {isCloud ? null : seatsPurchased}\n {teamCount}\n {channelCount}\n {skippedIntensiveQueries ? null : postCount}\n {sessionCount}\n {commandCount}\n {incomingCount}\n {outgoingCount}\n </>\n );\n } else if (!isLicensed) {\n systemCards = (\n <>\n {userCount}\n {isCloud || !isLicensed ? null : seatsPurchased}\n {teamCount}\n {channelCount}\n {skippedIntensiveQueries ? null : postCount}\n </>\n );\n }\n\n return (\n <div className='wrapper--fixed team_statistics'>\n <AdminHeader>\n <FormattedMessage {...messages.title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {banner}\n <div className='grid-statistics'>\n {systemCards}\n {dailyActiveUsers}\n {monthlyActiveUsers}\n {advancedStats}\n {pluginCounts}\n </div>\n {advancedGraphs}\n {pluginDoughnutCharts}\n {postTotalGraph}\n {botPostTotalGraph}\n {activeUserGraph}\n {pluginLineCharts}\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport SystemAnalytics from './system_analytics';\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n const isLicensed = license.IsLicensed === 'true';\n\n return {\n isLicensed,\n stats: state.entities.admin.analytics,\n pluginStatHandlers: state.plugins.siteStatsHandlers,\n };\n}\n\nexport default connect(mapStateToProps)(SystemAnalytics);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n title?: JSX.Element;\n description: JSX.Element;\n}\n\nconst Banner: React.FC<Props> = (props: Props) => {\n let title = (\n <FormattedMessage\n id='admin.banner.heading'\n defaultMessage='Note:'\n />\n );\n\n if (props.title) {\n title = props.title;\n }\n\n return (\n <div className='banner'>\n <div className='banner__content'>\n <h4 className='banner__heading'>\n {title}\n </h4>\n <p>\n {props.description}\n </p>\n </div>\n </div>\n );\n};\n\nexport default Banner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport WithTooltip from 'components/with_tooltip';\n\nexport type TableItem = {\n name: string;\n tip: string;\n value: React.ReactNode;\n}\ntype Props = {\n title: React.ReactNode;\n data: TableItem[];\n}\n\nconst TableChart = ({\n title,\n data,\n}: Props) => (\n <div className='col-sm-6'>\n <div className='total-count recent-active-users'>\n <div className='title'>\n {title}\n </div>\n <div className='content'>\n <table>\n <tbody>\n {\n data.map((item) => (\n <tr key={'table-entry-' + item.name}>\n <td>\n <WithTooltip\n title={item.tip}\n >\n <span>{item.name}</span>\n </WithTooltip>\n </td>\n <td>{item.value}</td>\n </tr>\n ))\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n);\n\nexport default memo(TableChart);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedDate, FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {AnalyticsRow, AnalyticsState} from '@mattermost/types/admin';\nimport type {ClientLicense} from '@mattermost/types/config';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {General} from 'mattermost-redux/constants';\n\nimport * as AdminActions from 'actions/admin_actions';\n\nimport Banner from 'components/admin_console/banner';\nimport ActivatedUserCard from 'components/analytics/activated_users_card';\nimport {messages as activatedUsersCardsMessages} from 'components/analytics/activated_users_card/title';\nimport LineChart from 'components/analytics/line_chart';\nimport StatisticCount from 'components/analytics/statistic_count';\nimport TableChart from 'components/analytics/table_chart';\nimport ExternalLink from 'components/external_link';\nimport LoadingScreen from 'components/loading_screen';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {StatTypes} from 'utils/constants';\nimport {getMonthLong} from 'utils/i18n';\n\nimport {formatPostsPerDayData, formatUsersWithPostsPerDayData, synchronizeChartLabels} from '../format';\n\nconst LAST_ANALYTICS_TEAM = 'last_analytics_team';\n\ntype Props = {\n\n /*\n * Array of team objects\n */\n teams: Team[];\n\n /*\n * Initial team to load analytics for\n */\n initialTeam?: Team;\n\n /*\n * The locale of the current user\n */\n locale: string;\n\n license: ClientLicense;\n\n stats: RelationOneToOne<Team, AnalyticsState>;\n\n actions: {\n\n /*\n * Function to get teams\n */\n getTeams: (page?: number, perPage?: number, includeTotalCount?: boolean, excludePolicyConstrained?: boolean) => void;\n\n /*\n * Function to get users in a team\n */\n getProfilesInTeam: (teamId: string, page: number, perPage?: number, sort?: string, options?: undefined) => Promise<{\n data?: UserProfile[];\n }>;\n\n /*\n * Function to set a key-value pair in the local storage\n */\n setGlobalItem: (name: string, value: string) => void;\n };\n};\n\ntype State = {\n team?: Team;\n recentlyActiveUsers?: UserProfile[];\n newUsers?: UserProfile[];\n};\n\nconst messages = defineMessages({\n title: {id: 'analytics.team.title', defaultMessage: 'Team Statistics for {team}'},\n info: {id: 'analytics.system.info', defaultMessage: 'Use data for only the chosen team. Exclude posts in direct message channels that are not tied to a team.'},\n totalPosts: {id: 'analytics.team.totalPosts', defaultMessage: 'Total Posts'},\n activeUsers: {id: 'analytics.team.activeUsers', defaultMessage: 'Active Users With Posts'},\n publicChannels: {id: 'analytics.team.publicChannels', defaultMessage: 'Public Channels'},\n privateGroups: {id: 'analytics.team.privateGroups', defaultMessage: 'Private Channels'},\n recentUsers: {id: 'analytics.team.recentUsers', defaultMessage: 'Recent Active Users'},\n newlyCreated: {id: 'analytics.team.newlyCreated', defaultMessage: 'Newly Created Users'},\n});\n\nexport const searchableStrings: Array<string|MessageDescriptor|[MessageDescriptor, {[key: string]: any}]> = [\n [messages.title, {team: ''}],\n messages.info,\n messages.totalPosts,\n messages.activeUsers,\n activatedUsersCardsMessages.totalUsers,\n messages.publicChannels,\n messages.privateGroups,\n messages.recentUsers,\n messages.newlyCreated,\n];\n\nexport default class TeamAnalytics extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n team: props.initialTeam,\n recentlyActiveUsers: [],\n newUsers: [],\n };\n }\n\n public componentDidMount(): void {\n if (this.state.team) {\n this.getData(this.state.team.id);\n }\n\n this.props.actions.getTeams(0, 1000);\n }\n\n public componentDidUpdate(prevProps: Props, prevState: State): void {\n if (this.state.team && prevState.team !== this.state.team) {\n this.getData(this.state.team.id);\n }\n }\n\n private getStatValue(stat: number | AnalyticsRow[] | undefined): number | undefined {\n if (typeof stat === 'number') {\n return stat;\n }\n if (!stat || stat.length === 0) {\n return undefined;\n }\n return stat[0].value;\n }\n\n private getData = async (id: string): Promise<void> => {\n AdminActions.getStandardAnalytics(id);\n AdminActions.getPostsPerDayAnalytics(id);\n AdminActions.getBotPostsPerDayAnalytics(id);\n AdminActions.getUsersPerDayAnalytics(id);\n const {data: recentlyActiveUsers} = await this.props.actions.getProfilesInTeam(id, 0, General.PROFILE_CHUNK_SIZE, 'last_activity_at');\n const {data: newUsers} = await this.props.actions.getProfilesInTeam(id, 0, General.PROFILE_CHUNK_SIZE, 'create_at');\n\n this.setState({\n recentlyActiveUsers,\n newUsers,\n });\n };\n\n private handleTeamChange = (e: React.ChangeEvent<HTMLSelectElement>): void => {\n const teamId = e.target.value;\n\n let team;\n this.props.teams.forEach((t) => {\n if (t.id === teamId) {\n team = t;\n }\n });\n\n this.setState({\n team,\n });\n\n this.props.actions.setGlobalItem(LAST_ANALYTICS_TEAM, teamId);\n };\n\n public render(): JSX.Element {\n if (this.props.teams.length === 0 || !this.state.team || !this.props.stats[this.state.team.id]) {\n return <LoadingScreen/>;\n }\n\n if (this.state.team == null) {\n return (\n <Banner\n description={\n <FormattedMessage\n id='analytics.team.noTeams'\n defaultMessage='This server has no teams for which to view statistics.'\n />\n }\n />\n );\n }\n\n const stats = this.props.stats[this.state.team.id];\n\n const labels = synchronizeChartLabels(stats[StatTypes.POST_PER_DAY], stats[StatTypes.USERS_WITH_POSTS_PER_DAY]);\n const postCountsDay = formatPostsPerDayData(labels, stats[StatTypes.POST_PER_DAY]);\n const userCountsWithPostsDay = formatUsersWithPostsPerDayData(labels, stats[StatTypes.USERS_WITH_POSTS_PER_DAY]);\n\n let banner = (\n <div className='banner'>\n <div className='banner__content'>\n <FormattedMessage {...messages.info}/>\n </div>\n </div>\n );\n\n let totalPostsCount;\n let postTotalGraph;\n let userActiveGraph;\n if (stats[StatTypes.TOTAL_POSTS] === -1) {\n banner = (\n <div className='banner'>\n <div className='banner__content'>\n <FormattedMessage\n id='analytics.system.infoAndSkippedIntensiveQueries1'\n defaultMessage='Use data for only the chosen team. Exclude posts in direct message channels that are not tied to a team.'\n />\n <p/>\n <FormattedMessage\n id='analytics.system.infoAndSkippedIntensiveQueries2'\n defaultMessage='To maximize performance, some statistics are disabled. You can <link>re-enable them in config.json</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://docs.mattermost.com/administration/statistics.html'\n location='team_analytics'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n );\n } else {\n totalPostsCount = (\n <StatisticCount\n title={<FormattedMessage {...messages.totalPosts}/>}\n icon='fa-comment'\n count={this.getStatValue(stats[StatTypes.TOTAL_POSTS])}\n />\n );\n\n postTotalGraph = (\n <div className='row'>\n <LineChart\n key={this.state.team.id}\n title={<FormattedMessage {...messages.totalPosts}/>}\n id='totalPosts'\n data={postCountsDay}\n width={740}\n height={225}\n />\n </div>\n );\n\n userActiveGraph = (\n <div className='row'>\n <LineChart\n key={this.state.team.id}\n title={<FormattedMessage {...messages.activeUsers}/>}\n id='activeUsersWithPosts'\n data={userCountsWithPostsDay}\n width={740}\n height={225}\n />\n </div>\n );\n }\n\n const recentActiveUsers = formatRecentUsersData(this.state.recentlyActiveUsers!, this.props.locale);\n const newlyCreatedUsers = formatNewUsersData(this.state.newUsers!, this.props.locale);\n\n const teams = this.props.teams.sort((a, b) => {\n const aName = a.display_name.toUpperCase();\n const bName = b.display_name.toUpperCase();\n if (aName === bName) {\n return 0;\n }\n if (aName > bName) {\n return 1;\n }\n return -1;\n }).map((team) => {\n return (\n <option\n key={team.id}\n value={team.id}\n >\n {team.display_name}\n </option>\n );\n });\n\n return (\n <div className='wrapper--fixed team_statistics'>\n <AdminHeader>\n <div className='team-statistics__header'>\n <FormattedMessage\n {...messages.title}\n values={{\n team: this.state.team.display_name,\n }}\n />\n </div>\n <div className='team-statistics__team-filter'>\n <select\n data-testid='teamFilter'\n className='form-control team-statistics__team-filter__dropdown'\n onChange={this.handleTeamChange}\n value={this.state.team.id}\n >\n {teams}\n </select>\n </div>\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {banner}\n <div className='grid-statistics'>\n <ActivatedUserCard\n activatedUsers={this.getStatValue(stats[StatTypes.TOTAL_USERS])}\n seatsPurchased={parseInt(this.props.license.Users, 10)}\n isCloud={this.props.license.Cloud === 'true'}\n />\n <StatisticCount\n title={<FormattedMessage {...messages.publicChannels}/>}\n icon='fa-globe'\n count={this.getStatValue(stats[StatTypes.TOTAL_PUBLIC_CHANNELS])}\n />\n <StatisticCount\n title={<FormattedMessage {...messages.privateGroups}/>}\n icon='fa-lock'\n count={this.getStatValue(stats[StatTypes.TOTAL_PRIVATE_GROUPS])}\n />\n {totalPostsCount}\n </div>\n {postTotalGraph}\n {userActiveGraph}\n <div className='row'>\n <TableChart\n title={<FormattedMessage {...messages.recentUsers}/>}\n data={recentActiveUsers}\n />\n <TableChart\n title={<FormattedMessage {...messages.newlyCreated}/>}\n data={newlyCreatedUsers}\n />\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\ntype Item = {\n name: string;\n value: JSX.Element;\n tip: string;\n};\n\nexport function formatRecentUsersData(data: UserProfile[], locale: string): Item[] {\n if (data == null) {\n return [];\n }\n\n return data.map((user: UserProfile) => ({\n name: user.username,\n value: (\n <FormattedDate\n value={user.last_activity_at}\n day='numeric'\n month={getMonthLong(locale)}\n year='numeric'\n hour='2-digit'\n minute='2-digit'\n />\n ),\n tip: user.email,\n }));\n}\n\nexport function formatNewUsersData(data: UserProfile[], locale: string): Item[] {\n if (data == null) {\n return [];\n }\n\n return data.map((user: UserProfile) => ({\n name: user.username,\n value: (\n <FormattedDate\n value={user.create_at}\n day='numeric'\n month={getMonthLong(locale)}\n year='numeric'\n hour='2-digit'\n minute='2-digit'\n />\n ),\n tip: user.email,\n }));\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getTeams} from 'mattermost-redux/actions/teams';\nimport {getProfilesInTeam} from 'mattermost-redux/actions/users';\nimport {getTeamsList} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setGlobalItem} from 'actions/storage';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {makeGetGlobalItem} from 'selectors/storage';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamAnalytics from './team_analytics';\n\nconst LAST_ANALYTICS_TEAM = 'last_analytics_team';\n\nfunction mapStateToProps(state: GlobalState) {\n const teams = getTeamsList(state);\n const teamId = makeGetGlobalItem(LAST_ANALYTICS_TEAM, '')(state);\n const initialTeam = state.entities.teams.teams[teamId] || (teams.length > 0 ? teams[0] : null);\n\n return {\n initialTeam,\n locale: getCurrentLocale(state),\n teams,\n stats: state.entities.admin.teamAnalytics!,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTeams,\n getProfilesInTeam,\n setGlobalItem,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamAnalytics);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nconst SECTION_NONE = (\n <tr>\n <td>\n <FormattedMessage\n id='admin.connectionSecurityNone'\n defaultMessage='None'\n />\n </td>\n <td>\n <FormattedMessage\n id='admin.connectionSecurityNoneDescription'\n defaultMessage='Mattermost will connect over an insecure connection.'\n />\n </td>\n </tr>\n);\n\nconst SECTION_TLS = (\n <tr>\n <td>\n <FormattedMessage\n id='admin.connectionSecurityTls'\n defaultMessage='TLS'\n />\n </td>\n <td>\n <FormattedMessage\n id='admin.connectionSecurityTlsDescription'\n defaultMessage='Encrypts the communication between Mattermost and your server.'\n />\n </td>\n </tr>\n);\n\nconst SECTION_STARTTLS = (\n <tr>\n <td>\n <FormattedMessage\n id='admin.connectionSecurityStart'\n defaultMessage='STARTTLS'\n />\n </td>\n <td>\n <FormattedMessage\n id='admin.connectionSecurityStartDescription'\n defaultMessage='Takes an existing insecure connection and attempts to upgrade it to a secure connection using TLS.'\n />\n </td>\n </tr>\n);\n\nexport const CONNECTION_SECURITY_HELP_TEXT_EMAIL = (\n <table\n className='table table-bordered'\n cellPadding='5'\n >\n <tbody>\n {SECTION_NONE}\n {SECTION_TLS}\n {SECTION_STARTTLS}\n </tbody>\n </table>\n);\n\nexport const CONNECTION_SECURITY_HELP_TEXT_LDAP = (\n <table\n className='table table-bordered'\n cellPadding='5'\n >\n <tbody>\n {SECTION_NONE}\n {SECTION_TLS}\n {SECTION_STARTTLS}\n </tbody>\n </table>\n);\n\nexport const CONNECTION_SECURITY_HELP_TEXT_WEBSERVER = (\n <table\n className='table table-bordered'\n cellPadding='5'\n >\n <tbody>\n {SECTION_NONE}\n {SECTION_TLS}\n </tbody>\n </table>\n);\n\nexport const WEBSERVER_MODE_HELP_TEXT = (\n <div>\n <table\n className='table table-bordered'\n cellPadding='5'\n >\n <tbody>\n <tr>\n <td>\n <FormattedMessage\n id='admin.webserverModeGzip'\n defaultMessage='gzip'\n />\n </td>\n <td>\n <FormattedMessage\n id='admin.webserverModeGzipDescription'\n defaultMessage='The Mattermost server will serve static files compressed with gzip.'\n />\n </td>\n </tr>\n <tr>\n <td>\n <FormattedMessage\n id='admin.webserverModeUncompressed'\n defaultMessage='Uncompressed'\n />\n </td>\n <td>\n <FormattedMessage\n id='admin.webserverModeUncompressedDescription'\n defaultMessage='The Mattermost server will serve static files uncompressed.'\n />\n </td>\n </tr>\n <tr>\n <td>\n <FormattedMessage\n id='admin.webserverModeDisabled'\n defaultMessage='Disabled'\n />\n </td>\n <td>\n <FormattedMessage\n id='admin.webserverModeDisabledDescription'\n defaultMessage='The Mattermost server will not serve static files.'\n />\n </td>\n </tr>\n </tbody>\n </table>\n <p className='help-text'>\n <FormattedMessage\n id='admin.webserverModeHelpText'\n defaultMessage='gzip compression applies to static content files. It is recommended to enable gzip to improve performance unless your environment has specific restrictions, such as a web proxy that distributes gzip files poorly.'\n />\n </p>\n </div>\n);\n\nexport const LOG_LEVEL_OPTIONS = [\n {\n value: 'DEBUG',\n display_name: defineMessage({id: 'admin.log.levelOptions.DEBUG', defaultMessage: 'DEBUG'}),\n },\n {\n value: 'INFO',\n display_name: defineMessage({id: 'admin.log.levelOptions.INFO', defaultMessage: 'INFO'}),\n },\n {\n value: 'ERROR',\n display_name: defineMessage({id: 'admin.log.levelOptions.ERROR', defaultMessage: 'ERROR'}),\n },\n {\n value: 'WARN',\n display_name: defineMessage({id: 'admin.log.levelOptions.WARN', defaultMessage: 'WARN'}),\n },\n];\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ReloadIcon() {\n const {formatMessage} = useIntl();\n return (\n <i\n className='fa fa-refresh'\n title={formatMessage({id: 'generic_icons.reload', defaultMessage: 'Reload Icon'})}\n />\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedDate, FormattedMessage, FormattedTime, defineMessage} from 'react-intl';\n\nimport type {Compliance} from '@mattermost/types/compliance';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport LoadingScreen from 'components/loading_screen';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport ReloadIcon from 'components/widgets/icons/fa_reload_icon';\n\ntype Props = {\n\n /*\n * Set if compliance reports are licensed\n */\n isLicensed: boolean;\n\n /*\n * Set if compliance reports are enabled in the config\n */\n enabled: boolean;\n\n /*\n * Array of reports to render\n */\n reports: Compliance[];\n users: Record<string, UserProfile>;\n\n /*\n * Error message to display\n */\n serverError?: string;\n\n readOnly?: boolean;\n\n actions: {\n\n /*\n * Function to get compliance reports\n */\n getComplianceReports: () => Promise<ActionResult<Compliance[]>>;\n\n /*\n * Function to save compliance reports\n */\n createComplianceReport: (job: Partial<Compliance>) => Promise<ActionResult<Compliance>>;\n };\n}\n\ntype State = {\n loadingReports: boolean;\n runningReport?: boolean;\n}\n\nexport default class ComplianceReports extends React.PureComponent<Props, State> {\n private descInput: React.RefObject<HTMLInputElement>;\n private emailsInput: React.RefObject<HTMLInputElement>;\n private fromInput: React.RefObject<HTMLInputElement>;\n private keywordsInput: React.RefObject<HTMLInputElement>;\n private toInput: React.RefObject<HTMLInputElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loadingReports: true,\n };\n\n this.descInput = React.createRef();\n this.emailsInput = React.createRef();\n this.fromInput = React.createRef();\n this.keywordsInput = React.createRef();\n this.toInput = React.createRef();\n }\n\n componentDidMount() {\n if (!this.props.isLicensed || !this.props.enabled) {\n return;\n }\n\n this.props.actions.getComplianceReports().then(\n () => this.setState({loadingReports: false}),\n );\n }\n\n reload = () => {\n this.setState({loadingReports: true});\n\n this.props.actions.getComplianceReports().then(\n () => this.setState({loadingReports: false}),\n );\n };\n\n runReport = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n\n this.setState({runningReport: true});\n\n const job: Partial<Compliance> = {};\n job.desc = this.descInput.current?.value;\n job.emails = this.emailsInput.current?.value;\n job.keywords = this.keywordsInput.current?.value;\n job.start_at = this.fromInput.current ? Date.parse(this.fromInput.current.value) : undefined;\n job.end_at = this.toInput.current ? Date.parse(this.toInput.current.value) : undefined;\n\n this.props.actions.createComplianceReport(job).then(\n ({data}) => {\n if (data) {\n if (this.emailsInput.current) {\n this.emailsInput.current.value = '';\n }\n if (this.keywordsInput.current) {\n this.keywordsInput.current.value = '';\n }\n if (this.descInput.current) {\n this.descInput.current.value = '';\n }\n if (this.fromInput.current) {\n this.fromInput.current.value = '';\n }\n if (this.toInput.current) {\n this.toInput.current.value = '';\n }\n }\n this.setState({runningReport: false});\n this.props.actions.getComplianceReports();\n },\n );\n };\n\n getDateTime(millis: number) {\n const date = new Date(millis);\n return (\n <span style={style.date}>\n <FormattedDate\n value={date}\n day='2-digit'\n month='short'\n year='numeric'\n />\n {' - '}\n <FormattedTime\n value={date}\n hour='2-digit'\n minute='2-digit'\n />\n </span>\n );\n }\n\n render() {\n if (!this.props.isLicensed || !this.props.enabled) {\n return <div/>;\n }\n\n let content = null;\n if (this.state.loadingReports) {\n content = <LoadingScreen/>;\n } else {\n const list = [];\n\n for (let i = 0; i < this.props.reports.length; i++) {\n const report = this.props.reports[i];\n\n let params: string | JSX.Element = '';\n if (report.type === 'adhoc') {\n params = (\n <span>\n <FormattedMessage\n id='admin.compliance_reports.from'\n defaultMessage='From:'\n />{' '}{this.getDateTime(report.start_at)}\n <br/>\n <FormattedMessage\n id='admin.compliance_reports.to'\n defaultMessage='To:'\n />{' '}{this.getDateTime(report.end_at)}\n <br/>\n <FormattedMessage\n id='admin.compliance_reports.emails'\n defaultMessage='Emails:'\n />{' '}{report.emails}\n <br/>\n <FormattedMessage\n id='admin.compliance_reports.keywords'\n defaultMessage='Keywords:'\n />{' '}{report.keywords}\n </span>);\n }\n let download: string | JSX.Element = '';\n let status: string | JSX.Element = '';\n if (report.status === 'finished') {\n download = (\n <a href={`${Client4.getBaseRoute()}/compliance/reports/${report.id}/download`}>\n <FormattedMessage\n id='admin.compliance_table.download'\n defaultMessage='Download'\n />\n </a>\n );\n\n status = (\n <span className='status-icon-success'>\n <FormattedMessage\n id='admin.compliance_table.success'\n defaultMessage='Success'\n />\n </span>\n );\n } else if (report.status === 'running') {\n status = (\n <span className='status-icon-warning'>\n <FormattedMessage\n id='admin.compliance_table.pending'\n defaultMessage='Pending'\n />\n </span>\n );\n } else if (report.status === 'failed') {\n status = (\n <span className='status-icon-error'>\n <FormattedMessage\n id='admin.compliance_table.failed'\n defaultMessage='Failed'\n />\n </span>\n );\n }\n\n let user = report.user_id;\n const profile = this.props.users[report.user_id];\n if (profile) {\n user = profile.email;\n }\n\n list[i] = (\n <tr key={report.id}>\n <td>{status}</td>\n <td style={style.dataCell}>{download}</td>\n <td>{this.getDateTime(report.create_at)}</td>\n <td>{report.count}</td>\n <td>{report.type}</td>\n <td style={style.dataCell}>{report.desc}</td>\n <td>{user}</td>\n <td style={style.dataCell}>{params}</td>\n </tr>\n );\n }\n\n content = (\n <div style={style.content}>\n <table className='table'>\n <thead>\n <tr>\n <th>\n <FormattedMessage\n id='admin.compliance_table.status'\n defaultMessage='Status'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.files'\n defaultMessage='Files'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.timestamp'\n defaultMessage='Timestamp'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.records'\n defaultMessage='Records'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.type'\n defaultMessage='Type'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.desc'\n defaultMessage='Description'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.userId'\n defaultMessage='Requested By'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.compliance_table.params'\n defaultMessage='Params'\n />\n </th>\n </tr>\n </thead>\n <tbody>\n {list}\n </tbody>\n </table>\n </div>\n );\n }\n\n let serverError: string | JSX.Element = '';\n if (this.props.serverError) {\n serverError = (\n <div\n className='form-group has-error'\n style={style.serverError}\n >\n <label className='control-label'>{this.props.serverError}</label>\n </div>\n );\n }\n\n return (\n <div className='panel compliance-panel'>\n <h4>\n <FormattedMessage\n id='admin.compliance_reports.title'\n defaultMessage='Compliance Reports'\n />\n </h4>\n <div className='row'>\n <div className='col-sm-6 col-md-4 form-group'>\n <label htmlFor='desc'>\n <FormattedMessage\n id='admin.compliance_reports.desc'\n defaultMessage='Job Name:'\n />\n </label>\n <LocalizedPlaceholderInput\n type='text'\n className='form-control'\n id='desc'\n ref={this.descInput}\n placeholder={defineMessage({id: 'admin.compliance_reports.desc_placeholder', defaultMessage: 'E.g. \"Audit 445 for HR\"'})}\n disabled={this.props.readOnly}\n />\n </div>\n <div className='col-sm-3 col-md-2 form-group'>\n <label htmlFor='from'>\n <FormattedMessage\n id='admin.compliance_reports.from'\n defaultMessage='From:'\n />\n </label>\n <LocalizedPlaceholderInput\n type='text'\n className='form-control'\n id='from'\n ref={this.fromInput}\n placeholder={defineMessage({id: 'admin.compliance_reports.from_placeholder', defaultMessage: 'E.g. \"2016-03-11\"'})}\n disabled={this.props.readOnly}\n />\n </div>\n <div className='col-sm-3 col-md-2 form-group'>\n <label htmlFor='to'>\n <FormattedMessage\n id='admin.compliance_reports.to'\n defaultMessage='To:'\n />\n </label>\n <LocalizedPlaceholderInput\n type='text'\n className='form-control'\n id='to'\n ref={this.toInput}\n placeholder={defineMessage({id: 'admin.compliance_reports.to_placeholder', defaultMessage: 'E.g. \"2016-03-15\"'})}\n disabled={this.props.readOnly}\n />\n </div>\n </div>\n <div className='row'>\n <div className='col-sm-6 col-md-4 form-group'>\n <label htmlFor='emails'>\n <FormattedMessage\n id='admin.compliance_reports.emails'\n defaultMessage='Emails:'\n />\n </label>\n <LocalizedPlaceholderInput\n type='text'\n className='form-control'\n id='emails'\n ref={this.emailsInput}\n placeholder={defineMessage({id: 'admin.compliance_reports.emails_placeholder', defaultMessage: 'E.g. \"bill@example.com, bob@example.com\"'})}\n disabled={this.props.readOnly}\n />\n </div>\n <div className='col-sm-6 col-md-4 form-group'>\n <label htmlFor='keywords'>\n <FormattedMessage\n id='admin.compliance_reports.keywords'\n defaultMessage='Keywords:'\n />\n </label>\n <LocalizedPlaceholderInput\n type='text'\n className='form-control'\n id='keywords'\n ref={this.keywordsInput}\n placeholder={defineMessage({id: 'admin.compliance_reports.keywords_placeholder', defaultMessage: 'E.g. \"shorting stock\"'})}\n disabled={this.props.readOnly}\n />\n </div>\n </div>\n <div className='clearfix'>\n <button\n id='run-button'\n type='submit'\n className='btn btn-primary'\n onClick={this.runReport}\n disabled={this.props.readOnly}\n >\n <FormattedMessage\n id='admin.compliance_reports.run'\n defaultMessage='Run Compliance Report'\n />\n </button>\n </div>\n {serverError}\n <div className='text-right'>\n <button\n type='submit'\n className='btn btn-tertiary'\n disabled={this.state.runningReport}\n onClick={this.reload}\n >\n <ReloadIcon/>\n <FormattedMessage\n id='admin.compliance_reports.reload'\n defaultMessage='Reload Completed Compliance Reports'\n />\n </button>\n </div>\n <div className='compliance-panel__table'>\n {content}\n </div>\n </div>\n );\n }\n}\n\nconst style: Record<string, React.CSSProperties> = {\n content: {margin: 10},\n greenStatus: {color: 'green'},\n redStatus: {color: 'red'},\n dataCell: {whiteSpace: 'nowrap'},\n date: {whiteSpace: 'nowrap'},\n serverError: {marginTop: '10px'},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {createComplianceReport, getComplianceReports} from 'mattermost-redux/actions/admin';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getComplianceReports as selectComplianceReports, getConfig} from 'mattermost-redux/selectors/entities/admin';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport ComplianceReports from './compliance_reports';\n\nconst getUsersForReports = createSelector(\n 'getUsersForReports',\n (state: GlobalState) => state.entities.users.profiles,\n (state: GlobalState) => state.entities.admin.complianceReports,\n (users, reports) => {\n const usersMap: Record<string, UserProfile> = {};\n Object.values(reports).forEach((r) => {\n const u = users[r.user_id];\n if (u) {\n usersMap[u.id] = u;\n }\n });\n return usersMap;\n },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n const isLicensed = license.IsLicensed === 'true';\n\n let enabled = false;\n const config = getConfig(state);\n if (config && config.ComplianceSettings) {\n enabled = config.ComplianceSettings.Enable;\n }\n\n let serverError: string | undefined;\n const error = state.requests.admin.createCompliance.error;\n if (error) {\n serverError = error.message;\n }\n\n const reports = Object.values(selectComplianceReports(state)).sort((a, b) => {\n return b.create_at - a.create_at;\n });\n\n return {\n isLicensed,\n enabled,\n reports,\n serverError,\n users: getUsersForReports(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getComplianceReports,\n createComplianceReport,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ComplianceReports);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {Audit} from '@mattermost/types/audits';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ComplianceReports from 'components/admin_console/compliance_reports';\nimport AuditTable from 'components/audit_table';\nimport LoadingScreen from 'components/loading_screen';\nimport ReloadIcon from 'components/widgets/icons/fa_reload_icon';\n\ntype Props = {\n isLicensed: boolean;\n audits: Audit[];\n isDisabled?: boolean;\n actions: {\n getAudits: () => Promise<ActionResult<Audit[]>>;\n };\n};\n\ntype State = {\n loadingAudits: boolean;\n};\n\nconst messages = defineMessages({\n reload: {id: 'admin.audits.reload', defaultMessage: 'Reload User Activity Logs'},\n});\n\nexport const searchableStrings = [\n messages.reload,\n];\n\nexport default class Audits extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n loadingAudits: true,\n };\n }\n\n public componentDidMount() {\n this.props.actions.getAudits().then(\n () => this.setState({loadingAudits: false}),\n );\n }\n\n private reload = () => {\n this.setState({loadingAudits: true});\n this.props.actions.getAudits().then(\n () => this.setState({loadingAudits: false}),\n );\n };\n\n private activityLogHeader = () => {\n const h4Style: CSSProperties = {\n display: 'inline-block',\n marginBottom: '6px',\n };\n const divStyle: CSSProperties = {\n clear: 'both',\n };\n return (\n <div style={divStyle}>\n <h4 style={h4Style}>\n <FormattedMessage\n id='admin.complianceMonitoring.userActivityLogsTitle'\n defaultMessage='User Activity Logs'\n />\n </h4>\n <button\n type='submit'\n className='btn btn-tertiary pull-right'\n onClick={this.reload}\n >\n <ReloadIcon/>\n <FormattedMessage {...messages.reload}/>\n </button>\n </div>\n );\n };\n\n private renderComplianceReports = () => {\n if (!this.props.isLicensed) {\n return <div/>;\n }\n return <ComplianceReports readOnly={this.props.isDisabled}/>;\n };\n\n public render() {\n let content = null;\n\n if (this.state.loadingAudits) {\n content = <LoadingScreen/>;\n } else {\n content = (\n <div>\n <AuditTable\n audits={this.props.audits}\n showUserId={true}\n showIp={true}\n showSession={true}\n />\n </div>\n );\n }\n\n return (\n <div>\n {this.renderComplianceReports()}\n <div className='panel compliance-panel'>\n {this.activityLogHeader()}\n <div className='compliance-panel__table'>\n {content}\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getAudits} from 'mattermost-redux/actions/admin';\nimport * as Selectors from 'mattermost-redux/selectors/entities/admin';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport Audits from './audits';\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n const isLicensed = license.Compliance === 'true';\n\n return {\n isLicensed,\n audits: Object.values(Selectors.getAudits(state)),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getAudits,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Audits);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {retryFailedCloudFetches} from 'actions/cloud';\n\nimport './cloud_fetch_error.scss';\n\nexport default function CloudFetchError() {\n const dispatch = useDispatch();\n const isCloud = useSelector(isCurrentLicenseCloud);\n if (!isCloud) {\n return null;\n }\n\n return (<div className='CloudFetchError '>\n <div className='CloudFetchError__header '>\n <FormattedMessage\n id='cloud.fetch_error'\n defaultMessage='Error fetching billing data. Please try again later.'\n />\n </div>\n <button\n className='btn btn-primary'\n onClick={() => {\n dispatch(retryFailedCloudFetches());\n }}\n >\n <FormattedMessage\n id='cloud.fetch_error.retry'\n defaultMessage='Retry'\n />\n </button>\n </div>);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst EmptyBillingHistorySvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '519'}\n height={props.height ? props.height.toString() : '396'}\n viewBox='0 0 519 396'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <path\n d='M332.061 394.758C434.897 394.758 518.263 311.592 518.263 209C518.263 106.408 434.897 23.2417 332.061 23.2417C229.225 23.2417 145.859 106.408 145.859 209C145.859 311.592 229.225 394.758 332.061 394.758Z'\n fill='#DDDFE4'\n stroke='#E8E9ED'\n strokeWidth='0.5'\n />\n <path\n d='M68.1753 318.92C78.2894 302.187 126.23 266.758 143.343 257.309C197.575 227.405 258.644 204.055 320.158 210.773C328.027 211.623 336.037 213.019 342.935 216.944C336.644 230.116 342.005 245.554 343.198 260.122C343.416 261.55 343.249 263.01 342.713 264.351C341.704 265.885 340.218 267.044 338.485 267.649C280.369 295.206 221.748 322.38 168.285 358.152C156.148 366.246 145.043 376.504 131.166 380.712C117.289 384.921 87.0078 380.712 76.2261 371.102C66.8807 362.705 52.4176 345.061 68.1753 318.92Z'\n fill='#CB8E00'\n />\n <path\n d='M294.934 114.22C278.852 120.29 270.093 139.916 274.018 156.71C277.942 173.503 292.729 186.513 309.397 190.823C314.661 192.464 320.295 192.499 325.579 190.924C329.794 189.175 333.547 186.475 336.543 183.033C340.696 178.73 344.36 173.98 347.466 168.87C350.989 163.502 353.256 157.409 354.101 151.044C355.173 139.795 349.327 128.545 340.508 121.483C331.688 114.422 320.28 111.205 308.972 110.659C307.738 110.517 294.934 114.22 294.934 114.22Z'\n fill='#121317'\n />\n <mask\n id='mask0'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='146'\n y='23'\n width='373'\n height='372'\n >\n <path\n d='M332.061 394.508C434.759 394.508 518.013 311.453 518.013 209C518.013 106.547 434.759 23.4917 332.061 23.4917C229.362 23.4917 146.109 106.547 146.109 209C146.109 311.453 229.362 394.508 332.061 394.508Z'\n fill='#D1D4DB'\n />\n </mask>\n <g mask='url(#mask0)'>\n <mask\n id='mask1'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='61'\n y='209'\n width='283'\n height='174'\n >\n <path\n d='M68.1753 318.92C78.2894 302.187 126.23 266.758 143.343 257.31C197.575 227.405 258.644 204.055 320.158 210.773C328.027 211.623 336.037 213.019 342.935 216.944C336.644 230.116 342.005 245.554 343.198 260.122C343.416 261.55 343.249 263.01 342.713 264.351C341.704 265.885 340.218 267.044 338.485 267.649C280.369 295.206 221.748 322.38 168.285 358.152C156.148 366.246 145.043 376.504 131.166 380.712C117.289 384.921 87.0078 380.712 76.2261 371.102C66.8807 362.705 52.4176 345.061 68.1753 318.92Z'\n fill='#CB8E00'\n />\n </mask>\n <g mask='url(#mask1)'>\n <rect\n x='61.163'\n y='208.987'\n width='201.616'\n height='166.601'\n fill='url(#pattern0)'\n />\n </g>\n <path\n d='M336.988 212.027C298.817 249.783 262.69 301.883 259.999 347.975C240.985 349.634 217.52 350.342 201.722 347.671C222.335 284.685 179.127 237.825 177.893 239.383C268.9 194.89 336.988 212.027 336.988 212.027Z'\n fill='white'\n />\n <path\n d='M433.092 368.755C455.667 346.498 452.734 243.996 451.621 243.086C435.702 230.096 415.474 223.641 395.427 219.129C343.198 207.394 233.602 240.152 231.579 243.045C228.1 247.78 215.578 370.009 243.594 396.292C278.549 429.03 399.028 402.403 433.092 368.755Z'\n fill='white'\n />\n <path\n d='M336.321 211.825C336.321 211.825 428.602 216.357 479.314 250.268C506.622 268.478 527.214 281.023 542.244 307.508C542.675 308.136 542.92 308.872 542.952 309.633C542.788 310.613 542.27 311.499 541.496 312.122C518.791 335.285 494.925 357.28 469.989 378.022C451.379 361.329 417.982 315.298 418.569 313.417C422.736 300.407 426.984 287.113 427.004 273.496C427.024 259.879 336.321 211.825 336.321 211.825Z'\n fill='white'\n />\n <path\n d='M177.933 240.536C193.022 257.686 202.546 279.016 205.242 301.701C205.403 303.037 207.446 302.531 207.264 301.196C204.493 278.148 194.786 256.486 179.43 239.079C178.54 238.068 177.003 239.525 177.913 240.536H177.933Z'\n fill='#121317'\n />\n <mask\n id='mask2'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='177'\n y='208'\n width='366'\n height='204'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M336.475 211.907C330.066 210.456 264.35 197.141 177.969 239.346C177.935 239.349 177.91 239.361 177.893 239.383L177.969 239.346C180.318 239.134 222.047 285.563 201.722 347.671C209.096 348.918 218.141 349.429 227.623 349.45C229.949 370.147 234.753 387.997 243.594 396.292C278.549 429.029 399.028 402.402 433.092 368.755C437.427 364.481 440.821 357.249 443.468 348.345C452.581 359.796 462.487 371.292 469.989 378.021C494.925 357.28 518.791 335.285 541.495 312.122C542.27 311.499 542.788 310.613 542.952 309.633C542.92 308.872 542.675 308.136 542.244 307.508C528.176 282.718 509.236 270.142 484.476 253.701C482.783 252.577 481.062 251.434 479.314 250.268C459.519 237.032 433.39 228.271 408.889 222.509C404.426 221.25 399.922 220.141 395.427 219.129C391.276 218.197 386.763 217.545 381.97 217.137C355.896 212.787 336.321 211.825 336.321 211.825C336.321 211.825 336.373 211.853 336.475 211.907ZM336.888 212.127C334.445 214.544 332.011 217.021 329.594 219.55C335.429 218.76 341.251 218.098 346.974 217.602C341.875 214.796 338.229 212.843 336.888 212.127Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask2)'>\n <rect\n x='176.963'\n y='207.952'\n width='359.807'\n height='203.853'\n fill='url(#pattern1)'\n />\n <rect\n x='176.963'\n y='207.952'\n width='164.395'\n height='203.853'\n fill='url(#pattern2)'\n />\n </g>\n <path\n d='M447.212 314.807C444.643 326.522 443.166 338.439 440.617 350.175C440.334 351.49 442.357 352.198 442.64 350.782C445.088 339.026 446.686 327.109 449.234 315.394C449.518 314.078 447.495 313.37 447.212 314.807Z'\n fill='#121317'\n />\n <path\n d='M325.074 221.072L324.042 187.484C324.125 184.574 323.701 181.671 322.788 178.905C321.621 176.464 320.131 174.191 318.358 172.148C303.612 152.921 296.792 128.772 299.303 104.669C299.764 98.9712 301.237 93.4008 303.652 88.2197C309.458 76.6058 321.594 69.6253 333.61 64.6884C342.268 61.1476 351.674 58.2543 360.857 59.9539C372.064 61.9772 381.248 70.8192 385.839 81.2394C390.431 91.6595 390.937 103.496 389.561 114.786C388.901 122.612 386.563 130.203 382.704 137.043C378.901 143.234 373.298 148.191 369.454 154.383C362.981 164.803 372.064 177.894 371.943 190.175C371.821 202.457 384.929 219.271 380.479 230.642C376.029 242.013 351.957 265.403 332.639 258.969C317.61 253.971 320.624 232.402 323.354 226.373L325.074 221.072Z'\n fill='#CB8E00'\n />\n <path\n d='M348.094 179.088C340.71 180.868 327.157 181.111 319.774 174.05C320.984 175.524 321.984 177.158 322.748 178.905C323.661 181.671 324.085 184.574 324.002 187.484C324.143 191.936 324.265 196.387 324.406 200.838C327.582 181.941 341.196 185.38 348.539 181.232L348.094 179.088Z'\n fill='black'\n fillOpacity='0.32'\n />\n </g>\n <path\n d='M323.97 164.759C329.742 164.819 335.377 163.002 340.027 159.582C341.104 158.775 339.977 156.987 338.88 157.791C334.547 161.023 329.266 162.73 323.861 162.647C322.516 162.646 322.628 164.738 323.978 164.699L323.97 164.759Z'\n fill='#121317'\n />\n <path\n d='M316.214 137.791C316.548 139.611 316.548 141.476 316.214 143.295C315.941 144.439 315.941 145.631 316.214 146.775C317.064 149.284 319.653 148.798 321.413 147.625C322.505 146.856 321.413 145.015 320.401 145.784C319.39 146.552 318.136 146.654 318.116 145.237C318.164 144.388 318.272 143.542 318.439 142.708C318.659 140.9 318.583 139.069 318.217 137.286C317.954 135.95 315.911 136.456 316.194 137.791H316.214Z'\n fill='#121317'\n />\n <path\n d='M468.128 105.681C445.432 83.4243 414.118 88.5838 397.693 97.5876C393.647 86.8437 388.732 61.1677 353.191 55.6237C343.421 54.086 326.328 58.5373 314.757 65.1941C303.187 71.8508 292.749 82.7566 294.125 97.2234C294.59 102.079 298.919 106.814 299.141 105.883L300.193 98.2351C305.756 100.784 312.917 96.313 313.908 92.9542C317.427 100.825 345.646 106.875 354.364 106.834C359.785 106.834 366.218 105.135 369.92 109.1C374.491 113.977 370.082 121.766 365.591 126.703C361.1 131.64 356.225 138.843 360.17 144.306C362.415 147.341 367.068 148.657 367.897 152.4C368.524 155.172 366.602 157.822 365.166 160.27C358.187 172.228 365.045 190.883 370.709 198.714C383.048 215.932 411.347 241.669 453.644 221.274C490.237 203.59 503.325 140.239 468.128 105.681Z'\n fill='#121317'\n />\n <mask\n id='mask3'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='294'\n y='55'\n width='195'\n height='174'\n >\n <path\n d='M468.128 105.681C445.432 83.4243 414.118 88.5838 397.693 97.5876C393.647 86.8437 388.732 61.1677 353.191 55.6237C343.421 54.086 326.328 58.5373 314.757 65.1941C303.187 71.8508 292.749 82.7566 294.125 97.2234C294.59 102.079 298.919 106.814 299.141 105.883L300.193 98.2351C305.756 100.784 312.917 96.313 313.908 92.9542C317.427 100.825 345.646 106.875 354.364 106.834C359.785 106.834 366.218 105.135 369.92 109.1C374.491 113.977 370.082 121.766 365.591 126.703C361.1 131.64 356.225 138.843 360.17 144.306C362.415 147.341 367.068 148.657 367.897 152.4C368.524 155.172 366.602 157.822 365.166 160.27C358.187 172.228 365.045 190.883 370.709 198.714C383.048 215.932 411.347 241.669 453.644 221.274C490.237 203.59 503.325 140.239 468.128 105.681Z'\n fill='#1A0C00'\n />\n </mask>\n <g mask='url(#mask3)'>\n <rect\n x='-50.5012'\n y='6.16785'\n width='587.271'\n height='261.802'\n fill='url(#pattern3)'\n />\n </g>\n <path\n d='M140.794 317.605C163.595 316.173 186.29 321.713 205.868 333.488C207.021 334.196 207.891 332.254 206.718 331.464C186.812 319.534 163.751 313.939 140.592 315.42C139.237 315.42 139.439 317.605 140.794 317.443V317.605Z'\n fill='#121317'\n />\n <path\n d='M355.416 115.737C347.96 115.205 340.466 115.751 333.165 117.356C332.154 117.578 332.578 119.743 333.57 119.521C340.709 117.982 348.03 117.464 355.315 117.983C356.508 118.064 356.529 115.818 355.416 115.737Z'\n fill='white'\n />\n <path\n d='M332.336 118.61C333.327 121.524 335.026 126.582 333.428 129.597C330.09 135.849 323.678 127.573 322.707 124.903C321.736 122.232 320.684 117.983 322.707 115.252C326.004 110.578 330.98 114.685 332.073 118.064C332.538 119.44 334.966 118.873 334.5 117.477C333.165 113.43 329.18 109.849 324.204 111.407C317.994 113.43 318.662 120.937 320.32 125.449C321.979 129.961 326.53 135.566 332.457 133.542C338.768 131.357 336.26 122.333 334.824 118.104C334.359 116.728 331.931 117.295 332.396 118.691L332.336 118.61Z'\n fill='white'\n />\n <path\n d='M300.537 127.392C300.375 124.336 300.112 118.995 302.56 116.546C307.556 111.468 311.501 121.281 311.723 124.073C311.946 126.865 311.723 131.276 309.093 133.34C304.562 136.921 300.84 131.58 300.719 128.019C300.719 126.562 298.13 126.42 298.19 127.897C298.155 129.022 298.345 130.143 298.75 131.193C299.154 132.243 299.765 133.202 300.545 134.012C301.325 134.823 302.26 135.47 303.294 135.914C304.328 136.357 305.44 136.59 306.565 136.598C313.159 136.456 314.656 129.01 314.252 124.195C313.847 119.379 310.954 112.803 304.623 113.107C297.867 113.431 297.826 122.799 298.049 127.27C298.049 128.747 300.638 128.869 300.577 127.392H300.537Z'\n fill='white'\n />\n <path\n d='M314.151 124.377C314.686 123.979 315.302 123.703 315.955 123.567C316.608 123.43 317.283 123.438 317.933 123.588C318.236 123.675 318.528 123.798 318.803 123.952C319.026 124.073 319.147 124.194 319.086 124.134C320.158 125.085 321.777 123.507 320.684 122.556C319.595 121.711 318.263 121.24 316.885 121.215C315.507 121.189 314.158 121.61 313.038 122.414C311.804 123.183 312.917 125.145 314.151 124.437V124.377Z'\n fill='white'\n />\n <path\n d='M329.221 121.281L326.51 121.564C326.293 121.646 326.109 121.797 325.987 121.994C325.865 122.191 325.811 122.423 325.834 122.654C325.857 122.884 325.956 123.101 326.114 123.27C326.273 123.439 326.484 123.55 326.713 123.587L329.423 123.284C329.631 123.197 329.806 123.045 329.921 122.852C330.037 122.658 330.087 122.432 330.064 122.207C330.041 121.983 329.947 121.772 329.795 121.605C329.644 121.438 329.442 121.324 329.221 121.281Z'\n fill='#121317'\n />\n <path\n d='M307.273 123.77L304.562 124.073C304.345 124.155 304.161 124.306 304.039 124.503C303.917 124.7 303.863 124.932 303.886 125.163C303.909 125.393 304.008 125.61 304.167 125.779C304.326 125.948 304.536 126.059 304.765 126.097L307.475 125.813C307.702 125.738 307.897 125.588 308.027 125.388C308.158 125.187 308.216 124.948 308.192 124.71C308.169 124.472 308.065 124.25 307.898 124.079C307.731 123.908 307.51 123.799 307.273 123.77Z'\n fill='#121317'\n />\n <path\n d='M135.191 386.054C178.682 389.595 212.342 391.8 248.834 392.691C283.768 393.561 315.364 397.648 333.954 379.539C351.431 362.502 375.3 358.618 399.958 359.063C401.981 359.063 403.235 356.635 401.617 355.481C398.077 353.432 394.109 352.234 390.026 351.981C381.672 351.313 374.511 351.151 374.491 351.111C372.916 348.272 370.308 346.149 367.209 345.183C363.084 344.079 358.801 343.696 354.546 344.05C350.723 344.454 352.179 342.229 345.504 341.379C338.988 340.851 332.429 341.342 326.065 342.836C318.196 344.859 306.545 349.735 296.774 354.005C282.028 360.459 250.027 350.747 234.917 345.061C220.312 339.578 200.973 329.886 186.692 323.837C168.871 316.31 160.254 309.147 143.97 306.031C125.118 302.41 110.351 300.386 91.8219 306.618C73.2929 312.85 57.4341 329.987 60.3469 347.085C61.8049 353.798 65.0156 360.004 69.6519 365.072C84.4185 382.695 101.673 383.929 126.655 385.427L135.191 386.054Z'\n fill='#CB8E00'\n />\n <path\n d='M350.602 352.892C355.368 351.215 360.345 350.213 365.388 349.917C370.598 349.166 375.868 348.909 381.126 349.148C381.346 349.211 381.539 349.344 381.677 349.526C381.814 349.709 381.889 349.931 381.889 350.16C381.889 350.389 381.814 350.611 381.677 350.794C381.539 350.976 381.346 351.109 381.126 351.172C376.051 350.932 370.965 351.169 365.934 351.88C361.11 352.163 356.346 353.103 351.775 354.672C350.541 355.198 349.529 353.337 350.784 352.811L350.602 352.892Z'\n fill='#121317'\n />\n <path\n d='M345.99 344.009C347.6 343.211 349.328 342.678 351.107 342.431C352.348 342.36 353.584 342.219 354.809 342.006C355.058 341.99 355.304 342.064 355.504 342.213C355.704 342.362 355.844 342.577 355.9 342.82C355.956 343.063 355.924 343.318 355.809 343.54C355.695 343.761 355.505 343.935 355.274 344.029C352.422 344.717 349.691 344.454 346.981 345.83C345.767 346.437 344.776 344.576 345.99 343.969V344.009Z'\n fill='#121317'\n />\n <g clipPath='url(#clip0)'>\n <path\n d='M88.256 189.289L37.0597 185.649C36.4179 187.934 35.0885 189.965 33.2523 191.466C31.2714 192.966 28.8337 193.735 26.3514 193.643C23.7224 193.708 21.1744 192.729 19.2634 190.922C17.3072 189.064 16.1391 186.525 16 183.83V91.9894H88.256V189.289Z'\n fill='#989DAE'\n />\n <path\n d='M183 48.3312V183.472C183.034 184.832 182.777 186.184 182.247 187.437C181.716 188.689 180.924 189.814 179.923 190.735C177.896 192.658 175.265 193.818 172.479 194.017H26.5214C29.3079 193.818 31.9391 192.658 33.9663 190.735C34.9691 189.814 35.7639 188.69 36.2974 187.438C36.8309 186.186 37.0907 184.834 37.0597 183.472V16H151.062C151.917 16.0336 152.727 16.3885 153.332 16.9937C153.937 17.599 154.292 18.4102 154.325 19.2655V27.259L159.425 45.0658H161.243V29.453L179.397 45.0658H179.753C180.608 45.0994 181.419 45.4541 182.024 46.0594C182.629 46.6647 182.983 47.4759 183.017 48.3312H183Z'\n fill='#F4F4F6'\n />\n <path\n d='M71.5476 34.5381H55.9441V31.6298H71.5476V34.5381ZM164.133 81.7508H55.9441V85.0332H164.133V81.7508ZM164.133 181.653H55.9441V178.387H164.133V181.653Z'\n fill='#BABEC9'\n />\n <path\n d='M112.58 120.273H55.9441V113.725H112.58V120.273ZM112.936 129.712H55.9441V135.886H112.936V129.712ZM112.936 145.325H55.9441V151.873H112.936V145.325ZM112.936 161.312H55.9441V167.485H112.936V161.312ZM164.133 161.312H122.37V167.485H164.133V161.312Z'\n fill='#BABEC9'\n />\n <path\n d='M140.897 42.1575C141.752 42.1911 142.563 42.5459 143.168 43.1512C143.773 43.7565 144.127 44.5677 144.161 45.423V58.1445C143.99 58.9105 143.583 59.6034 142.998 60.1253C142.412 60.6472 141.677 60.9717 140.897 61.0528H58.8336C58.0815 61.0008 57.3738 60.6771 56.8423 60.1421C56.3108 59.6072 55.9917 58.8973 55.9441 58.1445V45.423C55.9016 45.0151 55.9442 44.6028 56.0694 44.2123C56.1946 43.8218 56.3996 43.4617 56.6713 43.1546C56.943 42.8476 57.2755 42.6004 57.6478 42.4287C58.02 42.2571 58.4238 42.1647 58.8336 42.1575H140.897ZM55.91 101.377C55.8501 101.772 55.8832 102.174 56.0069 102.554C56.1307 102.933 56.3414 103.277 56.6224 103.56C56.9033 103.843 57.2466 104.056 57.6247 104.182C58.0028 104.308 58.4052 104.343 58.7995 104.286H109.639C110.048 104.328 110.461 104.285 110.853 104.159C111.244 104.032 111.605 103.826 111.912 103.552C112.219 103.279 112.466 102.944 112.637 102.569C112.807 102.195 112.897 101.789 112.902 101.377V94.8296C112.897 94.4181 112.807 94.0122 112.637 93.6377C112.466 93.2632 112.219 92.9285 111.912 92.6548C111.605 92.3811 111.244 92.1745 110.853 92.0482C110.461 91.9219 110.048 91.8787 109.639 91.9213H58.7995C58.4059 91.8673 58.0051 91.9055 57.6287 92.0328C57.2523 92.1601 56.9106 92.3731 56.6304 92.655C56.3503 92.9369 56.1394 93.2801 56.0144 93.6574C55.8894 94.0348 55.8537 94.4361 55.91 94.8296V101.377ZM164.099 94.8296C164.089 94.4182 163.995 94.0132 163.821 93.6399C163.648 93.2666 163.4 92.933 163.092 92.6601C162.784 92.3871 162.423 92.1808 162.032 92.0536C161.641 91.9265 161.228 91.8814 160.818 91.9213H125.328C124.933 91.8679 124.532 91.9064 124.155 92.0337C123.778 92.161 123.436 92.3737 123.154 92.6552C122.873 92.9367 122.661 93.2793 122.533 93.6565C122.406 94.0337 122.368 94.4351 122.421 94.8296V148.607C122.379 149.016 122.422 149.43 122.548 149.822C122.674 150.213 122.881 150.574 123.154 150.882C123.428 151.189 123.762 151.436 124.136 151.606C124.511 151.777 124.916 151.868 125.328 151.873H160.903C161.761 151.843 162.576 151.49 163.184 150.885C163.793 150.279 164.15 149.465 164.184 148.607L164.099 94.8296Z'\n fill='#1E325C'\n />\n <path\n d='M182.643 46.8855H153.237V17.4456L181.912 45.797L182.643 46.8855Z'\n fill='#989DAE'\n />\n </g>\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0'\n transform='scale(0.00512821 0.00621118)'\n />\n </pattern>\n <pattern\n id='pattern1'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image1'\n transform='scale(0.00287356 0.00507614)'\n />\n </pattern>\n <pattern\n id='pattern2'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image2'\n transform='scale(0.00628931 0.00507614)'\n />\n </pattern>\n <pattern\n id='pattern3'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image3'\n transform='scale(0.00176056 0.00395257)'\n />\n </pattern>\n <clipPath id='clip0'>\n <rect\n width='167'\n height='178'\n fill='white'\n transform='translate(16 16)'\n />\n </clipPath>\n <image\n id='image0'\n width='195'\n height='161'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image1'\n width='348'\n height='197'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image2'\n width='159'\n height='197'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ8AAADFCAYAAABKDiBxAAAgAElEQVR4Xu1dT3gUx5V/VT1Dst/GRnYOaxuBZjQie0OA97og7L3GCOcc/uVsQOw5CLibP74bkPcMRs4ZG3KOjcgxaDQjNCLZ70uMwPEmZrqr9nvd9TQ1TXV3dc9ILUxxsWG6u6pf/frV+/N7rxi4P04CJUmAlTSuG9ZJABz4HAhKk4ADX2midwM78DkMlCYBB77SRO8GduBzGChNAg58pYneDezA5zBQmgQc+EoTvRvYgc9hoDQJOPCVJno3sAOfw0BpEnDgK030bmAHPoeB0iTgwFea6N3ADnwOA6VJwIGvNNG7gR34HAZKk4ADX2midwM78DkMlCYBB77SRO8GduBzGChNAg58pYneDezA5zBQmgQc+EoTvRvYgc9hoDQJOPCVJno3sAOfw0BpEnDgK030bmAHPoeB0iTgwFea6N3ADnwOA6VJwIGvNNG7gR34HAZKk4ADX2midwM78DkMlCYBB77SRO8GduBzGChNAg58pYneDezA5zBQmgQc+EoTvRvYgc9hoDQJOPCVJno3sAOfw0BpEnDgK030bmAHPoeB0iTgwFea6N3ADnwOA6VJwIGvNNG7gR34HAZKk4ADX2midwM78DkMlCYBB77SRO8GduBzGChNAg58pYneDezA5zBQmgQc+EoTvRvYgc9hoDQJOPCVJno3sAOfw0BpEnDgK030bmAHPoeB0iTgwFea6N3ADnwOA6VJwIGvNNG7gR34HAZKk4ADX2midwM78DkMlCYBB77SRO8GduBzGChNAg58pYneDezA5zBQmgQc+EoTvRvYgc9hoDQJOPCVJno3sAOfw0BpEnDgK030bmAHPoeB0iTgwFea6N3ADnwOA6VJwIGvNNG7gR34HAZKk4ADX2midwM78DkMlCYBB77SRO8GduBzGChNAg58pYneDezA5zBQmgQc+EoTvRvYgc9hoDQJOPCVJno3sAOfw0BpEnDgK030bmAHPoeB0iTwSoOv1ersDYQ8/h33z++r19dKW4VXdOBXGnyLrc5XDGDqGXTfcODb/C/glQZfq/Xnmg9+bXd9593NF70b8ZUGn1v+ciXgwFeu/F/p0bcM+KSU4VwYY7LIigx6f5Ex3T2DSWDLgK/Z6rSkkPMTjZ1nirxSq9W5LADOBAD7flEfXSjyDHfP5kpgy4BvsdX5hgF81qiPXikigmarcwaAHWjUd3xY5H53z+ZLYMuAb/Nf3Y1YtgQ2BHxb0f5aXOwcFx4suC25bMj1xt8Q8C21OvfRa3gG3UNbJXjbbHW+lULem2jsPDIs8eNH9ujRo5GxsbEnw3rmq/ScDQFfs7V6C0DsfQb+/q0CvmEvKgKv2Vq5zhg/ysEbr9ffbg97jB/78zYEfD92odH7LbYeTUtgk7vrOy+8Ku88zPd04BumNN2zcklgy4Ov1WqNBEF138TE6Fe53myAi9vtv9RrtbdaAzzC3WohgVLAh/aSbSYjit/BpQBgf9xTHQZI4nNptR6fFiCuuGC1BXoGvGTTwbe4+GiaeXw2jye82Ooc98C7qxv16jmfc2DT9fqOeVs5IGDHxv6tTeDHzAiAt1Cvvz2Hz8CxGMA14cv3du92bBdbuRa5bvPB1+ocB4Cj30H3w0E8YdyOBWy7xoGfJVAiOdQXcvofFXF1T0L4o9nqCAA216jvOIECwxAM595MfSwCH/5BqpXzXovAKd89mw6+fNPLdzVpLQB4kKRZIy0KC3WV/0UQ1x2LOZ+gh3T1lgZfHtuwF/7AbZN98AyenxxEs+aVb5G55h3jx3b9lgUfbn0Cgvsg4EKjkU42WF5efuO5rNR213bcL2OBms3OGcnh6ER9dH/e8dEGfe77B7/3urc382PJO8+NuH5Lgy+A4BYD+UWjvvM8vbwpbxzVYsixRn3n+EYIKeuZD1srsxJg7Rf1nVezrg2dmvbKESnhyURt9F5zqXOZcfYRB6+Rx87Mq2kftlf3VSR/kmcMm3cZ5JqhgC+vIPQJh3UUIjiyuzF62eZFFG9v+hl095GmwEyDx6vbdafB5ll5rsF3bLf/fGoNfpgbREO12+16ICtNANnGjwXfHyAYIRvUZk6oLQPpf2OzK+DzcGfwhfc3AHajUd9x0maMzbhmYPAhW4R5cJ2Dd5zCFXkmjh6qAPimUR/lNvc9bK2c5wBHN1vLPWytTHFgd/JqKNM7odMjQG631ZQInh+63mHamtvt1X2BlH8AkGcbltq22Vo5LXzZ3r17l3VYymY9BrlmcPCFcTF5jvPKhaKaBxd2IyvIkiheIfCFnG40ett6XJi6Vi8rBEOBduax6fFdO74YZMG30r0Dgy/rZVrLj8+AYGhrrMfRsu5J+73IFt9sddARGWnUR+v6sxebj64zzo89g+6bpq20tfz4dOAHdQawlgbQQd7H5l4MBz0Pqof/fWJ0KDK0GXMzrtlQ8LVarZqA6hIA3G3UR9+zfSE0jqvgrcXzqw8frkzxCj9GAWLr54VbNd8Tp9in2VsaZeoYAMiitKmtSKy1ldtGX7eh4MPJ45ZaAX8hTyC32epIKeX8xPjO6T5N1ep8yUDWdHuviCZMEioa8jgweYTKsG+CkBcajWTaVFK4RAPwrqSPb5jz32iwDPv5Gw6+tAkjMIHxp/H43MPmo8vA+fJui2KiZmv1cxDyHsYCW63HWER02yac8Kfm6oltnndX166YehNCXtytbEAERqu9+jXz2IXazne+MJEh8Jql9uNbAPKwSTs+bK7MSm4OwzRbq7MAEs2BmWEv7MvwvFLBtxhqMtjbqI++WURYUX638g0Av8vh+UXc4nXwJLFelDnQimtXE4EB5xV59PIcBz5jIjFgqEcAG0vyXpO0GzoSDORH4/WdjSLv/7LfUyr4isS40gS+2Hp0nIF3GEESBN29zOOfy0CcmJjYdSN+HzobkvMHNtoVwcWBfcyg8j5qVQx9ZNVtkK231H58DkBimOPDoiyZsJtWIGoTE7tuFwXcVtzeSwUfCXJYgvnTYue458E1KeQnHmc3kOFS4ZUbNtuw7aKqeN+XaXZgq7U6K0FOPYXukRGo1gSwUxz4xaLzSOM02sybTAMOcCMP/czm2YNcsyHgwxAFCGD1+juZBeB4rRRierw+eqjPuQiB5EG9/naotWwAGrKewZvyoIr8vNSCHtxK9efbChHH8IU3Cxzu7q6/GLDVnIxfP4PuzwfJhtCccId4HgQHi4ZaUHMzYJcEwMmNjKfaypCu2xDwRdVrctoma4HXSpAjE7FQTLO1sgTAashgxrALkgw4eGdqtbc+ixv+RLX/zuve1xdbB2wcvDRHPcaH2yl6HHk8c5PAcT7472nPsfmYshbTFMbBsTnnLMssyHr2Zvy+IeDDiaOdkidfGX9Z/NrRbkM7J3IsqksM4IEEtvYMnp/QQUasZt2+U57kccwBvxZ4U8ie5uAd0TWinrGItqZOE52XPPlPpUExPGMdAI5COMG5Z/B8xqQZbYCpwkC3AFg7AHmBSgweNlfOc87OFY1LmkBnM58iYN0w8OmTQY2Cfx/0a4y2D++ozl4moGN+WEpkwIweQc2IdpKMGNPvvQ5VZE9fEiDf07eduFAXW51jHnj3srZs3VbFMAsDsSePx0q2qakuBRkvTLJLHLzzaYAOnRCAywzgIIC80FDlm6ETx+UH9bF3PikCiBccs8WVI8zjv96IHjibAj5Mb2GKSrfrwvCE8N6ocv5V2mITQFDDAIg13eOLGDH+8b9z/8prUJ3mAKdtOyUobfoVB++KaSunRQgZMyk2pMljD+2+5c400qZMNlakZVcDIeSF3VrwWv37NwAwybh3fHzs7c+GAaCizwjfo716h4Mcy/Nx2Y73AvhseF95NRnG86QQD3Y3dq0HUymvKgNx0hQKiTTa6qwAqGE6TdmAbT1ToADU4h47Xt+1Y155heeeQXc8y9CPnJPqLZDiEXYdMBUM9ehPbL5R3/FCmw3c+roQjGCQXNei5BHr4IoH1B+2Hh2uQHAvbheGdSggR2wdg41O39nYr7Zgi1/XBz6ynZTQ1gmc8ZuUsb4vnqjXt6Os0kjUGN0gmKp63dtJhrkOJrTgTYb0YnPlCkh5FzVimm2StEgRY1pcCkBejJdmqi8fA+EHGvVRT5eDpqXGOHj7A+Gfoa725BFLzufWbbEwv8x+OywPmCIArfbqNxLY/SQ71UaZFAXPoPf1gU8tBEbyU2NSUSPtYNoUoFUAvix8eaJoUNX0UroDoWs1zAMDQFsGcAGY3EvNJXUgKjLlOQA2YkNK+FOrs3cbqzzF1Fu0rf5zzfSBEImVSfHHQEpMw6VSnoZNHSMnSQg5r+8qJD+TBtYVxDDIsYM4KEO3+SKngN/S01xJX0iSNjJpMPXca/EtFb074GwNhBjjHBkvo2/2gqoc87xzYf4XZEhSaNRHU9+ZtB0AbNdrMuK2HxI6/UAcI203CLDw49i1a9daUu4Y5521k5hkrMpLL3GQn8QjD0pJ3Mr6YPJqN5Rfq736pRQwn1V7M3Tw5ZlsRIlntXjopNlavS6DYF53LvClbNqRIe2KcZhmnJ0i2nhob0WJ/zEbry283pfbifXbs/161DBVpvnxM+g2suzLNJn0tnbWim+daFP6onsGGPtPDBDrZsGg4Y/QNIDKXlvb0nZd81D2SwWfaoVbi2szdC6EgM+IXYIvrgihEI/V6UIJyZ9CTGP4gXM+A+KHOZuAsc1CZnm9tosTHyuMZ0JwTYK4qmdM8LqHzdVjYboQ4K4H3skY1evTZzkL723ek0JXAPxgvf6OVUFU/N1taXSlgs92wfA6xYA5RIFk1AqM/bCGscP1cEzEkpmyyazQ2BTw5cAv2Mb30syItO1xcXHlCPfYKR9gJq1DKmqPbtfb63leK35ITagplzqXOYdf5gl/KFPkWnxHMdvXyf1x8qxZ1rWlg8+2C1VUaNRL0GObCwC5JgN5lnneMdy6R+CnI3krwTQyAnbCD8MpWV6zCWAq4/C1DIKZiYmx9WwH2bXhB7TUmcXsA4aXpMfafwd/wbRlZxEJbFg18YXvbYfZrPJoS/YOmnLXWYDK83vp4KPFj8fZ0LvlwNtJUX6KhzFgtaTGPgSieHOguIDQfuPcExjURe3EPOxq/yLBM7TBpH+T7C8dpKZIwWK7c8iTcFgAnML3q1Qqbcw++CL4I1bCCV++b4oIpBEJVBety0XSZxsZs8sDOrp2KOCLawpb2yKyL8zxvrSjEWwCq6EtpWJvr0P1WwZwT8+wmJ4RbmlRq9t1Rkr4b83ONFQAZMBqjMOvEXwYigmk/4KmI8EqTYP1uWsR2bU/fGWqhLORo0oxfpAn/1wEGDb35Fln0/MGBp/64mcpSa7qeDGJf2hQG0pfSPx/yg3jgTH4dwxyR9t25dB3nv9VLP4X9vXjHjsiAlkXAEBxSRUOwOAseph953bg+0gOByi1pWJl2JgS44l9hVBZuWDUzgDddq1We5oVKlHFUaeox4yS62UqEYgvXpGFL3JPEgijj6uCwfmrRTv8Dww+Whzhy0O4heCXCcDPeeB9aAM+G4EoT3eM6PaoFVEoGIfrZWVgZrfq6ULPjBafTzHG5/Vajcj4Xg1sKvjDPjA+P12peN+CEL9PY+ro70JbfbO5egw8OIUEhzc5D+VtIlgoosCn30H3ffyISHMKIebiAWSKMQrObpgW3qTV6Z6iJzzFQUiF64x7J4rmoAcHn6LwmBgaWaq71+DxxW4H+kKiAc6594SK0kmjYBglSmVVzhBjOdIg7LIM4KzndVtIxVLHavXlZk3hANOHgHXHgR/U9AOhdRoVhneEL5jnVeYDGVxCTSU9eMAk3EFwS5C/x65Z33P/N/8qvC+lkG3b4xiS2rdFXRvYrGJTh2lQmjv+t91exU6uBxHwP2Pb6siH9KV/DUNQeiSg/2NZ3SclO1A0vJK11huy7UZ2mx13LwzeCraP+rKor/0SgPhkot6rT4hA6R3Oo9JJkMqBuY4pN9yWo/gcOi7J57GFpY9BMMVBTOraRG3PX0uAvZQJCG3A9uqXmAFp1Ha8ixxAKeALxtlBZKMg0D1emREgzlFmAR0PGcBeALGLA8MC9MTu9Tb8QKV1viYqFYVfPF65jw6aAudHHmP/hWk/nBNwOcfAW7cV9QzN3lrtKbJXVFbnXR0oNvZ1EeDhPQNrvjwDY0kk5/y0riVN2oZCDZx7J2q73gppRWgzJbFpFhc7h7gH5wJfXqhU2JoAuC4A5uK5ZxS4lHxP3INWBMxZVCBCiKv6NmeiTEWaF5nKowuondCmw9gbcLbHFCzG8ksJMJlGKqBFRmDHiQzh1v+cT+qesYkIG8/x4jMXl1YuSc7a8co69ZF+Sh63KYdNWlQATOYp+rfFxKaCj7zbXhtbbL4tp0x0JdKmmIJDzYOe6uLSoxuM8WOce8fXt+DlPx8TIsBakbUA4AjaQOFWKERND5dEdl5UXxsPQiuw/1aAOGmiOUVBX3YwXj1GgFlqP74GQiwntdRIO9E81FrLq1O4TVM4xve7k5jaQ41ZgUrbF89nkfZVxLRJA4LNjoWyCUBK26ZGpvGS7PpE8G2kuqUJkoZL6pWC11EtBwKGbB0JcJ+S/lFvPpgCgCsENqrPACEvirDQJ2rs3etAAGf1pDfSjibG3llILgpfxZYfY3osUj3ryyCAC5gCQ/CDgIvxZDrKcXn5f2tJtHkVV7wEAK9z8N6lD5OcIqS3VXhlzhf+sb9z/yo6IzZOmq322ejrQhKwB6fiuenUbdfEPs47UZ1pXDT5Hm0HuMW93e45F9iVILLhFCCRLrXe5Bv/fT14rRYPuYO8AstMslMS5BiBd70UEtgcB7YQBP5ytSrvCbFtO9Xo+oJ/LYEvTGhhGfL2uMc+hEAuBwCX8EvWt6dmc/WEBDHJOB9Dqv1T8N9F+wrBiN63po0PfM+DiXgTc+x2UOFsXrdXw0B30D2tO0DxdUFNLeVPRoqcJTJsYJNdLwDOxj3zRM0XaQ9YGySYSfSqNLayLjgboSE9igOs1VU3eQRkN6hOV73+oxL0MkoEntJOSEwY11Nw4ZYqvDsMAEE+gk0b0YFATWfrlUZaNbQn1zt/kmOCHmbcWcF/oy20pxn9zJ4wuumga2HdJtSu+SBOgM1SHpTnzuPoZT0z7fcNt/lsGQ7RFhuVXKbZNkrTHaMgNoKMsX95I+0rJ5sLAKZYIBeI9UyODNmiaGtVKsG9AKrTpuaNpBWorW2VVZefyH88QW1mqnyLvnpRI09eSsmX2qt/U12v9tdqby1HBUhyJBBigWqBk7SPAnRfTYUJbHFKWBwA4XMw/hiriaHdYtgcvyQADg18Weo6qxFj5Fn9ZSzO4iCjm8BFnUxJm5KnmnVikJ5YH6/teF95ldKGlhTO7dGfTwshJ/9ZEf/9U5/9FaR8AIxNYixvvPbOb9CrrHA+h1vkuuca9Vs+BQJjjioOCLAAIGcDIWd+UhGf4ZbOACQxVChzoLNs8HlIr9pWqdwzfWThx6WcFFpovIf4j6FdyWCSHKJeqOZFkkGSExJmrpisDbNP4VDAR3lUqqUwIZ0Khkx0J5N3qjklmBnrS2vp2pTsyqy2GJHWWDlMlWhIJghtv9roRXQ0cEGeS/TqIvCgZqDDoZvLq+dByDAUgzliAeIqxg59IY7FOxdQZ3oM8L4GHrK6r2H4Bjib9wA+ZcB+JQCmOHjGblr0kXDOz1D5o0ZmfdKoj/5cB1iSk6QajZ/6ngc//5nw7ggAOVEfXY/h5eEnaibEgWHWoAwFfGS0S4CFpOMAIkbFT0dMKbfwIGaAtunepM5RSao8SQMTlw77p5DzQ0D5Px68jwuEHeXRYaDFxvLF+q63/icK0YhJFUz+KImNEpkOUecpbCqE2ypq8/g7mwLJ+ryJfaLnhLGnMuOVJ5TKUl7yzbiJ0gv/rGK4aWxifOfZdru9fdAuBknaFetAANApyn/e8FDA1zPu0zMJSYCxpfqEmQJga3o/P6ReyUD8cWJi5+e6BtUXU7eLqKF3+DVH2yIyWBqvgTcVPluFZfCDwqMKMIanEzBxERBUuKVltdaIetawNT2orc+FtIgCEgZ81ztZqVDOp4HyEuOhr+iD59iAaP34L7Wdot0ssYEmetvA4UCF+2eD0KnyrsYD7FnmUprDsF4HUrDGeCjgG8TjMRnDuiNAv/da7EZHCGjbcnjEPAdvXyC6s4zzox6rTGA4Qk+VmTIVce86vsDRFsi/phYaPa0SBqunAdh1tPcSt76ElFV8LioqcFNP0ofpLyk/ZiDnPVb9Qkgf6fSTAcB7FLII64aD7jEsNwg/JnXyOQPZqtdGJ9AJQnvS4+I/usK7iWnMCvOWu1Jsx49MfQh9H1dk0lSQR5l5cnqkNKq1om1RthT4VBE4Nu++bSJzKjutrRe9kMNBWQ/Swgz4TeaxI0nd27XF+gBrSJBx4guvGWeR6FugWlzM395DR0IIOMs5YO+9xDJREzmAQhog5ANThRdpPXKG1rvRg2xRj0Cc/+JSB/uyfERsH/LqqQ1xfEdRttvXIOQyhpEi8HWaEtgTtAejv6M3zm5TiM0m/FVU+WxB8G27JkHW+soW251DE7X+w57JO5YQXEdbs0hr2ajutrILDXulBW4KCObihTyo2eh3BmISg8VI2cdDgwPpI2vmahpViTxPKo8kMCVRutDjlCBv4jhonxKtXU/9aU7AQYxdoilAwevUrbL1aFo3L6IwU+/wQ52IocC4RNt4UZBteKhl2BPrbbfhITH39Q5Uikp+nAOcwAZBOhkgzYZJ+81EOiBOHQdvxmQr0TaH4K/y4H1T/hefKyQ7LUEclkLeRY0TaiT+k6NM8t/R2b9FbK+ofBMp/ztOKhIv1jUbj3Uouj5pud0ic9bnMRTNR9VWWUfR03m42NjHJt1GLGXmwSQH/wqVQaqwzWHcLsNGeKoXHtXsmlJP6NkyDkeZgeSqbcG/1OtwlXa5E2eq4HiRw7KCOV2QnM0xKY/r9Hu6hsgMmDkJAK5Sgp7yzPjhVL1tnyAXEEM4aFLge+veadLWpy9+5GzAb3Vmtm7DZgEl6/c4eOmMkkHIqS+Aj+JmkrPbtvRoldzvIyqavjQKydgWv5A3hbYVsZSzthS09QKAd+Nzp+OrkuxAUyhBHyurOVL4YfliLH68VJInr9J6606AL+WnnHtXMLRDhwFiegzJrEIIjDFux2A12Yjo+UMgD+OHFmVYHt/SKff6toz3RR8ev1Gvv9g6TQW28eDssMNDlpY0eexZ95h+f7FLFTUX5HymPmZXNIwLywI5MkjDatPkkvK2dG3ur9WiY6hpHsr2+Za2zaRrsuo0TPfRB6bH68IG5Lz6ehRjRLp/+GcNAJ6CkHPj46MXKEyETBjGxBtIGgWQM3QWW+iQtDuzyKKWIM9WuLcHxA+fYSoSH6ZnSnrZn979+lzxWXF70hQ9yAtAo+YDLg/bVvvnHTDp+rxAwucstTr3pYA5E40Jf08DA27RNo2McF6dTueN5z78AbuAYmou3rYDFy8Q3i2b/iQ4r7D1m5BPo7NDwnrk08ioMQVrydmYqO38Aj3TpKZARGql91YeNRb4hF1LQ03Y7EwzjyFhRMYzTWm1wGRPDptPOBSbLw8ATSCLKrWCz4UvZ2wAQeOZevaRhyaFXEhipVBuE7fzqlfpKy7CRSPN0LMF2QHko+G/c2BI0W/p1CmlOZaEEDdM3aLitpdiNofZFHxmnqY9+rN0ueO8hQwuS5AfIOOlWuVP8WRKNDPqO9/5XWR7hn+eCBE8xXmSF97t8inmsY+S8tzKVj+MvEKb+J8+L1NTT/p908G31Op8hXEyPUFNZAGkzcdProzXfegvlkT9buKpQULOp9VKIFeOc/YUyysxyf+Lxs6rejiFEv2KRYNF5O9RCMQH9qt40x5Tp1GcK21pcXp+HDhS+tv1YC2+N4ZEcBxy6PxKpb1N+rckwEi8bS71YkZw6aRUHCde89H7eMMTkM5jLxgOchfFENOUSZ4dKpJnGEdcM6VONx18UTE4W7DlCRJZ1NZJIcHZCCmpH6ENvTy+QAhm4HKBYoSUvwX45zweneBVqvdNJYYmm2/dk+Z8DwZ/KS6Ibeew3Ua4tcZSWnru3GyjRUVeulyiQ3P4x3GwpplGoa0JrJ3V/oyekVZCsOngy7NF6y+QR93TgoKQM42G3dHzReaVukiofaPCm76OpvF74j1oeu/cO05B/0gCCKYg6O9NbfgQVEd6dkQ/9IVY0B6vXMkjT/2DxvAS4wxTnIkVeLayfCnAZ/sydJ1yAO4A967EtU3oBS4/3lvRWMf68200pq12Taq7zfs+8evDvK8fjCVFFxSgscPsOukAn0HM8q3QbDzU3oMK4mW6P/L4Vg4zDzun9pdI4nuQjQKhB23+sgmcVEDEgeGRUheSHIGiwKb5hIvEGLbqCP9o8buwTzR+aEldTU1rY+oRU9Ya/ujAl6S5onABO8hBXvWFNHpuZGsJzhZMpYJ68U5EREDGCxtDatRronKecXYUm4NHjc77a0oo9IHnn3UD+Ub89zgAeiCTYwGwD3UHBzVYaMSHlK9+IoAO0jhw1XnCB9ICyTgusqaz5jcMwP6owBfx4uDj+GLpEfksGyxNqGT4E4WfAq212o4H7fbj2QDkAaQtqZ7UfWdsUHs1ZEIDAFLy+37Xx6Wz6wIQhxnAnrhDQB9YaEKE9P0q8vTWKVDKw/5GYlhFtdPthY3S63+1ar4btk6h6cOxCbi/1OCLb3XUJzkAeD+eXrMlrKaBT8UQ/yaEvKof3kLMZwx4TzRGT6RR1HvEW0+aToBUGu9rLCrCzEScgULVdtKXZ5NionQNvoteLxt+LBmnE+lVf0WcksjZY5eegb8/K38/NPDlMdT7vvKwxVl1XxYpwfR1LbVXkc6UGEwextYQf4YJxFE9sTdrakth2sZIu1B88cUxsFY5GDGRNCPO47ZLAoL5je4cmpSci1YAAARiSURBVCQ/BDfVNb84985erG0xBdvj1w4FfCpD8RXmHfNWN5EHljd1o8oQ/woRly/MFGyVP/qHaNrGVPH76SIZA3pHU/+WzXj/nma2j9UmzWtI4Au/xmuc8/l4hsJGIFgvmnQSkUmj9ox3PpN0QEvauDaGt35/Hq0eZRPETSYr58fH3/4sys1W9pqo6fhcUwGOjedMGQ3bj1bP3cZLKW3WSL8mD9U+7dlDAV/eyee5Xj/eiu5br3lIocmnjREVGsmDWWdyUKYgkL71sQNJMTbTfCjtpcfdlF2JZw3jkVZ9XVP7zRX7A6CpjzMCdXdtx4Okdmi6VsX/H/SU0Kx13vLga7Y6L9TtZr3UsH5XXLpjMqzXlXNEV7J9vtKweBZvYjFOPJVHRUvx3jBZ2jAtga8q3Y6S95rmfBH40VNOKoO1ff+k68JQEfOWtzz48rTbGFQo8a02zj7J83yi4COJIk/PFxpDd1SwPiPqsCDHOPj74wfbKMAEqntXX3PHPHOma4fRFi1pXJorEiC2PPiKCC/vPQiUb4WQWaGBvM+NGobDA5PXSuD63uveNo2LTGUm4UsszwxrNCISQNj9IOmQP6payztPvD6PXVvk+fo9YRWiLxz4SEPFY3eDCpgWFA/BY8CuxGN662wWReeKj0exQx1stn2k885dBeGvbVZ3KprfS635qGg6q09L1mJEffDyEyWznqvCEnf0c9PoniQ6V7+GSO8nTZ618OFkPOCcR5MV/QDzjGGS1UsNPlOlfxYgfky/q8aLWOd8tq+QPmylAdfiaca0d8/LwImcMTlJ568UketLDb4iL7wR9wyqAQa9P/5O1A3UpHGH8f44X2pyTr1vijzXgS9FajagiGon/GtZJ0mmeX/hUfUR7T88U2OYf2zegcbLc21a1zHb+TvwJUgqMsI7TRDskzTK+KDdPG1qPExTJHs3rQBfORJ99bxJwMBt1Pf9MZucrC24sq5z4EsBX9IZFqZtrminJnxWmr0VpeDa2+OxPZVe+0iA/FXSaeHkSOiNf0yvO8x8bRbg9N+3FPjyqP08L/myXhsBb/VSVOPbvyWbKveG/Z4bvR5bBnwq7jUbAJywbdMxbGFvxedhtgE7jCZthzbHZRV5L1Nv6CLPSbtn64Av7LgE1mV8eQSx0V9wnrkM81qVqsLu9rlpZVm9Z6iXjAR5MWlbH/Rdtgz4Bn2RpPtVJRtmGW5joc9GjVPWc4swtBVokWaPTcL3lzX3VwJ82HE0y+guYwHyVp4VmaNJ6+O/oTPFube9aJ1GkbnE7/nRg4+8Sfxv3GMchgCLbum0ZZoOc47Pq+gYzeXVWRBYuJ7MCxyGDIo+45UAX1HhZN1HCXnsMFXkkGTT2WrxMVXTRywAx+6omU266X41t5vUxnfYjJ0s2dj87sBnI6WEa9ar1qJTMAfm0Zk0Hh3msllHUg0gjty3OvDlFln/DXg4C4dKoUNQbIam/nxlVarZzLHoNQ58RSXn7htYAv8PRiXPkbQtB6gAAAAASUVORK5CYII='\n />\n <image\n id='image3'\n width='568'\n height='253'\n xlinkHref='data:image/png;base64,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'\n />\n </defs>\n </svg>\n\n);\n\nexport default EmptyBillingHistorySvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport ExternalLink from 'components/external_link';\nimport PDFPreview from 'components/pdf_preview';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport './cloud_invoice_preview.scss';\n\ntype Props = {\n onHide?: () => void;\n url?: string;\n};\n\nfunction CloudInvoicePreview(props: Props) {\n const dispatch = useDispatch();\n\n const isPreviewModalOpen = useSelector((state: GlobalState) =>\n isModalOpen(state, ModalIdentifiers.CLOUD_INVOICE_PREVIEW),\n );\n\n const onHide = () => {\n dispatch(closeModal(ModalIdentifiers.CLOUD_INVOICE_PREVIEW));\n if (typeof props.onHide === 'function') {\n props.onHide();\n }\n };\n\n return (\n <Modal\n show={isPreviewModalOpen}\n onExited={onHide}\n onHide={onHide}\n id='cloud-invoice-preview'\n className='CloudInvoicePreview'\n dialogClassName='a11y__modal'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title>{'Invoice'}</Modal.Title>\n <div className={'subtitle'}>\n <FormattedMessage\n id='cloud.invoice_pdf_preview.download'\n values={{\n downloadLink: (msg: string) => (\n <ExternalLink\n href={props.url || ''}\n location='cloud_invoice_preview'\n >\n {msg}\n </ExternalLink>),\n }}\n />\n </div>\n </Modal.Header>\n <Modal.Body>\n <div className='cloud_invoice_preview_modal'>\n <PDFPreview\n fileInfo={{\n extension: 'pdf',\n size: 0,\n name: '',\n } as FileInfo}\n fileUrl={props.url ?? ''}\n scale={1.4}\n handleBgClose={() => {}}\n />\n </div>\n </Modal.Body>\n </Modal>\n );\n}\n\nexport default CloudInvoicePreview;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {InvoiceLineItemType} from '@mattermost/types/cloud';\nimport type {Invoice} from '@mattermost/types/cloud';\n\nimport {numberToFixedDynamic} from 'utils/utils';\n\nexport default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Element {\n const fullUsers = invoice.line_items.filter((item) => item.type === InvoiceLineItemType.Full).reduce((val, item) => val + item.quantity, 0);\n const partialUsers = invoice.line_items.filter((item) => item.type === InvoiceLineItemType.Partial).reduce((val, item) => val + item.quantity, 0);\n const meteredUsers = invoice.line_items.filter((item) => item.type === InvoiceLineItemType.Metered).reduce((val, item) => val + item.quantity, 0);\n const onPremUsers = invoice.line_items.filter((item) => item.type === InvoiceLineItemType.OnPremise).reduce((val, item) => val + item.quantity, 0);\n\n // e.g. purchased through self-hosted flow.\n if (onPremUsers) {\n return (\n <FormattedMessage\n id='admin.billing.history.onPremSeats'\n defaultMessage='{num} seats'\n values={{\n\n // should always be a whole number, but truncate just in case\n num: Math.floor(onPremUsers),\n }}\n />\n );\n }\n if (meteredUsers) {\n if (fullUsers || partialUsers) {\n return (\n <FormattedMessage\n id='admin.billing.history.fractionalAndRatedSeats'\n defaultMessage='{fractionalSeats} metered seats, {fullSeats} seats at full rate, {partialSeats} seats with partial charges'\n values={{\n fractionalSeats: numberToFixedDynamic(meteredUsers, 2),\n fullSeats: fullUsers.toFixed(0),\n partialSeats: partialUsers.toFixed(0),\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='admin.billing.history.fractionalSeats'\n defaultMessage='{fractionalSeats} seats'\n values={{\n fractionalSeats: numberToFixedDynamic(meteredUsers, 2),\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='admin.billing.history.seatsAndRates'\n defaultMessage='{fullSeats} seats at full rate, {partialSeats} seats with partial charges'\n values={{\n fullSeats: fullUsers.toFixed(0),\n partialSeats: partialUsers.toFixed(0),\n }}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\nimport {FormattedDate, FormattedMessage, FormattedNumber} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {Invoice} from '@mattermost/types/cloud';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {openModal} from 'actions/views/modals';\n\nimport CloudInvoicePreview from 'components/cloud_invoice_preview';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport InvoiceUserCount from './invoice_user_count';\n\ntype BillingHistoryTableProps = {\n invoices: Record<string, Invoice>;\n};\n\nconst PAGE_LENGTH = 4;\n\nconst getPaymentStatus = (status: string) => {\n switch (status) {\n case 'failed':\n return (\n <div className='BillingHistory__paymentStatus failed'>\n <i className='icon icon-alert-outline'/>\n <FormattedMessage\n id='admin.billing.history.paymentFailed'\n defaultMessage='Payment failed'\n />\n </div>\n );\n case 'paid':\n return (\n <div className='BillingHistory__paymentStatus paid'>\n <i className='icon icon-check-circle-outline'/>\n <FormattedMessage\n id='admin.billing.history.paid'\n defaultMessage='Paid'\n />\n </div>\n );\n default:\n return (\n <div className='BillingHistory__paymentStatus pending'>\n <i className='icon icon-check-circle-outline'/>\n <FormattedMessage\n id='admin.billing.history.pending'\n defaultMessage='Pending'\n />\n </div>\n );\n }\n};\n\nexport default function BillingHistoryTable({invoices}: BillingHistoryTableProps) {\n const dispatch = useDispatch();\n const [billingHistory, setBillingHistory] = useState<Invoice[] | undefined>(\n undefined,\n );\n const [firstRecord, setFirstRecord] = useState(1);\n const numInvoices = Object.values(invoices || []).length;\n const previousPage = () => {\n if (firstRecord > PAGE_LENGTH) {\n setFirstRecord(firstRecord - PAGE_LENGTH);\n }\n };\n const nextPage = () => {\n if (\n invoices &&\n firstRecord + PAGE_LENGTH < numInvoices\n ) {\n setFirstRecord(firstRecord + PAGE_LENGTH);\n }\n\n // TODO: When server paging, check if there are more invoices\n };\n\n useEffect(() => {\n if (invoices && numInvoices) {\n const invoicesByDate = Object.values(invoices).sort(\n (a, b) => b.period_start - a.period_start,\n );\n setBillingHistory(\n invoicesByDate.slice(\n firstRecord - 1,\n (firstRecord - 1) + PAGE_LENGTH,\n ),\n );\n }\n }, [invoices, firstRecord]);\n\n const paging = (\n <div className='BillingHistory__paging'>\n <FormattedMessage\n id='admin.billing.history.pageInfo'\n defaultMessage='{startRecord} - {endRecord} of {totalRecords}'\n values={{\n startRecord: firstRecord,\n endRecord: Math.min(\n firstRecord + (PAGE_LENGTH - 1),\n Object.values(invoices || []).length,\n ),\n totalRecords: Object.values(invoices || []).length,\n }}\n />\n <button\n onClick={previousPage}\n disabled={firstRecord <= PAGE_LENGTH}\n >\n <i className='icon icon-chevron-left'/>\n </button>\n <button\n onClick={nextPage}\n disabled={\n !invoices ||\n firstRecord + PAGE_LENGTH >= numInvoices\n }\n >\n <i className='icon icon-chevron-right'/>\n </button>\n </div>\n );\n return (\n <>\n <table className='BillingHistory__table'>\n <tbody>\n <tr className='BillingHistory__table-header'>\n <th>\n <FormattedMessage\n id='admin.billing.history.date'\n defaultMessage='Date'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.billing.history.description'\n defaultMessage='Description'\n />\n </th>\n <th className='BillingHistory__table-headerTotal'>\n <FormattedMessage\n id='admin.billing.history.total'\n defaultMessage='Total'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.billing.history.status'\n defaultMessage='Status'\n />\n </th>\n <th>{''}</th>\n </tr>\n {billingHistory?.map((invoice: Invoice) => {\n const url = Client4.getInvoicePdfUrl(invoice.id);\n return (\n <tr\n className='BillingHistory__table-row'\n key={invoice.id}\n onClick={() => {\n dispatch(\n openModal({\n modalId:\n ModalIdentifiers.CLOUD_INVOICE_PREVIEW,\n dialogType: CloudInvoicePreview,\n dialogProps: {\n url,\n },\n }),\n );\n }}\n >\n <td data-testid='billingHistoryTableRow'>\n <FormattedDate\n value={new Date(invoice.period_start)}\n month='2-digit'\n day='2-digit'\n year='numeric'\n timeZone='UTC'\n />\n </td>\n <td>\n <div>{invoice.current_product_name}</div>\n <div className='BillingHistory__table-bottomDesc'>\n <InvoiceUserCount invoice={invoice}/>\n </div>\n </td>\n <td\n data-testid={invoice.number}\n className='BillingHistory__table-total'\n >\n <FormattedNumber\n value={invoice.total / 100.0}\n // eslint-disable-next-line react/style-prop-object\n style='currency'\n currency='USD'\n />\n </td>\n <td data-testid={invoice.id}>{getPaymentStatus(invoice.status)}</td>\n <td className='BillingHistory__table-invoice'>\n <a\n data-testid={`billingHistoryLink-${invoice.id}`}\n target='_self'\n rel='noopener noreferrer'\n onClick={(e) => e.stopPropagation()}\n href={url}\n >\n <i className='icon icon-file-pdf-outline'/>\n </a>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n {numInvoices > PAGE_LENGTH && paging}\n </>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getInvoices} from 'mattermost-redux/actions/cloud';\nimport {getCloudErrors, getCloudInvoices, isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {pageVisited, trackEvent} from 'actions/telemetry_actions';\n\nimport CloudFetchError from 'components/cloud_fetch_error';\nimport EmptyBillingHistorySvg from 'components/common/svg_images_components/empty_billing_history_svg';\nimport ExternalLink from 'components/external_link';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {CloudLinks, HostedCustomerLinks} from 'utils/constants';\n\nimport BillingHistoryTable from './billing_history_table';\n\nimport './billing_history.scss';\n\nconst messages = defineMessages({\n title: {id: 'admin.billing.history.title', defaultMessage: 'Billing History'},\n});\n\nexport const searchableStrings = [\n messages.title,\n];\n\ninterface NoBillingHistorySectionProps {\n selfHosted: boolean;\n}\nexport const NoBillingHistorySection = (props: NoBillingHistorySectionProps) => (\n <div className='BillingHistory__noHistory'>\n <EmptyBillingHistorySvg\n width={300}\n height={210}\n />\n <div className='BillingHistory__noHistory-message'>\n <FormattedMessage\n id='admin.billing.history.noBillingHistory'\n defaultMessage='In the future, this is where your billing history will show.'\n />\n </div>\n <ExternalLink\n data-testid='billingHistoryLink'\n location='billing_history'\n href={props.selfHosted ? HostedCustomerLinks.SELF_HOSTED_BILLING : CloudLinks.BILLING_DOCS}\n className='BillingHistory__noHistory-link'\n onClick={() => trackEvent('cloud_admin', 'click_billing_history', {screen: 'billing'})}\n >\n <FormattedMessage\n id='admin.billing.history.seeHowBillingWorks'\n defaultMessage='See how billing works'\n />\n </ExternalLink>\n </div>\n);\n\nconst BillingHistory = () => {\n const dispatch = useDispatch();\n const isCloud = useSelector(isCurrentLicenseCloud);\n const invoices = useSelector(getCloudInvoices);\n const {invoices: invoicesError} = useSelector(getCloudErrors);\n\n useEffect(() => {\n pageVisited('cloud_admin', 'pageview_billing_history');\n }, []);\n useEffect(() => {\n dispatch(getInvoices());\n }, [isCloud]);\n const billingHistoryTable = invoices && <BillingHistoryTable invoices={invoices}/>;\n const areInvoicesEmpty = Object.keys(invoices || {}).length === 0;\n\n return (\n <div className='wrapper--fixed BillingHistory'>\n <AdminHeader>\n <FormattedMessage\n {...messages.title}\n />\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {invoicesError && <CloudFetchError/>}\n {!invoicesError && <div className='BillingHistory__card'>\n <div className='BillingHistory__cardHeader'>\n <div className='BillingHistory__cardHeaderText'>\n <div className='BillingHistory__cardHeaderText-top'>\n <FormattedMessage\n id='admin.billing.history.transactions'\n defaultMessage='Transactions'\n />\n </div>\n <div\n data-testid='no-invoices'\n className='BillingHistory__cardHeaderText-bottom'\n >\n <FormattedMessage\n id='admin.billing.history.allPaymentsShowHere'\n defaultMessage='All of your invoices will be shown here'\n />\n </div>\n </div>\n </div>\n\n <div className='BillingHistory__cardBody'>\n {invoices != null && (\n areInvoicesEmpty ? <NoBillingHistorySection selfHosted={!isCloud}/> : billingHistoryTable\n )}\n {invoices == null && (\n <div className='BillingHistory__spinner'>\n <LoadingSpinner/>\n </div>\n )}\n </div>\n </div>}\n </div>\n </div>\n </div>\n );\n};\n\nexport default BillingHistory;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport './link.scss';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nexport interface UpgradeLinkProps {\n telemetryInfo?: string;\n buttonText?: string;\n styleButton?: boolean; // show as a blue primary button\n styleLink?: boolean; // show as a anchor link\n}\n\nconst UpgradeLink = (props: UpgradeLinkProps) => {\n const styleButton = props.styleButton ? ' style-button' : '';\n const styleLink = props.styleLink ? ' style-link' : '';\n\n const [openSalesLink] = useOpenSalesLink();\n\n const handleLinkClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n if (props.telemetryInfo) {\n trackEvent('upgrade_mm_cloud', props.telemetryInfo);\n }\n openSalesLink();\n };\n const buttonText = (\n <FormattedMessage\n id='upgradeLink.warn.upgrade_now'\n defaultMessage='Upgrade now'\n />\n );\n return (\n <button\n className={`upgradeLink${styleButton}${styleLink}`}\n onClick={(e) => handleLinkClick(e)}\n >\n {props.buttonText ? props.buttonText : buttonText}\n </button>\n );\n};\n\nexport default UpgradeLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEmpty from 'lodash/isEmpty';\nimport moment from 'moment';\nimport React, {useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/common';\nimport {get as getPreference} from 'mattermost-redux/selectors/entities/preferences';\n\nimport AlertBanner from 'components/alert_banner';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport UpgradeLink from 'components/widgets/links/upgrade_link';\n\nimport {CloudBanners, Preferences} from 'utils/constants';\nimport {getBrowserTimezone} from 'utils/timezone';\n\nimport './cloud_trial_banner.scss';\n\nexport interface Props {\n trialEndDate: number;\n}\n\nconst CloudTrialBanner = ({trialEndDate}: Props): JSX.Element | null => {\n const endDate = new Date(trialEndDate);\n const DISMISSED_DAYS = 10;\n const {formatMessage} = useIntl();\n const [openSalesLink] = useOpenSalesLink();\n const dispatch = useDispatch();\n const user = useSelector(getCurrentUser);\n const storedDismissedEndDate = useSelector((state: GlobalState) => getPreference(state, Preferences.CLOUD_TRIAL_BANNER, CloudBanners.UPGRADE_FROM_TRIAL));\n\n let shouldShowBanner = true;\n if (!isEmpty(storedDismissedEndDate)) {\n const today = moment();\n const storedDate = moment(Number(storedDismissedEndDate || 0));\n const diffDays = storedDate.diff(today, 'days');\n\n // the banner when dismissed, will be dismissed for 10 days\n const bannerIsStillDismissed = diffDays < 0;\n shouldShowBanner = Boolean(storedDismissedEndDate) && bannerIsStillDismissed;\n }\n\n const [showBanner, setShowBanner] = useState<boolean>(shouldShowBanner);\n\n if (trialEndDate === 0 || !showBanner) {\n return null;\n }\n\n const onDismissBanner = () => {\n setShowBanner(false);\n const addTenDaysToToday = moment(new Date()).add(DISMISSED_DAYS, 'days').format('x');\n dispatch(savePreferences(user.id, [\n {\n category: Preferences.CLOUD_TRIAL_BANNER,\n name: CloudBanners.UPGRADE_FROM_TRIAL,\n user_id: user.id,\n value: addTenDaysToToday,\n },\n ]));\n };\n\n return (\n <AlertBanner\n mode={'info'}\n onDismiss={onDismissBanner}\n title={(\n <FormattedMessage\n id='admin.subscription.cloudTrialCard.upgradeTitle'\n defaultMessage='Upgrade to one of our paid plans to avoid Free plan data limits'\n />\n )}\n message={(\n <FormattedMessage\n id='admin.subscription.cloudTrialCard.description'\n defaultMessage='Your trial ends on {date} {time}. Upgrade to one of our paid plans with no limits.'\n values={{\n date: moment(endDate).format('MMM D, YYYY '),\n time: moment(endDate).endOf('day').format('h:mm a ') + moment().tz(getBrowserTimezone()).format('z'),\n }}\n />\n )}\n hideIcon={true}\n actionButtonLeft={(\n <UpgradeLink\n buttonText={formatMessage({id: 'admin.subscription.cloudTrialCard.upgrade', defaultMessage: 'Upgrade'})}\n styleButton={true}\n telemetryInfo='billing_subscriptions_cloud_trial_banner'\n />\n )}\n actionButtonRight={(\n <button\n onClick={openSalesLink}\n className='AlertBanner__buttonRight'\n >\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.contactSalesy'\n defaultMessage={\n 'Contact sales'\n }\n />\n </button>\n )}\n />\n );\n};\n\nexport default CloudTrialBanner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst CloudTrialSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '372'}\n height={props.height ? props.height.toString() : '250'}\n viewBox='0 0 372 250'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0)'>\n <g filter='url(#filter0_d)'>\n <rect\n x='6'\n y='20'\n width='338'\n height='197'\n rx='8'\n fill='white'\n />\n <rect\n x='6'\n y='20'\n width='100.516'\n height='197'\n fill='#1E325C'\n />\n <circle\n cx='22'\n cy='39'\n r='9'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='38'\n y='33'\n width='45'\n height='5'\n rx='2.5'\n fill='white'\n fillOpacity='0.32'\n />\n <rect\n x='38'\n y='41'\n width='30'\n height='3'\n rx='1.5'\n fill='white'\n fillOpacity='0.32'\n />\n <rect\n x='15'\n y='60'\n width='30'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <rect\n x='16'\n y='190'\n width='29'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='76'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='29'\n y='74'\n width='57'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='126'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='124'\n width='57'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='93'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='91'\n width='49'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='142'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='141'\n width='49'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='109'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='107'\n width='64'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='159'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='157'\n width='64'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='204'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='203'\n width='64'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='19'\n cy='176'\n r='4'\n fill='white'\n fillOpacity='0.16'\n />\n <rect\n x='30'\n y='174'\n width='43'\n height='4'\n rx='2'\n fill='white'\n fillOpacity='0.32'\n />\n <circle\n cx='124'\n cy='66'\n r='8'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='59'\n width='39'\n height='4'\n rx='2'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <rect\n x='139'\n y='68'\n width='119'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='76'\n width='98'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='84'\n width='133'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='92'\n width='70'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <circle\n cx='124'\n cy='118'\n r='8'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='111'\n width='39'\n height='4'\n rx='2'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <rect\n x='139'\n y='120'\n width='119'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='128'\n width='98'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='136'\n width='133'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='144'\n width='70'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <circle\n cx='124'\n cy='170'\n r='8'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='163'\n width='39'\n height='4'\n rx='2'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <rect\n x='139'\n y='172'\n width='119'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='180'\n width='98'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='188'\n width='133'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='139'\n y='196'\n width='70'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <circle\n cx='166.5'\n cy='32.5'\n r='2.5'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <circle\n cx='320'\n cy='36'\n r='4'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <circle\n cx='248'\n cy='36'\n r='4'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <circle\n cx='177.5'\n cy='32.5'\n r='2.5'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <circle\n cx='332'\n cy='36'\n r='4'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <rect\n x='116'\n y='31'\n width='43'\n height='3'\n rx='1.5'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='256'\n y='32'\n width='55'\n height='8'\n rx='4'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <rect\n x='133'\n y='40'\n width='66'\n height='1'\n rx='0.5'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <circle\n cx='118.5'\n cy='40.2079'\n r='2.5'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <ellipse\n cx='126.5'\n cy='40.2128'\n rx='2.5'\n ry='2.5049'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <rect\n x='5'\n y='19'\n width='340'\n height='199'\n rx='9'\n stroke='#3F4350'\n strokeOpacity='0.04'\n strokeWidth='2'\n />\n </g>\n <path\n d='M217.487 89.5394C229.639 77.858 243.676 72.0115 259.598 72C275.521 71.9885 289.563 77.835 301.726 89.5394C311.984 99.6693 318.199 113.202 319.206 127.597C320.212 141.993 315.941 156.262 307.194 167.726L316.308 176.857L304.632 188.556L295.519 179.425C284.094 187.973 270.012 192.18 255.781 191.296C241.44 190.434 228.676 184.651 217.487 173.946C205.829 161.759 200 147.688 200 131.734C200 115.78 205.829 101.715 217.487 89.5394Z'\n fill='#B3B3B3'\n />\n <path\n d='M225.378 97.2236C234.548 87.9772 246.012 83.2277 259.768 82.975C272.623 82.9932 284.946 88.118 294.035 97.2258C303.125 106.334 308.24 118.681 308.258 131.562C308.017 145.448 303.277 156.935 294.038 166.02C284.918 175.106 272.627 180.278 259.768 180.441C245.909 179.959 234.445 175.152 225.378 166.02C216.31 156.889 211.513 145.402 210.985 131.562C211.148 118.677 216.31 106.361 225.378 97.2236Z'\n fill='#F2F2F2'\n />\n <path\n d='M227.029 160.783C231.525 165.299 236.866 168.882 242.747 171.327C248.628 173.772 254.932 175.031 261.298 175.031C267.665 175.031 273.969 173.772 279.85 171.327C285.73 168.882 291.072 165.299 295.568 160.783C300.774 155.646 304.763 149.405 307.244 142.519C305.237 151.646 300.681 160.012 294.107 166.64C284.955 175.768 272.569 180.892 259.656 180.892C246.744 180.892 234.358 175.768 225.206 166.64C218.626 160.016 214.069 151.648 212.069 142.519C210.114 133.638 210.747 124.38 213.892 115.849C212.195 123.646 212.449 131.743 214.631 139.418C216.894 147.475 221.16 154.826 227.029 160.783Z'\n fill='#999999'\n />\n <path\n d='M357.006 243.535C353.963 244.379 351.727 244.086 350.266 242.622L302.498 190.762C301.773 190.025 301.231 189.129 300.914 188.144C300.598 187.16 300.516 186.115 300.675 185.093C301.286 182.085 302.812 179.34 305.043 177.237C307.178 175.009 309.895 173.427 312.884 172.671C313.92 172.457 314.996 172.532 315.993 172.887C316.99 173.243 317.872 173.865 318.541 174.687L370.676 222.55C372.138 224.014 372.396 226.202 371.416 229.114C370.226 232.388 368.363 235.376 365.948 237.884C363.501 240.505 360.421 242.451 357.006 243.535Z'\n fill='#FFBC1F'\n />\n <path\n d='M360.119 212.66L340.791 232.388L317.097 206.819L334.601 189.28L360.119 212.66Z'\n fill='#954D0E'\n />\n </g>\n <defs>\n <filter\n id='filter0_d'\n x='-8'\n y='14'\n width='366'\n height='225'\n filterUnits='userSpaceOnUse'\n colorInterpolationFilters='sRGB'\n >\n <feFlood\n floodOpacity='0'\n result='BackgroundImageFix'\n />\n <feColorMatrix\n in='SourceAlpha'\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0'\n result='hardAlpha'\n />\n <feOffset dy='8'/>\n <feGaussianBlur stdDeviation='6'/>\n <feColorMatrix\n type='matrix'\n values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0'\n />\n <feBlend\n mode='normal'\n in2='BackgroundImageFix'\n result='effect1_dropShadow'\n />\n <feBlend\n mode='normal'\n in='SourceGraphic'\n in2='effect1_dropShadow'\n result='shape'\n />\n </filter>\n <clipPath id='clip0'>\n <rect\n width='372'\n height='250'\n fill='white'\n />\n </clipPath>\n </defs>\n </svg>\n\n);\n\nexport default CloudTrialSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst PrivateCloudSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '364'}\n height={props.height ? props.height.toString() : '265'}\n viewBox='0 0 364 265'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <path\n d='M350.196 127.516C359.39 136.493 364 147.856 364 161.66C364 175.464 359.39 186.854 350.196 195.803C341.003 204.78 329.612 209.472 316.052 209.96H62.4837C44.5576 209.472 29.6689 203.315 17.7905 191.437C5.9392 179.586 0 164.697 0 146.771C0 128.845 5.9392 113.956 17.7905 102.078C29.6418 90.2264 44.5576 84.0431 62.4837 83.555C62.9718 59.8253 71.0806 40.0822 86.8371 24.3528C102.567 8.62339 122.31 0.514616 146.039 0.0264618C165.891 -0.000657862 183.193 5.80295 197.973 17.4373C212.754 29.0716 222.544 44.0688 227.398 62.483C235.616 56.6794 245.08 53.7505 255.738 53.7505C269.786 54.2386 281.529 59.2015 290.967 68.6392C300.404 78.0768 305.367 89.8468 305.855 103.868C305.855 107.746 305.367 111.38 304.391 114.77C308.269 113.793 312.12 113.305 316.025 113.305C329.585 113.821 340.975 118.539 350.196 127.516Z'\n fill='#FFBC1F'\n />\n <mask\n id='mask0'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='0'\n y='0'\n width='364'\n height='210'\n >\n <path\n d='M350.196 127.516C359.39 136.493 364 147.856 364 161.66C364 175.464 359.39 186.854 350.196 195.803C341.003 204.78 329.612 209.472 316.052 209.96H62.4837C44.5576 209.472 29.6689 203.315 17.7905 191.437C5.9392 179.586 0 164.697 0 146.771C0 128.845 5.9392 113.956 17.7905 102.078C29.6418 90.2264 44.5576 84.0431 62.4837 83.555C62.9718 59.8253 71.0806 40.0822 86.8371 24.3528C102.567 8.62339 122.31 0.514616 146.039 0.0264618C165.891 -0.000657862 183.193 5.80295 197.973 17.4373C212.754 29.0716 222.544 44.0688 227.398 62.483C235.616 56.6794 245.08 53.7505 255.738 53.7505C269.786 54.2386 281.529 59.2015 290.967 68.6392C300.404 78.0768 305.367 89.8468 305.855 103.868C305.855 107.746 305.367 111.38 304.391 114.77C308.269 113.793 312.12 113.305 316.025 113.305C329.585 113.821 340.975 118.539 350.196 127.516Z'\n fill='#FFC847'\n />\n </mask>\n <g mask='url(#mask0)'>\n <rect\n x='3.47766'\n y='137.949'\n width='358.204'\n height='86.9427'\n fill='url(#pattern0)'\n />\n </g>\n <path\n d='M364 161.66C364 147.856 359.39 136.493 350.196 127.517C341.003 118.567 329.612 113.848 316.052 113.36C312.174 113.36 308.296 113.848 304.418 114.825C305.394 111.435 305.883 107.801 305.883 103.923C305.394 89.8745 300.432 78.1317 290.994 68.6941C281.556 59.2564 269.786 54.2393 255.738 53.7512C245.08 53.7512 235.643 56.653 227.398 62.4837C222.544 44.0694 212.754 29.0723 197.973 17.4379C183.193 5.80361 165.891 0 146.039 0C122.31 0.488154 102.567 8.59693 86.8371 24.3263C71.0806 40.0828 62.9718 59.826 62.4837 83.5285C44.5576 84.0167 29.6689 90.2 17.7905 102.051C5.9392 113.957 0 128.845 0 146.772C0 146.772 0.759347 100.966 66.5787 89.9017C69.0466 27.1197 123.801 9.89867 146.582 9.89867C169.362 9.89867 206.652 20.9635 225.744 70.8094C265.935 45.5881 310.873 76.3147 298.56 122.499C354.535 110.187 364 161.66 364 161.66Z'\n fill='#F5AB00'\n />\n <path\n d='M88.0846 173.051V253.732C88.0846 259.834 93.0204 264.797 99.0952 264.797H231.114C237.188 264.797 242.124 259.834 242.124 253.732V173.051H88.0846Z'\n fill='#BABEC9'\n />\n <path\n d='M242.124 162.014C242.124 155.912 237.188 150.949 231.114 150.949H99.0952C93.0204 150.949 88.0846 155.912 88.0846 162.014V173.078H242.097V162.014H242.124Z'\n fill='#808F95'\n />\n <path\n d='M114.716 154.474C123.096 154.474 129.903 157.349 129.903 160.901C129.903 164.454 123.096 167.329 114.716 167.329C106.336 167.329 99.5291 164.454 99.5291 160.901C99.502 157.349 106.309 154.474 114.716 154.474Z'\n fill='#090A0B'\n />\n <path\n d='M215.493 154.474C223.9 154.474 230.68 157.349 230.68 160.901C230.68 164.454 223.873 167.329 215.493 167.329C207.113 167.329 200.306 164.454 200.306 160.901C200.306 157.349 207.113 154.474 215.493 154.474Z'\n fill='#090A0B'\n />\n <path\n d='M165.104 100.506C131.964 100.506 104.98 127.599 104.98 160.901C104.98 162.908 109.048 164.535 114.689 164.535V160.901C116.614 132.724 138.5 110.459 165.077 110.459C191.682 110.459 213.54 132.751 215.466 160.901V164.535C221.134 164.535 225.174 162.908 225.174 160.901C225.229 127.599 198.245 100.506 165.104 100.506Z'\n fill='#E8E9ED'\n />\n <path\n d='M215.493 160.901C213.567 132.724 191.709 110.459 165.104 110.459C138.5 110.459 116.642 132.751 114.716 160.901V164.535C120.384 164.535 125.455 162.908 125.455 160.901C125.455 142.677 140.615 121.035 165.132 121.035C189.648 121.035 204.808 142.65 204.808 160.901C204.808 162.908 209.879 164.535 215.547 164.535L215.493 160.901Z'\n fill='#BABEC9'\n />\n <path\n d='M176.929 245.298L172.02 213.812C174.922 211.669 176.82 208.225 176.82 204.32C176.82 197.811 171.586 192.55 165.104 192.55C158.65 192.55 153.389 197.811 153.389 204.32C153.389 208.225 155.287 211.669 158.189 213.812L153.28 245.298H176.929Z'\n fill='#090A0B'\n />\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0'\n transform='scale(0.00411523 0.0169492)'\n />\n </pattern>\n <image\n id='image0'\n width='243'\n height='59'\n xlinkHref='data:image/png;base64,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'\n />\n </defs>\n </svg>\n);\n\nexport default PrivateCloudSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport type {TelemetryProps} from 'components/common/hooks/useOpenPricingModal';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport CloudTrialSvg from 'components/common/svg_images_components/cloud_trial_svg';\nimport PrivateCloudSvg from 'components/common/svg_images_components/private_cloud_svg';\nimport ExternalLink from 'components/external_link';\n\nimport {CloudLinks, CloudProducts} from 'utils/constants';\n\ntype Props = {\n isFreeTrial: boolean;\n subscriptionPlan: string | undefined;\n onUpgradeMattermostCloud: (telemetryProps?: TelemetryProps | undefined) => void;\n}\n\nconst ContactSalesCard = (props: Props) => {\n const [openSalesLink, contactSalesLink] = useOpenSalesLink();\n const {\n isFreeTrial,\n subscriptionPlan,\n onUpgradeMattermostCloud,\n } = props;\n let title;\n let description;\n\n const pricingLink = (\n <ExternalLink\n location='contact_sales_card'\n href={CloudLinks.PRICING}\n rel='noopener noreferrer'\n onClick={() => trackEvent('cloud_admin', 'click_pricing_link')}\n >\n {CloudLinks.PRICING}\n </ExternalLink>\n );\n\n const isCloudLegacyPlan = subscriptionPlan === CloudProducts.LEGACY;\n\n if (isFreeTrial) {\n title = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.freeTrial.title'\n defaultMessage='Questions about your trial?'\n />\n );\n description = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.freeTrial.description'\n defaultMessage='We love to work with our customers and their needs. Contact sales for subscription, billing or trial-specific questions.'\n />\n );\n } else if (isCloudLegacyPlan) {\n title = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudEnterprise.title'\n defaultMessage='Looking to rollout Mattermost for your entire organization? '\n />\n );\n description = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudEnterprise.description'\n defaultMessage='At Mattermost, we work with you and your organization to meet your needs throughout the product. If you’re considering a wider rollout, talk to us.'\n />\n );\n } else {\n switch (subscriptionPlan) {\n case CloudProducts.STARTER:\n title = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudFree.title'\n defaultMessage='Upgrade to Cloud Professional'\n />\n );\n description = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudFree.description'\n defaultMessage='Optimize your processes with Guest Accounts, Office365 suite integrations, GitLab SSO and advanced permissions.'\n />\n );\n break;\n case CloudProducts.PROFESSIONAL:\n title = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudProfessional.title'\n defaultMessage='Upgrade to Cloud Enterprise'\n />\n );\n description = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudProfessional.description'\n defaultMessage='Advanced security and compliance features with premium support. See {pricingLink} for more details.'\n values={{pricingLink}}\n />\n );\n break;\n case CloudProducts.ENTERPRISE:\n title = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudEnterprise.title'\n defaultMessage='Looking to rollout Mattermost for your entire organization? '\n />\n );\n description = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudEnterprise.description'\n defaultMessage='At Mattermost, we work with you and your organization to meet your needs throughout the product. If you’re considering a wider rollout, talk to us.'\n />\n );\n break;\n default:\n title = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudProfessional.title'\n defaultMessage='Upgrade to Cloud Enterprise'\n />\n );\n description = (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.cloudProfessional.description'\n defaultMessage='Advanced security and compliance features with premium support. See {pricingLink} for more details.'\n values={{pricingLink}}\n />\n );\n break;\n }\n }\n\n return (\n <div className='PrivateCloudCard'>\n <div className='PrivateCloudCard__text'>\n <div className='PrivateCloudCard__text-title'>\n {title}\n </div>\n <div className='PrivateCloudCard__text-description'>\n {description}\n </div>\n {(isFreeTrial || subscriptionPlan === CloudProducts.ENTERPRISE || isCloudLegacyPlan) &&\n <ExternalLink\n location='contact_sales_card'\n href={contactSalesLink}\n className='PrivateCloudCard__actionButton'\n onClick={() => trackEvent('cloud_admin', 'click_contact_sales')}\n >\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.contactSales'\n defaultMessage='Contact Sales'\n />\n\n </ExternalLink>\n }\n {(!isFreeTrial && subscriptionPlan !== CloudProducts.ENTERPRISE && subscriptionPlan !== CloudProducts.LEGACY) &&\n <button\n type='button'\n onClick={() => {\n if (subscriptionPlan === CloudProducts.STARTER) {\n onUpgradeMattermostCloud({trackingLocation: 'admin_console_subscription_card_upgrade_now_button'});\n } else {\n openSalesLink();\n }\n }}\n className='PrivateCloudCard__actionButton'\n >\n {subscriptionPlan === CloudProducts.STARTER ? (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.upgradeNow'\n defaultMessage='Upgrade Now'\n />\n ) : (\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.contactSales'\n defaultMessage='Contact Sales'\n />\n )\n\n }\n\n </button>\n }\n </div>\n <div className='PrivateCloudCard__image'>\n {isFreeTrial ? (\n <CloudTrialSvg\n width={170}\n height={123}\n />\n ) : (\n <PrivateCloudSvg\n width={170}\n height={123}\n />\n )\n }\n </div>\n </div>\n );\n};\n\nexport default ContactSalesCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst UpgradeSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '476'}\n height={props.height ? props.height.toString() : '313'}\n viewBox='0 0 476 313'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <path\n d='M237 285.25C315.563 285.25 379.25 221.563 379.25 143C379.25 64.4375 315.563 0.75 237 0.75C158.437 0.75 94.75 64.4375 94.75 143C94.75 221.563 158.437 285.25 237 285.25Z'\n fill='#E8E9ED'\n stroke='#E8E9ED'\n strokeWidth='0.5'\n />\n <path\n d='M197.226 102.814C202.404 107.87 205 114.269 205 122.043C205 129.818 202.404 136.232 197.226 141.273C192.048 146.328 185.633 148.97 177.997 149.245H35.19C25.0942 148.97 16.7091 145.503 10.0194 138.814C3.34488 132.139 0 123.754 0 113.658C0 103.563 3.34488 95.1774 10.0194 88.4876C16.6939 81.8132 25.0942 78.3308 35.19 78.0559C35.4649 64.6916 40.0317 53.5726 48.9055 44.714C57.7641 35.8554 68.8832 31.2886 82.2474 31.0137C93.4276 30.9985 103.172 34.267 111.496 40.8193C119.82 47.3716 125.334 55.8178 128.068 66.1884C132.696 62.9199 138.026 61.2704 144.028 61.2704C151.94 61.5453 158.553 64.3404 163.869 69.6555C169.184 74.9707 171.979 81.5993 172.254 89.4957C172.254 91.6798 171.979 93.7264 171.429 95.6356C173.613 95.0858 175.782 94.8108 177.981 94.8108C185.618 95.101 192.033 97.7586 197.226 102.814Z'\n fill='#FFBC1F'\n />\n <path\n d='M205 122.045C205 114.271 202.404 107.871 197.226 102.816C192.048 97.7754 185.633 95.1179 177.997 94.8429C175.812 94.8429 173.628 95.1179 171.444 95.6677C171.994 93.7585 172.269 91.7119 172.269 89.5278C171.994 81.6162 169.199 75.0028 163.884 69.6876C158.569 64.3724 151.94 61.5469 144.028 61.2719C138.026 61.2719 132.711 62.9062 128.068 66.19C125.334 55.8193 119.82 47.3731 111.496 40.8208C103.172 34.2685 93.4276 31 82.2474 31C68.8832 31.2749 57.7641 35.8417 48.9055 44.7003C40.0317 53.5741 35.4649 64.6932 35.19 78.0422C25.0942 78.3171 16.7091 81.7994 10.0194 88.4739C3.34488 95.179 0 103.564 0 113.66C0 113.66 0.427654 87.863 37.4963 81.6314C38.8862 46.2734 69.7232 36.5748 82.5529 36.5748C95.3826 36.5748 116.384 42.8064 127.136 70.8789C149.771 56.6746 175.079 73.9794 168.145 99.9901C199.67 93.056 205 122.045 205 122.045Z'\n fill='#F5AB00'\n />\n <path\n d='M455.615 131.683C458.546 134.544 460.015 138.165 460.015 142.565C460.015 146.965 458.546 150.595 455.615 153.447C452.685 156.308 449.055 157.804 444.733 157.959H363.915C358.202 157.804 353.456 155.842 349.67 152.056C345.893 148.278 344 143.533 344 137.82C344 132.106 345.893 127.361 349.67 123.575C353.448 119.798 358.202 117.827 363.915 117.671C364.071 110.108 366.655 103.816 371.677 98.8022C376.69 93.7889 382.983 91.2044 390.546 91.0489C396.873 91.0402 402.388 92.89 407.099 96.5981C411.809 100.306 414.93 105.086 416.477 110.955C419.096 109.105 422.113 108.172 425.51 108.172C429.987 108.328 433.73 109.909 436.738 112.917C439.746 115.925 441.327 119.677 441.483 124.145C441.483 125.381 441.327 126.54 441.016 127.62C442.252 127.309 443.48 127.153 444.724 127.153C449.046 127.318 452.677 128.822 455.615 131.683Z'\n fill='#FFBC1F'\n />\n <path\n d='M460.015 142.565C460.015 138.166 458.546 134.544 455.615 131.683C452.685 128.831 449.055 127.327 444.733 127.171C443.497 127.171 442.261 127.327 441.025 127.638C441.336 126.557 441.492 125.399 441.492 124.163C441.336 119.686 439.754 115.943 436.746 112.935C433.738 109.927 429.987 108.328 425.51 108.172C422.113 108.172 419.105 109.097 416.477 110.955C414.93 105.086 411.809 100.307 407.099 96.5984C402.388 92.8903 396.873 91.0405 390.546 91.0405C382.983 91.1961 376.69 93.7806 371.677 98.7939C366.655 103.816 364.071 110.108 363.915 117.663C358.202 117.819 353.456 119.789 349.67 123.567C345.893 127.361 344 132.106 344 137.82C344 137.82 344.242 123.221 365.22 119.694C366.007 99.6842 383.458 94.1955 390.719 94.1955C397.98 94.1955 409.865 97.7221 415.95 113.609C428.76 105.57 443.082 115.364 439.158 130.084C456.998 126.16 460.015 142.565 460.015 142.565Z'\n fill='#F5AB00'\n />\n <path\n d='M401.495 130L384 152.389H391.417V190H411.071V152.417V152.389H419L401.495 130Z'\n fill='#386FE5'\n />\n <path\n d='M99.489 83L58 135.624H75.5887V223H122.198V135.69V135.624H141L99.489 83Z'\n fill='#386FE5'\n />\n <mask\n id='mask0'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='95'\n y='1'\n width='284'\n height='284'\n >\n <path\n d='M237 285C315.424 285 379 221.424 379 143C379 64.5756 315.424 1 237 1C158.576 1 95 64.5756 95 143C95 221.424 158.576 285 237 285Z'\n fill='#E8E9ED'\n />\n </mask>\n <g mask='url(#mask0)'>\n <path\n d='M110.205 195.029C111.455 188.376 113.949 182.032 116.433 175.732C119.096 168.978 121.783 162.167 125.561 155.953C134.369 141.481 148.716 131.036 164.154 124.056C179.591 117.075 194.362 113.129 210.88 109.347C205.467 115.175 203.818 122.594 200.581 129.859C193.026 146.811 186.533 164.212 180.044 181.598C170.303 207.684 160.566 233.766 150.834 259.846C129.709 247.404 114.533 225.315 110.5 201.131L110.205 195.029Z'\n fill='white'\n />\n <path\n d='M272.214 109.96C281.626 113.076 296.335 118.566 296.335 118.566C296.335 118.566 330.104 215.907 337.586 262.808C337.808 264.187 338.006 265.702 337.369 266.927C336.438 268.732 334.185 269.282 332.347 270.145C328.135 272.113 325.473 276.32 321.826 279.2C318.68 281.675 314.859 283.117 311.101 284.507C277.651 296.77 241.32 307.026 206.78 298.28C204.594 297.725 202.337 297.049 200.672 295.525C199.225 294.179 198.342 292.307 197.546 290.479C187.025 266.358 166.363 216.525 166.566 181.27C166.802 140.535 188.877 115.705 189.239 115.18C190.103 113.93 222.41 105.488 242.304 105.049C242.324 105.058 264.303 107.335 272.214 109.96Z'\n fill='white'\n />\n <mask\n id='mask1'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='166'\n y='105'\n width='172'\n height='197'\n >\n <path\n d='M272.214 109.96C281.626 113.076 296.335 118.566 296.335 118.566C296.335 118.566 330.104 215.907 337.586 262.808C337.808 264.187 338.006 265.702 337.369 266.927C336.438 268.732 334.185 269.282 332.347 270.145C328.135 272.113 325.473 276.32 321.826 279.2C318.68 281.675 314.859 283.117 311.101 284.507C277.651 296.77 241.32 307.026 206.78 298.28C204.594 297.725 202.337 297.049 200.672 295.525C199.225 294.179 198.342 292.307 197.546 290.479C187.025 266.358 166.363 216.525 166.566 181.27C166.802 140.535 188.877 115.705 189.239 115.18C190.103 113.93 222.41 105.488 242.304 105.049C242.324 105.058 264.303 107.335 272.214 109.96Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1)'>\n <rect\n x='166.156'\n y='105'\n width='171.739'\n height='170.292'\n fill='url(#pattern0)'\n />\n <rect\n x='166.156'\n y='105'\n width='150.513'\n height='196.825'\n fill='url(#pattern1)'\n />\n </g>\n <path\n d='M170.073 207.885C168.831 203.292 167.588 198.699 166.344 194.107C166.286 193.931 166.162 193.783 165.999 193.696C165.835 193.608 165.645 193.586 165.466 193.635C165.287 193.684 165.133 193.8 165.037 193.959C164.941 194.117 164.91 194.307 164.95 194.488C166.194 199.08 167.437 203.675 168.679 208.27C168.734 208.45 168.858 208.601 169.023 208.692C169.188 208.782 169.382 208.804 169.563 208.754C169.744 208.704 169.899 208.585 169.994 208.423C170.089 208.26 170.118 208.067 170.073 207.885Z'\n fill='#1D1400'\n />\n <path\n d='M164.371 190.257L164.023 188.656C163.965 188.479 163.842 188.332 163.678 188.245C163.515 188.157 163.324 188.135 163.145 188.184C162.966 188.233 162.813 188.349 162.717 188.507C162.621 188.666 162.59 188.856 162.629 189.037L162.976 190.643C163.029 190.826 163.152 190.982 163.318 191.077C163.483 191.171 163.679 191.197 163.864 191.15C164.043 191.09 164.192 190.964 164.281 190.799C164.371 190.633 164.394 190.439 164.347 190.257H164.371Z'\n fill='#1D1400'\n />\n </g>\n <path\n d='M293.59 117.645C304.203 121.021 338.869 132.754 346.935 141.321C375.47 171.631 387.111 253.275 388.013 260.878C389.315 271.554 386.363 295.612 375.47 302.365C369.503 306.066 351.832 294.164 342.666 284.516C329.896 271.071 323.688 236.641 321.126 218.276C316.427 184.594 293.59 117.645 293.59 117.645Z'\n fill='white'\n />\n <path\n d='M246.198 105.58L305.1 102.024C305.1 102.024 307.03 93.8665 301.41 84.4016C298.163 78.931 292.355 75.9545 288.544 68.4096C284.887 61.1734 285.355 52.8035 283.889 45.3888C280.758 29.5463 269.262 16.8782 263.492 14.1767C249.661 7.69784 246.198 105.58 246.198 105.58Z'\n fill='#1D1400'\n />\n <path\n d='M227.277 102.106C219.771 108.406 224.195 141.249 241.084 141.249C259.585 141.249 258.321 95.4196 259.657 95.1446C265.793 93.9434 272.093 90.6533 276.006 76.0362C276.565 73.9522 276.575 72.6593 276.937 70.6863C277.125 69.678 278.563 55.9582 278.162 40.9358C277.984 34.1049 271.191 13.1247 246.651 18.4602C215.969 25.1271 221.252 54.8824 224.238 61.2647C225.989 65.0034 228.469 74.232 228.884 79.1767C229.39 85.1345 228.117 101.397 227.277 102.106Z'\n fill='#CB8E00'\n />\n <path\n opacity='0.3'\n d='M259.604 95.1012C258.26 95.3539 256.895 95.4831 255.528 95.4871C252.075 95.4821 248.669 94.6988 245.561 93.1957H245.522C245.45 93.1626 245.376 93.1336 245.3 93.1088C243.959 92.694 243.265 94.696 244.533 95.2942C247.041 96.503 249.353 98.0802 251.393 99.9736C253.486 101.942 255.132 104.337 256.217 106.998C256.904 108.322 257.466 109.708 257.896 111.137C258.982 102.492 259.112 95.3183 259.633 95.1687L259.604 95.1012Z'\n fill='black'\n />\n <path\n d='M225.164 15.7105C236.82 5.29517 253.226 9.3185 260.381 12.4831C272.668 17.9248 276.397 30.564 276.397 30.564C273.551 34.0904 274.781 37.2599 271.616 41.5871C267.921 46.6476 263.381 42.4169 255.827 48.5387C252.736 51.0778 250.224 54.2492 248.46 57.8396C248.46 57.8396 245.918 52.7502 242.83 52.7936C239.294 52.8467 237.162 56.1705 238.141 59.5474C238.851 61.9836 241.639 67.6085 241.639 67.6085L230.577 95.9262C229.435 98.8492 227.282 101.265 224.509 102.735C221.736 104.204 218.528 104.63 215.468 103.934L149.831 82.8672C156.02 68.6939 166.339 66.9138 174.226 60.1408C181.945 53.4931 183.913 46.6959 190.363 41.6209C197.971 35.6293 209.848 32.1463 213.186 28.8176C222.675 19.3527 217.784 22.3051 225.164 15.7105Z'\n fill='#1D1400'\n />\n <mask\n id='mask2'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='149'\n y='9'\n width='128'\n height='96'\n >\n <path\n d='M225.164 15.7105C236.82 5.29517 253.226 9.3185 260.381 12.4831C272.668 17.9248 276.397 30.564 276.397 30.564C273.551 34.0904 274.781 37.2599 271.616 41.5871C267.921 46.6476 263.381 42.4169 255.827 48.5387C252.736 51.0778 250.224 54.2492 248.46 57.8396C248.46 57.8396 245.918 52.7502 242.83 52.7936C239.294 52.8467 237.162 56.1705 238.141 59.5474C238.851 61.9836 241.639 67.6085 241.639 67.6085L230.577 95.9262C229.435 98.8492 227.282 101.265 224.509 102.735C221.736 104.204 218.528 104.63 215.468 103.934L149.831 82.8672C156.02 68.6939 166.339 66.9138 174.226 60.1408C181.945 53.4931 183.913 46.6959 190.363 41.6209C197.971 35.6293 209.848 32.1463 213.186 28.8176C222.675 19.3527 217.784 22.3051 225.164 15.7105Z'\n fill='#1D1400'\n />\n </mask>\n <g mask='url(#mask2)'>\n <rect\n x='149.754'\n y='9'\n width='107.578'\n height='95.5179'\n fill='url(#pattern2)'\n />\n </g>\n <path\n d='M266.396 139.411C263.767 132.146 262.055 124.741 264.322 117.345C267.313 107.499 270.917 107.046 280.087 102.39C289.258 97.7351 290.802 95.0963 296.398 85.1586C297.715 82.814 299.089 83.3109 299.364 85.0862C299.606 86.6492 299.364 89.9103 299.364 89.9103C299.364 89.9103 303.224 77.85 304.671 77.3676C307.454 76.4365 308.154 82.3268 308.53 83.639C310.19 89.4521 309.013 92.3224 305.153 102.936C302.64 109.839 297.145 118.141 290.898 122.097C288.486 123.621 285.591 125.43 285.423 129.333C285.36 130.829 286.441 132.126 287.304 133.347C292.336 140.434 332.791 188.154 338.691 193.813C357.91 212.25 374.486 226.057 382.34 251.509C385.789 262.696 382.822 291.549 379.927 297.821C373.174 312.438 348.571 292.997 338.44 279.972C315.926 251.017 275.35 164.183 266.396 139.411Z'\n fill='#CB8E00'\n />\n <mask\n id='mask3'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='263'\n y='77'\n width='121'\n height='227'\n >\n <path\n d='M266.396 139.411C263.767 132.146 262.055 124.741 264.322 117.345C267.313 107.499 270.917 107.046 280.087 102.39C289.258 97.7351 290.802 95.0963 296.398 85.1586C297.715 82.814 299.089 83.3109 299.364 85.0862C299.606 86.6492 299.364 89.9103 299.364 89.9103C299.364 89.9103 303.224 77.85 304.671 77.3676C307.454 76.4365 308.154 82.3268 308.53 83.639C310.19 89.4521 309.013 92.3224 305.153 102.936C302.64 109.839 297.145 118.141 290.898 122.097C288.486 123.621 285.591 125.43 285.423 129.333C285.36 130.829 286.441 132.126 287.304 133.347C292.336 140.434 332.791 188.154 338.691 193.813C357.91 212.25 374.486 226.057 382.34 251.509C385.789 262.696 382.822 291.549 379.927 297.821C373.174 312.438 348.571 292.997 338.44 279.972C315.926 251.017 275.35 164.183 266.396 139.411Z'\n fill='#674600'\n />\n </mask>\n <g mask='url(#mask3)'>\n <rect\n x='263.121'\n y='77.0203'\n width='75.7389'\n height='156.784'\n fill='url(#pattern3)'\n />\n </g>\n <path\n d='M383.304 251.505C375.451 226.053 357.91 212.246 338.691 193.808C337.523 192.689 335.015 189.949 331.696 186.176C331.493 186.403 331.295 186.659 331.093 186.856C324.262 194.44 315.829 199.882 306.345 203.485C303.06 204.735 296.991 205.96 293.59 206.423C307.927 235.513 324.817 266.87 336.351 281.68C346.482 294.705 374.143 312.414 380.892 297.797C383.787 291.545 386.754 262.692 383.304 251.505Z'\n fill='white'\n />\n <path\n d='M191.671 277.421C196.503 279.87 201.195 282.589 205.723 285.564C212.356 290.016 231.595 288.859 231.595 288.859C231.595 288.859 241.412 309.569 242.425 302.54C242.951 298.878 241.383 296.712 240.915 293.06C242.912 295.69 244.123 297.098 245.112 300.248C246.101 303.398 245.744 306.235 245.3 309.414C244.963 311.802 246.159 312.878 247.409 312.989C249.821 313.196 250.303 310.447 251.509 310.056C261.804 306.679 259.681 302.858 260.593 293.437C260.516 304.908 259.874 303.944 255.209 310.538C254.273 311.86 256.015 313.433 260.516 310.857C264.052 308.768 266.445 306.515 268.075 301.208C269.843 295.705 269.428 289.733 266.917 284.526C261.336 273.108 256.893 269.306 244.273 267.763C231.653 266.219 217.084 265.085 208.092 268.245C204.599 269.475 191.671 277.421 191.671 277.421Z'\n fill='#CB8E00'\n />\n <path\n d='M367.621 221.802C356.731 209.153 345.552 196.771 334.084 184.656C333.949 184.533 333.772 184.466 333.589 184.468C333.406 184.47 333.231 184.541 333.098 184.667C332.966 184.792 332.886 184.964 332.874 185.146C332.863 185.329 332.921 185.509 333.037 185.65C344.502 197.778 355.681 210.16 366.574 222.796C367.182 223.505 368.229 222.507 367.621 221.802Z'\n fill='#1D1400'\n />\n <path\n d='M323.34 260.101L323.664 260.424C323.801 260.556 323.984 260.63 324.175 260.63C324.366 260.63 324.549 260.556 324.686 260.424C324.821 260.288 324.896 260.104 324.896 259.913C324.896 259.722 324.821 259.538 324.686 259.402L324.363 259.078C324.297 259.007 324.217 258.95 324.128 258.911C324.039 258.871 323.944 258.85 323.846 258.848C323.749 258.847 323.653 258.864 323.563 258.901C323.472 258.937 323.391 258.991 323.322 259.06C323.253 259.129 323.199 259.211 323.163 259.301C323.126 259.391 323.108 259.487 323.11 259.585C323.112 259.682 323.133 259.777 323.173 259.866C323.212 259.955 323.269 260.035 323.34 260.101Z'\n fill='white'\n />\n <path\n d='M323.48 261.162C313.067 243.709 303.312 225.885 294.217 207.692C293.802 206.862 292.553 207.59 292.968 208.425C302.056 226.602 311.811 244.426 322.231 261.896C322.328 262.061 322.487 262.182 322.673 262.23C322.859 262.278 323.056 262.251 323.222 262.154C323.388 262.056 323.508 261.897 323.557 261.711C323.605 261.526 323.578 261.328 323.48 261.162Z'\n fill='#1D1400'\n />\n <path\n d='M298.752 90.3784C297.865 92.7918 296.689 95.0888 295.249 97.219C294.728 97.9909 295.983 98.7194 296.499 97.9475C297.999 95.7075 299.225 93.2959 300.151 90.7644C300.469 89.8864 299.075 89.5101 298.752 90.3784Z'\n fill='black'\n />\n <path\n d='M294.425 100.475H294.666C294.858 100.475 295.042 100.399 295.177 100.263C295.313 100.128 295.389 99.9436 295.389 99.7517C295.389 99.5598 295.313 99.3757 295.177 99.24C295.042 99.1043 294.858 99.0281 294.666 99.0281H294.425C294.233 99.0281 294.049 99.1043 293.913 99.24C293.777 99.3757 293.701 99.5598 293.701 99.7517C293.701 99.9436 293.777 100.128 293.913 100.263C294.049 100.399 294.233 100.475 294.425 100.475Z'\n fill='black'\n />\n <path\n d='M305.626 86.9871C304.786 91.3079 303.171 95.4412 300.86 99.1873C300.378 99.9833 301.622 100.707 302.109 99.9157C304.488 96.0642 306.151 91.8153 307.02 87.373C307.204 86.4612 305.805 86.0705 305.626 86.9871Z'\n fill='black'\n />\n <path\n d='M300.455 101.923C300.646 101.923 300.831 101.847 300.966 101.711C301.102 101.575 301.178 101.391 301.178 101.199C301.178 101.007 301.102 100.823 300.966 100.688C300.831 100.552 300.646 100.476 300.455 100.476C300.263 100.476 300.079 100.552 299.943 100.688C299.807 100.823 299.731 101.007 299.731 101.199C299.731 101.391 299.807 101.575 299.943 101.711C300.079 101.847 300.263 101.923 300.455 101.923Z'\n fill='black'\n />\n <path\n d='M241.446 287.555L240.095 284.617C239.704 283.773 238.455 284.506 238.846 285.346C239.293 286.311 239.743 287.29 240.196 288.284C240.587 289.128 241.832 288.395 241.446 287.555Z'\n fill='#1D1400'\n />\n <path\n d='M257.052 280.57C258.745 284.405 259.397 288.515 259.503 292.683C259.574 294.337 259.547 295.993 259.421 297.642C259.184 300.084 257.713 301.627 256.044 303.263C255.373 303.914 256.401 304.937 257.067 304.285C258.398 302.997 259.802 301.618 260.443 299.837C261.157 297.908 260.989 295.573 260.969 293.566C260.921 288.838 260.226 284.212 258.306 279.861C257.93 279.012 256.685 279.745 257.057 280.589L257.052 280.57Z'\n fill='#1D1400'\n />\n <path\n d='M251.678 293.412C252.263 296.037 252.4 298.743 252.083 301.415C251.977 302.336 253.424 302.331 253.53 301.415C253.854 298.613 253.699 295.776 253.072 293.026C252.869 292.119 251.47 292.505 251.678 293.412Z'\n fill='#1D1400'\n />\n <path\n d='M251.292 286.721C250.904 284.968 250.725 283.175 250.756 281.38C250.756 280.449 249.309 280.449 249.309 281.38C249.278 283.306 249.476 285.228 249.898 287.107C250.1 288.014 251.494 287.628 251.292 286.721Z'\n fill='#1D1400'\n />\n <path\n d='M259.72 57.3333H259.585C259.067 57.3333 258.57 57.5391 258.203 57.9055C257.837 58.2719 257.631 58.7688 257.631 59.287C257.631 59.8052 257.837 60.3022 258.203 60.6686C258.57 61.035 259.067 61.2408 259.585 61.2408H259.72C260.238 61.2408 260.735 61.035 261.101 60.6686C261.468 60.3022 261.674 59.8052 261.674 59.287C261.674 58.7688 261.468 58.2719 261.101 57.9055C260.735 57.5391 260.238 57.3333 259.72 57.3333Z'\n fill='black'\n />\n <path\n d='M273.468 60.6763H273.329C272.811 60.6763 272.315 60.8819 271.949 61.2478C271.583 61.6138 271.377 62.1101 271.377 62.6276C271.377 63.1452 271.583 63.6415 271.949 64.0075C272.315 64.3734 272.811 64.579 273.329 64.579H273.468C273.986 64.579 274.482 64.3734 274.848 64.0075C275.214 63.6415 275.42 63.1452 275.42 62.6276C275.42 62.1101 275.214 61.6138 274.848 61.2478C274.482 60.8819 273.986 60.6763 273.468 60.6763Z'\n fill='black'\n />\n <path\n d='M254.963 77.0205C256.922 79.1751 259.186 81.0312 261.683 82.5297C260.424 84.2278 257.67 84.3242 256.039 82.9831C254.408 81.642 253.887 79.2493 254.418 77.1942'\n fill='black'\n />\n <path\n d='M265.856 75.8338C267.303 75.5105 270.579 75.4623 270.81 73.4603C270.97 72.0709 269.527 70.2233 269.083 68.9835C268.269 66.8298 267.806 64.5592 267.713 62.2586C267.713 61.1877 266.025 61.1829 266.044 62.2586C266.163 65.2543 266.847 68.2005 268.061 70.9421C268.249 71.3811 268.837 72.1771 268.861 72.6595C268.924 73.8945 268.746 73.2673 267.897 73.6532C267.168 73.9861 266.189 74.0343 265.403 74.208C264.351 74.4396 264.8 76.0557 265.846 75.8193L265.856 75.8338Z'\n fill='black'\n />\n <path\n opacity='0.3'\n d='M287.304 133.342C280.743 128.788 279.585 121.764 287.304 117.645C295.023 113.525 303.894 105.96 303.894 105.96C303.894 105.96 299.654 117.538 290.898 122.083C282.142 126.627 287.304 133.342 287.304 133.342Z'\n fill='black'\n />\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0'\n transform='scale(0.00280899)'\n />\n </pattern>\n <pattern\n id='pattern1'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image1'\n transform='scale(0.00320513 0.00245098)'\n />\n </pattern>\n <pattern\n id='pattern2'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image2'\n transform='scale(0.0044843 0.00505051)'\n />\n </pattern>\n <pattern\n id='pattern3'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image3'\n transform='scale(0.00636943 0.00307692)'\n />\n </pattern>\n <image\n id='image0'\n width='356'\n height='353'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image1'\n width='312'\n height='408'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATgAAAGYCAYAAADWY/6EAAAgAElEQVR4Xu2debNtsVHdtyEBkjAFMpjJAWwDJqmi+P5fgH9IVRIIYIxxwJiYMYHMiQP1s89ytfU0tLT3mXTXqbp137tnD+olaakntT5z+GMEjIAR2BSBz2wql8UyAkbACBwmOA8CI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgicIbh/eBzH3x3H8f+2RceCGQEj8NYIrBLcPzmO458dx/H/j+P45nEc/+etUXDjjYAR2BKBVYL7p8dx/OgNkf9yHMd/3RIdC2UEjMBbI7BKcP/gOI5/ftPg/tJm6luPATfeCGyLwCrBbQuIBTMCRmAfBExw+/SlJTECRqBAwATnIWEEjMC2CLwCwSlg8VfHcfzttkhbMCNgBB6OwCsQ3L+6Sf2/bikn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'\n />\n <image\n id='image2'\n width='223'\n height='198'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image3'\n width='157'\n height='325'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ0AAAFFCAYAAAD2PO8gAAAYw0lEQVR4Xu2d33Icx3XGT8+S4h/ZJSgvINAvQDDXqRKUsh0sU2WBT0CwJIB2LkwyKYuAq1IEk9gAlUpI+iYm4BTBFzDJXBB0khLhqlxb1BMQfoFoc2ECILFzUt07vegdzu70zPacHex+uBK1M3N6vv5NT8/pc04rwh8UEFZACduDOShAgA4QiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCsA6MQlh0FABwbEFQB04pLDIKADA+IKADpxyWEQ0IEBcQUAnbjkMAjowIC4AoBOXHIYBHRgQFwBQCcuOQwCOjAgrgCgE5ccBgEdGBBXANCJSw6DgA4MiCswsdCt/XhuWsXqMRHNKKIbNze274mrP6EGJxe6z+dmVaRemH5X/HT5wfP5ujKwen126uyfzl5mFbdubjx/VNd2+rZrYqFbXZifOv3ewddENF33ke7O0twtJrWqOzXiwwtfbP7XS98OruNxEwud7Qw9iqze22kN2zlfLv5gpt1oTK38+vnOsNdKn7+2NLeqSN0iphY3+MLKr5/vhrYheb2Jhy6E2GuLcwtKqYdVjkR3PmvO7313byfEAxLinoe5BqAbRr3k3DtLzetMdFf/kyM+d9xHogCSDLwEoAugsJ4fnjq5P09Muyu/Cf96DdDEWl0C0NWqOyajMYBuMvq5VncJ6GrVHZPRGEA3Gf1cq7sEdLXqjsloDKCbjH6u1V0Culp1x2Q0BtBNRj/X6i4BXa26493G6LXhM6/PXiOKd8chwkTfIaCrOXQS67rSEgA6acUL2nOg2+WIPxmHdd1jBd2XVy9ei5kXOOYbIdY49avr1P7pmSrCkQqyNfBw3U59wDhEmBy71+v6UvOVDroMFelrr6eIF6qaL+mw+ChWd5VSO20VPx2HkWrYB+pYjXTri817pOgaM91f2dy+PszNm8jhkwevSNFUXuTwL5ea8xHTQ4ro5f7B3qXVLf+gz7WluS1F6rJta56tYe7puJx7rKALLeovFi/ORBTPHLy//2TQq8sFJ5lXeUcH/3KpeT0ivkakpk37a5SPESpqumi/TDR0vmK50O2/2fuwyEhnbRjAVTxPEW3V4RV7NLWQz4QDdB7k6XkZxbRAMe2E+IDxMFnpIfoBaCjWSUl65N1afvD8SqUGUxcHdJJq18jW+lLzMRHPxKRu/Hxj+4lk0wCdkNrG3UM8HzPdl+5koVv0NgPovKUa7sD1pSYnV2gtb2x/mHe1O0sXb7Gi6f2D1zfKzCHzrj/K3wGdkPqd1xnNE/PW8ubgOZS79DWOLhZAJwSdNqM/SHy+XN2UxkGOa+s/VIq2bm5s3xC8laFMAboh5FtfbL7QzmWO+JIPTEVM6eTqWHFr0Ndyyn94bPJtAV0REpxj15wCPMx8ZWXz+VbJS5U+7cvFizNxFN9VrJ6OquqUGW2J7ipFL/cO9q74zD8BXckuTwrwmKpPVYx0JZslflp3rtrRQUfB5K7WADrxbpI3aEuNtRvhAw46y3ympMbu/pu9CxjpPPrXd/1x1JP2jguFZxWrnZsbz2573Fr3EBsoQUSt/Td753zAKHJ9/YF0cHq/5Rt6NdYjXRJ/d12R2kp3VBJl8pgUzTZUPP+zB797OkjoEOuvRTrSPTapGqrDuszf8sZ2oX5zoPMejcq21ee8Qo33uWCdjllfaur1xZmsjnLXH5n49srGc1N0sN+f76TdjEjEq4roXkg3RvdemHeWN59/UkRnW+CnQdHLLzafjbyg4lhDZ+YbTLeY6FFW/J12wlKkZg7O7K36vhryOnsQ6Hnn5v3u6+fLu86ofx9r6EYhbjKxvqyIHo3KjTGK+y5iE9AVUQvHBlEA0AWRERcposCxgU5P5FnxLSL6/SS9tkzG2p9Ozzeo/VK6qvr64sWHpHgm4sMrIW1XAp12VbSJzx0c7K2G8gmtX22+IKZZ7YRc3tg+V+TJGsWxRdMb9UcNK9VKx9o57g7Rcv49bprA0cXBoetZk/RwRfgCYcva+7g37DWdXXFo/83eJ2UegG6oeoHcBmO3rb7uZJrlpze6oUzppaQySUGh8mRtdDFHFDTJOzx0ne2PjCPTR3Bf6PRxRV0Gbmf6OICz2uK4QLyCL/U1enyAqXTJrJWN7j4RRJRupwGY6ZZi9Y3PtML6CUnRzvKD7UL+vCJ9McyxwaGzcDTa0dSoHZHGKfre/j1SqrXyoFyebNnXuomJU3yeFd12w57ckcuuLJh2njpYjZh2fcCyHZ6EVk1HfHjJzrmcBfjaTkMqgW6Yp6Bu55rXa5tmQ3nzzcqG4och/HjdEHhnzpWsnFyL4uh+v4fejIbM10cV/AnoEso7r7HoluJ4Z1CJCZtgE8WHN0J+0ZV52DqvZbpcNKOrW56jxDpumXamzwF0iSKpuLC+UbjO6FLrnRMHwZHMda+FGG3LQAjojqDrGxzgCusU8RFPUi7TwXU8B9D1vF7pVszqaV5eqp43hf5I8o3rqyNE6TbdWWreZaJ5RbyaNVWpJXRm8s7qesT8dVUlvKrovM4knnQNvUxw+/nPkq/Q2XFIN0w5lTOnILWErmov/NqP52Y5VlN5I1pRMPN8ev2K1jjzxJ3lB8Vi5fq10S6fUYN2Qmeq5emi+08p+kixup31RqgldGXi7l0hbCFCvWSWDqRMEmq+1cf71rlLNhBu5XXeIJ+eazddtEZ/hUakzvfrpKxOzntw7iw1H+tXXB2XDWsJnRZZv6pev/96t0xwpeuATW8/7m6j7lOxyFnVyMwvsC4UxbylpwJ6GfDgO/svs9pdFK5+sLuvsH6vZOcB0EuApcqb5Y1oZX+vLXRlb0if546UWcWhzZzxkKb7wdEzatqtzDNS7NK5C2nAA93DO7D7VACw82Jq85NBCduh1mmL3OtYQqcFCCVmspSm0+xeZX3UuI7WrF2ti64X285z57XpIACbc8vET/NyOwb66woGJhQBa9CxYwtdWYGKwmqXybJ2tU5cB9eJ1dby5rNChQePvuCLrccWue+e6JaAEUF5bQB0jkJJiQRdXSlIfuj6YvPbpJD2y5sb2xfSnaE/Bhrt6HwVSdB5HW/eBklARETqg72ze1fKzJ997KSPAXSOImVi1zofPT+YOVQnptMuGF0Ehxp0OY75fnpe1R0FO/YN5O+9d2bWVHFX5t8Xzp48Ox0T6yI95t9l4gHLQGHPSeICdVV5KlpVHq/XDAWyInttbisz/d5nrtTtFGUimqlIgKlTJNG0Ts8HVax0eQbt5jBxdTFH57hTssG7TsgwkL0zEi/OLSilHhr7AYsEHZuRzuSoNmjXp0CLj/BHa6h+wY6J32vaLZbjBl8amwXCursuDaaWUnRbx9HZsCdibumEahtnp/+tHwL9OiZW875pAL7+xX56JV/ntkhQsOjhkUGnIYoUsc8y152luVtMymTg+1YGygMvb77lnt8vBD+BxFQp55gfHXxn/7o7LzKj6d6ZVUXqg6wyrkW+bF3nss9ymbun2ChezbV7veq5DjdIT9jNayXP098z1yq4W043T0LPi5zdbkzRwRM0S4rv5dkfVBZMX59jNZO1pBayjKu7w0/E6kJewIHrckk7h4cdAfMe6LzfRzLSOSOHV0EXN8GmaC04t8xD1iiZvLYrWZ/sl3CzfvXiQyKeLprDUKQ6kob07Mk3l9scf+N+xDgfMF7a5wFU5veRQKcbOmi5qMyN9DvHzp0U0ZObG9uX3OOcDjBfj6dOn57S0cP6mFBVzfV9NlTUsiOTO8qHXMHw1WyU1adsG0cGna9IIY7rN0Kk1ydPnTw9n/W1pifwUUwfufNP67xVROeLhK530xOJX+ZVXyrqqPbRqt8I6HNuqGMmArp+YtkkFsVk8iLMv7VfTM81G3xBz/WyJvDdND/nwlmL6lkfCuYLlMxX+G66XdaNk/z/XRUr3ZZpnw+HUEDY61Q575to6LI6Kj26uFEpOo+X2ur/7EeQe74Ok2rQ4ZZN1snKP3UCETKz9deWmls60cZcl2lHF2w0/+3pitGQN9rRp6/fvn40jCO56nnfsYMuqa+xIPn0J51p8nhd90kCnS4yqHeeNltr2hHPfXXb/NZBi/j63J7koJgf6ZUAxfQRN+hK3hd2cr7ZhNk3TrDvPNhutOLcT8iR9PhBl2x3pIgy1zOHEcf61RqkXn3x4Nn9ftfS4FFD6Y2HTXK0G2pkXUAGzobJzO+W289bxO+GIzG3Ds7u33N9fnd+8teXuR3rjZVnFKnVrLrDR77H/FIWg3Sy7WCmndDR1WbgHqaTRnGuWQVgdc168fPE8xkh7DXcFYaiTmjjemHa9d2aM/0aN5AqpWsgv7POmh5d+z1w7oic1zdOmdobRaoK5F3X5/djB53PTeljytT0SPnVcp3Wvm1JH+csL+llNbP3Qgp4Y9s6nlXMLRWZjwr9t8sR61IVWy64Ttn+b3yWCp18jeBvjDxdxhY6d36UV43cTWKJ3ipd9mHg9kiuqPYLNVkSM2FRerQa5EbpXanovArdV6teZ02F1T/lNt1z/X0uuHp+y0zTpOiaO68c1PmjLFM7ttCZTvGsduTus+CzLabtTLvaYTpd0adJ/Tzz86CIEwPUqf3HilWrXxxbTyi84neyxHp2p+4YtF+7Iyuc4xsKNbbQ5Q3xPaPVUR6Ed4elodDhUIqUWc0wDHisKee10YyIEX2crvxkz3NdMDoUiuPGH8smM+W1xed339JsgC5Rs8yyXLKkdD5idaXdiFsqVnqL8imOTHkwrw3qymzo1vPALM4tNCj64IvN/l/becDoByjqxPK9k7KZd677uzPF0K6jvkGngK6IqhUc6xOtfASFell0iyafJrsfMSHWg/NKZAA6n14pcEzRUaM7OjDv9nMCD8rjLdC0voe6UT8S9ZyPHXTOuufL5YxklxCdMMw13JWIEKOGbkt3JGJq2TXhYdo46nOPHXSuK6RM5rpZcI9plgoUrradlKwK6EKEOkwqc/ty51VlPkpC7Z5YZs45arj62T920HW+2Pia2e8rZxO59E2n6ol4FTV0E3iy1lOzhHVLYlS5V1hdocpr17GDLu+GBv3uOlx9F8XdIojESu+omLmrYj+7eQ+Jk1E2xaSermw8e2c3RrsmTKxaWb/3s12nUrVuGycKOjM/6oT/eFV+T/vidMFEs4tzie0v+4HhRp7oY7JS/VIBBV5blqfa7jWqD/NAFzl3bKEbZu7mCphVaenOUnOe2Sw5zXCDL/msdfbrFDd83UCXrMX2tMHmnxb4kOgZ1QVLRvjAN5bQ9URlKA76lLtedy1wiLi+ZN44NWhL8rIfEkXSHH2AscfoVzczz+692btSNGB0LKEbtGNNEWGzjk2lFT6RrAEybNtDnd9bWJKvrGz6rb5Y+yODTr+i2kRURZCgvjkNnlL8Tn2REMJr8AYtPVkHsd5gLlRWWYh2D7pGUad28oFlpwPv5HsMsjUS6NzRIpQDtWyn2N1jWPH9oi6YfjZ74vIC1gApe48+51Vd53nkX6+Ddv3zESjkMdbZHDL8/Whpi6bKriDoed57r8/Mum+CMoGpvlp158EBv8z72R7JSKcbY8o6FAiW9BWv6HFa7ChS14oUmS5qo8zx1j/oxuUVCUwtY1PqnJFBJ3WDdbJjnbXc5tsD6wDrIM+TB690QUXXiX2Up+u3Dac+/lDx9Js3eztFvzCr1A3QearrJEJ3E6Wd5JZ7/dZi3cs7Nelyg0X1h9BJoo9fv//6UdkKmUXLoXlKMfRhgM5Twm4itLN5b6rIde5KgV279V2C82xa38OcJbxgm6IM0ybrMxw76GxW1KHiP4Z0xziAdXe4LlMouipnbRYM2p92pnEwu/fdvZ2yo+UwkLnndjdTUbQzdtClsuiDpRFm7UitRbVbEsUR3yiSYxuqM4/LdZypRWvsoHOTVUIkx9hOdStbFomulRrZqna2Dwu3iTNU9LGueDB20Glx0jXhhhXMnl+0dFeVfjX3nty1Zp0V9rMHv3sa6p6ruM5YQleFUGWuuXa1+VvFdIlIvVreePa9rGusLV1cJcVTvsWrM6+hS1JE6iv9W0PFlwBdmd4ak3M6fjX+aRSrX2XVCHbDmoaNVtEulojimaKL72mp2alvo3QKdwV/GOmI6B8//+G5E1F0mZi+Wdl8bgpwS/wlRRi/6uyqw1d8Ks1X3S5bik3nwFZVlR3Q6S/Qq80XtiREmWSfYUAwNUyIqA5fvj3RxkSZhRuHuVd7LqAz0M19RaxmidRuv7lXUbHta6roK0qfV/Scom0bdLz+yiRSPyLi/wgVdZO2B+iSvAlq02yorcftzjeKdC3j7FTFrI7/l8+aF96eUD89efjmV3/37/9tNkXx/dOw/utn3595raLW3//mP3VFztr+AboKumbt6txDxWpBX7qIr9BJV+yuevg2z92eoEjlKd/rhzwO0IVUM7mWmafF6reqs8fXX/qa6L7mO6XBvM/T10/cM/PE1Fre3P4zX5ujOA7QjUL1PjZNyPhbNVNmrdRWVk/vkFOj2+s2BdBV3CtrP/mLDw/fnp2q+zyrYhl6Lg/oKlTb1jExwZgBiiSWbeo/L85dOtRuGUEf5KC2ArqyPelxnhPxwhzx90bhi+vZNjQjkdvjNoIfAuiCS3p0wc4HBS1ERK9CrTbo1ZMGqdk28Y7PKzvJAf6DblXEh39ud/Sp8LZzLz2x0Gm/1j99/sNpn47LVVHwACca2LtygfYb6ibm7RErdRvHAroqvPTWrzXsQnvIjvK5z/XF5v/qOWJMdP/nBRzPIds57LVqD90v/uavPona0aeH7fb9kKNSN51P8YuiPrFhRc8634Y4rTzY1lsx9f0zr+w2zQ4bTVLFPfhes/bQ2TDnkMnQWhwTVnSCfsSK/6HIBN9GpBzG8aNQD0HPZP+YVATwBSzruPpDl7xOqISXfhhh+p3rLlXp3bBD5JMm0JkgzLpM9qvQzl6z9tB1Pe2N+GmREakq0daWmn9QRBcGRQOXsa3vc1CpsDLXrOs5tYeubsJZN0iDoyd1+Rqsm0Z57QF0eQrh9+AKALrgkuKCeQoAujyF8HtwBQBdcElxwTwFAF2eQvg9uAKALrikuGCeAoAuTyH8HlwBQBdcUlwwTwFAl6cQfg+uAKALLmn1F9R5F9rKyr/9z7fVWwtvAdCF17TSKya7Jn6d5F3klpyttDElLw7oSgo3qtPcSk9uuf9RtaeMXUBXRrURn7O+1LxLij5ixX9bh8ibonL8PxD8Ic7FcMcHAAAAAElFTkSuQmCC'\n />\n </defs>\n </svg>\n\n);\n\nexport default UpgradeSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedDate, FormattedMessage, FormattedNumber, defineMessages} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {CheckCircleOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {Invoice, InvoiceLineItem, Product} from '@mattermost/types/cloud';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport CloudInvoicePreview from 'components/cloud_invoice_preview';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport EmptyBillingHistorySvg from 'components/common/svg_images_components/empty_billing_history_svg';\nimport UpgradeSvg from 'components/common/svg_images_components/upgrade_svg';\nimport ExternalLink from 'components/external_link';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {BillingSchemes, CloudLinks, TrialPeriodDays, ModalIdentifiers} from 'utils/constants';\n\nconst messages = defineMessages({\n partialChargesTooltipTitle: {\n id: 'admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges',\n defaultMessage: 'What are partial charges?',\n },\n partialChargesTooltipText: {\n id: 'admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message',\n defaultMessage: 'Users who have not been enabled for the full duration of the month are charged at a prorated monthly rate.',\n },\n});\n\nexport const noBillingHistory = (\n <div className='BillingSummary__noBillingHistory'>\n <EmptyBillingHistorySvg\n height={167}\n width={234}\n />\n <div className='BillingSummary__noBillingHistory-title'>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.noBillingHistory.title'\n defaultMessage='No billing history yet'\n />\n </div>\n <div className='BillingSummary__noBillingHistory-message'>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.noBillingHistory.description'\n defaultMessage='In the future, this is where your most recent bill summary will show.'\n />\n </div>\n <ExternalLink\n location='billing_summary'\n href={CloudLinks.BILLING_DOCS}\n className='BillingSummary__noBillingHistory-link'\n onClick={() => trackEvent('cloud_admin', 'click_how_billing_works', {screen: 'subscriptions'})}\n >\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.noBillingHistory.link'\n defaultMessage='See how billing works'\n />\n </ExternalLink>\n </div>\n);\n\ntype FreeTrialProps = {\n daysLeftOnTrial: number;\n}\n\nexport const FreeTrial = ({daysLeftOnTrial}: FreeTrialProps) => {\n const [openSalesLink] = useOpenSalesLink();\n return (\n <div className='UpgradeMattermostCloud'>\n <div className='UpgradeMattermostCloud__image'>\n <UpgradeSvg\n height={167}\n width={234}\n />\n </div>\n <div className='UpgradeMattermostCloud__title'>\n {daysLeftOnTrial > TrialPeriodDays.TRIAL_1_DAY &&\n <FormattedMessage\n id='admin.billing.subscription.freeTrial.title'\n defaultMessage={'You\\'re currently on a free trial'}\n />\n }\n {(daysLeftOnTrial === TrialPeriodDays.TRIAL_1_DAY || daysLeftOnTrial === TrialPeriodDays.TRIAL_0_DAYS) &&\n <FormattedMessage\n id='admin.billing.subscription.freeTrial.lastDay.title'\n defaultMessage={'Your free trial ends today'}\n />\n }\n </div>\n <div className='UpgradeMattermostCloud__description'>\n {daysLeftOnTrial > TrialPeriodDays.TRIAL_WARNING_THRESHOLD &&\n <FormattedMessage\n id='admin.billing.subscription.freeTrial.description'\n defaultMessage='Your free trial will expire in {daysLeftOnTrial} days. Add your payment information to continue after the trial ends.'\n values={{daysLeftOnTrial}}\n />\n }\n {(daysLeftOnTrial > TrialPeriodDays.TRIAL_1_DAY && daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD) &&\n <FormattedMessage\n id='admin.billing.subscription.freeTrial.lessThan3Days.description'\n defaultMessage='Your free trial will end in {daysLeftOnTrial, number} {daysLeftOnTrial, plural, one {day} other {days}}. Add payment information to continue enjoying the benefits of Cloud Professional.'\n values={{daysLeftOnTrial}}\n />\n }\n {(daysLeftOnTrial === TrialPeriodDays.TRIAL_1_DAY || daysLeftOnTrial === TrialPeriodDays.TRIAL_0_DAYS) &&\n <FormattedMessage\n id='admin.billing.subscription.freeTrial.lastDay.description'\n defaultMessage='Your free trial has ended. Add payment information to continue enjoying the benefits of Cloud Professional.'\n />\n }\n </div>\n <button\n type='button'\n onClick={() => openSalesLink()}\n className='UpgradeMattermostCloud__upgradeButton'\n >\n\n <FormattedMessage\n id='admin.billing.subscription.privateCloudCard.contactSales'\n defaultMessage='Contact Sales'\n />\n\n </button>\n </div>);\n};\n\nexport const getPaymentStatus = () => {\n return (\n <div className='BillingSummary__lastInvoice-headerStatus paid'>\n <CheckCircleOutlineIcon/> {' '}\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.paid'\n defaultMessage='Paid'\n />\n </div>\n );\n};\n\ntype InvoiceInfoProps = {\n invoice: Invoice;\n product?: Product;\n fullCharges: InvoiceLineItem[];\n partialCharges: InvoiceLineItem[];\n hasMore?: number;\n}\n\nexport const InvoiceInfo = ({invoice, product, fullCharges, partialCharges, hasMore}: InvoiceInfoProps) => {\n const dispatch = useDispatch();\n\n const isUpcomingInvoice = invoice?.status.toLowerCase() === 'upcoming';\n const openInvoicePreview = () => {\n dispatch(\n openModal({\n modalId: ModalIdentifiers.CLOUD_INVOICE_PREVIEW,\n dialogType: CloudInvoicePreview,\n dialogProps: {\n url: Client4.getInvoicePdfUrl(invoice.id),\n },\n }),\n );\n };\n const title = () => {\n if (isUpcomingInvoice) {\n return (\n <FormattedMessage\n id='admin.billing.subscription.invoice.next'\n defaultMessage='Next Invoice'\n />\n );\n }\n return (\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.title'\n defaultMessage='Last Invoice'\n />\n );\n };\n return (\n <div className='BillingSummary__lastInvoice'>\n <div className='BillingSummary__lastInvoice-header'>\n <div className='BillingSummary__lastInvoice-headerTitle'>\n {title()}\n </div>\n {getPaymentStatus()}\n </div>\n <div className='BillingSummary__lastInvoice-date'>\n <FormattedDate\n value={new Date(invoice.period_start)}\n month='short'\n year='numeric'\n day='numeric'\n timeZone='UTC'\n />\n </div>\n <div className='BillingSummary__lastInvoice-productName'>\n {product?.name}\n </div>\n <hr/>\n {fullCharges.map((charge: any) => (\n <div\n key={charge.price_id}\n className='BillingSummary__lastInvoice-charge'\n >\n <div className='BillingSummary__lastInvoice-chargeDescription'>\n {product?.billing_scheme === BillingSchemes.FLAT_FEE ? (\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.monthlyFlatFee'\n defaultMessage='Monthly Flat Fee'\n />\n ) : (\n <>\n <FormattedNumber\n value={charge.price_per_unit / 100.0}\n // eslint-disable-next-line react/style-prop-object\n style='currency'\n currency='USD'\n />\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.seatCount'\n defaultMessage=' x {seats} seats'\n values={{seats: charge.quantity}}\n />\n </>\n )}\n </div>\n <div className='BillingSummary__lastInvoice-chargeAmount'>\n <FormattedNumber\n value={charge.total / 100.0}\n // eslint-disable-next-line react/style-prop-object\n style='currency'\n currency='USD'\n />\n </div>\n </div>\n ))}\n {Boolean(hasMore) && (\n <div\n className='BillingSummary__lastInvoice-hasMoreItems'\n >\n <div\n onClick={openInvoicePreview}\n className='BillingSummary__lastInvoice-chargeDescription'\n >\n {product?.billing_scheme === BillingSchemes.FLAT_FEE ? (\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.monthlyFlatFee'\n defaultMessage='Monthly Flat Fee'\n />\n ) : (\n <>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.upcomingInvoice.has_more_line_items'\n defaultMessage='And {count} more items'\n values={{count: hasMore}}\n />\n </>\n )}\n </div>\n </div>\n )}\n {Boolean(partialCharges.length) && (\n <>\n <div className='BillingSummary__lastInvoice-partialCharges'>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.partialCharges'\n defaultMessage='Partial charges'\n />\n <WithTooltip\n title={messages.partialChargesTooltipTitle}\n hint={messages.partialChargesTooltipText}\n >\n <i className='icon-information-outline'/>\n </WithTooltip>\n </div>\n {partialCharges.map((charge: any) => (\n <div\n key={charge.price_id}\n className='BillingSummary__lastInvoice-charge'\n >\n <div className='BillingSummary__lastInvoice-chargeDescription'>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.seatCountPartial'\n defaultMessage='{seats} seats'\n values={{seats: charge.quantity}}\n />\n </div>\n <div className='BillingSummary__lastInvoice-chargeAmount'>\n <FormattedNumber\n value={charge.total / 100.0}\n // eslint-disable-next-line react/style-prop-object\n style='currency'\n currency='USD'\n />\n </div>\n </div>\n ))}\n </>\n )}\n {Boolean(invoice.tax) && (\n <div className='BillingSummary__lastInvoice-charge'>\n <div className='BillingSummary__lastInvoice-chargeDescription'>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.taxes'\n defaultMessage='Taxes'\n />\n </div>\n <div className='BillingSummary__lastInvoice-chargeAmount'>\n <FormattedNumber\n value={invoice.tax / 100.0}\n // eslint-disable-next-line react/style-prop-object\n style='currency'\n currency='USD'\n />\n </div>\n </div>\n )}\n <hr/>\n <div className='BillingSummary__lastInvoice-charge total'>\n <div className='BillingSummary__lastInvoice-chargeDescription'>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.total'\n defaultMessage='Total'\n />\n </div>\n <div className='BillingSummary__lastInvoice-chargeAmount'>\n <FormattedNumber\n value={invoice.total / 100.0}\n // eslint-disable-next-line react/style-prop-object\n style='currency'\n currency='USD'\n />\n </div>\n </div>\n <div className='BillingSummary__lastInvoice-download'>\n <button\n onClick={openInvoicePreview}\n className='BillingSummary__lastInvoice-downloadButton btn btn-primary'\n >\n <i className='icon icon-file-pdf-outline'/>\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice'\n defaultMessage='View Invoice'\n />\n </button>\n </div>\n <BlockableLink\n to='/admin_console/billing/billing_history'\n className='BillingSummary__lastInvoice-billingHistory'\n >\n <FormattedMessage\n id='admin.billing.subscriptions.billing_summary.lastInvoice.seeBillingHistory'\n defaultMessage='See Billing History'\n />\n </BlockableLink>\n </div>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {\n noBillingHistory,\n FreeTrial,\n} from './billing_summary';\n\nimport './billing_summary.scss';\n\ntype BillingSummaryProps = {\n isFreeTrial: boolean;\n daysLeftOnTrial: number;\n}\n\nexport default function BillingSummary({isFreeTrial, daysLeftOnTrial}: BillingSummaryProps) {\n let body = noBillingHistory;\n\n if (isFreeTrial) {\n // eslint-disable-next-line new-cap\n body = FreeTrial({daysLeftOnTrial});\n }\n return (\n <div className='BillingSummary'>\n {body}\n </div>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport useGetLimits from 'components/common/hooks/useGetLimits';\n\nimport {CloudProducts} from 'utils/constants';\nimport {fallbackStarterLimits, asGBString, hasSomeLimits} from 'utils/limits';\n\nimport './feature_list.scss';\n\nexport interface FeatureListProps {\n subscriptionPlan?: string;\n}\n\nconst FeatureList = (props: FeatureListProps) => {\n const intl = useIntl();\n const [limits] = useGetLimits();\n\n const featuresCloudStarter = [\n intl.formatMessage(\n {\n id: 'admin.billing.subscription.planDetails.features.limitedMessageHistory',\n defaultMessage: 'Limited to a message history of {limit} messages',\n },\n {\n limit: intl.formatNumber(limits.messages?.history ?? fallbackStarterLimits.messages.history),\n },\n ),\n intl.formatMessage(\n {\n id: 'admin.billing.subscription.planDetails.features.limitedFileStorage',\n defaultMessage: 'Limited to {limit} File Storage',\n },\n {\n\n limit: asGBString(limits.files?.total_storage ?? fallbackStarterLimits.files.totalStorage, intl.formatNumber),\n },\n ),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.groupAndOneToOneMessaging',\n defaultMessage: 'Group and one-to-one messaging, file sharing, and search',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.incidentCollaboration',\n defaultMessage: 'Incident collaboration',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.unlimitedUsers',\n defaultMessage: 'Unlimited users',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.mfa',\n defaultMessage: 'Multi-Factor Authentication (MFA)',\n }),\n ];\n\n const featuresCloudStarterLegacy = [\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.groupAndOneToOneMessaging',\n defaultMessage: 'Group and one-to-one messaging, file sharing, and search',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.incidentCollaboration',\n defaultMessage: 'Incident collaboration',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.unlimittedUsersAndMessagingHistory',\n defaultMessage: 'Unlimited users & message history',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.mfa',\n defaultMessage: 'Multi-Factor Authentication (MFA)',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.multilanguage',\n defaultMessage: 'Multi-language translations',\n }),\n ];\n\n const featuresCloudProfessional = [\n intl.formatMessage(\n {\n id: 'admin.billing.subscription.planDetails.features.fileStorage',\n defaultMessage: 'Unlimited file storage',\n },\n ),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.guestAccounts',\n defaultMessage: 'Guest Accounts',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.ldapUserSync',\n defaultMessage: 'AD/LDAP user sync',\n }),\n\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.ssoSaml',\n defaultMessage: 'SSO w/ SAML (includes Okta and OneLogIn)',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.multiplatformSso',\n defaultMessage: 'SSO with Google, O365',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.openid',\n defaultMessage: 'OpenID',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.mfaEnforcement',\n defaultMessage: 'MFA enforcement',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.advanceTeamPermission',\n defaultMessage: 'Advanced team permissions',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.readOnlyChannels',\n defaultMessage: 'Read-only announcement channels',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.sharedChannels',\n defaultMessage: 'Shared channels (coming soon)',\n }),\n ];\n\n const featuresCloudEnterprise = [\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.enterpriseAdminAndSso',\n defaultMessage: 'Enterprise administration & SSO',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.autoComplianceExports',\n defaultMessage: 'Automated compliance exports',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.customRetentionPolicies',\n defaultMessage: 'Custom data retention policies',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.ldapSync',\n defaultMessage: 'AD/LDAP group sync to teams & channels',\n }),\n intl.formatMessage({\n id: 'admin.billing.subscription.planDetails.features.premiumSupport',\n defaultMessage: 'Premium Support (optional upgrade)',\n }),\n ];\n\n let features: string[] = [];\n\n switch (props.subscriptionPlan) {\n case CloudProducts.PROFESSIONAL:\n features = featuresCloudProfessional;\n break;\n\n case CloudProducts.STARTER:\n features = hasSomeLimits(limits) ? featuresCloudStarter : featuresCloudStarterLegacy;\n break;\n case CloudProducts.ENTERPRISE:\n features = featuresCloudEnterprise;\n break;\n default:\n // unknown product\n features = [];\n break;\n }\n\n const featureElements = features?.map((feature, i) => (\n <div\n key={`PlanDetailsFeature${i.toString()}`}\n className='PlanDetailsFeature'\n >\n <i className='icon-check'/>\n <span>{feature}</span>\n </div>\n ));\n\n return <>{featureElements}</>;\n};\n\nexport default FeatureList;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport Tag from 'components/widgets/tag/tag';\n\nimport {CloudProducts} from 'utils/constants';\n\nimport './plan_details.scss';\n\ntype Props = {\n userCount: number;\n isFreeTrial: boolean;\n subscriptionPlan: string | undefined;\n daysLeftOnTrial: number;\n isYearly: boolean;\n};\n\nexport const PlanDetailsTopElements = ({\n userCount,\n isFreeTrial,\n subscriptionPlan,\n daysLeftOnTrial,\n isYearly,\n}: Props) => {\n let productName;\n const openPricingModal = useOpenPricingModal();\n const {formatMessage} = useIntl();\n\n const userCountDisplay = (\n <div className='PlanDetails__userCount'>\n <FormattedMessage\n id='admin.billing.subscription.planDetails.userCount'\n defaultMessage='{userCount} users'\n values={{userCount}}\n />\n </div>\n );\n switch (subscriptionPlan) {\n case CloudProducts.PROFESSIONAL:\n productName = (\n <FormattedMessage\n id='admin.billing.subscription.planDetails.productName.cloudProfessional'\n defaultMessage='Cloud Professional'\n />\n );\n break;\n case CloudProducts.ENTERPRISE:\n productName = (\n <FormattedMessage\n id='admin.billing.subscription.planDetails.productName.cloudEnterprise'\n defaultMessage='Cloud Enterprise'\n />\n );\n break;\n case CloudProducts.STARTER:\n productName = (\n <FormattedMessage\n id='admin.billing.subscription.planDetails.productName.cloudFree'\n defaultMessage='Cloud Free'\n />\n );\n break;\n default:\n productName = (\n <FormattedMessage\n id='admin.billing.subscription.planDetails.productName.unknown'\n defaultMessage='Unknown product'\n />\n );\n break;\n }\n\n const trialBadge = isFreeTrial ? (\n <Tag\n className='TrialBadge'\n text={formatMessage({\n id: 'admin.billing.subscription.cloudTrialBadge.daysLeftOnTrial',\n defaultMessage: '{daysLeftOnTrial} trial days left',\n },\n {daysLeftOnTrial},\n )}\n />\n ) : null;\n\n const monthlyBadge = (\n <Tag\n className='RecurringIntervalBadge'\n text={formatMessage({\n id: 'admin.billing.subscription.cloudMonthlyBadge',\n defaultMessage: 'Monthly',\n })}\n />\n );\n\n const yearlyBadge = (\n <Tag\n className='RecurringIntervalBadge'\n text={formatMessage({\n id: 'admin.billing.subscription.cloudYearlyBadge',\n defaultMessage: 'Annual',\n })}\n />\n );\n\n const getBadge = () => {\n // no badges to show if the plan is Cloud Free\n if (subscriptionPlan === CloudProducts.STARTER) {\n return null;\n }\n\n if (isFreeTrial) {\n return trialBadge;\n }\n\n if (isYearly) {\n return yearlyBadge;\n }\n\n return monthlyBadge;\n };\n\n const viewPlansButton = (\n <button\n onClick={() => openPricingModal({trackingLocation: 'billing_plan_details_view_plans'})}\n className='btn btn-secondary PlanDetails__viewPlansButton'\n >\n {formatMessage({\n id: 'workspace_limits.menu_limit.view_plans',\n defaultMessage: 'View plans',\n })}\n </button>\n );\n\n return (\n <>\n <div className='PlanDetails__top'>\n <div className='PlanDetails__productName'>\n {productName}{getBadge()}\n </div>\n {viewPlansButton}\n </div>\n {userCountDisplay}\n </>\n );\n};\n\nexport const currentPlanText = (isFreeTrial: boolean) => {\n if (isFreeTrial) {\n return null;\n }\n return (\n <div className='PlanDetails__currentPlan'>\n <i className='icon-check-circle'/>\n <FormattedMessage\n id='admin.billing.subscription.planDetails.currentPlan'\n defaultMessage='Current Plan'\n />\n </div>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Product} from '@mattermost/types/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport ExternalLink from 'components/external_link';\n\nimport {BillingSchemes, CloudProducts, CloudLinks, RecurringIntervals} from 'utils/constants';\n\nimport './plan_pricing.scss';\n\ninterface Props {\n product: Product;\n}\nconst PlanPricing = ({\n product,\n}: Props) => {\n if (product.sku === CloudProducts.STARTER) {\n return null;\n }\n\n const getPrice = (product: Product) => {\n if (product.recurring_interval === RecurringIntervals.YEAR) {\n return (product.price_per_seat / 12).toFixed(2);\n }\n return product.price_per_seat.toFixed(2);\n };\n\n return (\n <div className='PlanPricing'>\n <div className='PlanDetails__paid-tier'>\n {`$${getPrice(product)}`}\n {product.billing_scheme === BillingSchemes.FLAT_FEE ? (\n <FormattedMessage\n id='admin.billing.subscription.planDetails.flatFeePerMonth'\n defaultMessage='/month (Unlimited Users). '\n />\n ) : (\n <FormattedMessage\n id='admin.billing.subscription.planDetails.perUserPerMonth'\n defaultMessage='/user/month. '\n />) }\n <ExternalLink\n location='plan_pricing'\n href={CloudLinks.BILLING_DOCS}\n onClick={() => trackEvent('cloud_admin', 'click_how_billing_works', {screen: 'payment'})}\n >\n <FormattedMessage\n id='admin.billing.subscription.planDetails.howBillingWorks'\n defaultMessage='See how billing works'\n />\n </ExternalLink>\n </div>\n </div>\n );\n};\n\nexport default PlanPricing;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getSubscriptionProduct, getCloudSubscription} from 'mattermost-redux/selectors/entities/cloud';\n\nimport useGetTotalUsersNoBots from 'components/common/hooks/useGetTotalUsersNoBots';\n\nimport {TrialPeriodDays} from 'utils/constants';\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils';\n\nimport FeatureList from './feature_list';\nimport {\n PlanDetailsTopElements,\n currentPlanText,\n} from './plan_details';\nimport PlanPricing from './plan_pricing';\n\nimport './plan_details.scss';\n\ntype Props = {\n isFreeTrial: boolean;\n subscriptionPlan: string | undefined;\n}\nconst PlanDetails = ({isFreeTrial, subscriptionPlan}: Props) => {\n const subscription = useSelector(getCloudSubscription);\n const product = useSelector(getSubscriptionProduct);\n const daysLeftOnTrial = Math.min(\n getRemainingDaysFromFutureTimestamp(subscription?.trial_end_at),\n TrialPeriodDays.TRIAL_30_DAYS,\n );\n const userCount = useGetTotalUsersNoBots();\n\n if (!product || !userCount) {\n return null;\n }\n\n return (\n <div className='PlanDetails'>\n <PlanDetailsTopElements\n userCount={userCount}\n isFreeTrial={isFreeTrial}\n subscriptionPlan={subscriptionPlan}\n daysLeftOnTrial={daysLeftOnTrial}\n isYearly={product.recurring_interval === 'year'}\n />\n <PlanPricing\n product={product}\n />\n <div className='PlanDetails__teamAndChannelCount'>\n <FormattedMessage\n id='admin.billing.subscription.planDetails.subheader'\n defaultMessage='Plan details'\n />\n </div>\n <FeatureList\n subscriptionPlan={subscriptionPlan}\n />\n {currentPlanText(isFreeTrial)}\n </div>\n );\n};\n\nexport default PlanDetails;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCloudSubscription, getCloudProducts, getCloudCustomer} from 'mattermost-redux/actions/cloud';\nimport {\n getSubscriptionProduct,\n getCloudSubscription as selectCloudSubscription,\n getCloudErrors,\n} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {pageVisited} from 'actions/telemetry_actions';\n\nimport CloudTrialBanner from 'components/admin_console/billing/billing_subscriptions/cloud_trial_banner';\nimport CloudFetchError from 'components/cloud_fetch_error';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {\n TrialPeriodDays,\n} from 'utils/constants';\nimport {useQuery} from 'utils/http_utils';\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils';\n\nimport ContactSalesCard from './contact_sales_card';\n\nimport BillingSummary from '../billing_summary';\nimport PlanDetails from '../plan_details';\n\nimport './billing_subscriptions.scss';\n\nconst messages = defineMessages({\n title: {id: 'admin.billing.subscription.title', defaultMessage: 'Subscription'},\n});\n\nexport const searchableStrings = [\n messages.title,\n];\n\nconst BillingSubscriptions = () => {\n const dispatch = useDispatch();\n const subscription = useSelector(selectCloudSubscription);\n const errorLoadingData = useSelector((state: GlobalState) => {\n const errors = getCloudErrors(state);\n return Boolean(errors.limits || errors.subscription || errors.customer || errors.products);\n });\n const trialEndDate = subscription?.trial_end_at || 0;\n const query = useQuery();\n const actionQueryParam = query.get('action');\n\n const product = useSelector(getSubscriptionProduct);\n\n const openPricingModal = useOpenPricingModal();\n\n let isFreeTrial = false;\n let daysLeftOnTrial = 0;\n if (subscription?.is_free_trial === 'true') {\n isFreeTrial = true;\n daysLeftOnTrial = Math.min(\n getRemainingDaysFromFutureTimestamp(subscription.trial_end_at),\n TrialPeriodDays.TRIAL_30_DAYS,\n );\n }\n\n useEffect(() => {\n dispatch(getCloudSubscription());\n const includeLegacyProducts = true;\n dispatch(getCloudProducts(includeLegacyProducts));\n dispatch(getCloudCustomer());\n\n pageVisited('cloud_admin', 'pageview_billing_subscription');\n\n if (actionQueryParam === 'show_pricing_modal') {\n openPricingModal({trackingLocation: 'billing_subscriptions_external_direct_link'});\n }\n }, []);\n\n // handle not loaded yet here, failed to load handled below\n if ((!subscription || !product) && !errorLoadingData) {\n return null;\n }\n\n return (\n <div className='wrapper--fixed BillingSubscriptions'>\n <AdminHeader>\n <FormattedMessage {...messages.title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {errorLoadingData && <CloudFetchError/>}\n {!errorLoadingData && <>\n {isFreeTrial && <CloudTrialBanner trialEndDate={trialEndDate}/>}\n <div className='BillingSubscriptions__topWrapper'>\n <PlanDetails\n isFreeTrial={isFreeTrial}\n subscriptionPlan={product?.sku}\n />\n <BillingSummary\n isFreeTrial={isFreeTrial}\n daysLeftOnTrial={daysLeftOnTrial}\n />\n </div>\n <ContactSalesCard\n isFreeTrial={isFreeTrial}\n subscriptionPlan={product?.sku}\n onUpgradeMattermostCloud={openPricingModal}\n />\n </>}\n </div>\n </div>\n </div>\n );\n};\n\nexport default BillingSubscriptions;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst CompanySvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '527'}\n height={props.height ? props.height.toString() : '296'}\n viewBox='0 0 527 296'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <g clipPath='url(#clip0)'>\n <path\n d='M393.56 114.194C395.02 115.654 395.762 117.485 395.762 119.686V254.297C395.762 256.498 395.02 258.329 393.56 259.789C392.1 261.249 390.27 261.99 388.068 261.99H123.25C121.048 261.99 119.125 261.249 117.479 259.789C115.834 258.329 115 256.498 115 254.297V119.686C115 117.485 115.834 115.654 117.479 114.194C119.125 112.734 121.048 111.993 123.25 111.993H388.068C390.246 111.993 392.077 112.734 393.56 114.194Z'\n fill='#CC8F00'\n />\n <mask\n id='mask0'\n mask-type='alpha'\n maskUnits='userSpaceOnUse'\n x='115'\n y='111'\n width='281'\n height='151'\n >\n <path\n d='M393.56 114.194C395.02 115.654 395.762 117.485 395.762 119.686V254.297C395.762 256.498 395.02 258.329 393.56 259.789C392.1 261.249 390.27 261.99 388.068 261.99H123.25C121.048 261.99 119.125 261.249 117.479 259.789C115.834 258.329 115 256.498 115 254.297V119.686C115 117.485 115.834 115.654 117.479 114.194C119.125 112.734 121.048 111.993 123.25 111.993H388.068C390.246 111.993 392.077 112.734 393.56 114.194Z'\n fill='#CC8F00'\n />\n </mask>\n <g mask='url(#mask0)'>\n <rect\n x='76.4777'\n y='175'\n width='358.204'\n height='86.9427'\n fill='url(#pattern0)'\n />\n </g>\n <path\n d='M139.725 171.338H130.387C127.815 170.967 126.355 169.693 125.984 167.491V141.677C126.355 139.128 127.815 137.83 130.387 137.83H139.725C142.274 137.83 143.757 139.128 144.128 141.677V167.491C143.757 169.693 142.274 170.967 139.725 171.338ZM139.725 202.111H130.387C127.815 201.741 126.355 200.466 125.984 198.265V189.482C126.355 186.933 127.815 185.636 130.387 185.636H139.725C142.274 185.636 143.757 186.933 144.128 189.482V198.265C143.757 200.466 142.274 201.741 139.725 202.111ZM139.725 231.773H130.387C127.815 231.402 126.355 230.127 125.984 227.926V219.143C126.355 216.942 127.815 215.667 130.387 215.297H139.725C142.274 215.667 143.757 216.942 144.128 219.143V227.926C143.757 230.127 142.274 231.402 139.725 231.773ZM165.54 171.338H155.645C153.073 170.967 151.798 169.693 151.798 167.491V141.677C151.798 139.128 153.073 137.83 155.645 137.83H165.54C167.741 137.83 169.016 139.128 169.387 141.677V167.491C169.016 169.693 167.741 170.967 165.54 171.338ZM165.54 202.111H155.645C153.073 201.741 151.798 200.466 151.798 198.265V189.482C151.798 186.933 153.073 185.636 155.645 185.636H165.54C167.741 185.636 169.016 186.933 169.387 189.482V198.265C169.016 200.466 167.741 201.741 165.54 202.111ZM165.54 231.773H155.645C153.073 231.402 151.798 230.127 151.798 227.926V219.143C151.798 216.942 153.073 215.667 155.645 215.297H165.54C167.741 215.667 169.016 216.942 169.387 219.143V227.926C169.016 230.127 167.741 231.402 165.54 231.773ZM361.141 167.491V141.677C360.771 139.128 359.311 137.83 356.739 137.83H347.4C344.828 137.83 343.368 139.128 342.997 141.677V167.491C343.368 169.693 344.828 170.967 347.4 171.338H356.739C359.288 170.967 360.771 169.693 361.141 167.491ZM356.739 202.111H347.4C344.828 201.741 343.368 200.466 342.997 198.265V189.482C343.368 186.933 344.828 185.636 347.4 185.636H356.739C359.288 185.636 360.771 186.933 361.141 189.482V198.265C360.771 200.466 359.288 201.741 356.739 202.111ZM356.739 231.773H347.4C344.828 231.402 343.368 230.127 342.997 227.926V219.143C343.368 216.942 344.828 215.667 347.4 215.297H356.739C359.288 215.667 360.771 216.942 361.141 219.143V227.926C360.771 230.127 359.288 231.402 356.739 231.773ZM382.553 171.338H372.658C370.086 170.967 368.812 169.693 368.812 167.491V141.677C368.812 139.128 370.086 137.83 372.658 137.83H382.553C384.754 137.83 386.029 139.128 386.4 141.677V167.491C386.029 169.693 384.754 170.967 382.553 171.338ZM382.553 202.111H372.658C370.086 201.741 368.812 200.466 368.812 198.265V189.482C368.812 186.933 370.086 185.636 372.658 185.636H382.553C384.754 185.636 386.029 186.933 386.4 189.482V198.265C386.029 200.466 384.754 201.741 382.553 202.111ZM382.553 231.773H372.658C370.086 231.402 368.812 230.127 368.812 227.926V219.143C368.812 216.942 370.086 215.667 372.658 215.297H382.553C384.754 215.667 386.029 216.942 386.4 219.143V227.926C386.029 230.127 384.754 231.402 382.553 231.773Z'\n fill='#66320A'\n />\n <path\n d='M332.013 41.895V255.942C331.642 259.603 330.368 261.619 328.167 261.99H186.975C184.403 261.619 182.943 259.603 182.572 255.942V41.895C182.943 38.2337 184.403 36.2177 186.975 35.8469H328.167C330.368 36.2177 331.642 38.2337 332.013 41.895Z'\n fill='#FFBC1F'\n />\n <path\n d='M214.434 150.459C214.064 153.031 212.789 154.306 210.588 154.306H198.492C195.919 154.306 194.645 153.031 194.645 150.459V120.242C194.645 117.693 195.919 116.395 198.492 116.395H210.588C212.789 116.395 214.064 117.693 214.434 120.242V150.459ZM210.588 186.725C212.789 186.725 214.064 185.45 214.434 182.878V174.095C214.064 171.894 212.789 170.62 210.588 170.249H198.492C195.919 170.62 194.645 171.894 194.645 174.095V182.878C194.645 185.45 195.919 186.725 198.492 186.725H210.588ZM210.588 218.587C212.789 218.587 214.064 217.313 214.434 214.741V205.958C214.064 203.757 212.789 202.482 210.588 202.111H198.492C195.919 202.482 194.645 203.757 194.645 205.958V214.741C194.645 217.313 195.919 218.587 198.492 218.587H210.588ZM210.588 247.715C212.789 247.345 214.064 246.07 214.434 243.869V235.086C214.064 232.885 212.789 231.61 210.588 231.24H198.492C195.919 231.61 194.645 232.885 194.645 235.086V243.869C194.645 246.07 195.919 247.345 198.492 247.715H210.588ZM239.16 154.306C241.709 154.306 243.192 153.031 243.563 150.459V120.242C243.192 117.693 241.732 116.395 239.16 116.395H227.064C224.862 116.395 223.588 117.693 223.217 120.242V150.459C223.588 153.031 224.862 154.306 227.064 154.306H239.16ZM239.16 186.725C241.709 186.725 243.192 185.45 243.563 182.878V174.095C243.192 171.894 241.732 170.62 239.16 170.249H227.064C224.862 170.62 223.588 171.894 223.217 174.095V182.878C223.588 185.45 224.862 186.725 227.064 186.725H239.16ZM286.965 154.306C289.167 154.306 290.441 153.031 290.812 150.459V120.242C290.441 117.693 289.167 116.395 286.965 116.395H274.869C272.297 116.395 270.837 117.693 270.466 120.242V150.459C270.837 153.031 272.297 154.306 274.869 154.306H286.965ZM286.965 186.725C289.167 186.725 290.441 185.45 290.812 182.878V174.095C290.441 171.894 289.167 170.62 286.965 170.249H274.869C272.297 170.62 270.837 171.894 270.466 174.095V182.878C270.837 185.45 272.297 186.725 274.869 186.725H286.965ZM315.537 154.306C318.086 154.306 319.384 153.031 319.384 150.459V120.242C319.384 117.693 318.086 116.395 315.537 116.395H303.441C301.24 116.395 299.965 117.693 299.594 120.242V150.459C299.965 153.031 301.24 154.306 303.441 154.306H315.537ZM214.434 95.6556C214.064 98.2277 212.789 99.5022 210.588 99.5022H198.492C195.919 99.5022 194.645 98.2277 194.645 95.6556V65.4382C194.645 62.8892 195.919 61.5916 198.492 61.5916H210.588C212.789 61.5916 214.064 62.8892 214.434 65.4382V95.6556ZM239.16 99.5022C241.709 99.5022 243.192 98.2277 243.563 95.6556V65.4382C243.192 62.8892 241.732 61.5916 239.16 61.5916H227.064C224.862 61.5916 223.588 62.8892 223.217 65.4382V95.6556C223.588 98.2277 224.862 99.5022 227.064 99.5022H239.16ZM286.965 99.5022C289.167 99.5022 290.441 98.2277 290.812 95.6556V65.4382C290.441 62.8892 289.167 61.5916 286.965 61.5916H274.869C272.297 61.5916 270.837 62.8892 270.466 65.4382V95.6556C270.837 98.2277 272.297 99.5022 274.869 99.5022H286.965ZM315.537 99.5022C318.086 99.5022 319.384 98.2277 319.384 95.6556V65.4382C319.384 62.8892 318.086 61.5916 315.537 61.5916H303.441C301.24 61.5916 299.965 62.8892 299.594 65.4382V95.6556C299.965 98.2277 301.24 99.5022 303.441 99.5022H315.537ZM315.537 186.725C318.086 186.725 319.384 185.45 319.384 182.878V174.095C319.384 171.894 318.086 170.62 315.537 170.249H303.441C301.24 170.62 299.965 171.894 299.594 174.095V182.878C299.965 185.45 301.24 186.725 303.441 186.725H315.537ZM315.537 218.587C318.086 218.587 319.384 217.313 319.384 214.741V205.958C319.384 203.757 318.086 202.482 315.537 202.111H303.441C301.24 202.482 299.965 203.757 299.594 205.958V214.741C299.965 217.313 301.24 218.587 303.441 218.587H315.537ZM315.537 247.715C318.086 247.345 319.384 246.07 319.384 243.869V235.086C319.384 232.885 318.086 231.61 315.537 231.24H303.441C301.24 231.61 299.965 232.885 299.594 235.086V243.869C299.965 246.07 301.24 247.345 303.441 247.715H315.537Z'\n fill='#CC8F00'\n />\n <path\n d='M285.876 203.2H228.732V261.99H285.876V203.2Z'\n fill='#E0E9EF'\n />\n <path\n d='M332.013 46.8306H183.128C180.556 46.4598 179.096 45.1853 178.725 42.9839V35.8467C179.096 33.2977 180.556 32 183.128 32H332.013C334.215 32 335.489 33.2977 335.86 35.8467V42.9839C335.489 45.1853 334.215 46.483 332.013 46.8306ZM286.409 196.063H228.176C225.604 196.434 224.329 197.709 224.329 199.91V206.514C224.329 209.086 225.604 210.361 228.176 210.361H255.659V262.013H258.949V210.338H286.409C288.958 210.338 290.441 209.063 290.812 206.491V199.887C290.441 197.709 288.981 196.434 286.409 196.063Z'\n fill='#1E325C'\n />\n <path\n d='M474.538 94.5434C473.565 80.0836 467.725 67.3849 457.043 56.4474C444.877 44.7914 430.834 38.9519 414.914 38.9519C398.995 38.9519 384.975 44.7914 372.809 56.4474C361.154 68.6131 355.314 82.6326 355.314 98.5523C355.314 114.472 361.154 128.515 372.809 140.657C383.979 151.363 396.747 157.133 411.091 157.967C425.435 158.825 438.666 154.862 450.832 146.126L459.939 155.233L471.595 143.577L462.488 134.47C471.479 122.328 475.488 109.003 474.538 94.5434ZM449.372 132.825C440.126 141.932 428.702 146.752 415.1 147.215C401.242 146.729 389.772 141.932 380.642 132.825C371.535 123.718 366.738 112.224 366.252 98.3669C366.738 84.7645 371.535 73.3403 380.642 64.0944C389.749 54.8716 401.242 50.1212 415.1 49.8663C428.702 50.1212 440.126 54.8484 449.372 64.0944C458.595 73.3403 463.346 84.7645 463.6 98.3669C463.346 112.224 458.618 123.718 449.372 132.825Z'\n fill='#B3B3B3'\n />\n <path\n opacity='0.5'\n d='M380.642 64.1175C389.749 54.8947 401.242 50.1443 415.1 49.8894C428.702 50.1443 440.126 54.8716 449.372 64.1175C458.595 73.3634 463.345 84.7876 463.6 98.3901C463.345 112.247 458.618 123.718 449.372 132.848C440.126 141.955 428.702 146.775 415.1 147.238C401.242 146.752 389.772 141.955 380.642 132.848C371.535 123.718 366.738 112.224 366.251 98.3669C366.738 84.7645 371.535 73.3403 380.642 64.1175Z'\n fill='#F2F2F2'\n />\n <path\n d='M382.287 127.542C392.252 137.019 403.676 141.77 416.56 141.77C429.444 141.77 440.868 137.019 450.832 127.542C456.185 122.189 460.055 116.117 462.488 109.305C460.542 118.296 456.162 126.313 449.373 133.358C439.408 142.836 427.915 147.586 414.915 147.586C401.915 147.586 390.421 142.836 380.457 133.358C373.644 126.313 369.264 118.296 367.341 109.305C365.394 100.313 365.997 91.4383 369.171 82.7021C367.48 90.4882 367.712 98.3206 369.89 106.223C372.091 114.124 376.216 121.215 382.287 127.542Z'\n fill='#999999'\n />\n <path\n d='M512.263 210.129C509.228 210.987 506.98 210.685 505.52 209.226L457.761 157.434C456.301 155.975 455.699 154.098 455.93 151.78C456.162 149.463 457.622 146.868 460.31 143.948C463.23 141.283 465.825 139.754 468.142 139.383C470.46 139.012 472.337 139.684 473.797 141.399L525.935 189.158C527.395 190.618 527.627 192.796 526.654 195.716C525.68 198.636 523.85 201.555 521.185 204.475C518.288 207.395 515.299 209.272 512.263 210.129Z'\n fill='#FFBC1F'\n />\n <path\n d='M515.369 179.31L496.042 199.006L472.337 173.47L489.832 155.975L515.369 179.31Z'\n fill='#954D0E'\n />\n </g>\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0'\n transform='scale(0.00411523 0.0169492)'\n />\n </pattern>\n <clipPath id='clip0'>\n <rect\n width='527'\n height='296'\n fill='white'\n />\n </clipPath>\n <image\n id='image0'\n width='243'\n height='59'\n xlinkHref='data:image/png;base64,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'\n />\n </defs>\n </svg>\n\n);\n\nexport default CompanySvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport CompanySvg from 'components/common/svg_images_components/company_svg';\n\nimport type {GlobalState} from 'types/store';\n\nimport './company_info_display.scss';\n\nconst addInfoButton = (\n <div className='CompanyInfoDisplay__addInfo'>\n <BlockableLink\n to='/admin_console/billing/company_info_edit'\n className='CompanyInfoDisplay__addInfoButton'\n onClick={() => trackEvent('cloud_admin', 'click_add_company_info')}\n >\n <i className='icon icon-plus'/>\n <FormattedMessage\n id='admin.billing.company_info.add'\n defaultMessage='Add Company Information'\n />\n </BlockableLink>\n </div>\n);\n\nconst noCompanyInfoSection = (\n <div className='CompanyInfoDisplay__noCompanyInfo'>\n <CompanySvg\n width={300}\n height={210}\n />\n <div className='CompanyInfoDisplay__noCompanyInfo-message'>\n <FormattedMessage\n id='admin.billing.company_info_display.noCompanyInfo'\n defaultMessage='There is currently no company information on file.'\n />\n </div>\n <BlockableLink\n to='/admin_console/billing/company_info_edit'\n className='CompanyInfoDisplay__noCompanyInfo-link'\n onClick={() => trackEvent('cloud_admin', 'click_add_company_info')}\n >\n <FormattedMessage\n id='admin.billing.company_info.add'\n defaultMessage='Add Company Information'\n />\n </BlockableLink>\n </div>\n);\n\nconst CompanyInfoDisplay: React.FC = () => {\n const companyInfo = useSelector((state: GlobalState) => state.entities.cloud.customer);\n\n if (!companyInfo) {\n return null;\n }\n\n let body = noCompanyInfoSection;\n const address = companyInfo?.company_address?.line1 ? companyInfo.company_address : companyInfo?.billing_address;\n const isCompanyBillingFilled = address?.line1 !== undefined;\n if (isCompanyBillingFilled) {\n body = (\n <div className='CompanyInfoDisplay__companyInfo'>\n <div className='CompanyInfoDisplay__companyInfo-text'>\n <div className='CompanyInfoDisplay__companyInfo-name'>\n {companyInfo?.name}\n </div>\n {Boolean(companyInfo.num_employees) &&\n <div className='CompanyInfoDisplay__companyInfo-numEmployees'>\n <FormattedMessage\n id='admin.billing.company_info.employees'\n defaultMessage='{employees} employees'\n values={{employees: companyInfo.num_employees}}\n />\n </div>\n }\n <div className='CompanyInfoDisplay__companyInfo-addressTitle'>\n <FormattedMessage\n id='admin.billing.company_info.companyAddress'\n defaultMessage='Company Address'\n />\n </div>\n <div className='CompanyInfoDisplay__companyInfo-address'>\n <div>{address.line1}</div>\n {address.line2 && <div>{address.line2}</div>}\n <div>{`${address.city}, ${address.state}, ${address.postal_code}`}</div>\n <div>{address.country}</div>\n </div>\n </div>\n <div className='CompanyInfoDisplay__companyInfo-edit'>\n <BlockableLink\n to='/admin_console/billing/company_info_edit'\n className='CompanyInfoDisplay__companyInfo-editButton'\n onClick={() => trackEvent('cloud_admin', 'click_edit_company_info')}\n >\n <i className='icon icon-pencil-outline'/>\n </BlockableLink>\n </div>\n </div>\n );\n }\n\n return (\n <div className='CompanyInfoDisplay'>\n <div className='CompanyInfoDisplay__header'>\n <div className='CompanyInfoDisplay__headerText'>\n <div className='CompanyInfoDisplay__headerText-top'>\n <FormattedMessage\n id='admin.billing.company_info_display.companyDetails'\n defaultMessage='Company Details'\n />\n </div>\n <div className='CompanyInfoDisplay__headerText-bottom'>\n {isCompanyBillingFilled &&\n <FormattedMessage\n id='admin.billing.company_info_display.detailsProvided'\n defaultMessage='Your company name and address'\n />}\n {!isCompanyBillingFilled &&\n <FormattedMessage\n id='admin.billing.company_info_display.provideDetails'\n defaultMessage='Provide your company name and address'\n />}\n </div>\n </div>\n {!address?.line1 && addInfoButton}\n </div>\n <div className='CompanyInfoDisplay__body'>\n {body}\n </div>\n </div>\n );\n};\n\nexport default CompanyInfoDisplay;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getCloudCustomer} from 'mattermost-redux/actions/cloud';\nimport {getCloudErrors} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {pageVisited} from 'actions/telemetry_actions';\n\nimport CloudFetchError from 'components/cloud_fetch_error';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport CompanyInfoDisplay from './company_info_display';\n\ntype Props = Record<string, never>;\n\nconst messages = defineMessages({\n title: {id: 'admin.billing.company_info.title', defaultMessage: 'Company Information'},\n});\n\nexport const searchableStrings = [\n messages.title,\n];\n\nconst CompanyInfo: React.FC<Props> = () => {\n const dispatch = useDispatch();\n const {customer: customerError} = useSelector(getCloudErrors);\n\n useEffect(() => {\n dispatch(getCloudCustomer());\n\n pageVisited('cloud_admin', 'pageview_billing_company_info');\n }, []);\n\n return (\n <div className='wrapper--fixed CompanyInfo'>\n <AdminHeader>\n <FormattedMessage {...messages.title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {customerError ? <CloudFetchError/> : <CompanyInfoDisplay/>}\n </div>\n </div>\n </div>\n );\n};\n\nexport default CompanyInfo;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport interface StateCode {\n code: string;\n name: string;\n}\n\nexport const US_STATES = [\n {code: 'AL', name: 'Alabama'},\n {code: 'AK', name: 'Alaska'},\n {code: 'AZ', name: 'Arizona'},\n {code: 'AR', name: 'Arkansas'},\n {code: 'CA', name: 'California'},\n {code: 'CO', name: 'Colorado'},\n {code: 'CT', name: 'Connecticut'},\n {code: 'DE', name: 'Delaware'},\n {code: 'DC', name: 'District of Columbia'},\n {code: 'FL', name: 'Florida'},\n {code: 'GA', name: 'Georgia'},\n {code: 'HI', name: 'Hawaii'},\n {code: 'ID', name: 'Idaho'},\n {code: 'IL', name: 'Illinois'},\n {code: 'IN', name: 'Indiana'},\n {code: 'IA', name: 'Iowa'},\n {code: 'KS', name: 'Kansas'},\n {code: 'KY', name: 'Kentucky'},\n {code: 'LA', name: 'Louisiana'},\n {code: 'ME', name: 'Maine'},\n {code: 'MD', name: 'Maryland'},\n {code: 'MA', name: 'Massachusetts'},\n {code: 'MI', name: 'Michigan'},\n {code: 'MN', name: 'Minnesota'},\n {code: 'MS', name: 'Mississippi'},\n {code: 'MO', name: 'Missouri'},\n {code: 'MT', name: 'Montana'},\n {code: 'NE', name: 'Nebraska'},\n {code: 'NV', name: 'Nevada'},\n {code: 'NH', name: 'New Hampshire'},\n {code: 'NJ', name: 'New Jersey'},\n {code: 'NM', name: 'New Mexico'},\n {code: 'NY', name: 'New York'},\n {code: 'NC', name: 'North Carolina'},\n {code: 'ND', name: 'North Dakota'},\n {code: 'OH', name: 'Ohio'},\n {code: 'OK', name: 'Oklahoma'},\n {code: 'OR', name: 'Oregon'},\n {code: 'PA', name: 'Pennsylvania'},\n {code: 'PR', name: 'Puerto Rico'},\n {code: 'RI', name: 'Rhode Island'},\n {code: 'SC', name: 'South Carolina'},\n {code: 'SD', name: 'South Dakota'},\n {code: 'TN', name: 'Tennessee'},\n {code: 'TX', name: 'Texas'},\n {code: 'UT', name: 'Utah'},\n {code: 'VT', name: 'Vermont'},\n {code: 'VA', name: 'Virginia'},\n {code: 'WA', name: 'Washington'},\n {code: 'WV', name: 'West Virginia'},\n {code: 'WI', name: 'Wisconsin'},\n {code: 'WY', name: 'Wyoming'},\n] as StateCode[];\n\nexport const CA_PROVINCES = [\n {code: 'AB', name: 'Alberta'},\n {code: 'BC', name: 'British Columbia'},\n {code: 'MB', name: 'Manitoba'},\n {code: 'NB', name: 'New Brunswick'},\n {code: 'NL', name: 'Newfoundland and Labrador'},\n {code: 'NT', name: 'Northwest Territories'},\n {code: 'NS', name: 'Nova Scotia'},\n {code: 'NU', name: 'Nunavut'},\n {code: 'ON', name: 'Ontario'},\n {code: 'PE', name: 'Prince Edward Island'},\n {code: 'QC', name: 'Quebec'},\n {code: 'SK', name: 'Saskatchewan'},\n {code: 'YT', name: 'Yukon Territory'},\n] as StateCode[];\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport DropdownInput from 'components/dropdown_input';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport {US_STATES, CA_PROVINCES} from 'utils/states';\nimport type {StateCode} from 'utils/states';\n\ntype Props = {\n country: string;\n state: string;\n testId?: string;\n onChange: (newValue: string) => void;\n onBlur?: () => void;\n}\n\n// StateSelector will display a state dropdown for US and Canada.\n// Will display a open text input for any other country.\nexport default function StateSelector(props: Props) {\n // Making TS happy here with the react-select event handler\n const {formatMessage} = useIntl();\n const onStateSelected = (option: any) => {\n props.onChange(option.value);\n };\n\n let stateList = [] as StateCode[];\n if (props.country === 'US') {\n stateList = US_STATES;\n } else if (props.country === 'CA') {\n stateList = CA_PROVINCES;\n }\n\n if (stateList.length > 0) {\n const withId: {testId?: string} = {};\n if (props.testId) {\n withId.testId = props.testId;\n }\n return (\n <DropdownInput\n {...withId}\n onChange={onStateSelected}\n value={props.state ? {value: props.state, label: props.state} : undefined}\n options={stateList.map((stateCode) => ({\n value: stateCode.code,\n label: stateCode.name,\n }))}\n legend={formatMessage({id: 'admin.billing.subscription.stateprovince', defaultMessage: 'State/Province'})}\n placeholder={formatMessage({id: 'admin.billing.subscription.stateprovince', defaultMessage: 'State/Province'})}\n name={'country_dropdown'}\n />\n );\n }\n\n return (\n <Input\n name='state'\n type='text'\n value={props.state}\n onChange={(e) => {\n props.onChange(e.target.value);\n }}\n onBlur={props.onBlur}\n placeholder={formatMessage({id: 'admin.billing.subscription.stateprovince', defaultMessage: 'State/Province'})}\n required={true}\n />\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {Job} from '@mattermost/types/jobs';\n\nimport {blevePurgeIndexes} from 'actions/admin_actions.jsx';\n\nimport ExternalLink from 'components/external_link';\n\nimport {JobStatuses, JobTypes} from 'utils/constants';\n\nimport BooleanSetting from './boolean_setting';\nimport JobsTable from './jobs';\nimport OLDAdminSettings from './old_admin_settings';\nimport type {BaseProps, BaseState} from './old_admin_settings';\nimport RequestButton from './request_button/request_button';\nimport SettingSet from './setting_set';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ntype Props = BaseProps & {\n config: AdminConfig;\n};\n\ntype State = BaseState & {\n indexDir: string;\n enableIndexing: boolean;\n enableSearching: boolean;\n enableAutocomplete: boolean;\n canSave: boolean;\n canPurgeAndIndex: boolean;\n};\n\nconst messages = defineMessages({\n title: {id: 'admin.bleve.title', defaultMessage: 'Bleve'},\n enableIndexingTitle: {id: 'admin.bleve.enableIndexingTitle', defaultMessage: 'Enable Bleve Indexing:'},\n enableIndexingDescription: {id: 'admin.bleve.enableIndexingDescription', defaultMessage: 'When true, indexing of new posts occurs automatically. Search queries will use database search until \"Enable Bleve for search queries\" is enabled. <link>Learn more about Bleve in our documentation.</link>'},\n bulkIndexingTitle: {id: 'admin.bleve.bulkIndexingTitle', defaultMessage: 'Bulk Indexing:'},\n createJob_help: {id: 'admin.bleve.createJob.help', defaultMessage: 'All users, channels and posts in the database will be indexed from oldest to newest. Bleve is available during indexing but search results may be incomplete until the indexing job is complete.'},\n purgeIndexesHelpText: {id: 'admin.bleve.purgeIndexesHelpText', defaultMessage: 'Purging will entirely remove the content of the Bleve index directory. Search results may be incomplete until a bulk index of the existing database is rebuilt.'},\n purgeIndexesButton: {id: 'admin.bleve.purgeIndexesButton', defaultMessage: 'Purge Index'},\n purgeIndexesButton_label: {id: 'admin.bleve.purgeIndexesButton.label', defaultMessage: 'Purge Indexes:'},\n enableSearchingTitle: {id: 'admin.bleve.enableSearchingTitle', defaultMessage: 'Enable Bleve for search queries:'},\n enableSearchingDescription: {id: 'admin.bleve.enableSearchingDescription', defaultMessage: 'When true, Bleve will be used for all search queries using the latest index. Search results may be incomplete until a bulk index of the existing post database is finished. When false, database search is used.'},\n});\n\nexport const searchableStrings = [\n messages.title,\n messages.enableIndexingTitle,\n messages.enableIndexingDescription,\n messages.bulkIndexingTitle,\n messages.createJob_help,\n messages.purgeIndexesHelpText,\n messages.purgeIndexesButton,\n messages.purgeIndexesButton_label,\n messages.enableSearchingTitle,\n messages.enableSearchingDescription,\n];\n\nexport default class BleveSettings extends OLDAdminSettings<Props, State> {\n getConfigFromState = (config: Props['config']) => {\n if (config && config.BleveSettings) {\n config.BleveSettings.IndexDir = this.state.indexDir;\n config.BleveSettings.EnableIndexing = this.state.enableIndexing;\n config.BleveSettings.EnableSearching = this.state.enableSearching;\n config.BleveSettings.EnableAutocomplete = this.state.enableAutocomplete;\n }\n return config;\n };\n\n getStateFromConfig(config: Props['config']) {\n return {\n enableIndexing: config.BleveSettings.EnableIndexing,\n indexDir: config.BleveSettings.IndexDir,\n enableSearching: config.BleveSettings.EnableSearching,\n enableAutocomplete: config.BleveSettings.EnableAutocomplete,\n canSave: true,\n canPurgeAndIndex: config.BleveSettings.EnableIndexing,\n };\n }\n\n handleSettingChanged = (id: string, value: boolean) => {\n if (id === 'enableIndexing') {\n if (value === false) {\n this.setState({\n enableSearching: false,\n enableAutocomplete: false,\n });\n }\n }\n\n if (id !== 'enableSearching' && id !== 'enableAutocomplete') {\n this.setState({\n canPurgeAndIndex: false,\n });\n }\n\n this.handleChange(id, value);\n };\n\n handleSaved = () => {\n this.setState({\n canPurgeAndIndex: this.state.enableIndexing && this.state.indexDir !== '',\n });\n };\n\n canSave = () => {\n return this.state.canSave;\n };\n\n getExtraInfo(job: Job) {\n if (job.status === JobStatuses.IN_PROGRESS) {\n return (\n <FormattedMessage\n id='admin.bleve.percentComplete'\n defaultMessage='{percent}% Complete'\n values={{percent: Number(job.progress)}}\n />\n );\n }\n\n return <></>;\n }\n\n renderTitle() {\n return (<FormattedMessage {...messages.title}/>);\n }\n\n renderSettings = () => {\n return (\n <SettingsGroup>\n <BooleanSetting\n id='enableIndexing'\n label={<FormattedMessage {...messages.enableIndexingTitle}/>}\n helpText={\n <FormattedMessage\n {...messages.enableIndexingDescription}\n values={{\n link: (chunks) => (\n <ExternalLink\n href='https://docs.mattermost.com/deploy/bleve-search.html'\n location='bleve_settings'\n >\n {chunks}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('BleveSettings.EnableIndexing')}\n disabled={this.props.isDisabled}\n />\n <TextSetting\n id='indexDir'\n label={\n <FormattedMessage\n id='admin.bleve.indexDirTitle'\n defaultMessage='Index Directory:'\n />\n }\n helpText={\n <FormattedMessage\n id='admin.bleve.indexDirDescription'\n defaultMessage='Directory path to use for store bleve indexes.'\n />\n }\n value={this.state.indexDir}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('BleveSettings.IndexDir')}\n disabled={this.props.isDisabled}\n />\n <SettingSet\n label={<FormattedMessage {...messages.bulkIndexingTitle}/>}\n >\n <div className='job-table-setting'>\n <JobsTable\n jobType={JobTypes.BLEVE_POST_INDEXING}\n disabled={!this.state.canPurgeAndIndex || Boolean(this.props.isDisabled)}\n createJobButtonText={\n <FormattedMessage\n id='admin.bleve.createJob.title'\n defaultMessage='Index Now'\n />\n }\n createJobHelpText={<FormattedMessage {...messages.createJob_help}/>}\n getExtraInfoText={this.getExtraInfo}\n />\n </div>\n </SettingSet>\n <RequestButton\n id='purgeIndexesSection'\n requestAction={blevePurgeIndexes}\n helpText={<FormattedMessage {...messages.purgeIndexesHelpText}/>}\n buttonText={<FormattedMessage {...messages.purgeIndexesButton}/>}\n successMessage={defineMessage({\n id: 'admin.bleve.purgeIndexesButton.success',\n defaultMessage: 'Indexes purged successfully.',\n })}\n errorMessage={defineMessage({\n id: 'admin.bleve.purgeIndexesButton.error',\n defaultMessage: 'Failed to purge indexes: {error}',\n })}\n disabled={!this.state.canPurgeAndIndex || this.props.isDisabled}\n label={<FormattedMessage {...messages.purgeIndexesButton_label}/>}\n />\n <BooleanSetting\n id='enableSearching'\n label={<FormattedMessage {...messages.enableSearchingTitle}/>}\n helpText={<FormattedMessage {...messages.enableSearchingDescription}/>}\n value={this.state.enableSearching}\n disabled={!this.state.enableIndexing || this.props.isDisabled}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('BleveSettings.EnableSearching')}\n />\n <BooleanSetting\n id='enableAutocomplete'\n label={\n <FormattedMessage\n id='admin.bleve.enableAutocompleteTitle'\n defaultMessage='Enable Bleve for autocomplete queries:'\n />\n }\n helpText={\n <FormattedMessage\n id='admin.bleve.enableAutocompleteDescription'\n defaultMessage='When true, Bleve will be used for all autocompletion queries on users and channels using the latest index. Autocompletion results may be incomplete until a bulk index of the existing users and channels database is finished. When false, database autocomplete is used.'\n />\n }\n value={this.state.enableAutocomplete}\n disabled={!this.state.enableIndexing || this.props.isDisabled}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('BleveSettings.EnableAutocomplete')}\n />\n </SettingsGroup>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {uploadBrandImage, deleteBrandImage} from 'actions/admin_actions.jsx';\n\nimport SettingSet from 'components/admin_console/setting_set';\nimport FormError from 'components/form_error';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Constants} from 'utils/constants';\n\nconst HTTP_STATUS_OK = 200;\n\ntype Props = {\n\n /*\n * Set for testing purpose\n */\n id?: string;\n\n /*\n * Set to disable the setting\n */\n disabled: boolean;\n\n /*\n * Set the save needed in the admin schema settings to trigger the save button to turn on\n */\n setSaveNeeded: () => void;\n\n /*\n * Registers the function suppose to be run when the save button is pressed\n */\n registerSaveAction: (saveAction: () => Promise<unknown>) => void;\n\n /*\n * Unregisters the function on unmount of the component suppose to be run when the save button is pressed\n */\n unRegisterSaveAction: (saveAction: () => Promise<unknown>) => void;\n};\n\ntype State = {\n deleteBrandImage: boolean;\n brandImage?: Blob;\n brandImageExists: boolean;\n brandImageTimestamp: number;\n error: string;\n};\n\nexport default class BrandImageSetting extends React.PureComponent<Props, State> {\n private imageRef: React.RefObject<HTMLImageElement>;\n private fileInputRef: React.RefObject<HTMLInputElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n deleteBrandImage: false,\n brandImageExists: false,\n brandImageTimestamp: Date.now(),\n error: '',\n };\n\n this.imageRef = React.createRef();\n this.fileInputRef = React.createRef();\n }\n\n componentDidMount() {\n fetch(\n Client4.getBrandImageUrl(String(this.state.brandImageTimestamp)),\n ).then((resp) => {\n if (resp.status === HTTP_STATUS_OK) {\n this.setState({brandImageExists: true});\n } else {\n this.setState({brandImageExists: false});\n }\n }).catch((err) => {\n console.error(`unable to retrieve brand image: ${err}`); //eslint-disable-line no-console\n this.setState({brandImageExists: false});\n });\n\n this.props.registerSaveAction(this.handleSave);\n }\n\n componentWillUnmount() {\n this.props.unRegisterSaveAction(this.handleSave);\n }\n\n componentDidUpdate() {\n if (this.imageRef.current) {\n const reader = new FileReader();\n\n const img = this.imageRef.current;\n reader.onload = (e) => {\n const src =\n e.target?.result instanceof ArrayBuffer ? e.target?.result.toString() : e.target?.result;\n\n if (src) {\n img.setAttribute('src', src);\n }\n };\n\n if (this.state.brandImage) {\n reader.readAsDataURL(this.state.brandImage);\n }\n }\n }\n\n handleSelectClick = () => {\n this.fileInputRef.current?.click();\n };\n\n handleImageChange = () => {\n if (!this.fileInputRef.current) {\n return;\n }\n const element = this.fileInputRef.current;\n if (element.files && element.files.length > 0) {\n this.props.setSaveNeeded();\n this.setState({\n brandImage: element.files[0],\n deleteBrandImage: false,\n });\n }\n };\n\n handleDeleteButtonPressed = () => {\n this.setState({\n deleteBrandImage: true,\n brandImage: undefined,\n brandImageExists: false,\n });\n this.props.setSaveNeeded();\n };\n\n handleSave = async () => {\n this.setState({\n error: '',\n });\n\n let error;\n if (this.state.deleteBrandImage) {\n await deleteBrandImage(\n () => {\n this.setState({\n deleteBrandImage: false,\n brandImageExists: false,\n brandImage: undefined,\n });\n },\n (err: Error) => {\n error = err;\n this.setState({\n error: err.message,\n });\n },\n );\n } else if (this.state.brandImage) {\n await uploadBrandImage(\n this.state.brandImage,\n () => {\n this.setState({\n brandImageExists: true,\n brandImage: undefined,\n brandImageTimestamp: Date.now(),\n });\n },\n (err: Error) => {\n error = err;\n this.setState({\n error: err.message,\n });\n },\n );\n }\n return {error};\n };\n\n render() {\n let img = null;\n if (this.state.brandImage) {\n img = (\n <div className='remove-image__img mb-5'>\n <img\n ref={this.imageRef}\n alt='brand image'\n src=''\n />\n </div>\n );\n } else if (this.state.brandImageExists) {\n let overlay;\n if (!this.props.disabled) {\n overlay = (\n <WithTooltip\n title={(\n <FormattedMessage\n id='admin.team.removeBrandImage'\n defaultMessage='Remove brand image'\n />\n )}\n isVertical={false}\n >\n <button\n type='button'\n className='remove-image__btn'\n onClick={this.handleDeleteButtonPressed}\n >\n <span aria-hidden={true}>{'×'}</span>\n </button>\n </WithTooltip>\n );\n }\n img = (\n <div className='remove-image__img mb-5'>\n <img\n alt='brand image'\n src={Client4.getBrandImageUrl(\n String(this.state.brandImageTimestamp),\n )}\n />\n {overlay}\n </div>\n );\n } else {\n img = (\n <p className='mt-2'>\n <FormattedMessage\n id='admin.team.noBrandImage'\n defaultMessage='No brand image uploaded'\n />\n </p>\n );\n }\n\n return (\n <SettingSet\n inputId={this.props.id}\n helpText={\n <FormattedMessage\n id='admin.team.uploadDesc'\n defaultMessage='Customize your user experience by adding a custom image to your login screen. Recommended maximum image size is less than 2 MB.'\n />\n }\n label={\n <FormattedMessage\n id='admin.team.brandImageTitle'\n defaultMessage='Custom Brand Image:'\n />\n }\n setByEnv={false}\n >\n <div>\n <div className='remove-image'>{img}</div>\n </div>\n <div className='file__upload mt-5'>\n <button\n type='button'\n className='btn btn-tertiary'\n disabled={this.props.disabled}\n onClick={this.handleSelectClick}\n >\n <FormattedMessage\n id='admin.team.chooseImage'\n defaultMessage='Select Image'\n />\n </button>\n <input\n ref={this.fileInputRef}\n type='file'\n accept={Constants.ACCEPT_STATIC_IMAGE}\n disabled={this.props.disabled}\n onChange={this.handleImageChange}\n />\n </div>\n <FormError error={this.state.error}/>\n </SettingSet>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport type {CSSProperties, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ReloadIcon from 'components/widgets/icons/fa_reload_icon';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nimport statusGreen from 'images/status_green.png';\nimport statusYellow from 'images/status_yellow.png';\n\ntype Props = {\n clusterInfos: Array<{\n version: string;\n config_hash: string;\n hostname: string;\n ipaddress: string;\n schema_version: string;\n }>;\n reload: (e: MouseEvent<HTMLButtonElement>) => void;\n}\n\ntype Style = {\n clusterTable: CSSProperties;\n clusterCell: CSSProperties;\n warning: CSSProperties;\n}\n\nexport default class ClusterTable extends PureComponent<Props> {\n render() {\n let versionMismatch = (\n <img\n alt='version mismatch'\n className='cluster-status'\n src={statusGreen}\n />\n );\n let configMismatch = (\n <img\n alt='config mismatch'\n className='cluster-status'\n src={statusGreen}\n />\n );\n let versionMismatchWarning = (\n <div/>\n );\n let version = '';\n let configHash = '';\n let singleItem = false;\n\n if (this.props.clusterInfos.length) {\n version = this.props.clusterInfos[0].version;\n configHash = this.props.clusterInfos[0].config_hash;\n singleItem = this.props.clusterInfos.length === 1;\n }\n\n this.props.clusterInfos.map((clusterInfo) => {\n if (clusterInfo.version !== version) {\n versionMismatch = (\n <img\n alt='version mismatch'\n className='cluster-status'\n src={statusYellow}\n />\n );\n versionMismatchWarning = (\n <div\n style={style.warning}\n className='alert alert-warning'\n >\n <WarningIcon/>\n <FormattedMessage\n id='admin.cluster.version_mismatch_warning'\n defaultMessage='WARNING: Multiple versions of Mattermost has been detected in your HA cluster. Unless you are currently performing an upgrade please ensure all nodes in your cluster are running the same Mattermost version to avoid platform disruption.'\n />\n </div>\n );\n }\n\n if (clusterInfo.config_hash !== configHash) {\n configMismatch = (\n <img\n alt='config mismatch'\n className='cluster-status'\n src={statusYellow}\n />\n );\n }\n\n return null;\n });\n\n const items = this.props.clusterInfos.map((clusterInfo) => {\n let status = null;\n\n let hostname: React.ReactNode = clusterInfo.hostname;\n if (hostname === '') {\n hostname = (\n <FormattedMessage\n id='admin.cluster.unknown'\n defaultMessage='unknown'\n />\n );\n }\n\n let version: React.ReactNode = clusterInfo.version;\n if (version === '') {\n version = (\n <FormattedMessage\n id='admin.cluster.unknown'\n defaultMessage='unknown'\n />\n );\n }\n\n let configHash: React.ReactNode = clusterInfo.config_hash;\n if (configHash === '') {\n configHash = (\n <FormattedMessage\n id='admin.cluster.unknown'\n defaultMessage='unknown'\n />\n );\n }\n\n if (singleItem) {\n status = (\n <img\n alt='Cluster status'\n className='cluster-status'\n src={statusYellow}\n />\n );\n } else {\n status = (\n <img\n alt='Cluster status'\n className='cluster-status'\n src={statusGreen}\n />\n );\n }\n\n return (\n <tr key={clusterInfo.ipaddress}>\n <td style={style.clusterCell}>{status}</td>\n <td style={style.clusterCell}>{hostname}</td>\n <td style={style.clusterCell}>{versionMismatch} {version}</td>\n <td style={style.clusterCell}><div className='config-hash'>{configMismatch} {configHash}</div></td>\n <td style={style.clusterCell}>{clusterInfo.ipaddress}</td>\n <td style={style.clusterCell}>{clusterInfo.schema_version}</td>\n </tr>\n );\n });\n\n return (\n <div\n className='cluster-panel__table'\n style={style.clusterTable}\n >\n <div className='text-right'>\n <button\n type='submit'\n className='btn btn-tertiary'\n onClick={this.props.reload}\n >\n <ReloadIcon/>\n <FormattedMessage\n id='admin.cluster.status_table.reload'\n defaultMessage=' Reload Cluster Status'\n />\n </button>\n </div>\n <table className='table'>\n <thead>\n <tr>\n <th>\n <FormattedMessage\n id='admin.cluster.status_table.status'\n defaultMessage='Status'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.cluster.status_table.hostname'\n defaultMessage='Hostname'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.cluster.status_table.version'\n defaultMessage='Version'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.cluster.status_table.config_hash'\n defaultMessage='Config File MD5'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.cluster.status_table.url'\n defaultMessage='Gossip Address'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.cluster.status_table.schema_version'\n defaultMessage='DB Schema Version'\n />\n </th>\n </tr>\n </thead>\n <tbody>\n {items}\n </tbody>\n </table>\n {versionMismatchWarning}\n </div>\n );\n }\n}\n\nconst style: Style = {\n clusterTable: {margin: 10, marginBottom: 30},\n clusterCell: {whiteSpace: 'nowrap'},\n warning: {marginBottom: 10},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport type {MouseEvent} from 'react';\n\nimport type {ClusterInfo} from '@mattermost/types/admin';\n\nimport {getClusterStatus} from 'actions/admin_actions.jsx';\n\nimport ClusterTable from './cluster_table';\n\nimport LoadingScreen from '../loading_screen';\n\nconst ClusterTableContainer = () => {\n const interval = useRef<NodeJS.Timeout>();\n const [clusterInfos, setClusterInfos] = useState<ClusterInfo[] | null>(null);\n\n const load = useCallback(() => {\n getClusterStatus(setClusterInfos, null);\n }, []);\n\n useEffect(() => {\n load();\n interval.current = setInterval(load, 15000);\n return () => {\n if (interval.current) {\n clearInterval(interval.current);\n }\n };\n }, []);\n\n const reload = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n if (e) {\n e.preventDefault();\n }\n\n setClusterInfos(null);\n\n load();\n }, [load]);\n\n if (clusterInfos == null) {\n return (<LoadingScreen/>);\n }\n\n return (\n <ClusterTable\n clusterInfos={clusterInfos}\n reload={reload}\n />\n );\n};\n\nexport default React.memo(ClusterTableContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig, ClientLicense} from '@mattermost/types/config';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport ExternalLink from 'components/external_link';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nimport {DocLinks} from 'utils/constants';\n\nimport BooleanSetting from './boolean_setting';\nimport ClusterTableContainer from './cluster_table_container';\nimport type {BaseProps, BaseState} from './old_admin_settings';\nimport OLDAdminSettings from './old_admin_settings';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ntype Props = {\n license: ClientLicense;\n} & BaseProps;\n\ntype State = {\n Enable: boolean;\n ClusterName: string;\n OverrideHostname: string;\n UseIPAddress: boolean;\n EnableExperimentalGossipEncryption: boolean;\n EnableGossipCompression: boolean;\n GossipPort: number;\n showWarning: boolean;\n} & BaseState;\n\nconst messages = defineMessages({\n cluster: {id: 'admin.advance.cluster', defaultMessage: 'High Availability'},\n noteDescription: {id: 'admin.cluster.noteDescription', defaultMessage: 'Changing properties in this section will require a server restart before taking effect.'},\n enableTitle: {id: 'admin.cluster.enableTitle', defaultMessage: 'Enable High Availability Mode:'},\n enableDescription: {id: 'admin.cluster.enableDescription', defaultMessage: 'When true, Mattermost will run in High Availability mode. Please see <link>documentation</link> to learn more about configuring High Availability for Mattermost.'},\n clusterName: {id: 'admin.cluster.ClusterName', defaultMessage: 'Cluster Name:'},\n clusterNameDesc: {id: 'admin.cluster.ClusterNameDesc', defaultMessage: 'The cluster to join by name. Only nodes with the same cluster name will join together. This is to support Blue-Green deployments or staging pointing to the same database.'},\n overrideHostname: {id: 'admin.cluster.OverrideHostname', defaultMessage: 'Override Hostname:'},\n overrideHostnameDesc: {id: 'admin.cluster.OverrideHostnameDesc', defaultMessage: \"The default value of '<blank>' will attempt to get the Hostname from the OS or use the IP Address. You can override the hostname of this server with this property. It is not recommended to override the Hostname unless needed. This property can also be set to a specific IP Address if needed.\"},\n useIPAddress: {id: 'admin.cluster.UseIPAddress', defaultMessage: 'Use IP Address:'},\n useIPAddressDesc: {id: 'admin.cluster.UseIPAddressDesc', defaultMessage: 'When true, the cluster will attempt to communicate via IP Address vs using the hostname.'},\n enableExperimentalGossipEncryption: {id: 'admin.cluster.EnableExperimentalGossipEncryption', defaultMessage: 'Enable Experimental Gossip encryption:'},\n enableExperimentalGossipEncryptionDesc: {id: 'admin.cluster.EnableExperimentalGossipEncryptionDesc', defaultMessage: 'When true, all communication through the gossip protocol will be encrypted.'},\n enableGossipCompression: {id: 'admin.cluster.EnableGossipCompression', defaultMessage: 'Enable Gossip compression:'},\n enableGossipCompressionDesc: {id: 'admin.cluster.EnableGossipCompressionDesc', defaultMessage: 'When true, all communication through the gossip protocol will be compressed. It is recommended to keep this flag disabled.'},\n gossipPort: {id: 'admin.cluster.GossipPort', defaultMessage: 'Gossip Port:'},\n gossipPortDesc: {id: 'admin.cluster.GossipPortDesc', defaultMessage: 'The port used for the gossip protocol. Both UDP and TCP should be allowed on this port.'},\n});\n\nexport const searchableStrings = [\n messages.cluster,\n messages.noteDescription,\n messages.enableTitle,\n messages.enableDescription,\n messages.clusterName,\n messages.clusterNameDesc,\n messages.overrideHostname,\n messages.overrideHostnameDesc,\n messages.useIPAddress,\n messages.useIPAddressDesc,\n messages.enableExperimentalGossipEncryption,\n messages.enableExperimentalGossipEncryptionDesc,\n messages.enableGossipCompression,\n messages.enableGossipCompressionDesc,\n messages.gossipPort,\n messages.gossipPortDesc,\n];\n\nexport default class ClusterSettings extends OLDAdminSettings<Props, State> {\n getConfigFromState = (config: AdminConfig) => {\n config.ClusterSettings.Enable = this.state.Enable;\n config.ClusterSettings.ClusterName = this.state.ClusterName;\n config.ClusterSettings.OverrideHostname = this.state.OverrideHostname;\n config.ClusterSettings.UseIPAddress = this.state.UseIPAddress;\n config.ClusterSettings.EnableExperimentalGossipEncryption = this.state.EnableExperimentalGossipEncryption;\n config.ClusterSettings.EnableGossipCompression = this.state.EnableGossipCompression;\n config.ClusterSettings.GossipPort = this.parseIntNonZero(this.state.GossipPort, 8074);\n return config;\n };\n\n getStateFromConfig(config: AdminConfig) {\n const settings = config.ClusterSettings;\n\n return {\n Enable: settings.Enable,\n ClusterName: settings.ClusterName,\n OverrideHostname: settings.OverrideHostname,\n UseIPAddress: settings.UseIPAddress,\n EnableExperimentalGossipEncryption: settings.EnableExperimentalGossipEncryption,\n EnableGossipCompression: settings.EnableGossipCompression,\n GossipPort: settings.GossipPort,\n showWarning: false,\n };\n }\n\n renderTitle() {\n return (<FormattedMessage {...messages.cluster}/>);\n }\n\n overrideHandleChange = (id: string, value: unknown) => {\n this.setState({\n showWarning: true,\n });\n\n this.handleChange(id, value);\n };\n\n renderSettings = () => {\n const licenseEnabled = this.props.license.IsLicensed === 'true' && this.props.license.Cluster === 'true';\n if (!licenseEnabled) {\n return (<></>);\n }\n\n let configLoadedFromCluster = null;\n\n if (Client4.clusterId) {\n configLoadedFromCluster = (\n <div\n style={style.configLoadedFromCluster}\n className='alert alert-warning'\n >\n <WarningIcon/>\n <FormattedMessage\n id='admin.cluster.loadedFrom'\n defaultMessage='This configuration file was loaded from Node ID {clusterId}. Please see the Troubleshooting Guide in our <link>documentation</link> if you are accessing the System Console through a load balancer and experiencing issues.'\n values={{\n clusterId: Client4.clusterId,\n link: (msg) => (\n <ExternalLink\n location='cluster_settings'\n href={DocLinks.HIGH_AVAILABILITY_CLUSTER}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n );\n }\n\n let warning = null;\n\n if (this.state.showWarning) {\n warning = (\n <div\n style={style.warning}\n className='alert alert-warning'\n >\n <WarningIcon/>\n <FormattedMessage\n id='admin.cluster.should_not_change'\n defaultMessage='WARNING: These settings may not sync with the other servers in the cluster. High Availability inter-node communication will not start until you modify the config.json to be identical on all servers and restart Mattermost. Please see the <link>documentation</link> on how to add or remove a server from the cluster. If you are accessing the System Console through a load balancer and experiencing issues, please see the Troubleshooting Guide in our <link>documentation</link>.'\n values={{\n link: (msg) => (\n <ExternalLink\n location='cluster_settings'\n href={DocLinks.HIGH_AVAILABILITY_CLUSTER}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n );\n }\n\n let clusterTableContainer: React.ReactNode = null;\n if (this.state.Enable) {\n clusterTableContainer = (<ClusterTableContainer/>);\n }\n\n return (\n <SettingsGroup>\n {configLoadedFromCluster}\n {clusterTableContainer}\n <div className='banner'>\n <FormattedMessage {...messages.noteDescription}/>\n </div>\n {warning}\n <BooleanSetting\n id='Enable'\n label={\n <FormattedMessage {...messages.enableTitle}/>\n }\n helpText={\n <FormattedMessage\n {...messages.enableDescription}\n values={{\n link: (msg) => (\n <ExternalLink\n location='cluster_settings'\n href={DocLinks.HIGH_AVAILABILITY_CLUSTER}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.Enable}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.Enable')}\n disabled={this.props.isDisabled}\n />\n <TextSetting\n id='ClusterName'\n label={<FormattedMessage {...messages.clusterName}/>}\n placeholder={defineMessage({id: 'admin.cluster.ClusterNameEx', defaultMessage: 'E.g.: \"Production\" or \"Staging\"'})}\n helpText={<FormattedMessage {...messages.clusterNameDesc}/>}\n value={this.state.ClusterName}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.ClusterName')}\n disabled={this.props.isDisabled}\n />\n <TextSetting\n id='OverrideHostname'\n label={<FormattedMessage {...messages.overrideHostname}/>}\n placeholder={defineMessage({id: 'admin.cluster.OverrideHostnameEx', defaultMessage: 'E.g.: \"app-server-01\"'})}\n helpText={<FormattedMessage {...messages.overrideHostnameDesc}/>}\n value={this.state.OverrideHostname}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.OverrideHostname')}\n disabled={this.props.isDisabled}\n />\n <BooleanSetting\n id='UseIPAddress'\n label={<FormattedMessage {...messages.useIPAddress}/>}\n helpText={<FormattedMessage {...messages.useIPAddressDesc}/>}\n value={this.state.UseIPAddress}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.UseIPAddress')}\n disabled={this.props.isDisabled}\n />\n <BooleanSetting\n id='EnableExperimentalGossipEncryption'\n label={<FormattedMessage {...messages.enableExperimentalGossipEncryption}/>}\n helpText={<FormattedMessage {...messages.enableExperimentalGossipEncryptionDesc}/>}\n value={this.state.EnableExperimentalGossipEncryption}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.EnableExperimentalGossipEncryption')}\n disabled={this.props.isDisabled}\n />\n <BooleanSetting\n id='EnableGossipCompression'\n label={<FormattedMessage {...messages.enableGossipCompression}/>}\n helpText={<FormattedMessage {...messages.enableGossipCompressionDesc}/>}\n value={this.state.EnableGossipCompression}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.EnableGossipCompression')}\n disabled={this.props.isDisabled}\n />\n <TextSetting\n id='GossipPort'\n label={<FormattedMessage {...messages.gossipPort}/>}\n placeholder={defineMessage({id: 'admin.cluster.GossipPortEx', defaultMessage: 'E.g.: \"8074\"'})}\n helpText={<FormattedMessage {...messages.gossipPortDesc}/>}\n value={this.state.GossipPort}\n onChange={this.overrideHandleChange}\n setByEnv={this.isSetByEnv('ClusterSettings.GossipPort')}\n disabled={this.props.isDisabled}\n />\n </SettingsGroup>\n );\n };\n}\n\nconst style = {\n configLoadedFromCluster: {marginBottom: 10},\n warning: {marginBottom: 10},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport ConfirmModal from 'components/confirm_modal';\n\nimport BooleanSetting from './boolean_setting';\n\ntype Props = {\n id: string;\n value: boolean;\n onChange: (id: string, value: boolean, confirm?: boolean, doSubmit?: boolean, warning?: React.ReactNode | string) => void;\n cancelSubmit: () => void;\n disabled?: boolean;\n setByEnv: boolean;\n showConfirm: boolean;\n}\n\nconst CustomEnableDisableGuestAccountsSetting = ({\n id,\n value,\n onChange,\n cancelSubmit,\n disabled,\n setByEnv,\n showConfirm,\n}: Props) => {\n const handleChange = useCallback((targetId: string, newValue: boolean, submit = false) => {\n const confirmNeeded = newValue === false; // Requires confirmation if disabling guest accounts\n let warning: React.ReactNode | string = '';\n if (confirmNeeded) {\n warning = (\n <FormattedMessage\n id='admin.guest_access.disableConfirmWarning'\n defaultMessage='All current guest account sessions will be revoked, and marked as inactive'\n />\n );\n }\n onChange(targetId, newValue, confirmNeeded, submit, warning);\n }, [onChange]);\n\n const handleConfirm = useCallback(() => {\n handleChange(id, false, true);\n }, [handleChange, id]);\n\n const label = (\n <FormattedMessage\n id='admin.guest_access.enableTitle'\n defaultMessage='Enable Guest Access: '\n />\n );\n\n const helpText = (\n <FormattedMessage\n id='admin.guest_access.helpText'\n defaultMessage='When true, external guest can be invited to channels within teams. Please see <a>Permissions Schemes</a> for which roles can invite guests.'\n values={{\n a: (chunks: string) => <Link to='/admin_console/user_management/permissions/system_scheme'>{chunks}</Link>,\n }}\n />\n );\n\n return (\n <>\n <BooleanSetting\n id={id}\n value={value}\n label={label}\n helpText={helpText}\n setByEnv={setByEnv}\n onChange={handleChange}\n disabled={disabled}\n />\n <ConfirmModal\n show={showConfirm && (value === false)}\n title={\n <FormattedMessage\n id='admin.guest_access.disableConfirmTitle'\n defaultMessage='Save and Disable Guest Access?'\n />\n }\n message={\n <FormattedMessage\n id='admin.guest_access.disableConfirmMessage'\n defaultMessage='Disabling guest access will revoke all current Guest Account sessions. Guests will no longer be able to login and new guests cannot be invited into Mattermost. Guest users will be marked as inactive in user lists. Enabling this feature will not reinstate previous guest accounts. Are you sure you wish to remove these users?'\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='admin.guest_access.disableConfirmButton'\n defaultMessage='Save and Disable Guest Access'\n />\n }\n onConfirm={handleConfirm}\n onCancel={cancelSubmit}\n />\n </>\n );\n};\n\nexport default CustomEnableDisableGuestAccountsSetting;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {AdminConfig, ClientLicense} from '@mattermost/types/config';\nimport type {TermsOfService} from '@mattermost/types/terms_of_service';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BooleanSetting from 'components/admin_console/boolean_setting';\nimport OLDAdminSettings from 'components/admin_console/old_admin_settings';\nimport type {BaseProps, BaseState} from 'components/admin_console/old_admin_settings';\nimport SettingsGroup from 'components/admin_console/settings_group';\nimport TextSetting from 'components/admin_console/text_setting';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {Constants} from 'utils/constants';\n\ntype Props = BaseProps & {\n actions: {\n getTermsOfService: () => Promise<ActionResult<TermsOfService>>;\n createTermsOfService: (text: string) => Promise<ActionResult<TermsOfService>>;\n };\n config: AdminConfig;\n license: ClientLicense;\n setNavigationBlocked: () => void;\n\n /*\n * Action to save config file\n */\n patchConfig: () => void;\n};\n\ntype State = BaseState & {\n termsEnabled?: boolean;\n reAcceptancePeriod?: number;\n loadingTermsText: boolean;\n receivedTermsText: string;\n termsText: string;\n saveNeeded: boolean;\n saving: boolean;\n serverError: JSX.Element | string | null;\n errorTooltip: boolean;\n}\n\nexport const messages = defineMessages({\n termsOfServiceTitle: {id: 'admin.support.termsOfServiceTitle', defaultMessage: 'Custom Terms of Service'},\n enableTermsOfServiceTitle: {id: 'admin.support.enableTermsOfServiceTitle', defaultMessage: 'Enable Custom Terms of Service'},\n termsOfServiceTextTitle: {id: 'admin.support.termsOfServiceTextTitle', defaultMessage: 'Custom Terms of Service Text'},\n termsOfServiceTextHelp: {id: 'admin.support.termsOfServiceTextHelp', defaultMessage: 'Text that will appear in your custom Terms of Service. Supports Markdown-formatted text.'},\n termsOfServiceReAcceptanceTitle: {id: 'admin.support.termsOfServiceReAcceptanceTitle', defaultMessage: 'Re-Acceptance Period:'},\n termsOfServiceReAcceptanceHelp: {id: 'admin.support.termsOfServiceReAcceptanceHelp', defaultMessage: 'The number of days before Terms of Service acceptance expires, and the terms must be re-accepted.'},\n enableTermsOfServiceHelp: {id: 'admin.support.enableTermsOfServiceHelp', defaultMessage: 'When true, new users must accept the terms of service before accessing any Mattermost teams on desktop, web or mobile. Existing users must accept them after login or a page refresh. To update terms of service link displayed in account creation and login pages, go to <a>Site Configuration > Customization</a>'},\n});\n\nexport const searchableStrings = [\n messages.termsOfServiceTitle,\n messages.enableTermsOfServiceTitle,\n messages.enableTermsOfServiceHelp,\n messages.termsOfServiceTextTitle,\n messages.termsOfServiceTextHelp,\n messages.termsOfServiceReAcceptanceTitle,\n messages.termsOfServiceReAcceptanceHelp,\n];\n\nexport default class CustomTermsOfServiceSettings extends OLDAdminSettings<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n termsEnabled: props.config.SupportSettings?.CustomTermsOfServiceEnabled,\n reAcceptancePeriod: props.config.SupportSettings?.CustomTermsOfServiceReAcceptancePeriod,\n loadingTermsText: true,\n receivedTermsText: '',\n termsText: '',\n saveNeeded: false,\n saving: false,\n serverError: null,\n errorTooltip: false,\n };\n }\n\n getStateFromConfig(config: Props['config']) {\n return {\n termsEnabled: config.SupportSettings?.CustomTermsOfServiceEnabled,\n reAcceptancePeriod: this.parseIntNonZero(String(config.SupportSettings?.CustomTermsOfServiceReAcceptancePeriod), Constants.DEFAULT_TERMS_OF_SERVICE_RE_ACCEPTANCE_PERIOD),\n };\n }\n\n getConfigFromState = (config: Props['config']) => {\n if (config && config.SupportSettings) {\n config.SupportSettings.CustomTermsOfServiceEnabled = Boolean(this.state.termsEnabled);\n config.SupportSettings.CustomTermsOfServiceReAcceptancePeriod = this.parseIntNonZero(String(this.state.reAcceptancePeriod), Constants.DEFAULT_TERMS_OF_SERVICE_RE_ACCEPTANCE_PERIOD);\n }\n return config;\n };\n\n componentDidMount() {\n this.getTermsOfService();\n }\n\n doSubmit = async (callback?: () => void) => {\n this.setState({\n saving: true,\n serverError: null,\n });\n\n if (this.state.termsEnabled && (this.state.receivedTermsText !== this.state.termsText || !this.props.config?.SupportSettings?.CustomTermsOfServiceEnabled)) {\n const result = await this.props.actions.createTermsOfService(this.state.termsText);\n if (result.error) {\n this.handleAPIError(result.error, callback);\n return;\n }\n }\n\n // clone config so that we aren't modifying data in the stores\n let config = JSON.parse(JSON.stringify(this.props.config));\n config = this.getConfigFromState(config);\n\n const {data, error} = await this.props.patchConfig(config);\n\n if (data) {\n this.setState(this.getStateFromConfig(data));\n\n this.setState({\n saveNeeded: false,\n saving: false,\n });\n\n this.props.setNavigationBlocked(false);\n\n if (callback) {\n callback();\n }\n\n if (this.handleSaved) {\n this.handleSaved(config);\n }\n } else if (error) {\n this.handleAPIError({id: error.server_error_id, ...error}, callback, config);\n }\n };\n\n handleAPIError = (err: any, callback?: (() => void), config?: Props['config']) => {\n this.setState({\n saving: false,\n serverError: err.message,\n serverErrorId: err.id,\n });\n\n if (callback) {\n callback();\n }\n\n if (this.handleSaved && config) {\n this.handleSaved(config as AdminConfig);\n }\n };\n\n getTermsOfService = async () => {\n this.setState({loadingTermsText: true});\n\n const {data} = await this.props.actions.getTermsOfService();\n if (data) {\n this.setState({\n termsText: data.text,\n receivedTermsText: data.text,\n });\n }\n\n this.setState({loadingTermsText: false});\n };\n\n handleTermsTextChange = (id: string, value: boolean) => {\n this.handleChange('termsText', value);\n };\n\n handleTermsEnabledChange = (id: string, value: boolean) => {\n this.handleChange('termsEnabled', value);\n };\n\n handleReAcceptancePeriodChange = (id: string, value: boolean) => {\n this.handleChange('reAcceptancePeriod', value);\n };\n\n renderTitle() {\n return (<FormattedMessage {...messages.termsOfServiceTitle}/>);\n }\n\n renderSettings = () => {\n if (this.state.loadingTermsText) {\n return <LoadingScreen/>;\n }\n\n return (\n <SettingsGroup>\n <BooleanSetting\n key={'customTermsOfServiceEnabled'}\n id={'SupportSettings.CustomTermsOfServiceEnabled'}\n label={<FormattedMessage {...messages.enableTermsOfServiceTitle}/>}\n helpText={\n <FormattedMessage\n {...messages.enableTermsOfServiceHelp}\n values={{\n a: (chunks: string) => <Link to='/admin_console/site_config/customization'>{chunks}</Link>,\n }}\n />\n }\n value={Boolean(this.state.termsEnabled)}\n onChange={this.handleTermsEnabledChange}\n setByEnv={this.isSetByEnv('SupportSettings.CustomTermsOfServiceEnabled')}\n disabled={this.props.isDisabled || !(this.props.license.IsLicensed && this.props.license.CustomTermsOfService === 'true')}\n />\n <TextSetting\n key={'customTermsOfServiceText'}\n id={'SupportSettings.CustomTermsOfServiceText'}\n type={'textarea'}\n label={<FormattedMessage {...messages.termsOfServiceTextTitle}/>}\n helpText={<FormattedMessage {...messages.termsOfServiceTextHelp}/>}\n onChange={this.handleTermsTextChange}\n setByEnv={this.isSetByEnv('SupportSettings.CustomTermsOfServiceText')}\n value={this.state.termsText}\n maxLength={Constants.MAX_TERMS_OF_SERVICE_TEXT_LENGTH}\n disabled={this.props.isDisabled || !this.state.termsEnabled}\n />\n <TextSetting\n key={'customTermsOfServiceReAcceptancePeriod'}\n id={'SupportSettings.CustomTermsOfServiceReAcceptancePeriod'}\n type={'number'}\n label={<FormattedMessage {...messages.termsOfServiceReAcceptanceTitle}/>}\n helpText={<FormattedMessage {...messages.termsOfServiceReAcceptanceHelp}/>}\n value={this.state.reAcceptancePeriod || ''}\n onChange={this.handleReAcceptancePeriodChange}\n setByEnv={this.isSetByEnv('SupportSettings.CustomTermsOfServiceReAcceptancePeriod')}\n disabled={this.props.isDisabled || !this.state.termsEnabled}\n />\n </SettingsGroup>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getTermsOfService, createTermsOfService} from 'mattermost-redux/actions/users';\n\nimport CustomTermsOfServiceSettings from './custom_terms_of_service_settings';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTermsOfService,\n createTermsOfService,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(CustomTermsOfServiceSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport type {ChangeEvent} from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\n\nimport Setting from './setting';\n\ntype Props = {\n id: string;\n value: string[];\n onChange: (id: string, valueAsArray: string[]) => void;\n disabled: boolean;\n setByEnv: boolean;\n}\n\ntype State = {\n value: string;\n}\n\nexport default class CustomURLSchemesSetting extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n value: this.arrayToString(props.value),\n };\n }\n\n stringToArray = (str: string): string[] => {\n return str.split(',').map((s) => s.trim()).filter(Boolean);\n };\n\n arrayToString = (arr: string[]): string => {\n return arr.join(',');\n };\n\n handleChange = (e: ChangeEvent<HTMLInputElement>): void => {\n const valueAsArray = this.stringToArray(e.target.value);\n\n this.props.onChange(this.props.id, valueAsArray);\n\n this.setState({\n value: e.target.value,\n });\n };\n\n render() {\n return (\n <Setting\n label={\n <FormattedMessage\n id='admin.customization.customUrlSchemes'\n defaultMessage='Custom URL Schemes:'\n />\n }\n helpText={\n <FormattedMessage\n id='admin.customization.customUrlSchemesDesc'\n defaultMessage='Allows message text to link if it begins with any of the comma-separated URL schemes listed. By default, the following schemes will create links: \"http\", \"https\", \"ftp\", \"tel\", and \"mailto\".'\n />\n }\n inputId={this.props.id}\n setByEnv={this.props.setByEnv}\n >\n <LocalizedPlaceholderInput\n id={this.props.id}\n className='form-control'\n type='text'\n placeholder={defineMessage({id: 'admin.customization.customUrlSchemesPlaceholder', defaultMessage: 'E.g.: \"git,smtp\"'})}\n value={this.state.value}\n onChange={this.handleChange}\n disabled={this.props.disabled || this.props.setByEnv}\n />\n </Setting>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\n\nimport type {Column} from './data_grid';\n\nimport './data_grid.scss';\n\ntype HeaderElementProps = {\n col: Column;\n}\n\nconst HeaderElement = ({col}: HeaderElementProps) => {\n const style: CSSProperties = {};\n if (col.width) {\n style.flexGrow = col.width;\n }\n return (\n <div\n key={col.field}\n className='DataGrid_cell'\n style={style}\n >\n {col.name}\n </div>\n );\n};\n\nexport type Props = {\n columns: Column[];\n}\n\nconst DataGridHeader = ({columns}: Props) => {\n return (\n <div className='DataGrid_header'>\n {columns.map((col) => (\n <HeaderElement\n col={col}\n key={col.field}\n />\n ))}\n </div>\n );\n};\n\nexport default DataGridHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {CSSProperties} from 'react';\n\nimport type {Row, Column} from './data_grid';\n\nimport './data_grid.scss';\n\ntype DataGridRowProps = {\n columns: Column[];\n row: Row;\n}\n\ntype DataGridCellProps = {\n column: Column;\n row: Row;\n}\n\nconst DataGridCell = ({row, column}: DataGridCellProps) => {\n const style: CSSProperties = {};\n if (column.width) {\n style.flexGrow = column.width;\n }\n\n if (column.textAlign) {\n style.textAlign = column.textAlign;\n }\n\n if (column.overflow) {\n style.overflow = column.overflow;\n }\n\n return (\n <div\n key={column.field}\n className={classNames('DataGrid_cell', column.className)}\n style={style}\n >\n {row.cells[column.field]}\n </div>\n );\n};\n\nconst DataGridRow = ({row, columns}: DataGridRowProps) => {\n const cells = columns.map((column, index) => (\n <DataGridCell\n key={index}\n row={row}\n column={column}\n />\n ));\n return (\n <div\n className='DataGrid_row'\n onClick={row.onClick}\n >\n {cells}\n </div>\n );\n};\n\nexport default React.memo(DataGridRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\n\ntype Props = {\n name: string;\n checked: boolean;\n label: string | JSX.Element;\n updateOption: (checked: boolean, name: string) => void;\n};\n\nfunction FilterCheckbox({\n name,\n checked,\n label,\n updateOption,\n}: Props) {\n const toggleOption = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n updateOption(!checked, name);\n }, [name, checked, updateOption]);\n\n return (\n <div\n className='FilterList_checkbox'\n onClick={toggleOption}\n >\n <label>\n {checked &&\n <input\n type='checkbox'\n id={name}\n name={name}\n defaultChecked={true}\n />\n }\n\n {!checked &&\n <input\n type='checkbox'\n id={name}\n name={name}\n defaultChecked={false}\n />\n }\n {label}\n </label>\n </div>\n );\n}\n\nexport default React.memo(FilterCheckbox);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\n\nimport type {FilterOption, FilterValues} from './filter';\nimport FilterCheckbox from './filter_checkbox';\n\nimport './filter.scss';\n\ntype Props = {\n option: FilterOption;\n optionKey: string;\n updateValues: (values: FilterValues, optionKey: string) => void;\n}\n\nconst FilterList = ({\n option,\n optionKey,\n updateValues,\n}: Props) => {\n const updateOption = useCallback(async (value: boolean, key: string) => {\n const values = {\n ...option.values,\n [key]: {\n ...option.values[key],\n value,\n },\n };\n await updateValues(values, optionKey);\n }, [option.values, optionKey, updateValues]);\n\n const valuesToRender = option.keys.map((optionKey: string, index: number) => {\n const currentValue = option.values[optionKey];\n const {value, name} = currentValue;\n const FilterItem = option.type || FilterCheckbox;\n\n return (\n <div\n key={index}\n className='FilterList_item'\n >\n <FilterItem\n key={index}\n name={optionKey}\n checked={value}\n label={name}\n updateOption={updateOption}\n />\n </div>\n );\n });\n\n return (\n <div className='FilterList'>\n <div className='FilterList_name'>\n {option.name}\n </div>\n\n {valuesToRender}\n </div>\n );\n};\n\nexport default memo(FilterList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport FilterList from './filter_list';\nimport './filter.scss';\n\nexport type Filters = {\n [filterKey: string]: string[];\n};\n\nexport type FilterValue = {\n name: string | JSX.Element;\n value: boolean | string | string[];\n};\n\nexport type FilterValues = {\n [key: string]: FilterValue;\n};\n\nexport type FilterOption = {\n\n // Display name of the filter option eg. 'Channels', 'Roles' or <FormattedMessage .../>\n name: string | JSX.Element;\n\n // List of keys that match the filter values, used to define the order in which the filters appear\n keys: string[];\n\n // Key value map of filter values with keys matching the keys above\n values: FilterValues;\n\n // Filter Component type, optional parameter defaults to FilterCheckbox\n type?: React.ElementType;\n}\n\nexport type FilterOptions = {\n [key: string]: FilterOption;\n}\n\ntype Props = {\n onFilter: (filters: FilterOptions) => void;\n options: FilterOptions;\n keys: string[];\n}\n\ntype State = {\n show: boolean;\n options: FilterOptions;\n keys: string[];\n optionsModified: boolean;\n filterCount: number;\n}\n\nclass Filter extends React.PureComponent<Props, State> {\n private buttonRef: React.RefObject<HTMLButtonElement>;\n private filterRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: Props) {\n super(props);\n\n let options = {...props.options};\n let keys = [...props.keys];\n let valid = true;\n keys.forEach((key) => {\n const option = options[key];\n if (option && valid) {\n option.keys.forEach((optionKey) => {\n if (!option.values[optionKey]) {\n valid = false;\n }\n });\n } else {\n valid = false;\n }\n });\n\n if (!valid) {\n options = {};\n keys = [];\n }\n\n this.state = {\n show: false,\n options,\n keys,\n optionsModified: false,\n filterCount: 0,\n };\n\n this.filterRef = React.createRef();\n this.buttonRef = React.createRef();\n }\n\n componentDidMount = () => {\n document.addEventListener('mousedown', this.handleClickOutside);\n };\n\n componentWillUnmount = () => {\n document.removeEventListener('mousedown', this.handleClickOutside);\n };\n\n handleClickOutside = (event: MouseEvent) => {\n if (this.filterRef?.current?.contains(event.target as Node)) {\n return;\n }\n this.hidePopover();\n };\n\n hidePopover = () => {\n this.setState({show: false});\n this.buttonRef?.current?.blur();\n };\n\n togglePopover = () => {\n if (this.state.show) {\n this.hidePopover();\n return;\n }\n\n this.setState({show: true});\n };\n\n updateValues = async (values: FilterValues, optionKey: string) => {\n const options = {\n ...this.state.options,\n [optionKey]: {\n ...this.state.options[optionKey],\n values: {\n ...values,\n },\n },\n };\n this.setState({options, optionsModified: true});\n };\n\n onFilter = () => {\n this.props.onFilter(this.state.options);\n this.setState({optionsModified: false, show: false, filterCount: this.calculateFilterCount()});\n };\n\n calculateFilterCount = () => {\n const options = this.state.options;\n let filterCount = 0;\n this.props.keys.forEach((key) => {\n const {values, keys} = options[key];\n keys.forEach((filterKey: string) => {\n if (values[filterKey].value instanceof Array) {\n filterCount += (values[filterKey].value as string[]).length;\n } else if (values[filterKey].value) {\n filterCount += 1;\n }\n });\n });\n return filterCount;\n };\n\n resetFilters = () => {\n this.setState({options: {...this.props.options}}, this.onFilter);\n };\n\n renderFilterOptions = () => {\n const {keys, options} = this.state;\n return keys.map((key: string) => {\n const filter = options[key];\n const FilterListComponent = filter.type || FilterList;\n\n return (\n <FilterListComponent\n option={filter}\n optionKey={key}\n updateValues={this.updateValues}\n key={key}\n />\n );\n });\n };\n\n render() {\n const filters = this.renderFilterOptions();\n const {filterCount} = this.state;\n\n return (\n <div\n className='Filter'\n ref={this.filterRef}\n >\n <button\n type='button'\n className={classNames('Filter_button', {Filter__active: this.state.show})}\n onClick={this.togglePopover}\n ref={this.buttonRef}\n >\n <i className='Icon icon-filter-variant'/>\n\n <FormattedMessage\n id='admin.filter.filters'\n defaultMessage='Filters'\n />\n {filterCount > 0 && ` (${filterCount})`}\n </button>\n\n <div\n className={classNames('Filter_content', {Filter__show: this.state.show})}\n >\n <div className='Filter_header'>\n <div className='Filter_title'>\n <FormattedMessage\n id='admin.filter.title'\n defaultMessage='Filter by'\n />\n </div>\n\n <a\n className='Filter_reset'\n onClick={this.resetFilters}\n >\n <FormattedMessage\n id='admin.filter.reset'\n defaultMessage='Reset filters'\n />\n </a>\n </div>\n\n <hr/>\n\n <div className='Filter_lists'>\n {filters}\n </div>\n\n <button\n type='button'\n className='btn btn-primary btn-sm Filter_apply'\n disabled={!this.state.optionsModified}\n onClick={this.onFilter}\n >\n <FormattedMessage\n id='admin.filter.apply'\n defaultMessage='Apply'\n />\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default Filter;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport Filter from 'components/admin_console/filter/filter';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport FaSearchIcon from 'components/widgets/icons/fa_search_icon';\n\nimport './data_grid.scss';\n\ntype Props = {\n onSearch: (term: string) => void;\n term: string;\n extraComponent?: JSX.Element;\n\n filterProps?: {\n options: FilterOptions;\n keys: string[];\n onFilter: (options: FilterOptions) => void;\n };\n}\n\ntype State = {\n term: string;\n}\n\nclass DataGridSearch extends React.PureComponent<Props, State> {\n static defaultProps = {\n term: '',\n };\n\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n term: '',\n };\n }\n\n handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value;\n this.setState({term});\n this.props.onSearch(term);\n };\n\n resetSearch = () => {\n this.props.onSearch('');\n };\n\n onFilter = (filters: FilterOptions) => {\n this.props.filterProps?.onFilter(filters);\n };\n\n render() {\n const {filterProps} = this.props;\n\n let filter;\n if (filterProps) {\n filter = <Filter {...filterProps}/>;\n }\n\n return (\n <div className='DataGrid_search'>\n <div className='DataGrid_searchBar'>\n <span\n className='DataGrid_searchIcon'\n aria-hidden='true'\n >\n <FaSearchIcon/>\n </span>\n\n <LocalizedPlaceholderInput\n type='text'\n placeholder={defineMessage({id: 'search_bar.search', defaultMessage: 'Search'})}\n onChange={this.handleSearch}\n value={this.props.term}\n data-testid='searchInput'\n />\n <i\n className={'DataGrid_clearButton fa fa-times-circle ' + (this.props.term.length ? '' : 'hidden')}\n onClick={this.resetSearch}\n data-testid='clear-search'\n />\n </div>\n\n {filter}\n {this.props.extraComponent}\n </div>\n );\n }\n}\n\nexport default DataGridSearch;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport DataGridHeader from './data_grid_header';\nimport DataGridRow from './data_grid_row';\nimport DataGridSearch from './data_grid_search';\n\nimport './data_grid.scss';\n\nexport type Column = {\n name: string | JSX.Element;\n field: string;\n fixed?: boolean;\n\n // Optional styling overrides\n className?: string;\n width?: number;\n textAlign?: '-moz-initial' | 'inherit' | 'initial' | 'revert' | 'unset' | 'center' | 'end' | 'justify' | 'left' | 'match-parent' | 'right' | 'start' | undefined;\n overflow?: string;\n}\n\nexport type Row = {\n cells: {\n [key: string]: JSX.Element | string | null;\n };\n onClick?: () => void;\n}\n\ntype Props = {\n rows: Row[];\n columns: Column[];\n placeholderEmpty?: JSX.Element;\n loadingIndicator?: JSX.Element;\n\n rowsContainerStyles?: CSSProperties;\n\n minimumColumnWidth?: number;\n\n page: number;\n startCount: number;\n endCount: number;\n total?: number;\n loading: boolean;\n\n nextPage: () => void;\n previousPage: () => void;\n\n onSearch?: (term: string) => void;\n term?: string;\n extraComponent?: JSX.Element;\n filterProps?: {\n options: FilterOptions;\n keys: string[];\n onFilter: (options: FilterOptions) => void;\n };\n\n className?: string;\n};\n\ntype State = {\n visibleColumns: Column[];\n fixedColumns: Column[];\n hiddenColumns: Column[];\n minimumColumnWidth: number;\n};\n\nconst MINIMUM_COLUMN_WIDTH = 100;\n\nclass DataGrid extends React.PureComponent<Props, State> {\n private ref: React.RefObject<HTMLDivElement>;\n\n static defaultProps = {\n term: '',\n };\n\n public constructor(props: Props) {\n super(props);\n\n const minimumColumnWidth = props.minimumColumnWidth ? props.minimumColumnWidth : MINIMUM_COLUMN_WIDTH;\n\n this.state = {\n visibleColumns: this.props.columns,\n hiddenColumns: [],\n fixedColumns: this.props.columns.filter((col) => col.fixed),\n minimumColumnWidth,\n };\n\n this.ref = React.createRef();\n }\n\n componentDidMount() {\n this.handleResize();\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.columns !== prevProps.columns) {\n this.setState({visibleColumns: this.props.columns});\n }\n }\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n }\n\n private handleResize = () => {\n if (!this.ref?.current) {\n return;\n }\n\n const {minimumColumnWidth, fixedColumns} = this.state;\n const fixedColumnWidth = (fixedColumns.length * minimumColumnWidth);\n\n let visibleColumns: Column[] = this.props.columns;\n let availableWidth = this.ref.current.clientWidth - fixedColumnWidth - 50;\n\n visibleColumns = visibleColumns.filter((column) => {\n if (availableWidth > minimumColumnWidth) {\n availableWidth -= minimumColumnWidth;\n return true;\n }\n\n return Boolean(column.fixed);\n });\n\n this.setState({visibleColumns});\n };\n\n private renderRows(): JSX.Element {\n const {rows, rowsContainerStyles} = this.props;\n const {visibleColumns} = this.state;\n let rowsToRender: JSX.Element | JSX.Element[] | null = null;\n\n if (this.props.loading) {\n if (this.props.loadingIndicator) {\n rowsToRender = (\n <div className='DataGrid_loading'>\n {this.props.loadingIndicator}\n </div>\n );\n } else {\n rowsToRender = (\n <div className='DataGrid_loading'>\n <LoadingSpinner/>\n <FormattedMessage\n id='admin.data_grid.loading'\n defaultMessage='Loading'\n />\n </div>\n );\n }\n } else if (rows.length === 0) {\n const placeholder = this.props.placeholderEmpty || (\n <FormattedMessage\n id='admin.data_grid.empty'\n defaultMessage='No items found'\n />\n );\n rowsToRender = (\n <div className='DataGrid_empty'>\n {placeholder}\n </div>\n );\n } else {\n rowsToRender = rows.map((row, index) => {\n return (\n <DataGridRow\n key={index}\n row={row}\n columns={visibleColumns}\n />\n );\n });\n }\n return (\n <div\n className='DataGrid_rows'\n style={rowsContainerStyles || {}}\n >\n {rowsToRender}\n </div>\n );\n }\n\n private renderHeader(): JSX.Element {\n return (\n <DataGridHeader\n columns={this.state.visibleColumns}\n />\n );\n }\n\n private renderSearch(): JSX.Element | null {\n if (this.props.onSearch) {\n return (\n <DataGridSearch\n onSearch={this.search}\n term={this.props.term}\n filterProps={this.props.filterProps}\n extraComponent={this.props.extraComponent}\n />\n );\n }\n return null;\n }\n\n private nextPage = () => {\n if (!this.props.loading) {\n this.props.nextPage();\n }\n };\n\n private previousPage = () => {\n if (!this.props.loading) {\n this.props.previousPage();\n }\n };\n\n private search = (term: string) => {\n if (this.props.onSearch) {\n this.props.onSearch(term);\n }\n };\n\n private renderFooter = (): JSX.Element | null => {\n const {startCount, endCount, total} = this.props;\n let footer: JSX.Element | null = null;\n\n if (total) {\n const firstPage = startCount <= 1;\n const lastPage = endCount >= total;\n\n let prevPageFn: () => void = this.previousPage;\n if (firstPage) {\n prevPageFn = () => {};\n }\n\n let nextPageFn: () => void = this.nextPage;\n if (lastPage) {\n nextPageFn = () => {};\n }\n\n footer = (\n <div className='DataGrid_footer'>\n <div className='DataGrid_cell'>\n <FormattedMessage\n id='admin.data_grid.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n values={{\n startCount,\n endCount,\n total,\n }}\n />\n <button\n type='button'\n className={'btn btn-quaternary btn-icon btn-sm ml-2 prev ' + (firstPage ? 'disabled' : '')}\n onClick={prevPageFn}\n disabled={firstPage}\n >\n <PreviousIcon/>\n </button>\n <button\n type='button'\n className={'btn btn-quaternary btn-icon btn-sm next ' + (lastPage ? 'disabled' : '')}\n onClick={nextPageFn}\n disabled={lastPage}\n >\n <NextIcon/>\n </button>\n </div>\n </div>\n );\n }\n\n return footer;\n };\n\n public render() {\n return (\n <div\n className={classNames('DataGrid', this.props.className)}\n ref={this.ref}\n >\n {this.renderSearch()}\n {this.renderHeader()}\n {this.renderRows()}\n {this.renderFooter()}\n </div>\n );\n }\n}\n\nexport default DataGrid;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\ntype Props = {\n children: React.ReactNode;\n expanded?: boolean;\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n};\n\nconst CardHeader: React.FC<Props> = (props: Props) => {\n return (\n <div\n className={classNames('Card__header', {expanded: props.expanded})}\n onClick={props.onClick}\n >\n {props.children}\n {props.expanded && <hr className='Card__hr'/>}\n </div>\n );\n};\n\nexport default CardHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {Children, isValidElement, cloneElement} from 'react';\n\nimport CardBody from './card_body';\nimport CardHeader from './card_header';\n\nimport './card.scss';\n\ntype Props = {\n expanded?: boolean;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport default class Card extends React.PureComponent<Props> {\n public static Header = CardHeader;\n public static Body = CardBody;\n\n render() {\n const {expanded, children} = this.props;\n\n const childrenWithProps = Children.map(children, (child) => {\n // Checking isValidElement is the safe way and avoids a TS error too.\n if (isValidElement<{expanded?: boolean}>(child)) {\n return cloneElement(child, {expanded});\n }\n return child;\n });\n\n return (\n <div\n className={classNames('Card', this.props.className, {\n expanded,\n })}\n >\n {childrenWithProps}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useState, useEffect} from 'react';\n\nimport './card.scss';\n\nexport default function CardBody(props: {expanded?: boolean; children: React.ReactNode}) {\n const [height, setHeight] = useState(0);\n const [expanding, setExpanding] = useState(false);\n const [expanded, setExpanded] = useState(false);\n\n const stopExpanding = () => setExpanding(false);\n\n const card = (node: HTMLDivElement) => {\n if (node && node.children) {\n setHeight(Array.from(node.children).map((child) => child.scrollHeight).reduce((a, b) => a + b, 0));\n }\n };\n\n useEffect(() => {\n setExpanding(true);\n if (props.expanded) {\n setExpanded(true);\n }\n }, [props.expanded]);\n\n useEffect(() => {\n if (!props.expanded) {\n setExpanded(false);\n }\n }, [expanding]);\n\n return (\n <div\n ref={card}\n style={{\n height: (expanding && expanded) ? height : '',\n }}\n className={classNames('Card__body', {expanded, expanding})}\n onTransitionEnd={stopExpanding}\n >\n {props.children}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n buttonText?: React.ReactNode;\n isDisabled?: boolean;\n onClick?: () => void;\n};\n\n// This component can be used in the card header\nconst TitleAndButtonCardHeader: React.FC<Props> = (props: Props) => {\n return (\n <>\n <div>\n <div className='text-top'>\n {props.title}\n </div>\n {\n props.subtitle &&\n <div className='text-bottom'>\n {props.subtitle}\n </div>\n }\n </div>\n {\n props.buttonText && props.onClick &&\n <button\n disabled={props.isDisabled}\n className='btn btn-primary'\n onClick={props.onClick}\n >\n {props.buttonText}\n </button>\n }\n\n </>\n );\n};\n\nexport default TitleAndButtonCardHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {createRef} from 'react';\nimport type {RefObject} from 'react';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessages, injectIntl} from 'react-intl';\nimport ReactSelect from 'react-select';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {DataRetentionCustomPolicies, DataRetentionCustomPolicy} from '@mattermost/types/data_retention';\nimport type {JobTypeBase, JobType} from '@mattermost/types/jobs';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport JobsTable from 'components/admin_console/jobs';\nimport Card from 'components/card/card';\nimport TitleAndButtonCardHeader from 'components/card/title_and_button_card_header/title_and_button_card_header';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {getHistory} from 'utils/browser_history';\nimport {JobTypes} from 'utils/constants';\n\nimport './data_retention_settings.scss';\n\ntype OptionType = {\n label: string | JSX.Element;\n value: string;\n}\n\ntype Props = {\n config: DeepPartial<AdminConfig>;\n customPolicies: DataRetentionCustomPolicies;\n customPoliciesCount: number;\n globalMessageRetentionHours: string | undefined;\n globalFileRetentionHours: string | undefined;\n actions: {\n getDataRetentionCustomPolicies: (page: number) => Promise<ActionResult>;\n createJob: (job: JobTypeBase) => Promise<ActionResult>;\n getJobsByType: (job: JobType) => Promise<ActionResult>;\n deleteDataRetentionCustomPolicy: (id: string) => Promise<ActionResult>;\n patchConfig: (config: DeepPartial<AdminConfig>) => Promise<ActionResult>;\n };\n} & WrappedComponentProps;\n\ntype State = {\n customPoliciesLoading: boolean;\n page: number;\n loading: boolean;\n showEditJobTime: boolean;\n}\nconst PAGE_SIZE = 10;\n\nconst messages = defineMessages({\n createJob_title: {id: 'admin.data_retention.createJob.title', defaultMessage: 'Run Deletion Job Now'},\n settings_title: {id: 'admin.data_retention.settings.title', defaultMessage: 'Data Retention Policies'},\n globalPolicy_title: {id: 'admin.data_retention.globalPolicy.title', defaultMessage: 'Global retention policy'},\n globalPolicy_subTitle: {id: 'admin.data_retention.globalPolicy.subTitle', defaultMessage: 'Keep messages and files for a set amount of time.'},\n customPolicies_title: {id: 'admin.data_retention.customPolicies.title', defaultMessage: 'Custom retention policies'},\n customPolicies_subTitle: {id: 'admin.data_retention.customPolicies.subTitle', defaultMessage: 'Customize how long specific teams and channels will keep messages.'},\n jobCreation_title: {id: 'admin.data_retention.jobCreation.title', defaultMessage: 'Policy log'},\n jobCreation_subTitle: {id: 'admin.data_retention.jobCreation.subTitle', defaultMessage: 'Daily log of messages and files removed based on the policies defined above.'},\n createJob_instructions: {id: 'admin.data_retention.createJob.instructions', defaultMessage: 'Daily time to check policies and run delete job:'},\n});\n\nexport const searchableStrings = [\n messages.createJob_title,\n messages.settings_title,\n messages.globalPolicy_title,\n messages.globalPolicy_subTitle,\n messages.customPolicies_title,\n messages.customPolicies_subTitle,\n messages.jobCreation_title,\n messages.jobCreation_subTitle,\n messages.createJob_instructions,\n];\n\nclass DataRetentionSettings extends React.PureComponent<Props, State> {\n inputRef: RefObject<ReactSelect<OptionType>>;\n constructor(props: Props) {\n super(props);\n this.inputRef = createRef();\n this.state = {\n customPoliciesLoading: true,\n page: 0,\n loading: false,\n showEditJobTime: false,\n };\n }\n deleteCustomPolicy = async (id: string) => {\n await this.props.actions.deleteDataRetentionCustomPolicy(id);\n this.loadPage(0);\n };\n\n getGlobalPolicyColumns = (): Column[] => {\n const columns: Column[] = [\n {\n name: (\n <FormattedMessage\n id='admin.data_retention.globalPoliciesTable.description'\n defaultMessage='Description'\n />\n ),\n field: 'description',\n },\n {\n name: (\n <FormattedMessage\n id='admin.data_retention.globalPoliciesTable.channelMessages'\n defaultMessage='Channel messages'\n />\n ),\n field: 'channel_messages',\n },\n {\n name: (\n <FormattedMessage\n id='admin.data_retention.globalPoliciesTable.files'\n defaultMessage='Files'\n />\n ),\n field: 'files',\n },\n ];\n columns.push(\n {\n name: '',\n field: 'actions',\n className: 'actionIcon',\n },\n );\n return columns;\n };\n getCustomPolicyColumns = (): Column[] => {\n const columns: Column[] = [\n {\n name: (\n <FormattedMessage\n id='admin.data_retention.customPoliciesTable.description'\n defaultMessage='Description'\n />\n ),\n field: 'description',\n },\n {\n name: (\n <FormattedMessage\n id='admin.data_retention.customPoliciesTable.channelMessages'\n defaultMessage='Channel messages'\n />\n ),\n field: 'channel_messages',\n },\n {\n name: (\n <FormattedMessage\n id='admin.data_retention.customPoliciesTable.appliedTo'\n defaultMessage='Applied to'\n />\n ),\n field: 'applied_to',\n },\n {\n name: '',\n field: 'actions',\n className: 'actionIcon',\n },\n ];\n return columns;\n };\n\n getGlobalRetentionSetting = (enabled: boolean | undefined, hours: string | undefined): JSX.Element => {\n if (!enabled) {\n return (\n <FormattedMessage\n id='admin.data_retention.form.keepForever'\n defaultMessage='Keep forever'\n />\n );\n }\n const hoursInt = parseInt(hours || '', 10);\n if (hoursInt && hoursInt % 8760 === 0) {\n const years = hoursInt / 8760;\n return (\n <FormattedMessage\n id='admin.data_retention.retention_years'\n defaultMessage='{count} {count, plural, one {year} other {years}}'\n values={{\n count: `${years}`,\n }}\n />\n );\n }\n if (hoursInt && hoursInt % 24 === 0) {\n const days = hoursInt / 24;\n return (\n <FormattedMessage\n id='admin.data_retention.retention_days'\n defaultMessage='{count} {count, plural, one {day} other {days}}'\n values={{\n count: `${days}`,\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='admin.data_retention.retention_hours'\n defaultMessage='{count} {count, plural, one {hour} other {hours}}'\n values={{\n count: `${hours}`,\n }}\n />\n );\n };\n getMessageRetentionSetting = (enabled: boolean | undefined, days: number | undefined): JSX.Element => {\n if (!enabled) {\n return (\n <FormattedMessage\n id='admin.data_retention.form.keepForever'\n defaultMessage='Keep forever'\n />\n );\n }\n if (days && days % 365 === 0) {\n const years = days / 365;\n return (\n <FormattedMessage\n id='admin.data_retention.retention_years'\n defaultMessage='{count} {count, plural, one {year} other {years}}'\n values={{\n count: `${years}`,\n }}\n />\n );\n }\n return (\n <FormattedMessage\n id='admin.data_retention.retention_days'\n defaultMessage='{count} {count, plural, one {day} other {days}}'\n values={{\n count: `${days}`,\n }}\n />\n );\n };\n getGlobalPolicyRows = (): Row[] => {\n const {DataRetentionSettings} = this.props.config;\n return [{\n cells: {\n description: this.props.intl.formatMessage({id: 'admin.data_retention.form.text', defaultMessage: 'Applies to all teams and channels, but does not apply to custom retention policies.'}),\n channel_messages: (\n <div data-testid='global_message_retention_cell'>\n {this.getGlobalRetentionSetting(DataRetentionSettings?.EnableMessageDeletion, this.props.globalMessageRetentionHours)}\n </div>\n ),\n files: (\n <div data-testid='global_file_retention_cell'>\n {this.getGlobalRetentionSetting(DataRetentionSettings?.EnableFileDeletion, this.props.globalFileRetentionHours)}\n </div>\n ),\n actions: (\n <MenuWrapper\n isDisabled={false}\n stopPropagationOnToggle={true}\n >\n <div className='text-right'>\n <a>\n <i className='icon icon-dots-vertical'/>\n </a>\n </div>\n <Menu\n openLeft={false}\n openUp={false}\n ariaLabel={this.props.intl.formatMessage({id: 'admin.user_item.menuAriaLabel', defaultMessage: 'User Actions Menu'})}\n >\n <Menu.ItemAction\n show={true}\n onClick={() => {\n getHistory().push('/admin_console/compliance/data_retention_settings/global_policy');\n }}\n text={this.props.intl.formatMessage({id: 'admin.data_retention.globalPoliciesTable.edit', defaultMessage: 'Edit'})}\n disabled={false}\n buttonClass={'edit_global_policy'}\n />\n </Menu>\n </MenuWrapper>\n ),\n },\n onClick: () => {\n getHistory().push('/admin_console/compliance/data_retention_settings/global_policy');\n },\n }];\n };\n getChannelAndTeamCounts = (policy: DataRetentionCustomPolicy): JSX.Element => {\n if (policy.channel_count === 0 && policy.team_count === 0) {\n return (\n <FormattedMessage\n id='admin.data_retention.channel_team_counts_empty'\n defaultMessage='N/A'\n />\n );\n }\n return (\n <FormattedMessage\n id='admin.data_retention.channel_team_counts'\n defaultMessage='{team_count} {team_count, plural, one {team} other {teams}}, {channel_count} {channel_count, plural, one {channel} other {channels}}'\n values={{\n team_count: policy.team_count,\n channel_count: policy.channel_count,\n }}\n />\n );\n };\n getCustomPolicyRows = (startCount: number, endCount: number): Row[] => {\n let policies = Object.values(this.props.customPolicies);\n policies = policies.slice(startCount - 1, endCount);\n\n return policies.map((policy: DataRetentionCustomPolicy) => {\n const desciptionId = `customDescription-${policy.id}`;\n const durationId = `customDuration-${policy.id}`;\n const appliedToId = `customAppliedTo-${policy.id}`;\n const menuWrapperId = `customWrapper-${policy.id}`;\n return {\n cells: {\n description: (\n <div id={desciptionId}>\n {policy.display_name}\n </div>\n ),\n channel_messages: (\n <div id={durationId}>\n {this.getMessageRetentionSetting(policy.post_duration !== -1, policy.post_duration)}\n </div>\n ),\n applied_to: (\n <div id={appliedToId}>\n {this.getChannelAndTeamCounts(policy)}\n </div>\n ),\n actions: (\n <MenuWrapper\n isDisabled={false}\n stopPropagationOnToggle={true}\n id={menuWrapperId}\n >\n <div className='text-right'>\n <a>\n <i className='icon icon-dots-vertical'/>\n </a>\n </div>\n <Menu\n openLeft={false}\n openUp={false}\n ariaLabel={this.props.intl.formatMessage({id: 'admin.user_item.menuAriaLabel', defaultMessage: 'User Actions Menu'})}\n >\n <Menu.ItemAction\n show={true}\n onClick={() => {\n getHistory().push(`/admin_console/compliance/data_retention_settings/custom_policy/${policy.id}`);\n }}\n text={this.props.intl.formatMessage({id: 'admin.data_retention.globalPoliciesTable.edit', defaultMessage: 'Edit'})}\n disabled={false}\n />\n <Menu.ItemAction\n show={true}\n onClick={() => {\n this.deleteCustomPolicy(policy.id);\n }}\n text={this.props.intl.formatMessage({id: 'admin.data_retention.globalPoliciesTable.delete', defaultMessage: 'Delete'})}\n disabled={false}\n />\n </Menu>\n </MenuWrapper>\n ),\n },\n onClick: () => {\n getHistory().push(`/admin_console/compliance/data_retention_settings/custom_policy/${policy.id}`);\n },\n };\n });\n };\n private loadPage = async (page: number) => {\n this.setState({customPoliciesLoading: true});\n await this.props.actions.getDataRetentionCustomPolicies(page);\n this.setState({page, customPoliciesLoading: false});\n };\n componentDidMount = async () => {\n await this.loadPage(this.state.page);\n };\n\n private nextPage = () => {\n this.loadPage(this.state.page + 1);\n };\n\n private previousPage = () => {\n this.loadPage(this.state.page - 1);\n };\n\n public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {\n const {page} = this.state;\n const startCount = (page * PAGE_SIZE) + 1;\n const total = this.props.customPoliciesCount;\n let endCount = (page + 1) * PAGE_SIZE;\n endCount = endCount > total ? total : endCount;\n\n return {startCount, endCount, total};\n };\n\n showEditJobTime = (value: boolean) => {\n this.setState({showEditJobTime: value});\n };\n\n componentDidUpdate = (prevProps: Props, prevState: State) => {\n if (prevState.showEditJobTime !== this.state.showEditJobTime && this.state.showEditJobTime) {\n this.inputRef.current?.focus();\n }\n };\n\n handleCreateJob = async (e?: React.SyntheticEvent) => {\n e?.preventDefault();\n const job = {\n type: JobTypes.DATA_RETENTION as JobType,\n };\n\n await this.props.actions.createJob(job);\n await this.props.actions.getJobsByType(JobTypes.DATA_RETENTION as JobType);\n };\n\n changeJobTimeConfig = async (value: string) => {\n const newConfig = JSON.parse(JSON.stringify(this.props.config));\n newConfig.DataRetentionSettings.DeletionJobStartTime = value;\n\n await this.props.actions.patchConfig(newConfig);\n this.inputRef.current?.blur();\n };\n\n getJobStartTime = (): JSX.Element | null => {\n const {DataRetentionSettings} = this.props.config;\n const timeArray = DataRetentionSettings?.DeletionJobStartTime?.split(':');\n if (!timeArray) {\n return null;\n }\n let hour = parseInt(timeArray[0], 10);\n if (hour < 12) {\n if (hour === 0) {\n hour = 12;\n }\n return (\n <FormattedMessage\n id='admin.data_retention.jobTimeAM'\n defaultMessage='{time} AM (UTC)'\n values={{\n time: `${hour}:${timeArray[1]}`,\n }}\n />\n );\n }\n if (hour !== 12) {\n hour -= 12;\n }\n return (\n <FormattedMessage\n id='admin.data_retention.jobTimePM'\n defaultMessage='{time} PM (UTC)'\n values={{\n time: `${hour}:${timeArray[1]}`,\n }}\n />\n );\n };\n getJobTimeOptions = () => {\n const options: OptionType[] = [];\n return () => {\n if (options.length > 0) {\n return options;\n }\n const minuteIntervals = ['00', '15', '30', '45'];\n for (let h = 0; h < 24; h++) {\n let hourLabel = h;\n let hourValue = `${h}`;\n const timeOfDay = h >= 12 ? 'pm' : 'am';\n if (hourLabel < 10) {\n hourValue = `0${hourValue}`;\n }\n if (hourLabel > 12) {\n hourLabel -= 12;\n }\n if (hourLabel === 0) {\n hourLabel = 12;\n }\n for (let i = 0; i < minuteIntervals.length; i++) {\n options.push({label: `${hourLabel}:${minuteIntervals[i]}${timeOfDay}`, value: `${hourValue}:${minuteIntervals[i]}`});\n }\n }\n\n return options;\n };\n };\n getJobTimes = this.getJobTimeOptions();\n\n render = () => {\n const {DataRetentionSettings} = this.props.config;\n const {startCount, endCount, total} = this.getPaginationProps();\n\n return (\n <div className='wrapper--fixed DataRetentionSettings'>\n <AdminHeader>\n <FormattedMessage {...messages.settings_title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Header>\n <TitleAndButtonCardHeader\n title={<FormattedMessage {...messages.globalPolicy_title}/>}\n subtitle={<FormattedMessage {...messages.globalPolicy_subTitle}/>}\n />\n </Card.Header>\n <Card.Body\n expanded={true}\n >\n <div id='global_policy_table'>\n <DataGrid\n columns={this.getGlobalPolicyColumns()}\n rows={this.getGlobalPolicyRows()}\n loading={false}\n page={0}\n nextPage={() => {}}\n previousPage={() => {}}\n startCount={1}\n endCount={4}\n total={0}\n className={'customTable'}\n />\n </div>\n </Card.Body>\n </Card>\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Header>\n <TitleAndButtonCardHeader\n title={<FormattedMessage {...messages.customPolicies_title}/>}\n subtitle={<FormattedMessage {...messages.customPolicies_subTitle}/>}\n buttonText={\n <FormattedMessage\n id='admin.data_retention.customPolicies.addPolicy'\n defaultMessage='Add policy'\n />\n }\n onClick={() => {\n getHistory().push('/admin_console/compliance/data_retention_settings/custom_policy');\n }}\n />\n </Card.Header>\n <Card.Body\n expanded={true}\n >\n <div id='custom_policy_table'>\n <DataGrid\n columns={this.getCustomPolicyColumns()}\n rows={this.getCustomPolicyRows(startCount, endCount)}\n loading={this.state.customPoliciesLoading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n className={'customTable'}\n />\n </div>\n </Card.Body>\n </Card>\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Header>\n <TitleAndButtonCardHeader\n title={<FormattedMessage {...messages.jobCreation_title}/>}\n subtitle={<FormattedMessage {...messages.jobCreation_subTitle}/>}\n buttonText={<FormattedMessage {...messages.createJob_title}/>}\n isDisabled={String(DataRetentionSettings?.EnableMessageDeletion) !== 'true' && String(DataRetentionSettings?.EnableFileDeletion) !== 'true' && (this.props.customPoliciesCount === 0)}\n onClick={this.handleCreateJob}\n />\n </Card.Header>\n <Card.Body\n expanded={true}\n >\n <JobsTable\n jobType={JobTypes.DATA_RETENTION as JobType}\n hideJobCreateButton={true}\n className={'job-table__data-retention'}\n disabled={String(DataRetentionSettings?.EnableMessageDeletion) !== 'true' && String(DataRetentionSettings?.EnableFileDeletion) !== 'true'}\n createJobButtonText={<FormattedMessage {...messages.createJob_title}/>}\n createJobHelpText={\n <div>\n <FormattedMessage {...messages.createJob_instructions}/>\n {this.state.showEditJobTime ? (\n <ReactSelect\n id={'JobSelectTime'}\n className={'JobSelectTime'}\n components={{\n DropdownIndicator: () => null,\n IndicatorSeparator: () => null,\n }}\n onChange={(e) => {\n this.changeJobTimeConfig((e as OptionType).value);\n }}\n styles={{\n control: (base) => ({\n ...base,\n height: 32,\n minHeight: 32,\n }),\n menu: (base) => ({\n ...base,\n width: 210,\n }),\n }}\n onBlur={() => {\n this.showEditJobTime(false);\n }}\n value={{label: this.getJobStartTime(), value: DataRetentionSettings?.DeletionJobStartTime} as OptionType}\n hideSelectedOptions={true}\n isSearchable={true}\n options={this.getJobTimes()}\n ref={this.inputRef}\n onFocus={() => {\n this.showEditJobTime(true);\n }}\n menuIsOpen={this.state.showEditJobTime}\n />\n ) : (\n <span\n className='JobSelectedtime'\n >\n <b>{this.getJobStartTime()}</b>\n </span>\n )}\n <a\n className='EditJobTime'\n onClick={() => this.showEditJobTime(true)}\n >\n {this.props.intl.formatMessage({id: 'admin.data_retention.globalPoliciesTable.edit', defaultMessage: 'Edit'})}\n </a>\n </div>\n }\n />\n </Card.Body>\n </Card>\n </div>\n </div>\n </div>\n );\n };\n}\n\nexport default injectIntl(DataRetentionSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getDataRetentionCustomPolicies as fetchDataRetentionCustomPolicies, deleteDataRetentionCustomPolicy, patchConfig} from 'mattermost-redux/actions/admin';\nimport {createJob, getJobsByType} from 'mattermost-redux/actions/jobs';\nimport {getDataRetentionCustomPolicies, getDataRetentionCustomPoliciesCount} from 'mattermost-redux/selectors/entities/admin';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport DataRetentionSettings from './data_retention_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n const customPolicies = getDataRetentionCustomPolicies(state);\n const customPoliciesCount = getDataRetentionCustomPoliciesCount(state);\n const globalMessageRetentionHours = getConfig(state).DataRetentionMessageRetentionHours;\n const globalFileRetentionHours = getConfig(state).DataRetentionFileRetentionHours;\n\n return {\n customPolicies,\n customPoliciesCount,\n globalMessageRetentionHours,\n globalFileRetentionHours,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getDataRetentionCustomPolicies: fetchDataRetentionCustomPolicies,\n createJob,\n getJobsByType,\n deleteDataRetentionCustomPolicy,\n patchConfig,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DataRetentionSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport type {ActionMeta, OptionsType, ValueType} from 'react-select';\nimport AsyncSelect from 'react-select/async';\n\nimport type {PagedTeamSearchOpts, Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport type {FilterOption, FilterValues} from '../filter';\n\nimport type {PropsFromRedux} from './index';\n\nconst TEAMS_PER_PAGE = 50;\n\ntype TeamSelectOption = {label: string; value: string}\n\nexport interface Props extends PropsFromRedux {\n option: FilterOption;\n updateValues: (values: FilterValues, optionKey: string) => void;\n}\n\nfunction TeamFilterDropdown(props: Props) {\n const {formatMessage} = useIntl();\n\n const [list, setList] = useState<OptionsType<TeamSelectOption>>([]);\n const [pageNumber, setPageNumber] = useState(0);\n\n async function loadListInPageNumber(page: number) {\n try {\n const response = await props.getTeams(page, TEAMS_PER_PAGE, true) as ActionResult<{teams: Team[]}>;\n if (response && response.data && response.data.teams && response.data.teams.length > 0) {\n const list = response.data.teams.\n map((team: Team) => ({\n value: team.id,\n label: team.display_name,\n })).\n sort((a: TeamSelectOption, b: TeamSelectOption) => a.label.localeCompare(b.label));\n\n if (page === 0) {\n setList(list);\n } else {\n setList((existingList) => [...existingList, ...list]);\n }\n\n setPageNumber(page + 1);\n }\n } catch (error) {\n console.error(error); // eslint-disable-line no-console\n }\n }\n\n async function searchInList(term: string, callBack: (options: OptionsType<{label: string; value: string}>) => void) {\n try {\n const response = await props.searchTeams(term, {page: 0, per_page: TEAMS_PER_PAGE} as PagedTeamSearchOpts);\n if (response && response.data && response.data.teams && response.data.teams.length > 0) {\n const teams = response.data.teams.map((team: Team) => ({\n value: team.id,\n label: team.display_name,\n }));\n\n callBack(teams);\n }\n\n callBack([]);\n } catch (error) {\n console.error(error); // eslint-disable-line no-console\n callBack([]);\n }\n }\n\n function handleMenuScrolledToBottom() {\n loadListInPageNumber(pageNumber);\n }\n\n function handleOnChange(value: ValueType<TeamSelectOption>, actionMeta: ActionMeta<TeamSelectOption>) {\n if (!actionMeta.action) {\n return;\n }\n\n let selected = [];\n if (Array.isArray(value) && value.length > 0) {\n selected = value.map((v) => v.value);\n }\n\n if (actionMeta.action === 'clear') {\n props.updateValues({team_ids: {name: 'Teams', value: []}}, 'teams');\n } else if (actionMeta.action === 'select-option' || actionMeta.action === 'remove-value') {\n props.updateValues({team_ids: {name: 'Teams', value: selected}}, 'teams');\n }\n }\n\n useEffect(() => {\n loadListInPageNumber(0);\n }, []);\n\n const optionValues = props.option.values?.team_ids?.value as string[];\n const selectedValues = list.filter((item) => optionValues.includes(item.value));\n\n return (\n <div className='FilterList FilterList__full'>\n <div className='FilterList_name'>\n {props.option.name}\n </div>\n <AsyncSelect\n inputId='adminConsoleTeamFilterDropdown'\n isMulti={true}\n isClearable={true}\n hideSelectedOptions={true}\n classNamePrefix='filterListSelect'\n cacheOptions={false}\n placeholder={formatMessage({id: 'admin.channels.filterBy.team.placeholder', defaultMessage: 'Search and select teams'})}\n loadingMessage={() => formatMessage({id: 'admin.channels.filterBy.team.loading', defaultMessage: 'Loading teams'})}\n noOptionsMessage={() => formatMessage({id: 'admin.channels.filterBy.team.noTeams', defaultMessage: 'No teams found'})}\n loadOptions={searchInList}\n defaultOptions={list}\n value={selectedValues}\n onChange={handleOnChange}\n onMenuScrollToBottom={handleMenuScrolledToBottom}\n components={{\n LoadingIndicator: () => <LoadingSpinner/>,\n }}\n />\n </div>\n );\n}\n\nexport default TeamFilterDropdown;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect, type ConnectedProps} from 'react-redux';\n\nimport {getTeams, searchTeams} from 'mattermost-redux/actions/teams';\n\nimport TeamFilterDropdown from './team_filter_dropdown';\n\nconst mapDispatchToProps = {\n searchTeams,\n getTeams,\n};\n\nconst connector = connect(null, mapDispatchToProps);\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(TeamFilterDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport isEqual from 'lodash/isEqual';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ChannelSearchOpts, ChannelWithTeamData} from '@mattermost/types/channels';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Column, Row} from 'components/admin_console/data_grid/data_grid';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport TeamFilterDropdown from 'components/admin_console/filter/team_filter_dropdown';\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport GlobeIcon from 'components/widgets/icons/globe_icon';\nimport LockIcon from 'components/widgets/icons/lock_icon';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Constants} from 'utils/constants';\n\nimport './channel_list.scss';\n\ntype Props = {\n channels: ChannelWithTeamData[];\n totalCount: number;\n searchTerm: string;\n filters: ChannelSearchOpts;\n\n policyId?: string;\n\n onRemoveCallback: (channel: ChannelWithTeamData) => void;\n onAddCallback: (channels: ChannelWithTeamData[]) => void;\n channelsToRemove: Record<string, ChannelWithTeamData>;\n channelsToAdd: Record<string, ChannelWithTeamData>;\n\n actions: {\n searchChannels: (id: string, term: string, opts: ChannelSearchOpts) => Promise<ActionResult>;\n getDataRetentionCustomPolicyChannels: (id: string, page: number, perPage: number) => Promise<ActionResult>;\n setChannelListSearch: (term: string) => void;\n setChannelListFilters: (filters: ChannelSearchOpts) => void;\n };\n}\n\ntype State = {\n loading: boolean;\n page: number;\n}\nconst PAGE_SIZE = 10;\nexport default class ChannelList extends React.PureComponent<Props, State> {\n private pageLoaded = 0;\n public constructor(props: Props) {\n super(props);\n this.state = {\n loading: false,\n page: 0,\n };\n }\n\n componentDidMount = () => {\n this.loadPage(0, PAGE_SIZE * 2);\n };\n\n private setStateLoading = (loading: boolean) => {\n this.setState({loading});\n };\n private setStatePage = (page: number) => {\n this.setState({page});\n };\n\n private loadPage = async (page: number, pageSize = PAGE_SIZE) => {\n if (this.props.policyId) {\n this.setStateLoading(true);\n await this.props.actions.getDataRetentionCustomPolicyChannels(this.props.policyId, page, pageSize);\n this.setStateLoading(false);\n }\n };\n\n private nextPage = () => {\n const page = this.state.page + 1;\n this.loadPage(page + 1);\n this.setStatePage(page);\n };\n\n private previousPage = () => {\n const page = this.state.page - 1;\n this.loadPage(page + 1);\n this.setStatePage(page);\n };\n\n private getVisibleTotalCount = (): number => {\n const {channelsToAdd, channelsToRemove, totalCount} = this.props;\n const channelsToAddCount = Object.keys(channelsToAdd).length;\n const channelsToRemoveCount = Object.keys(channelsToRemove).length;\n return totalCount + (channelsToAddCount - channelsToRemoveCount);\n };\n\n public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {\n const {page} = this.state;\n const startCount = (page * PAGE_SIZE) + 1;\n const total = this.getVisibleTotalCount();\n\n let endCount = 0;\n\n endCount = (page + 1) * PAGE_SIZE;\n endCount = endCount > total ? total : endCount;\n\n return {startCount, endCount, total};\n };\n\n private removeChannel = (channel: ChannelWithTeamData) => {\n const {channelsToRemove} = this.props;\n if (channelsToRemove[channel.id] === channel) {\n return;\n }\n\n let {page} = this.state;\n const {endCount} = this.getPaginationProps();\n\n this.props.onRemoveCallback(channel);\n if (endCount > this.getVisibleTotalCount() && (endCount % PAGE_SIZE) === 1 && page > 0) {\n page--;\n }\n\n this.setStatePage(page);\n };\n\n getColumns = (): Column[] => {\n const name = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.nameHeader'\n defaultMessage='Name'\n />\n );\n\n const team = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.teamHeader'\n defaultMessage='Team'\n />\n );\n\n return [\n {\n name,\n field: 'name',\n fixed: true,\n },\n {\n name: team,\n field: 'team',\n fixed: true,\n },\n {\n name: '',\n field: 'remove',\n textAlign: 'right',\n fixed: true,\n },\n ];\n };\n\n getRows = () => {\n const {page} = this.state;\n const {channels, channelsToRemove, channelsToAdd, totalCount} = this.props; // term was here\n const {startCount, endCount} = this.getPaginationProps();\n\n let channelsToDisplay = channels;\n const includeTeamsList = Object.values(channelsToAdd);\n\n // Remove users to remove and add users to add\n channelsToDisplay = channelsToDisplay.filter((user) => !channelsToRemove[user.id]);\n channelsToDisplay = [...includeTeamsList, ...channelsToDisplay];\n channelsToDisplay = channelsToDisplay.slice(startCount - 1, endCount);\n\n // Dont load more elements if searching\n if (channelsToDisplay.length < PAGE_SIZE && channels.length < totalCount) { //term === '' && was included\n const numberOfTeamsRemoved = Object.keys(channelsToRemove).length;\n const pagesOfTeamsRemoved = Math.floor(numberOfTeamsRemoved / PAGE_SIZE);\n const pageToLoad = page + pagesOfTeamsRemoved + 1;\n\n // Directly call action to load more users from parent component to load more users into the state\n if (pageToLoad > this.pageLoaded) {\n this.loadPage(pageToLoad + 1);\n this.pageLoaded = pageToLoad;\n }\n }\n\n return channelsToDisplay.map((channel) => {\n let iconToDisplay = <GlobeIcon className='channel-icon'/>;\n\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n iconToDisplay = <LockIcon className='channel-icon'/>;\n }\n if (isArchivedChannel(channel)) {\n iconToDisplay = (\n <ArchiveIcon\n className='channel-icon'\n data-testid={`${channel.name}-archive-icon`}\n />\n );\n }\n return {\n cells: {\n id: channel.id,\n name: (\n <div\n className='ChannelList__nameColumn'\n id={`channel-name-${channel.id}`}\n >\n {iconToDisplay}\n <div className='ChannelList__nameText'>\n <b id={`display-name-channel-${channel.id}`}>\n {channel.display_name}\n </b>\n </div>\n </div>\n ),\n team: channel.team_display_name,\n remove: (\n <a\n id={`remove-channel-${channel.id}`}\n className='group-actions TeamList_editText'\n onClick={(e) => {\n e.preventDefault();\n this.removeChannel(channel);\n }}\n href='#'\n >\n <FormattedMessage\n id='admin.data_retention.custom_policy.teams.remove'\n defaultMessage='Remove'\n />\n </a>\n ),\n },\n };\n });\n };\n\n onSearch = async (searchTerm: string) => {\n this.props.actions.setChannelListSearch(searchTerm);\n };\n public async componentDidUpdate(prevProps: Props) {\n const {policyId, searchTerm, filters} = this.props;\n const filtersModified = !isEqual(prevProps.filters, this.props.filters);\n const searchTermModified = prevProps.searchTerm !== searchTerm;\n if (searchTermModified || filtersModified) {\n this.setStateLoading(true);\n if (searchTerm === '') {\n if (filtersModified && policyId) {\n await prevProps.actions.searchChannels(policyId, searchTerm, filters);\n } else {\n await this.loadPage(1);\n this.setStatePage(0);\n }\n this.setStateLoading(false);\n return;\n }\n\n this.searchDebounced();\n }\n }\n\n searchDebounced = debounce(\n async () => {\n const {policyId, searchTerm, filters, actions} = this.props;\n if (policyId) {\n await actions.searchChannels(policyId, searchTerm, filters);\n }\n\n this.setStateLoading(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n onFilter = async (filterOptions: FilterOptions) => {\n const filters: ChannelSearchOpts = {};\n const {public: publicChannels, private: privateChannels, deleted} = filterOptions.channels.values;\n const {team_ids: teamIds} = filterOptions.teams.values;\n if (publicChannels.value || privateChannels.value || deleted.value || (teamIds.value as string[]).length) {\n filters.public = publicChannels.value as boolean;\n filters.private = privateChannels.value as boolean;\n filters.deleted = deleted.value as boolean;\n filters.team_ids = teamIds.value as string[];\n }\n this.props.actions.setChannelListFilters(filters);\n };\n render() {\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n const filterOptions: FilterOptions = {\n teams: {\n name: 'Teams',\n values: {\n team_ids: {\n name: (\n <FormattedMessage\n id='admin.team_settings.title'\n defaultMessage='Teams'\n />\n ),\n value: [],\n },\n },\n keys: ['team_ids'],\n type: TeamFilterDropdown,\n },\n channels: {\n name: 'Channels',\n values: {\n public: {\n name: (\n <FormattedMessage\n id='admin.channel_list.public'\n defaultMessage='Public'\n />\n ),\n value: false,\n },\n private: {\n name: (\n <FormattedMessage\n id='admin.channel_list.private'\n defaultMessage='Private'\n />\n ),\n value: false,\n },\n deleted: {\n name: (\n <FormattedMessage\n id='admin.channel_list.archived'\n defaultMessage='Archived'\n />\n ),\n value: false,\n },\n },\n keys: ['public', 'private', 'deleted'],\n },\n };\n\n const filterProps = {\n options: filterOptions,\n keys: ['teams', 'channels'],\n onFilter: this.onFilter,\n };\n\n return (\n <div className='PolicyChannelsList'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n className={'customTable'}\n onSearch={this.onSearch}\n term={this.props.searchTerm}\n filterProps={filterProps}\n />\n </div>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel, ChannelSearchOpts, ChannelWithTeamData} from '@mattermost/types/channels';\nimport type {DataRetentionCustomPolicy} from '@mattermost/types/data_retention';\n\nimport {getDataRetentionCustomPolicyChannels, searchDataRetentionCustomPolicyChannels as searchChannels} from 'mattermost-redux/actions/admin';\nimport {getDataRetentionCustomPolicy} from 'mattermost-redux/selectors/entities/admin';\nimport {filterChannelList, getChannelsInPolicy, searchChannelsInPolicy} from 'mattermost-redux/selectors/entities/channels';\nimport {filterChannelsMatchingTerm, channelListToMap} from 'mattermost-redux/utils/channel_utils';\n\nimport {setChannelListSearch, setChannelListFilters} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelList from './channel_list';\n\ntype OwnProps = {\n policyId?: string;\n channelsToAdd: Record<string, ChannelWithTeamData>;\n}\n\nfunction searchChannelsToAdd(channels: Record<string, Channel>, term: string, filters: ChannelSearchOpts): Record<string, Channel> {\n let filteredTeams = filterChannelsMatchingTerm(Object.keys(channels).map((key) => channels[key]), term);\n filteredTeams = filterChannelList(filteredTeams, filters);\n return channelListToMap(filteredTeams);\n}\n\nfunction mapStateToProps() {\n const getPolicyChannels = getChannelsInPolicy();\n return (state: GlobalState, ownProps: OwnProps) => {\n let {channelsToAdd} = ownProps;\n\n let channels: ChannelWithTeamData[] = [];\n let totalCount = 0;\n const policyId = ownProps.policyId;\n const policy = policyId ? getDataRetentionCustomPolicy(state, policyId) : {} as DataRetentionCustomPolicy;\n const searchTerm = state.views.search.channelListSearch.term || '';\n const filters = state.views.search.channelListSearch?.filters || {};\n\n if (searchTerm || (filters && Object.keys(filters).length !== 0)) {\n channels = policyId ? searchChannelsInPolicy(state, policyId, searchTerm, filters) as ChannelWithTeamData[] : [];\n channelsToAdd = searchChannelsToAdd(channelsToAdd, searchTerm, filters) as Record<string, ChannelWithTeamData>;\n totalCount = channels.length;\n } else {\n channels = policyId ? getPolicyChannels(state, {policyId}) as ChannelWithTeamData[] : [];\n if (policy?.channel_count) {\n totalCount = policy.channel_count;\n }\n }\n return {\n channels,\n totalCount,\n searchTerm,\n channelsToAdd,\n filters,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getDataRetentionCustomPolicyChannels,\n searchChannels,\n setChannelListSearch,\n setChannelListFilters,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport * as Utils from 'utils/utils';\n\nexport const FOREVER = 'FOREVER';\nexport const YEARS = 'YEARS';\nexport const DAYS = 'DAYS';\nexport const HOURS = 'HOURS';\nexport const keepForeverOption = () => ({value: FOREVER, label: <div><i className='icon icon-infinity option-icon'/><span className='option_forever'>{Utils.localizeMessage({id: 'admin.data_retention.form.keepForever', defaultMessage: 'Keep forever'})}</span></div>});\nexport const yearsOption = () => ({value: YEARS, label: <span className='option_years'>{Utils.localizeMessage({id: 'admin.data_retention.form.years', defaultMessage: 'Years'})}</span>});\nexport const daysOption = () => ({value: DAYS, label: <span className='option_days'>{Utils.localizeMessage({id: 'admin.data_retention.form.days', defaultMessage: 'Days'})}</span>});\nexport const hoursOption = () => ({value: HOURS, label: <span className='option_hours'>{Utils.localizeMessage({id: 'admin.data_retention.form.hours', defaultMessage: 'Hours'})}</span>});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team, TeamSearchOpts} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Column, Row} from 'components/admin_console/data_grid/data_grid';\nimport TeamIcon from 'components/widgets/team_icon/team_icon';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport './team_list.scss';\n\ntype Props = {\n teams: Team[];\n totalCount: number;\n searchTerm: string;\n\n policyId?: string;\n\n onRemoveCallback: (user: Team) => void;\n onAddCallback: (users: Team[]) => void;\n teamsToRemove: Record<string, Team>;\n teamsToAdd: Record<string, Team>;\n\n actions: {\n searchTeams: (id: string, term: string, opts: TeamSearchOpts) => Promise<ActionResult>;\n getDataRetentionCustomPolicyTeams: (id: string, page: number, perPage: number) => Promise<ActionResult>;\n setTeamListSearch: (term: string) => ActionResult;\n };\n}\n\ntype State = {\n loading: boolean;\n page: number;\n}\nconst PAGE_SIZE = 10;\nexport default class TeamList extends React.PureComponent<Props, State> {\n private pageLoaded = 0;\n public constructor(props: Props) {\n super(props);\n this.state = {\n loading: false,\n page: 0,\n };\n }\n\n componentDidMount = () => {\n this.loadPage(0, PAGE_SIZE * 2);\n };\n\n private setStateLoading = (loading: boolean) => {\n this.setState({loading});\n };\n private setStatePage = (page: number) => {\n this.setState({page});\n };\n\n private loadPage = async (page: number, pageSize = PAGE_SIZE) => {\n if (this.props.policyId) {\n this.setStateLoading(true);\n await this.props.actions.getDataRetentionCustomPolicyTeams(this.props.policyId, page, pageSize);\n this.setStateLoading(false);\n }\n };\n\n private nextPage = () => {\n const page = this.state.page + 1;\n this.loadPage(page + 1);\n this.setStatePage(page);\n };\n\n private previousPage = () => {\n const page = this.state.page - 1;\n this.loadPage(page + 1);\n this.setStatePage(page);\n };\n\n private getVisibleTotalCount = (): number => {\n const {teamsToAdd, teamsToRemove, totalCount} = this.props;\n const teamsToAddCount = Object.keys(teamsToAdd).length;\n const teamsToRemoveCount = Object.keys(teamsToRemove).length;\n return totalCount + (teamsToAddCount - teamsToRemoveCount);\n };\n\n public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {\n const {page} = this.state;\n const startCount = (page * PAGE_SIZE) + 1;\n const total = this.getVisibleTotalCount();\n let endCount = 0;\n\n endCount = (page + 1) * PAGE_SIZE;\n endCount = endCount > total ? total : endCount;\n\n return {startCount, endCount, total};\n };\n\n private removeTeam = (team: Team) => {\n const {teamsToRemove} = this.props;\n if (teamsToRemove[team.id] === team) {\n return;\n }\n\n let {page} = this.state;\n const {endCount} = this.getPaginationProps();\n\n this.props.onRemoveCallback(team);\n if (endCount > this.getVisibleTotalCount() && (endCount % PAGE_SIZE) === 1 && page > 0) {\n page--;\n }\n\n this.setStatePage(page);\n };\n\n getColumns = (): Column[] => {\n const name = (\n <FormattedMessage\n id='admin.team_settings.team_list.nameHeader'\n defaultMessage='Name'\n />\n );\n\n return [\n {\n name,\n field: 'name',\n fixed: true,\n },\n {\n name: '',\n field: 'remove',\n textAlign: 'right',\n fixed: true,\n className: 'TeamList__actionColumn',\n },\n ];\n };\n\n getRows = () => {\n const {page} = this.state;\n const {teams, teamsToRemove, teamsToAdd, totalCount} = this.props;\n const {startCount, endCount} = this.getPaginationProps();\n let teamsToDisplay = teams;\n const includeTeamsList = Object.values(teamsToAdd);\n\n // Remove teams to remove and add teams to add\n teamsToDisplay = teamsToDisplay.filter((user) => !teamsToRemove[user.id]);\n teamsToDisplay = [...includeTeamsList, ...teamsToDisplay];\n teamsToDisplay = teamsToDisplay.slice(startCount - 1, endCount);\n\n if (teamsToDisplay.length < PAGE_SIZE && teams.length < totalCount) {\n const numberOfTeamsRemoved = Object.keys(teamsToRemove).length;\n const pagesOfTeamsRemoved = Math.floor(numberOfTeamsRemoved / PAGE_SIZE);\n const pageToLoad = page + pagesOfTeamsRemoved + 1;\n\n if (pageToLoad > this.pageLoaded) {\n this.loadPage(pageToLoad + 1);\n this.pageLoaded = pageToLoad;\n }\n }\n\n return teamsToDisplay.map((team) => {\n return {\n cells: {\n id: team.id,\n name: (\n <div\n className='TeamList__nameColumn'\n id={`team-name-${team.id}`}\n >\n <div className='TeamList__lowerOpacity'>\n <TeamIcon\n size='sm'\n url={Utils.imageURLForTeam(team)}\n content={team.display_name}\n />\n </div>\n <div className='TeamList__nameText'>\n <b data-testid='team-display-name'>\n {team.display_name}\n </b>\n </div>\n </div>\n ),\n remove: (\n <a\n id={`remove-team-${team.id}`}\n className='group-actions TeamList_editText'\n onClick={(e) => {\n e.preventDefault();\n this.removeTeam(team);\n }}\n href='#'\n >\n <FormattedMessage\n id='admin.data_retention.custom_policy.teams.remove'\n defaultMessage='Remove'\n />\n </a>\n ),\n },\n };\n });\n };\n\n onSearch = async (searchTerm: string) => {\n this.props.actions.setTeamListSearch(searchTerm);\n };\n public async componentDidUpdate(prevProps: Props) {\n const {searchTerm} = this.props;\n const searchTermModified = prevProps.searchTerm !== this.props.searchTerm;\n if (searchTermModified) {\n this.setStateLoading(true);\n if (searchTerm === '') {\n await this.loadPage(1);\n this.setStateLoading(false);\n return;\n }\n this.searchDebounced();\n }\n }\n\n searchDebounced = debounce(\n async () => {\n const {policyId, searchTerm, actions} = this.props;\n\n if (policyId) {\n await actions.searchTeams(policyId, searchTerm, {});\n }\n\n this.setStateLoading(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n render() {\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n return (\n <div className='PolicyTeamsList'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n className={'customTable'}\n onSearch={this.onSearch}\n term={this.props.searchTerm}\n />\n </div>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {DataRetentionCustomPolicy} from '@mattermost/types/data_retention';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {getDataRetentionCustomPolicyTeams, searchDataRetentionCustomPolicyTeams as searchTeams} from 'mattermost-redux/actions/admin';\nimport {getDataRetentionCustomPolicy} from 'mattermost-redux/selectors/entities/admin';\nimport {getTeamsInPolicy, searchTeamsInPolicy} from 'mattermost-redux/selectors/entities/teams';\nimport {teamListToMap, filterTeamsStartingWithTerm} from 'mattermost-redux/utils/team_utils';\n\nimport {setTeamListSearch} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamList from './team_list';\n\ntype OwnProps = {\n policyId?: string;\n teamsToAdd: Record<string, Team>;\n}\n\nfunction searchTeamsToAdd(teams: Record<string, Team>, term: string): Record<string, Team> {\n const filteredTeams = filterTeamsStartingWithTerm(Object.keys(teams).map((key) => teams[key]), term);\n return teamListToMap(filteredTeams);\n}\n\nfunction mapStateToProps() {\n const getPolicyTeams = getTeamsInPolicy();\n return (state: GlobalState, ownProps: OwnProps) => {\n let {teamsToAdd} = ownProps;\n\n let teams: Team[] = [];\n const policyId = ownProps.policyId;\n const policy = policyId ? getDataRetentionCustomPolicy(state, policyId) || {} as DataRetentionCustomPolicy : {} as DataRetentionCustomPolicy;\n let totalCount = 0;\n const searchTerm = state.views.search.teamListSearch || '';\n teams = policyId ? getPolicyTeams(state, {policyId}) : [];\n if (searchTerm) {\n teams = searchTeamsInPolicy(teams, searchTerm) || [];\n teamsToAdd = searchTeamsToAdd(teamsToAdd, searchTerm);\n totalCount = teams.length;\n } else if (policy?.team_count) {\n totalCount = policy.team_count;\n }\n\n return {\n teams,\n totalCount,\n searchTerm,\n teamsToAdd,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getDataRetentionCustomPolicyTeams,\n searchTeams,\n setTeamListSearch,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Channel, ChannelSearchOpts, ChannelWithTeamData} from '@mattermost/types/channels';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\n\nimport Constants from 'utils/constants';\n\ntype ChannelWithTeamDataValue = ChannelWithTeamData & Value;\n\ntype Props = {\n searchTerm: string;\n onModalDismissed?: () => void;\n onChannelsSelected?: (channels: ChannelWithTeamData[]) => void;\n intl: IntlShape;\n groupID: string;\n actions: {\n loadChannels: (page?: number, perPage?: number, notAssociatedToGroup?: string, excludeDefaultChannels?: boolean, excludePolicyConstrained?: boolean) => Promise<ActionResult<ChannelWithTeamData[]>>;\n setModalSearchTerm: (term: string) => void;\n searchAllChannels: (term: string, opts?: ChannelSearchOpts) => Promise<ActionResult<ChannelWithTeamData[]>>;\n };\n alreadySelected?: string[];\n excludePolicyConstrained?: boolean;\n excludeTeamIds?: string[];\n}\n\ntype State = {\n values: ChannelWithTeamDataValue[];\n show: boolean;\n search: boolean;\n loadingChannels: boolean;\n channels: ChannelWithTeamData[];\n}\n\nconst CHANNELS_PER_PAGE = 50;\n\nexport class ChannelSelectorModal extends React.PureComponent<Props, State> {\n searchTimeoutId = 0;\n selectedItemRef = React.createRef<HTMLDivElement>();\n\n state: State = {\n values: [],\n show: true,\n search: false,\n loadingChannels: true,\n channels: [],\n };\n\n componentDidMount() {\n this.props.actions.loadChannels(0, CHANNELS_PER_PAGE + 1, this.props.groupID, false, this.props.excludePolicyConstrained).then((response) => {\n this.setState({channels: response.data!.sort(compareChannels)});\n this.setChannelsLoadingState(false);\n });\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.searchTerm !== this.props.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n\n const searchTerm = this.props.searchTerm;\n if (searchTerm === '') {\n this.props.actions.loadChannels(0, CHANNELS_PER_PAGE + 1, this.props.groupID, false, this.props.excludePolicyConstrained).then((response) => {\n this.setState({channels: response.data!.sort(compareChannels)});\n this.setChannelsLoadingState(false);\n });\n } else {\n this.searchTimeoutId = window.setTimeout(\n async () => {\n this.setChannelsLoadingState(true);\n const response = await this.props.actions.searchAllChannels(searchTerm, {not_associated_to_group: this.props.groupID});\n this.setState({channels: response.data!});\n this.setChannelsLoadingState(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n }\n }\n }\n\n handleHide = () => {\n this.props.actions.setModalSearchTerm('');\n this.setState({show: false});\n };\n\n handleExit = () => {\n if (this.props.onModalDismissed) {\n this.props.onModalDismissed();\n }\n };\n\n handleSubmit = (e: any) => {\n if (e) {\n e.preventDefault();\n }\n\n if (this.state.values.length === 0) {\n return;\n }\n\n if (this.props.onChannelsSelected) {\n this.props.onChannelsSelected(this.state.values);\n }\n this.handleHide();\n };\n\n addValue = (value: ChannelWithTeamDataValue) => {\n const values = [...this.state.values];\n if (value?.id && !values.some((v) => v.id === value.id)) {\n values.push(value);\n }\n\n this.setState({values});\n };\n\n setChannelsLoadingState = (loadingState: boolean) => {\n this.setState({\n loadingChannels: loadingState,\n });\n };\n\n handlePageChange = (page: number, prevPage: number) => {\n if (page > prevPage) {\n this.setChannelsLoadingState(true);\n this.props.actions.loadChannels(page, CHANNELS_PER_PAGE + 1, this.props.groupID, false, this.props.excludePolicyConstrained).then((response) => {\n const newState = [...this.state.channels];\n const stateChannelIDs = this.state.channels.map((stateChannel) => stateChannel.id);\n response.data!.forEach((serverChannel) => {\n if (!stateChannelIDs.includes(serverChannel.id)) {\n newState.push(serverChannel);\n }\n });\n this.setState({channels: newState.sort(compareChannels)});\n this.setChannelsLoadingState(false);\n });\n }\n };\n\n handleDelete = (values: ChannelWithTeamDataValue[]) => {\n this.setState({values});\n };\n\n search = (term: string, multiselectComponent: MultiSelect<ChannelWithTeamDataValue>) => {\n if (multiselectComponent.state.page !== 0) {\n multiselectComponent.setState({page: 0});\n }\n this.props.actions.setModalSearchTerm(term);\n };\n\n renderOption = (\n option: ChannelWithTeamDataValue,\n isSelected: boolean,\n onAdd: (value: ChannelWithTeamDataValue) => void,\n onMouseMove: (value: ChannelWithTeamDataValue) => void) => {\n let rowSelected = '';\n if (isSelected) {\n rowSelected = 'more-modal__row--selected';\n }\n\n return (\n <div\n key={option.id}\n ref={isSelected ? this.selectedItemRef : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => onMouseMove(option)}\n >\n <div\n className='more-modal__details'\n >\n <div className='channel-info-block'>\n {option.type === Constants.PRIVATE_CHANNEL &&\n <i className='icon icon-lock-outline'/>}\n {option.type === Constants.OPEN_CHANNEL &&\n <i className='icon icon-globe'/>}\n <span className='channel-name'>{option.display_name}</span>\n <span className='team-name'>{'(' + option.team_display_name + ')'}</span>\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i className='icon icon-plus'/>\n </div>\n </div>\n </div>\n );\n };\n\n renderValue(props: {data: ChannelWithTeamDataValue}) {\n return props.data.display_name + ' (' + props.data.team_display_name + ')';\n }\n\n render() {\n const numRemainingText = (\n <FormattedMessage\n id='multiselect.selectChannels'\n defaultMessage='Use ↑↓ to browse, ↵ to select.'\n />\n );\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n\n let options = this.state.channels.map((i): ChannelWithTeamDataValue => ({...i, label: i.display_name, value: i.id}));\n if (this.props.alreadySelected) {\n options = options.filter((channel) => this.props.alreadySelected?.indexOf(channel.id) === -1);\n }\n if (this.props.excludePolicyConstrained) {\n options = options.filter((channel) => channel.policy_id === null);\n }\n if (this.props.excludeTeamIds) {\n options = options.filter((channel) => this.props.excludeTeamIds?.indexOf(channel.team_id) === -1);\n }\n const values = this.state.values.map((i): ChannelWithTeamDataValue => ({...i, label: i.display_name, value: i.id}));\n\n return (\n <Modal\n dialogClassName={'a11y__modal more-modal more-direct-channels channel-selector-modal'}\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.handleExit}\n role='none'\n aria-labelledby='channelSelectorModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='channelSelectorModalLabel'\n >\n <FormattedMessage\n id='channelSelectorModal.title'\n defaultMessage='Add Channels to <b>Channel Selection</b> List'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <MultiSelect<ChannelWithTeamDataValue>\n key='addChannelsToSchemeKey'\n options={options}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n values={values}\n valueRenderer={this.renderValue}\n perPage={CHANNELS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.addValue}\n handleSubmit={this.handleSubmit}\n numRemainingText={numRemainingText}\n buttonSubmitText={buttonSubmitText}\n saving={false}\n loading={this.state.loadingChannels}\n placeholderText={defineMessage({id: 'multiselect.addChannelsPlaceholder', defaultMessage: 'Search and add channels'})}\n />\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nfunction compareChannels(a: Channel, b: Channel) {\n const aDisplayName = a.display_name.toUpperCase();\n const bDisplayName = b.display_name.toUpperCase();\n const result = aDisplayName.localeCompare(bDisplayName);\n if (result !== 0) {\n return result;\n }\n\n const aName = a.name.toUpperCase();\n const bName = b.name.toUpperCase();\n return aName.localeCompare(bName);\n}\n\nexport default injectIntl(ChannelSelectorModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getAllChannels as loadChannels, searchAllChannels} from 'mattermost-redux/actions/channels';\n\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelSelectorModal from './channel_selector_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n searchTerm: state.views.search.modalSearch,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadChannels,\n setModalSearchTerm,\n searchAllChannels,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelSelectorModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\nimport TeamIcon from 'components/widgets/team_icon/team_icon';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {imageURLForTeam} from 'utils/utils';\n\nconst TEAMS_PER_PAGE = 50;\n\ntype TeamValue = (Team & Value);\n\nexport type Props = {\n currentSchemeId?: string;\n alreadySelected?: string[];\n intl: IntlShape;\n excludeGroupConstrained?: boolean;\n searchTerm: string;\n teams: Team[];\n onModalDismissed?: () => void;\n onTeamsSelected?: (a: Team[]) => void;\n modalID?: string;\n actions: {\n loadTeams: (page?: number, perPage?: number, includeTotalCount?: boolean, excludePolicyConstrained?: boolean) => Promise<ActionResult>;\n setModalSearchTerm: (searchTerm: string) => void;\n searchTeams: (searchTerm: string) => void;\n };\n data?: any;\n excludePolicyConstrained?: boolean;\n};\n\ntype State = {\n values: TeamValue[];\n show: boolean;\n search: boolean;\n loadingTeams: boolean;\n confirmAddModal: boolean;\n confirmAddTeam: any;\n};\n\nexport class TeamSelectorModal extends React.PureComponent<Props, State> {\n private searchTimeoutId?: number;\n private selectedItemRef?: React.RefObject<HTMLDivElement> | undefined;\n private currentSchemeId?: string;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n values: [],\n show: true,\n search: false,\n loadingTeams: true,\n confirmAddModal: false,\n confirmAddTeam: null,\n };\n\n this.selectedItemRef = React.createRef();\n }\n\n componentDidMount() {\n this.props.actions.loadTeams(0, TEAMS_PER_PAGE + 1, false, this.props.excludePolicyConstrained).then(() => {\n this.setTeamsLoadingState(false);\n });\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.searchTerm !== prevProps.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n\n const searchTerm = this.props.searchTerm;\n if (searchTerm === '') {\n return;\n }\n\n this.searchTimeoutId = window.setTimeout(\n async () => {\n this.setTeamsLoadingState(true);\n await this.props.actions.searchTeams(searchTerm);\n this.setTeamsLoadingState(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n }\n }\n\n handleHide = () => {\n this.props.actions.setModalSearchTerm('');\n this.setState({show: false});\n };\n\n handleExit = () => {\n if (this.props.onModalDismissed) {\n this.props.onModalDismissed();\n }\n };\n\n handleSubmit = (e: Event | TeamValue[] | undefined) => {\n if (e) {\n (e as Event).preventDefault();\n }\n\n if (this.state.values.length === 0) {\n return;\n }\n\n this.props.onTeamsSelected?.(this.state.values);\n this.handleHide();\n };\n\n addValue = (value: TeamValue, confirmed = false) => {\n if (this.props.modalID === ModalIdentifiers.ADD_TEAMS_TO_SCHEME && value.scheme_id !== null && value.scheme_id !== '' && !confirmed) {\n this.setState({confirmAddModal: true, confirmAddTeam: value});\n return;\n }\n const values = Object.assign([], this.state.values);\n const teamIds = values.map((v: Team) => v.id);\n if (value && value.id && teamIds.indexOf(value.id) === -1) {\n values.push(value);\n }\n\n this.setState({values, confirmAddModal: false, confirmAddTeam: null});\n };\n\n setTeamsLoadingState = (loadingState: boolean) => {\n this.setState({\n loadingTeams: loadingState,\n });\n };\n\n handlePageChange = (page: number, prevPage: number) => {\n if (page > prevPage) {\n this.setTeamsLoadingState(true);\n this.props.actions.loadTeams(page, TEAMS_PER_PAGE + 1, false, this.props.excludePolicyConstrained).then(() => {\n this.setTeamsLoadingState(false);\n });\n }\n };\n\n handleDelete = (values: TeamValue[]) => {\n this.setState({values});\n };\n\n search = (term: string, multiselectComponent: { state: { page: number }; setState: (arg0: { page: number }) => void }) => {\n if (multiselectComponent.state.page !== 0) {\n multiselectComponent.setState({page: 0});\n }\n this.props.actions.setModalSearchTerm(term);\n };\n\n renderOption = (option: TeamValue, isSelected: boolean, onAdd: (value: TeamValue) => void, onMouseMove: (value: TeamValue) => void) => {\n let rowSelected = '';\n if (isSelected) {\n rowSelected = 'more-modal__row--selected';\n }\n\n return (\n <div\n key={option.id}\n ref={isSelected ? this.selectedItemRef : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => onMouseMove(option)}\n >\n <div\n className='more-modal__details'\n >\n <div className='team-info-block'>\n <TeamIcon\n content={option.display_name}\n url={imageURLForTeam(option)}\n />\n <div className='team-data'>\n <div className='title'>{option.display_name}</div>\n </div>\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i className='fa fa-plus'/>\n </div>\n </div>\n </div>\n );\n };\n\n renderValue(props: { data: TeamValue }) {\n return props.data.display_name;\n }\n\n renderConfirmModal(show: boolean, team: TeamValue) {\n const title = (\n <FormattedMessage\n id='add_teams_to_scheme.confirmation.title'\n defaultMessage='Team Override Scheme Change?'\n />\n );\n const message = (\n <FormattedMessage\n id='add_teams_to_scheme.confirmation.message'\n defaultMessage='This team is already selected in another team scheme, are you sure you want to move it to this team scheme?'\n />\n );\n const confirmButtonText = (\n <FormattedMessage\n id='add_teams_to_scheme.confirmation.accept'\n defaultMessage='Yes, Move Team'\n />\n );\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n confirmButtonText={confirmButtonText}\n onCancel={() => this.setState({confirmAddModal: false, confirmAddTeam: null})}\n onConfirm={() => this.addValue(team, true)}\n />\n );\n }\n\n render() {\n const confirmModal = this.renderConfirmModal(this.state.confirmAddModal, this.state.confirmAddTeam);\n const numRemainingText = (\n <FormattedMessage\n id='multiselect.selectTeams'\n defaultMessage='Use ↑↓ to browse, ↵ to select.'\n />\n );\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n\n let teams = [] as Team[];\n if (this.props.teams) {\n teams = this.props.teams.filter((team) => team.delete_at === 0);\n teams = teams.filter((team) => team.scheme_id !== this.currentSchemeId);\n teams = this.props.excludeGroupConstrained ? teams.filter((team) => !team.group_constrained) : teams;\n if (this.props.alreadySelected) {\n teams = teams.filter((team) => this.props.alreadySelected?.indexOf(team.id) === -1);\n }\n if (this.props.excludePolicyConstrained) {\n teams = teams.filter((team) => team.policy_id === null);\n }\n teams.sort((a, b) => {\n const aName = a.display_name.toUpperCase();\n const bName = b.display_name.toUpperCase();\n if (aName === bName) {\n return 0;\n }\n if (aName > bName) {\n return 1;\n }\n return -1;\n });\n }\n\n const teamsValues = teams.map((team) => {\n return {label: team.name, value: team.id, ...team};\n });\n\n return (\n <Modal\n dialogClassName='a11y__modal more-modal more-direct-channels team-selector-modal'\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.handleExit}\n role='none'\n aria-labelledby='teamSelectorModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='teamSelectorModalLabel'\n >\n <FormattedMessage\n id='add_teams_to_scheme.modalTitle'\n defaultMessage='Add Teams to Team Selection List'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {confirmModal}\n <MultiSelect<TeamValue>\n key='addTeamsToSchemeKey'\n options={teamsValues}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n values={this.state.values}\n valueRenderer={this.renderValue}\n perPage={TEAMS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.addValue}\n handleSubmit={this.handleSubmit}\n numRemainingText={numRemainingText}\n buttonSubmitText={buttonSubmitText}\n saving={false}\n loading={this.state.loadingTeams}\n placeholderText={defineMessage({id: 'multiselect.addTeamsPlaceholder', defaultMessage: 'Search and add teams'})}\n />\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nexport default injectIntl(TeamSelectorModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getTeams as loadTeams, searchTeams} from 'mattermost-redux/actions/teams';\nimport {getTeams} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamSelectorModal from './team_selector_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const searchTerm = state.views.search.modalSearch;\n\n const teams = Object.values(getTeams(state) || {}).filter((team) => {\n return team.display_name.toLowerCase().startsWith(searchTerm.toLowerCase()) ||\n team.description.toLowerCase().startsWith(searchTerm.toLowerCase());\n });\n\n return {\n searchTerm,\n teams,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadTeams,\n setModalSearchTerm,\n searchTeams,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamSelectorModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useState, useEffect, useRef} from 'react';\nimport type {CSSProperties} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\nimport ReactSelect, {components} from 'react-select';\nimport type {Props as SelectProps, IndicatorContainerProps, ControlProps, OptionProps} from 'react-select';\n\nimport 'components/widgets/inputs/input/input.scss';\nimport './dropdown_input_hybrid.scss';\nimport {formatAsString} from 'utils/i18n';\n\ntype OptionType = {\n label: string | JSX.Element;\n value: string;\n}\n\ntype Props<T extends OptionType> = Omit<SelectProps<T>, 'onChange'> & {\n value: T;\n legend?: string | MessageDescriptor;\n error?: string;\n onDropdownChange: (value: T) => void;\n onInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string | MessageDescriptor;\n className?: string;\n name?: string;\n exceptionToInput: string[];\n width: number;\n inputValue: string;\n inputType?: string;\n defaultValue: T;\n dropdownClassNamePrefix?: string;\n inputId?: string;\n};\n\nconst baseStyles = {\n input: (provided: CSSProperties) => ({\n ...provided,\n color: 'var(--center-channel-color)',\n }),\n control: (provided: CSSProperties) => ({\n ...provided,\n border: 'none',\n boxShadow: 'none',\n padding: '0 2px',\n cursor: 'pointer',\n minHeight: '40px',\n borderRadius: '0',\n }),\n indicatorSeparator: (provided: CSSProperties) => ({\n ...provided,\n display: 'none',\n }),\n menuPortal: (provided: CSSProperties) => ({\n ...provided,\n zIndex: 99999999,\n }),\n};\n\nconst IndicatorsContainer = (props: IndicatorContainerProps<OptionType>) => (\n <div className='DropdownInput__indicatorsContainer'>\n <components.IndicatorsContainer {...props}>\n <i className='icon icon-chevron-down'/>\n </components.IndicatorsContainer>\n </div>\n);\n\nconst Control = (props: ControlProps<OptionType>) => (\n <div className='DropdownInput__controlContainer'>\n <components.Control {...props}/>\n </div>\n);\n\nconst Option = (props: OptionProps<OptionType>) => (\n <div\n className={classNames('DropdownInput__option', {\n selected: props.isSelected,\n focused: props.isFocused,\n })}\n >\n <components.Option {...props}/>\n </div>\n);\n\nconst DropdownInputHybrid = <T extends OptionType = OptionType>(props: Props<T>) => {\n const {\n value,\n placeholder,\n className,\n name,\n legend,\n onDropdownChange,\n onInputChange,\n error,\n exceptionToInput,\n width,\n inputValue,\n inputType,\n defaultValue,\n dropdownClassNamePrefix,\n inputId,\n ...otherProps\n } = props;\n\n const intl = useIntl();\n\n const containerRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [inputFocused, setInputFocused] = useState(false);\n const [focused, setFocused] = useState(false);\n const [showInput, setShowInput] = useState(Boolean(inputValue));\n\n useEffect(() => {\n if (showInput && !inputValue) {\n inputRef.current?.focus();\n }\n }, [showInput]);\n\n useEffect(() => {\n if (!inputFocused) {\n showTextInput(inputValue, false);\n }\n }, [inputValue]);\n\n useEffect(() => {\n if (!inputValue && !focused && !inputFocused) {\n onDropdownChange(defaultValue);\n showTextInput('');\n }\n }, [focused, inputFocused]);\n\n const getMenuStyles = () =>\n (showInput ? {\n menu: (provided: CSSProperties) => ({\n ...provided,\n width: containerRef.current ? `${containerRef.current.offsetWidth}px` : '0px',\n left: inputRef.current ? `-${inputRef.current.offsetWidth}px` : '0px',\n }),\n } : {});\n\n const onInputBlur = () => setInputFocused(false);\n\n const onInputFocus = () => setInputFocused(true);\n\n const onDropdownInputFocus = (event: React.FocusEvent<HTMLElement>) => {\n setFocused(true);\n\n props.onFocus?.(event);\n };\n\n const onDropdownInputBlur = (event: React.FocusEvent<HTMLElement>) => {\n setFocused(false);\n\n props.onBlur?.(event);\n };\n\n const onValueChange = (event: T) => {\n showTextInput(event.value);\n\n onDropdownChange(event);\n };\n\n // We want to show the text input when we have a dropdown value selected and\n const showTextInput = (val: string, focus = true) => {\n if (!val || exceptionToInput.includes(val)) {\n setShowInput(false);\n } else {\n setShowInput(true);\n if (focus) {\n inputRef.current?.focus();\n }\n }\n };\n\n const showLegend = Boolean(focused || value);\n\n return (\n <div\n className='DropdownInput hybrid_container'\n ref={containerRef}\n style={{\n width: '100%',\n }}\n >\n <fieldset\n className={classNames('Input_fieldset', className, {\n Input_fieldset___error: error,\n Input_fieldset___legend: showLegend,\n Input_fieldset___split: showInput,\n })}\n >\n <legend className={classNames('Input_legend', {Input_legend___focus: showLegend})}>\n {showLegend ? formatAsString(intl.formatMessage, legend || placeholder) : null}\n </legend>\n <div\n className={classNames('Input_wrapper input_hybrid_wrapper', {showInput})}\n onFocus={onInputFocus}\n onBlur={onInputBlur}\n style={{\n maxWidth: showInput ? '10000px' : '0',\n }}\n >\n <input\n name={`Input_${name}`}\n type={inputType || 'text'}\n value={inputValue}\n onChange={onInputChange}\n placeholder={formatAsString(intl.formatMessage, placeholder)}\n required={false}\n className={classNames('Input form-control')}\n ref={inputRef}\n id={inputId}\n disabled={props.disabled}\n />\n </div>\n <div\n className={classNames('Input_wrapper dropdown_hybrid_wrapper', {showInput: !showInput})}\n onFocus={onDropdownInputFocus}\n onBlur={onDropdownInputBlur}\n style={{\n width: showInput ? `${width}px` : '100%',\n }}\n >\n <ReactSelect\n id={`DropdownInput_${name}`}\n placeholder={focused ? '' : placeholder}\n components={{\n IndicatorsContainer,\n Option,\n Control,\n }}\n className={classNames('Input', className, {Input__focus: showLegend})}\n classNamePrefix={dropdownClassNamePrefix}\n onChange={onValueChange as any}\n styles={{...baseStyles, ...getMenuStyles()}}\n value={value}\n hideSelectedOptions={true}\n isSearchable={false}\n menuPortalTarget={document.body}\n isDisabled={props.disabled}\n {...otherProps}\n />\n </div>\n </fieldset>\n </div>\n );\n};\n\nexport default DropdownInputHybrid;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages, FormattedMessage} from 'react-intl';\n\nimport type {ChannelWithTeamData} from '@mattermost/types/channels';\nimport type {\n DataRetentionCustomPolicy,\n CreateDataRetentionCustomPolicy,\n PatchDataRetentionCustomPolicy,\n} from '@mattermost/types/data_retention';\nimport type {Team} from '@mattermost/types/teams';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport ChannelList from 'components/admin_console/data_retention_settings/channel_list';\nimport {keepForeverOption, yearsOption, daysOption, FOREVER, YEARS} from 'components/admin_console/data_retention_settings/dropdown_options/dropdown_options';\nimport TeamList from 'components/admin_console/data_retention_settings/team_list';\nimport Card from 'components/card/card';\nimport TitleAndButtonCardHeader from 'components/card/title_and_button_card_header/title_and_button_card_header';\nimport ChannelSelectorModal from 'components/channel_selector_modal';\nimport SaveButton from 'components/save_button';\nimport TeamSelectorModal from 'components/team_selector_modal';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport DropdownInputHybrid from 'components/widgets/inputs/dropdown_input_hybrid';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport {getHistory} from 'utils/browser_history';\nimport {ItemStatus} from 'utils/constants';\n\nimport './custom_policy_form.scss';\n\ntype Props = {\n policyId?: string;\n policy?: DataRetentionCustomPolicy | null;\n teams?: Team[];\n actions: {\n fetchPolicy: (id: string) => Promise<ActionResult>;\n fetchPolicyTeams: (id: string, page: number, perPage: number) => Promise<ActionResult>;\n createDataRetentionCustomPolicy: (policy: CreateDataRetentionCustomPolicy) => Promise<ActionResult>;\n updateDataRetentionCustomPolicy: (id: string, policy: PatchDataRetentionCustomPolicy) => Promise<ActionResult>;\n addDataRetentionCustomPolicyTeams: (id: string, policy: string[]) => Promise<ActionResult>;\n removeDataRetentionCustomPolicyTeams: (id: string, policy: string[]) => Promise<ActionResult>;\n addDataRetentionCustomPolicyChannels: (id: string, policy: string[]) => Promise<ActionResult>;\n removeDataRetentionCustomPolicyChannels: (id: string, policy: string[]) => Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => void;\n };\n};\n\ntype State = {\n policyName: string | undefined;\n addTeamOpen: boolean;\n addChannelOpen: boolean;\n messageRetentionInputValue: string;\n messageRetentionDropdownValue: {label: string | JSX.Element; value: string};\n removedTeamsCount: number;\n removedTeams: IDMappedObjects<Team>;\n newTeams: IDMappedObjects<Team>;\n removedChannelsCount: number;\n removedChannels: IDMappedObjects<ChannelWithTeamData>;\n newChannels: IDMappedObjects<ChannelWithTeamData>;\n saveNeeded: boolean;\n saving: boolean;\n serverError: boolean;\n inputErrorText: React.ReactNode;\n formErrorText: React.ReactNode;\n}\n\nexport default class CustomPolicyForm extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n policyName: '',\n addTeamOpen: false,\n addChannelOpen: false,\n messageRetentionInputValue: this.getMessageRetentionDefaultInputValue(),\n messageRetentionDropdownValue: this.getMessageRetentionDefaultDropdownValue(),\n removedTeamsCount: 0,\n removedTeams: {},\n newTeams: {},\n removedChannelsCount: 0,\n removedChannels: {},\n newChannels: {},\n saveNeeded: false,\n saving: false,\n serverError: false,\n inputErrorText: '',\n formErrorText: '',\n };\n }\n\n openAddChannel = () => {\n this.setState({addChannelOpen: true});\n };\n\n closeAddChannel = () => {\n this.setState({addChannelOpen: false});\n };\n\n openAddTeam = () => {\n this.setState({addTeamOpen: true});\n };\n\n closeAddTeam = () => {\n this.setState({addTeamOpen: false});\n };\n getMessageRetentionDefaultInputValue = (): string => {\n if (!this.props.policy || Object.keys(this.props.policy).length === 0 || (this.props.policy && this.props.policy.post_duration === -1)) {\n return '';\n }\n if (this.props.policy && this.props.policy.post_duration % 365 === 0) {\n return (this.props.policy.post_duration / 365).toString();\n }\n return this.props.policy.post_duration.toString();\n };\n getMessageRetentionDefaultDropdownValue = () => {\n if (!this.props.policyId || (this.props.policy && this.props.policy.post_duration === -1)) {\n return keepForeverOption();\n }\n if (this.props.policy && this.props.policy.post_duration % 365 === 0) {\n return yearsOption();\n }\n return daysOption();\n };\n\n componentDidMount = async () => {\n this.loadPage();\n };\n private loadPage = async () => {\n if (this.props.policyId) {\n await this.props.actions.fetchPolicy(this.props.policyId);\n this.setState({\n policyName: this.props.policy?.display_name,\n messageRetentionInputValue: this.getMessageRetentionDefaultInputValue(),\n messageRetentionDropdownValue: this.getMessageRetentionDefaultDropdownValue(),\n });\n }\n };\n\n addToNewTeams = (teams: Team[]) => {\n let {removedTeamsCount} = this.state;\n const {newTeams, removedTeams} = this.state;\n teams.forEach((team: Team) => {\n if (removedTeams[team.id]?.id === team.id) {\n delete removedTeams[team.id];\n removedTeamsCount -= 1;\n } else {\n newTeams[team.id] = team;\n }\n });\n this.setState({newTeams: {...newTeams}, removedTeams: {...removedTeams}, removedTeamsCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n addToRemovedTeams = (team: Team) => {\n let {removedTeamsCount} = this.state;\n const {newTeams, removedTeams} = this.state;\n if (newTeams[team.id]?.id === team.id) {\n delete newTeams[team.id];\n } else if (removedTeams[team.id]?.id !== team.id) {\n removedTeamsCount += 1;\n removedTeams[team.id] = team;\n }\n this.setState({removedTeams: {...removedTeams}, newTeams: {...newTeams}, removedTeamsCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n addToNewChannels = (channels: ChannelWithTeamData[]) => {\n let {removedChannelsCount} = this.state;\n const {newChannels, removedChannels} = this.state;\n channels.forEach((channel: ChannelWithTeamData) => {\n if (removedChannels[channel.id]?.id === channel.id) {\n delete removedChannels[channel.id];\n removedChannelsCount -= 1;\n } else {\n newChannels[channel.id] = channel;\n }\n });\n this.setState({newChannels: {...newChannels}, removedChannels: {...removedChannels}, removedChannelsCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n addToRemovedChannels = (channel: ChannelWithTeamData) => {\n let {removedChannelsCount} = this.state;\n const {newChannels, removedChannels} = this.state;\n if (newChannels[channel.id]?.id === channel.id) {\n delete newChannels[channel.id];\n } else if (removedChannels[channel.id]?.id !== channel.id) {\n removedChannelsCount += 1;\n removedChannels[channel.id] = channel;\n }\n this.setState({removedChannels: {...removedChannels}, newChannels: {...newChannels}, removedChannelsCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n getTeamsToExclude = () => {\n const {teams} = this.props;\n const {newTeams, removedTeams} = this.state;\n\n let teamsToDisplay = teams?.map((team) => {\n return team.id;\n });\n const includeTeamsList = Object.keys(newTeams);\n\n // Remove teams to remove and add teams to add\n if (teamsToDisplay) {\n teamsToDisplay = teamsToDisplay?.filter((id) => !removedTeams[id]);\n teamsToDisplay = [...includeTeamsList, ...teamsToDisplay];\n }\n return teamsToDisplay;\n };\n handleSubmit = async () => {\n const {policyName, messageRetentionInputValue, messageRetentionDropdownValue, newTeams, removedTeams, newChannels, removedChannels} = this.state;\n const {policyId, policy} = this.props;\n const {\n updateDataRetentionCustomPolicy,\n addDataRetentionCustomPolicyTeams,\n removeDataRetentionCustomPolicyTeams,\n addDataRetentionCustomPolicyChannels,\n removeDataRetentionCustomPolicyChannels,\n } = this.props.actions;\n\n this.setState({saving: true});\n\n const teamsToAdd = Object.keys(newTeams);\n const teamsToRemove = Object.keys(removedTeams);\n const channelsToAdd = Object.keys(newChannels);\n const channelsToRemove = Object.keys(removedChannels);\n\n let error = false;\n let postDuration = parseInt(messageRetentionInputValue, 10);\n\n if (postDuration <= 0) {\n this.setState({\n formErrorText: (\n <FormattedMessage\n id='admin.data_retention.custom_policy.form.durationInput.error'\n defaultMessage='Error parsing message retention.'\n />\n ),\n saving: false,\n });\n return;\n }\n if (messageRetentionDropdownValue.value === FOREVER) {\n postDuration = -1;\n } else if (this.state.messageRetentionDropdownValue.value === YEARS) {\n postDuration = parseInt(messageRetentionInputValue, 10) * 365;\n }\n\n if (!policyName?.trim()) {\n this.setState({\n inputErrorText: (\n <FormattedMessage\n id='admin.data_retention.custom_policy.form.input.error'\n defaultMessage=\"Policy name can't be blank.\"\n />\n ),\n saving: false,\n });\n return;\n }\n\n if (policyId && policy) {\n const policyInfo = {\n display_name: policyName,\n post_duration: postDuration,\n };\n\n if (((policy?.team_count + teamsToAdd.length) - teamsToRemove.length) === 0 && ((policy?.channel_count + channelsToAdd.length) - channelsToRemove.length) === 0) {\n this.setState({\n formErrorText: (\n <FormattedMessage\n id='admin.data_retention.custom_policy.form.teamsError'\n defaultMessage='You must add a team or a channel to the policy.'\n />\n ),\n saving: false,\n });\n return;\n }\n\n const actions: Array<Promise<{data?: any; error?: Error}>> = [updateDataRetentionCustomPolicy(policyId, policyInfo)];\n if (teamsToAdd.length > 0) {\n actions.push(addDataRetentionCustomPolicyTeams(policyId, teamsToAdd));\n }\n if (teamsToRemove.length > 0) {\n actions.push(removeDataRetentionCustomPolicyTeams(policyId, teamsToRemove));\n }\n if (channelsToAdd.length > 0) {\n actions.push(addDataRetentionCustomPolicyChannels(policyId, channelsToAdd));\n }\n if (channelsToRemove.length > 0) {\n actions.push(removeDataRetentionCustomPolicyChannels(policyId, channelsToRemove));\n }\n const results = await Promise.all(actions);\n\n for (const result of results) {\n if (result.error) {\n error = true;\n }\n }\n } else {\n if (teamsToAdd.length < 1 && channelsToAdd.length < 1) {\n this.setState({\n formErrorText: (\n <FormattedMessage\n id='admin.data_retention.custom_policy.form.teamsError'\n defaultMessage='You must add a team or a channel to the policy.'\n />\n ),\n saving: false,\n });\n return;\n }\n const newPolicy = {\n display_name: policyName,\n post_duration: postDuration,\n team_ids: teamsToAdd,\n channel_ids: channelsToAdd,\n };\n\n const result = await this.props.actions.createDataRetentionCustomPolicy(newPolicy);\n if (result.error) {\n error = true;\n }\n }\n\n if (error) {\n this.setState({serverError: true, saving: false});\n } else {\n this.props.actions.setNavigationBlocked(false);\n getHistory().push('/admin_console/compliance/data_retention_settings');\n }\n };\n\n render = () => {\n const {serverError, formErrorText} = this.state;\n return (\n <div className='wrapper--fixed DataRetentionSettings'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/compliance/data_retention_settings'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.data_retention.customTitle'\n defaultMessage='Custom Retention Policy'\n />\n </div>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Header>\n <TitleAndButtonCardHeader\n title={\n <FormattedMessage\n id='admin.data_retention.custom_policy.form.title'\n defaultMessage='Name and retention'\n />\n }\n subtitle={\n <FormattedMessage\n id='admin.data_retention.custom_policy.form.subTitle'\n defaultMessage='Give your policy a name and configure retention settings.'\n />\n }\n />\n </Card.Header>\n <Card.Body\n expanded={true}\n >\n <div\n className='CustomPolicy__fields'\n >\n <Input\n name='policyName'\n aria-label='Policy name'\n type='text'\n value={this.state.policyName}\n onChange={(e) => {\n this.setState({policyName: e.target.value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }}\n placeholder={messages.policyName}\n customMessage={{type: ItemStatus.ERROR, value: this.state.inputErrorText}}\n />\n <DropdownInputHybrid\n onDropdownChange={(value) => {\n if (this.state.messageRetentionDropdownValue.value !== value.value) {\n this.setState({messageRetentionDropdownValue: value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }\n }}\n onInputChange={(e) => {\n this.setState({messageRetentionInputValue: e.target.value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }}\n value={this.state.messageRetentionDropdownValue}\n inputValue={this.state.messageRetentionInputValue}\n width={95}\n exceptionToInput={[FOREVER]}\n defaultValue={keepForeverOption()}\n options={[daysOption(), yearsOption(), keepForeverOption()]}\n legend={messages.channelAndDirectMessageRetention}\n placeholder={messages.channelAndDirectMessageRetention}\n inputType={'number'}\n name={'message_retention'}\n dropdownClassNamePrefix={'message_retention'}\n inputId={'message_retention_input'}\n />\n </div>\n\n </Card.Body>\n </Card>\n {this.state.addTeamOpen &&\n <TeamSelectorModal\n onModalDismissed={this.closeAddTeam}\n onTeamsSelected={(teams) => {\n this.addToNewTeams(teams);\n }}\n modalID={'CUSTOM_POLICY_TEAMS'}\n alreadySelected={Object.keys(this.state.newTeams)}\n excludePolicyConstrained={true}\n />\n }\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Header>\n <TitleAndButtonCardHeader\n title={\n <FormattedMessage\n id='admin.data_retention.custom_policy.team_selector.title'\n defaultMessage='Assigned teams'\n />\n }\n subtitle={\n <FormattedMessage\n id='admin.data_retention.custom_policy.team_selector.subTitle'\n defaultMessage='Add teams that will follow this retention policy.'\n />\n }\n buttonText={\n <FormattedMessage\n id='admin.data_retention.custom_policy.team_selector.addTeams'\n defaultMessage='Add teams'\n />\n }\n onClick={this.openAddTeam}\n />\n </Card.Header>\n <Card.Body\n expanded={true}\n >\n <TeamList\n onRemoveCallback={this.addToRemovedTeams}\n onAddCallback={this.addToNewTeams}\n teamsToRemove={this.state.removedTeams}\n teamsToAdd={this.state.newTeams}\n policyId={this.props.policyId}\n />\n </Card.Body>\n </Card>\n {this.state.addChannelOpen &&\n <ChannelSelectorModal\n onModalDismissed={this.closeAddChannel}\n onChannelsSelected={(channels) => {\n this.addToNewChannels(channels);\n }}\n groupID={''}\n alreadySelected={Object.keys(this.state.newChannels)}\n excludePolicyConstrained={true}\n excludeTeamIds={this.getTeamsToExclude()}\n />\n }\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Header>\n <TitleAndButtonCardHeader\n title={\n <FormattedMessage\n id='admin.data_retention.custom_policy.channel_selector.title'\n defaultMessage='Assigned channels'\n />\n }\n subtitle={\n <FormattedMessage\n id='admin.data_retention.custom_policy.channel_selector.subTitle'\n defaultMessage='Add channels that will follow this retention policy.'\n />\n }\n buttonText={\n <FormattedMessage\n id='admin.data_retention.custom_policy.channel_selector.addChannels'\n defaultMessage='Add channels'\n />\n }\n onClick={this.openAddChannel}\n />\n </Card.Header>\n <Card.Body\n expanded={true}\n >\n <ChannelList\n onRemoveCallback={this.addToRemovedChannels}\n onAddCallback={this.addToNewChannels}\n channelsToRemove={this.state.removedChannels}\n channelsToAdd={this.state.newChannels}\n policyId={this.props.policyId}\n />\n </Card.Body>\n </Card>\n </div>\n </div>\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.saving}\n disabled={!this.state.saveNeeded}\n onClick={this.handleSubmit}\n defaultMessage={(\n <FormattedMessage\n id='admin.data_retention.custom_policy.save'\n defaultMessage='Save'\n />\n )}\n />\n <BlockableLink\n className='cancel-button'\n to='/admin_console/compliance/data_retention_settings'\n >\n <FormattedMessage\n id='admin.data_retention.custom_policy.cancel'\n defaultMessage='Cancel'\n />\n </BlockableLink>\n {serverError &&\n <span className='CustomPolicy__error'>\n <i className='icon icon-alert-outline'/>\n <FormattedMessage\n id='admin.data_retention.custom_policy.serverError'\n defaultMessage='There are errors in the form above'\n />\n </span>\n }\n {\n formErrorText &&\n <span className='CustomPolicy__error'>\n <i className='icon icon-alert-outline'/>\n {formErrorText}\n </span>\n }\n </div>\n </div>\n );\n };\n}\n\nconst messages = defineMessages({\n channelAndDirectMessageRetention: {\n id: 'admin.data_retention.form.channelAndDirectMessageRetention',\n defaultMessage: 'Channel & direct message retention',\n },\n policyName: {\n id: 'admin.data_retention.custom_policy.form.input',\n defaultMessage: 'Policy name',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {\n getDataRetentionCustomPolicy as fetchPolicy,\n getDataRetentionCustomPolicyTeams as fetchPolicyTeams,\n createDataRetentionCustomPolicy,\n updateDataRetentionCustomPolicy,\n addDataRetentionCustomPolicyTeams,\n removeDataRetentionCustomPolicyTeams,\n addDataRetentionCustomPolicyChannels,\n removeDataRetentionCustomPolicyChannels,\n} from 'mattermost-redux/actions/admin';\nimport {getDataRetentionCustomPolicy} from 'mattermost-redux/selectors/entities/admin';\nimport {getTeamsInPolicy} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setNavigationBlocked} from 'actions/admin_actions.jsx';\n\nimport type {GlobalState} from 'types/store';\n\nimport CustomPolicyForm from './custom_policy_form';\n\ntype OwnProps = {\n match: {\n params: {\n policy_id: string;\n };\n };\n}\n\nfunction mapStateToProps() {\n const getPolicyTeams = getTeamsInPolicy();\n return (state: GlobalState, ownProps: OwnProps) => {\n const policyId = ownProps.match.params.policy_id;\n const policy = getDataRetentionCustomPolicy(state, policyId);\n const teams = policyId ? getPolicyTeams(state, {policyId}) : [];\n return {\n policyId,\n policy,\n teams,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n fetchPolicy,\n fetchPolicyTeams,\n createDataRetentionCustomPolicy,\n updateDataRetentionCustomPolicy,\n addDataRetentionCustomPolicyTeams,\n removeDataRetentionCustomPolicyTeams,\n addDataRetentionCustomPolicyChannels,\n removeDataRetentionCustomPolicyChannels,\n setNavigationBlocked,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CustomPolicyForm);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages, FormattedMessage} from 'react-intl';\n\nimport type {AdminConfig, EnvironmentConfig} from '@mattermost/types/config';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport {keepForeverOption, yearsOption, daysOption, FOREVER, YEARS, DAYS, hoursOption} from 'components/admin_console/data_retention_settings/dropdown_options/dropdown_options';\nimport SetByEnv from 'components/admin_console/set_by_env';\nimport Card from 'components/card/card';\nimport SaveButton from 'components/save_button';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport DropdownInputHybrid from 'components/widgets/inputs/dropdown_input_hybrid';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport './global_policy_form.scss';\n\ntype ValueType = {\n label: string | JSX.Element;\n value: string;\n}\ntype Props = {\n config: DeepPartial<AdminConfig>;\n messageRetentionHours: string | undefined;\n fileRetentionHours: string | undefined;\n environmentConfig: Partial<EnvironmentConfig>;\n actions: {\n patchConfig: (config: DeepPartial<AdminConfig>) => Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => void;\n };\n};\ntype State = {\n messageRetentionDropdownValue: ValueType;\n messageRetentionInputValue: string;\n fileRetentionDropdownValue: ValueType;\n fileRetentionInputValue: string;\n saveNeeded: boolean;\n saving: boolean;\n serverError: React.ReactNode;\n formErrorText: React.ReactNode;\n}\n\nexport default class GlobalPolicyForm extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n const {DataRetentionSettings} = props.config;\n this.state = {\n saveNeeded: false,\n saving: false,\n serverError: null,\n formErrorText: '',\n messageRetentionDropdownValue: this.getDefaultDropdownValue(DataRetentionSettings?.EnableMessageDeletion, props.messageRetentionHours),\n messageRetentionInputValue: this.getDefaultInputValue(DataRetentionSettings?.EnableMessageDeletion, props.messageRetentionHours),\n fileRetentionDropdownValue: this.getDefaultDropdownValue(DataRetentionSettings?.EnableFileDeletion, props.fileRetentionHours),\n fileRetentionInputValue: this.getDefaultInputValue(DataRetentionSettings?.EnableFileDeletion, props.fileRetentionHours),\n };\n }\n\n getDefaultInputValue = (isEnabled: boolean | undefined, hours: string | undefined): string => {\n if (!isEnabled || hours === undefined) {\n return '';\n }\n const hoursInt = parseInt(hours, 10);\n\n // 8760 hours in a year\n if (hoursInt % 8760 === 0) {\n return (hoursInt / 8760).toString();\n }\n if (hoursInt % 24 === 0) {\n return (hoursInt / 24).toString();\n }\n\n return hours.toString();\n };\n getDefaultDropdownValue = (isEnabled: boolean | undefined, hours: string | undefined) => {\n if (!isEnabled || hours === undefined) {\n return keepForeverOption();\n }\n const hoursInt = parseInt(hours, 10);\n\n // 8760 hours in a year\n if (hoursInt % 8760 === 0) {\n return yearsOption();\n }\n if (hoursInt % 24 === 0) {\n return daysOption();\n }\n\n return hoursOption();\n };\n\n handleSubmit = async () => {\n const {messageRetentionDropdownValue, messageRetentionInputValue, fileRetentionDropdownValue, fileRetentionInputValue} = this.state;\n const newConfig: AdminConfig = JSON.parse(JSON.stringify(this.props.config));\n\n this.setState({saving: true});\n\n if ((messageRetentionDropdownValue.value !== FOREVER && parseInt(messageRetentionInputValue, 10) < 1) || (fileRetentionDropdownValue.value !== FOREVER && parseInt(fileRetentionInputValue, 10) < 1)) {\n this.setState({\n formErrorText: (\n <FormattedMessage\n id='admin.data_retention.global_policy.form.numberError'\n defaultMessage='You must add a number greater than or equal to 1.'\n />\n ),\n saving: false,\n });\n return;\n }\n\n newConfig.DataRetentionSettings.EnableMessageDeletion = this.setDeletionEnabled(messageRetentionDropdownValue.value);\n\n if (!this.isMessageRetentionSetByEnv() && this.setDeletionEnabled(messageRetentionDropdownValue.value)) {\n newConfig.DataRetentionSettings.MessageRetentionDays = 0;\n newConfig.DataRetentionSettings.MessageRetentionHours = this.setRetentionHours(messageRetentionDropdownValue.value, messageRetentionInputValue);\n }\n\n newConfig.DataRetentionSettings.EnableFileDeletion = this.setDeletionEnabled(fileRetentionDropdownValue.value);\n\n if (!this.isFileRetentionSetByEnv() && this.setDeletionEnabled(fileRetentionDropdownValue.value)) {\n newConfig.DataRetentionSettings.FileRetentionDays = 0;\n newConfig.DataRetentionSettings.FileRetentionHours = this.setRetentionHours(fileRetentionDropdownValue.value, fileRetentionInputValue);\n }\n\n const {error} = await this.props.actions.patchConfig(newConfig);\n\n if (error) {\n this.setState({serverError: error.message, saving: false});\n } else {\n this.props.actions.setNavigationBlocked(false);\n getHistory().push('/admin_console/compliance/data_retention_settings');\n }\n };\n\n setDeletionEnabled = (dropdownValue: string) => {\n if (dropdownValue === FOREVER) {\n return false;\n }\n return true;\n };\n\n setRetentionHours = (dropdownValue: string, value: string): number => {\n if (dropdownValue === YEARS) {\n return parseInt(value, 10) * 24 * 365;\n }\n if (dropdownValue === DAYS) {\n return parseInt(value, 10) * 24;\n }\n return parseInt(value, 10);\n };\n\n isMessageRetentionSetByEnv = () => {\n return (this.props.environmentConfig?.DataRetentionSettings?.MessageRetentionDays && this.props.config.DataRetentionSettings?.MessageRetentionDays && this.props.config.DataRetentionSettings.MessageRetentionDays > 0) ||\n (this.props.environmentConfig?.DataRetentionSettings?.MessageRetentionHours && this.props.config.DataRetentionSettings?.MessageRetentionHours && this.props.config.DataRetentionSettings.MessageRetentionHours > 0) ||\n (this.props.environmentConfig?.DataRetentionSettings?.EnableMessageDeletion && !this.props.config.DataRetentionSettings?.EnableMessageDeletion);\n };\n\n isFileRetentionSetByEnv = () => {\n return (this.props.environmentConfig?.DataRetentionSettings?.FileRetentionDays && this.props.config.DataRetentionSettings?.FileRetentionDays && this.props.config.DataRetentionSettings.FileRetentionDays > 0) ||\n (this.props.environmentConfig?.DataRetentionSettings?.FileRetentionHours && this.props.config.DataRetentionSettings?.FileRetentionHours && this.props.config.DataRetentionSettings.FileRetentionHours > 0) ||\n (this.props.environmentConfig?.DataRetentionSettings?.EnableFileDeletion && !this.props.config.DataRetentionSettings?.EnableFileDeletion);\n };\n\n render = () => {\n return (\n <div className='wrapper--fixed DataRetentionSettings'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/compliance/data_retention_settings'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.data_retention.globalPolicyTitle'\n defaultMessage='Global Retention Policy'\n />\n </div>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <Card\n expanded={true}\n className={'console'}\n >\n <Card.Body>\n <div\n className='global_policy'\n >\n <p>\n <FormattedMessage\n id='admin.data_retention.form.text'\n defaultMessage='Applies to all teams and channels, but does not apply to custom retention policies.'\n />\n </p>\n <div id='global_direct_message_dropdown'>\n <DropdownInputHybrid\n onDropdownChange={(value) => {\n if (this.state.messageRetentionDropdownValue.value !== value.value) {\n this.setState({messageRetentionDropdownValue: value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }\n }}\n onInputChange={(e) => {\n this.setState({messageRetentionInputValue: e.target.value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }}\n value={this.state.messageRetentionDropdownValue}\n inputValue={this.state.messageRetentionInputValue}\n width={90}\n exceptionToInput={[FOREVER]}\n disabled={this.isMessageRetentionSetByEnv()}\n defaultValue={keepForeverOption()}\n options={[hoursOption(), daysOption(), yearsOption(), keepForeverOption()]}\n legend={messages.channelAndMessageRetention}\n placeholder={messages.channelAndMessageRetention}\n name={'channel_message_retention'}\n inputType={'number'}\n dropdownClassNamePrefix={'channel_message_retention_dropdown'}\n inputId={'channel_message_retention_input'}\n />\n {this.isMessageRetentionSetByEnv() && <SetByEnv/>}\n </div>\n <div id='global_file_dropdown'>\n <DropdownInputHybrid\n onDropdownChange={(value) => {\n if (this.state.fileRetentionDropdownValue.value !== value.value) {\n this.setState({fileRetentionDropdownValue: value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }\n }}\n onInputChange={(e) => {\n this.setState({fileRetentionInputValue: e.target.value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n }}\n value={this.state.fileRetentionDropdownValue}\n inputValue={this.state.fileRetentionInputValue}\n width={90}\n exceptionToInput={[FOREVER]}\n disabled={this.isFileRetentionSetByEnv()}\n defaultValue={keepForeverOption()}\n options={[hoursOption(), daysOption(), yearsOption(), keepForeverOption()]}\n legend={messages.fileRetention}\n placeholder={messages.fileRetention}\n name={'file_retention'}\n inputType={'number'}\n dropdownClassNamePrefix={'file_retention_dropdown'}\n inputId={'file_retention_input'}\n />\n {this.isFileRetentionSetByEnv() && <SetByEnv/>}\n </div>\n </div>\n\n </Card.Body>\n </Card>\n </div>\n </div>\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.saving}\n disabled={!this.state.saveNeeded}\n onClick={this.handleSubmit}\n defaultMessage={(\n <FormattedMessage\n id='admin.data_retention.custom_policy.save'\n defaultMessage='Save'\n />\n )}\n />\n <BlockableLink\n className='cancel-button'\n to='/admin_console/compliance/data_retention_settings'\n >\n <FormattedMessage\n id='admin.data_retention.custom_policy.cancel'\n defaultMessage='Cancel'\n />\n </BlockableLink>\n {this.state.serverError &&\n <span className='CustomPolicy__error'>\n <i className='icon icon-alert-outline'/>\n {this.state.serverError}\n </span>\n }\n {\n this.state.formErrorText &&\n <span className='CustomPolicy__error'>\n <i className='icon icon-alert-outline'/>\n {this.state.formErrorText}\n </span>\n }\n </div>\n </div>\n );\n };\n}\n\nconst messages = defineMessages({\n channelAndMessageRetention: {\n id: 'admin.data_retention.form.channelAndDirectMessageRetention',\n defaultMessage: 'Channel & direct message retention',\n },\n fileRetention: {\n id: 'admin.data_retention.form.fileRetention',\n defaultMessage: 'File retention',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {\n patchConfig,\n} from 'mattermost-redux/actions/admin';\nimport {getEnvironmentConfig} from 'mattermost-redux/selectors/entities/admin';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {setNavigationBlocked} from 'actions/admin_actions.jsx';\n\nimport type {GlobalState} from 'types/store';\n\nimport GlobalPolicyForm from './global_policy_form';\n\nfunction mapStateToProps(state: GlobalState) {\n const messageRetentionHours = getConfig(state).DataRetentionMessageRetentionHours;\n const fileRetentionHours = getConfig(state).DataRetentionFileRetentionHours;\n\n return {\n messageRetentionHours,\n fileRetentionHours,\n environmentConfig: getEnvironmentConfig(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchConfig,\n setNavigationBlocked,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GlobalPolicyForm);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useMemo, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {SchemaMigration} from '@mattermost/types/admin';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport './migrations_table.scss';\n\ntype Props = {\n createHelpText: React.ReactElement;\n className?: string;\n actions: {\n getAppliedSchemaMigrations: () => Promise<ActionResult>;\n };\n}\n\nconst MigrationsTable = ({\n createHelpText,\n className,\n actions,\n}: Props) => {\n const [migrations, setMigrations] = useState<SchemaMigration[]>([]);\n\n useEffect(() => {\n async function handleGetAppliedSchemaMigrations() {\n const result: ActionResult = await actions.getAppliedSchemaMigrations();\n if (result.data) {\n setMigrations(result.data);\n }\n }\n\n handleGetAppliedSchemaMigrations();\n }, []);\n\n const items = useMemo(() => migrations.map((migration) => {\n return (\n <tr\n key={migration.version}\n >\n <td className='whitespace--nowrap'>{migration.version}</td>\n <td className='whitespace--nowrap'>{migration.name}</td>\n </tr>\n );\n }), [migrations]);\n\n return (\n <div className={classNames('MigrationsTable', 'migrations-table__panel', className)}>\n <div className='help-text'>\n {createHelpText}\n </div>\n <div className='migrations-table__table'>\n <table\n className='table'\n data-testid='migrationsTable'\n >\n <thead>\n <tr>\n <th>\n <FormattedMessage\n id='admin.database.migrations_table.version'\n defaultMessage='Version'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.database.migrations_table.name'\n defaultMessage='Name'\n />\n </th>\n </tr>\n </thead>\n <tbody>\n {items}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n\nexport default React.memo(MigrationsTable);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getAppliedSchemaMigrations} from 'mattermost-redux/actions/admin';\n\nimport MigrationsTable from './migrations_table';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getAppliedSchemaMigrations,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(MigrationsTable);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {recycleDatabaseConnection, ping} from 'actions/admin_actions';\n\nimport ExternalLink from 'components/external_link';\n\nimport {DocLinks} from 'utils/constants';\n\nimport BooleanSetting from './boolean_setting';\nimport MigrationsTable from './database';\nimport type {BaseState} from './old_admin_settings';\nimport OLDAdminSettings from './old_admin_settings';\nimport RequestButton from './request_button/request_button';\nimport SettingSet from './setting_set';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ntype Props = {\n license: {\n IsLicensed: string;\n };\n isDisabled: boolean;\n};\n\ninterface State extends BaseState {\n searchBackend: string;\n maxIdleConns: number;\n maxOpenConns: number;\n trace: boolean;\n disableDatabaseSearch: boolean;\n queryTimeout: number;\n connMaxLifetimeMilliseconds: number;\n connMaxIdleTimeMilliseconds: number;\n minimumHashtagLength: number;\n dataSource: string;\n driverName: string;\n}\n\nconst messages = defineMessages({\n title: {id: 'admin.database.title', defaultMessage: 'Database Settings'},\n recycleDescription: {id: 'admin.recycle.recycleDescription', defaultMessage: 'Deployments using multiple databases can switch from one master database to another without restarting the Mattermost server by updating \"config.json\" to the new desired configuration and using the {reloadConfiguration} feature to load the new settings while the server is running. The administrator should then use {featureName} feature to recycle the database connections based on the new settings.'},\n featureName: {id: 'admin.recycle.recycleDescription.featureName', defaultMessage: 'Recycle Database Connections'},\n reloadConfiguration: {id: 'admin.recycle.recycleDescription.reloadConfiguration', defaultMessage: 'Environment > Web Server > Reload Configuration from Disk'},\n button: {id: 'admin.recycle.button', defaultMessage: 'Recycle Database Connections'},\n noteDescription: {id: 'admin.sql.noteDescription', defaultMessage: 'Changing properties in this section will require a server restart before taking effect.'},\n disableDatabaseSearchTitle: {id: 'admin.sql.disableDatabaseSearchTitle', defaultMessage: 'Disable database search: '},\n disableDatabaseSearchDescription: {id: 'admin.sql.disableDatabaseSearchDescription', defaultMessage: 'Disables the use of the database to perform searches. Should only be used when other <link>search engines</link> are configured.'},\n driverName: {id: 'admin.sql.driverName', defaultMessage: 'Driver Name:'},\n driverNameDescription: {id: 'admin.sql.driverNameDescription', defaultMessage: 'Set the database driver in the config.json file.'},\n dataSource: {id: 'admin.sql.dataSource', defaultMessage: 'Data Source:'},\n dataSourceDescription: {id: 'admin.sql.dataSourceDescription', defaultMessage: 'Set the database source in the config.json file.'},\n maxConnectionsTitle: {id: 'admin.sql.maxConnectionsTitle', defaultMessage: 'Maximum Idle Connections:'},\n maxConnectionsDescription: {id: 'admin.sql.maxConnectionsDescription', defaultMessage: 'Maximum number of idle connections held open to the database.'},\n maxOpenTitle: {id: 'admin.sql.maxOpenTitle', defaultMessage: 'Maximum Open Connections:'},\n maxOpenDescription: {id: 'admin.sql.maxOpenDescription', defaultMessage: 'Maximum number of open connections held open to the database.'},\n queryTimeoutTitle: {id: 'admin.sql.queryTimeoutTitle', defaultMessage: 'Query Timeout:'},\n queryTimeoutDescription: {id: 'admin.sql.queryTimeoutDescription', defaultMessage: 'The number of seconds to wait for a response from the database after opening a connection and sending the query. Errors that you see in the UI or in the logs as a result of a query timeout can vary depending on the type of query.'},\n connMaxLifetimeTitle: {id: 'admin.sql.connMaxLifetimeTitle', defaultMessage: 'Maximum Connection Lifetime:'},\n connMaxLifetimeDescription: {id: 'admin.sql.connMaxLifetimeDescription', defaultMessage: 'Maximum lifetime for a connection to the database in milliseconds.'},\n connMaxIdleTimeTitle: {id: 'admin.sql.connMaxIdleTimeTitle', defaultMessage: 'Maximum Connection Idle Time:'},\n connMaxIdleTimeDescription: {id: 'admin.sql.connMaxIdleTimeDescription', defaultMessage: 'Maximum idle time for a connection to the database in milliseconds.'},\n minimumHashtagLengthTitle: {id: 'admin.service.minimumHashtagLengthTitle', defaultMessage: 'Minimum Hashtag Length:'},\n minimumHashtagLengthDescription: {id: 'admin.service.minimumHashtagLengthDescription', defaultMessage: 'Minimum number of characters in a hashtag. This must be greater than or equal to 2. MySQL databases must be configured to support searching strings shorter than three characters, <link>see documentation</link>.'},\n traceTitle: {id: 'admin.sql.traceTitle', defaultMessage: 'SQL Statement Logging: '},\n traceDescription: {id: 'admin.sql.traceDescription', defaultMessage: '(Development Mode) When true, executing SQL statements are written to the log.'},\n});\n\nexport const searchableStrings: Array<string|MessageDescriptor|[MessageDescriptor, {[key: string]: any}]> = [\n messages.title,\n [messages.recycleDescription, {featureName: '', reloadConfiguration: ''}],\n messages.featureName,\n messages.reloadConfiguration,\n messages.button,\n messages.noteDescription,\n messages.disableDatabaseSearchTitle,\n messages.disableDatabaseSearchDescription,\n messages.driverName,\n messages.driverNameDescription,\n messages.dataSource,\n messages.dataSourceDescription,\n messages.maxConnectionsTitle,\n messages.maxConnectionsDescription,\n messages.maxOpenTitle,\n messages.maxOpenDescription,\n messages.queryTimeoutTitle,\n messages.queryTimeoutDescription,\n messages.connMaxLifetimeTitle,\n messages.connMaxLifetimeDescription,\n messages.connMaxIdleTimeTitle,\n messages.connMaxIdleTimeDescription,\n messages.traceTitle,\n messages.traceDescription,\n];\n\nexport default class DatabaseSettings extends OLDAdminSettings<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n ...this.state,\n searchBackend: '',\n };\n }\n\n getConfigFromState = (config: AdminConfig) => {\n // driverName and dataSource are read-only from the UI\n\n config.SqlSettings.MaxIdleConns = this.parseIntNonZero(this.state.maxIdleConns);\n config.SqlSettings.MaxOpenConns = this.parseIntNonZero(this.state.maxOpenConns);\n config.SqlSettings.Trace = this.state.trace;\n config.SqlSettings.DisableDatabaseSearch = this.state.disableDatabaseSearch;\n config.SqlSettings.QueryTimeout = this.parseIntNonZero(this.state.queryTimeout);\n config.SqlSettings.ConnMaxLifetimeMilliseconds = this.parseIntNonNegative(this.state.connMaxLifetimeMilliseconds);\n config.SqlSettings.ConnMaxIdleTimeMilliseconds = this.parseIntNonNegative(this.state.connMaxIdleTimeMilliseconds);\n config.ServiceSettings.MinimumHashtagLength = this.parseIntNonZero(this.state.minimumHashtagLength, 3, 2);\n\n return config;\n };\n\n componentDidMount() {\n this.getSearchBackend().then((searchBackend) => {\n this.setState({searchBackend});\n });\n }\n\n async getSearchBackend() {\n const res = await ping()();\n return res.ActiveSearchBackend;\n }\n\n getStateFromConfig(config: AdminConfig) {\n return {\n driverName: config.SqlSettings.DriverName,\n dataSource: config.SqlSettings.DataSource,\n maxIdleConns: config.SqlSettings.MaxIdleConns,\n maxOpenConns: config.SqlSettings.MaxOpenConns,\n trace: config.SqlSettings.Trace,\n disableDatabaseSearch: config.SqlSettings.DisableDatabaseSearch,\n queryTimeout: config.SqlSettings.QueryTimeout,\n connMaxLifetimeMilliseconds: config.SqlSettings.ConnMaxLifetimeMilliseconds,\n connMaxIdleTimeMilliseconds: config.SqlSettings.ConnMaxIdleTimeMilliseconds,\n minimumHashtagLength: config.ServiceSettings.MinimumHashtagLength,\n };\n }\n\n renderTitle() {\n return (<FormattedMessage {...messages.title}/>);\n }\n\n renderSettings = () => {\n const dataSource = '**********' + this.state.dataSource.substring(this.state.dataSource.indexOf('@'));\n\n let recycleDbButton = <div/>;\n if (this.props.license.IsLicensed === 'true') {\n recycleDbButton = (\n <RequestButton\n requestAction={recycleDatabaseConnection}\n helpText={\n <FormattedMessage\n {...messages.recycleDescription}\n values={{\n featureName: (\n <b>\n <FormattedMessage {...messages.featureName}/>\n </b>\n ),\n reloadConfiguration: (\n <a href='../environment/web_server'>\n <b>\n <FormattedMessage {...messages.reloadConfiguration}/>\n </b>\n </a>\n ),\n }}\n />\n }\n buttonText={\n <FormattedMessage {...messages.button}/>\n }\n showSuccessMessage={false}\n errorMessage={defineMessage({\n id: 'admin.recycle.reloadFail',\n defaultMessage: 'Recycling unsuccessful: {error}',\n })}\n includeDetailedError={true}\n disabled={this.props.isDisabled}\n />\n );\n }\n\n return (\n <SettingsGroup>\n <div className='banner'>\n <FormattedMessage {...messages.noteDescription}/>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='DriverName'\n >\n <FormattedMessage {...messages.driverName}/>\n </label>\n <div className='col-sm-8'>\n <input\n type='text'\n className='form-control'\n value={this.state.driverName}\n disabled={true}\n />\n <div className='help-text'>\n <FormattedMessage {...messages.driverNameDescription}/>\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='DataSource'\n >\n <FormattedMessage {...messages.dataSource}/>\n </label>\n <div className='col-sm-8'>\n <input\n type='text'\n className='form-control'\n value={dataSource}\n disabled={true}\n />\n <div className='help-text'>\n <FormattedMessage {...messages.dataSourceDescription}/>\n </div>\n </div>\n </div>\n <TextSetting\n id='maxIdleConns'\n label={\n <FormattedMessage {...messages.maxConnectionsTitle}/>\n }\n placeholder={defineMessage({id: 'admin.sql.maxConnectionsExample', defaultMessage: 'E.g.: \"10\"'})}\n helpText={\n <FormattedMessage {...messages.maxConnectionsDescription}/>\n }\n value={this.state.maxIdleConns}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.MaxIdleConns')}\n disabled={this.props.isDisabled}\n type='text'\n />\n <TextSetting\n id='maxOpenConns'\n label={\n <FormattedMessage {...messages.maxOpenTitle}/>\n }\n placeholder={defineMessage({id: 'admin.sql.maxOpenExample', defaultMessage: 'E.g.: \"10\"'})}\n helpText={\n <FormattedMessage {...messages.maxOpenDescription}/>\n }\n value={this.state.maxOpenConns}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.MaxOpenConns')}\n disabled={this.props.isDisabled}\n type='text'\n />\n <TextSetting\n id='queryTimeout'\n label={\n <FormattedMessage {...messages.queryTimeoutTitle}/>\n }\n placeholder={defineMessage({id: 'admin.sql.queryTimeoutExample', defaultMessage: 'E.g.: \"30\"'})}\n helpText={\n <FormattedMessage {...messages.queryTimeoutDescription}/>\n }\n value={this.state.queryTimeout}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.QueryTimeout')}\n disabled={this.props.isDisabled}\n type='text'\n />\n <TextSetting\n id='connMaxLifetimeMilliseconds'\n label={\n <FormattedMessage {...messages.connMaxLifetimeTitle}/>\n }\n placeholder={defineMessage({id: 'admin.sql.connMaxLifetimeExample', defaultMessage: 'E.g.: \"3600000\"'})}\n helpText={\n <FormattedMessage {...messages.connMaxLifetimeDescription}/>\n }\n value={this.state.connMaxLifetimeMilliseconds}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.ConnMaxLifetimeMilliseconds')}\n disabled={this.props.isDisabled}\n type='text'\n />\n <TextSetting\n id='connMaxIdleTimeMilliseconds'\n label={\n <FormattedMessage {...messages.connMaxIdleTimeTitle}/>\n }\n placeholder={defineMessage({id: 'admin.sql.connMaxIdleTimeExample', defaultMessage: 'E.g.: \"300000\"'})}\n helpText={\n <FormattedMessage {...messages.connMaxIdleTimeDescription}/>\n }\n value={this.state.connMaxIdleTimeMilliseconds}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.ConnMaxIdleTimeMilliseconds')}\n disabled={this.props.isDisabled}\n type='text'\n />\n <TextSetting\n id='minimumHashtagLength'\n label={\n <FormattedMessage {...messages.minimumHashtagLengthTitle}/>\n }\n placeholder={defineMessage({id: 'admin.service.minimumHashtagLengthExample', defaultMessage: 'E.g.: \"3\"'})}\n helpText={\n <FormattedMessage\n {...messages.minimumHashtagLengthDescription}\n values={{\n link: (msg) => (\n <ExternalLink\n location='database_settings'\n href='https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.minimumHashtagLength}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.MinimumHashtagLength')}\n disabled={this.props.isDisabled}\n type='text'\n />\n <BooleanSetting\n id='trace'\n label={\n <FormattedMessage {...messages.traceTitle}/>\n }\n helpText={\n <FormattedMessage {...messages.traceDescription}/>\n }\n value={this.state.trace}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.Trace')}\n disabled={this.props.isDisabled}\n />\n {recycleDbButton}\n <BooleanSetting\n id='disableDatabaseSearch'\n label={\n <FormattedMessage {...messages.disableDatabaseSearchTitle}/>\n }\n helpText={\n <FormattedMessage\n {...messages.disableDatabaseSearchDescription}\n values={{\n link: (msg) => (\n <ExternalLink\n location='database_settings'\n href={DocLinks.ELASTICSEARCH}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.disableDatabaseSearch}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('SqlSettings.DisableDatabaseSearch')}\n disabled={this.props.isDisabled}\n />\n <SettingSet\n label={\n <FormattedMessage\n id='admin.database.migrations_table.title'\n defaultMessage='Schema Migrations:'\n />\n }\n >\n <div className='migrations-table-setting'>\n <MigrationsTable\n createHelpText={\n <FormattedMessage\n id='admin.database.migrations_table.help_text'\n defaultMessage='All applied migrations.'\n />\n }\n />\n </div>\n </SettingSet>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='activeSearchBackend'\n >\n <FormattedMessage\n id='admin.database.search_backend.title'\n defaultMessage='Active Search Backend:'\n />\n </label>\n <div className='col-sm-8'>\n <input\n id='activeSearchBackend'\n type='text'\n className='form-control'\n value={this.state.searchBackend}\n disabled={true}\n />\n <div className='help-text'>\n <FormattedMessage\n id='admin.database.search_backend.help_text'\n defaultMessage='Shows the currently active backend used for search. Values can be none, database, elasticsearch, bleve etc.'\n />\n </div>\n </div>\n </div>\n </SettingsGroup>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {Job, JobType} from '@mattermost/types/jobs';\n\nimport {elasticsearchPurgeIndexes, elasticsearchTest, rebuildChannelsIndex} from 'actions/admin_actions.jsx';\n\nimport ExternalLink from 'components/external_link';\n\nimport {DocLinks, JobStatuses, JobTypes} from 'utils/constants';\n\nimport BooleanSetting from './boolean_setting';\nimport JobsTable from './jobs';\nimport OLDAdminSettings from './old_admin_settings';\nimport type {BaseProps, BaseState} from './old_admin_settings';\nimport RequestButton from './request_button/request_button';\nimport SettingSet from './setting_set';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ninterface State extends BaseState {\n connectionUrl: string;\n backend: string;\n skipTLSVerification: boolean;\n ca: string;\n clientCert: string;\n clientKey: string;\n username: string;\n password: string;\n sniff: boolean;\n enableIndexing: boolean;\n enableSearching: boolean;\n enableAutocomplete: boolean;\n configTested: boolean;\n canSave: boolean;\n canPurgeAndIndex: boolean;\n ignoredPurgeIndexes: string;\n}\n\ntype Props = BaseProps & {\n config: AdminConfig;\n};\n\nexport const messages = defineMessages({\n title: {id: 'admin.elasticsearch.title', defaultMessage: 'Elasticsearch'},\n enableIndexingTitle: {id: 'admin.elasticsearch.enableIndexingTitle', defaultMessage: 'Enable Elasticsearch Indexing:'},\n enableIndexingDescription: {id: 'admin.elasticsearch.enableIndexingDescription', defaultMessage: 'When true, indexing of new posts occurs automatically. Search queries will use database search until \"Enable Elasticsearch for search queries\" is enabled. <link>Learn more about Elasticsearch in our documentation.</link>'},\n connectionUrlTitle: {id: 'admin.elasticsearch.connectionUrlTitle', defaultMessage: 'Server Connection Address:'},\n connectionUrlDescription: {id: 'admin.elasticsearch.connectionUrlDescription', defaultMessage: 'The address of the Elasticsearch server. <link>Please see documentation with server setup instructions.</link>'},\n skipTLSVerificationTitle: {id: 'admin.elasticsearch.skipTLSVerificationTitle', defaultMessage: 'Skip TLS Verification:'},\n skipTLSVerificationDescription: {id: 'admin.elasticsearch.skipTLSVerificationDescription', defaultMessage: 'When true, Mattermost will not require the Elasticsearch certificate to be signed by a trusted Certificate Authority.'},\n usernameTitle: {id: 'admin.elasticsearch.usernameTitle', defaultMessage: 'Server Username:'},\n usernameDescription: {id: 'admin.elasticsearch.usernameDescription', defaultMessage: '(Optional) The username to authenticate to the Elasticsearch server.'},\n passwordTitle: {id: 'admin.elasticsearch.passwordTitle', defaultMessage: 'Server Password:'},\n passwordDescription: {id: 'admin.elasticsearch.passwordDescription', defaultMessage: '(Optional) The password to authenticate to the Elasticsearch server.'},\n sniffTitle: {id: 'admin.elasticsearch.sniffTitle', defaultMessage: 'Enable Cluster Sniffing:'},\n sniffDescription: {id: 'admin.elasticsearch.sniffDescription', defaultMessage: 'When true, sniffing finds and connects to all data nodes in your cluster automatically.'},\n testHelpText: {id: 'admin.elasticsearch.testHelpText', defaultMessage: 'Tests if the Mattermost server can connect to the Elasticsearch server specified. Testing the connection only saves the configuration if the test is successful. A successful test will also re-initialize the client if you have started Elasticsearch after starting Mattermost. But this will not restart the workers. To do that, please toggle \"Enable Elasticsearch Indexing\".'},\n elasticsearch_test_button: {id: 'admin.elasticsearch.elasticsearch_test_button', defaultMessage: 'Test Connection'},\n bulkIndexingTitle: {id: 'admin.elasticsearch.bulkIndexingTitle', defaultMessage: 'Bulk Indexing:'},\n help: {id: 'admin.elasticsearch.createJob.help', defaultMessage: 'All users, channels and posts in the database will be indexed from oldest to newest. Elasticsearch is available during indexing but search results may be incomplete until the indexing job is complete.'},\n rebuildChannelsIndexTitle: {id: 'admin.elasticsearch.rebuildChannelsIndexTitle', defaultMessage: 'Rebuild Channels Index'},\n rebuildChannelIndexHelpText: {id: 'admin.elasticsearch.rebuildChannelsIndex.helpText', defaultMessage: 'This purges the channels index and re-indexes all channels in the database, from oldest to newest. Channel autocomplete is available during indexing but search results may be incomplete until the indexing job is complete.\\n<b>Note- Please ensure no other indexing job is in progress in the table above.</b>'},\n rebuildChannelsIndexButtonText: {id: 'admin.elasticsearch.rebuildChannelsIndex.title', defaultMessage: 'Rebuild Channels Index'},\n purgeIndexesHelpText: {id: 'admin.elasticsearch.purgeIndexesHelpText', defaultMessage: 'Purging will entirely remove the indexes on the Elasticsearch server. Search results may be incomplete until a bulk index of the existing database is rebuilt.'},\n purgeIndexesButton: {id: 'admin.elasticsearch.purgeIndexesButton', defaultMessage: 'Purge Index'},\n label: {id: 'admin.elasticsearch.purgeIndexesButton.label', defaultMessage: 'Purge Indexes:'},\n enableSearchingTitle: {id: 'admin.elasticsearch.enableSearchingTitle', defaultMessage: 'Enable Elasticsearch for search queries:'},\n enableSearchingDescription: {id: 'admin.elasticsearch.enableSearchingDescription', defaultMessage: 'Requires a successful connection to the Elasticsearch server. When true, Elasticsearch will be used for all search queries using the latest index. Search results may be incomplete until a bulk index of the existing post database is finished. When false, database search is used.'},\n});\n\nexport const searchableStrings: Array<string|MessageDescriptor|[MessageDescriptor, {[key: string]: any}]> = [\n [messages.connectionUrlDescription, {documentationLink: ''}],\n [messages.enableIndexingDescription, {documentationLink: ''}],\n messages.title,\n messages.enableIndexingTitle,\n messages.connectionUrlTitle,\n messages.skipTLSVerificationTitle,\n messages.skipTLSVerificationDescription,\n messages.usernameTitle,\n messages.usernameDescription,\n messages.passwordTitle,\n messages.passwordDescription,\n messages.sniffTitle,\n messages.sniffDescription,\n messages.testHelpText,\n messages.elasticsearch_test_button,\n messages.bulkIndexingTitle,\n messages.help,\n messages.purgeIndexesHelpText,\n messages.purgeIndexesButton,\n messages.label,\n messages.enableSearchingTitle,\n messages.enableSearchingDescription,\n];\n\nexport default class ElasticsearchSettings extends OLDAdminSettings<Props, State> {\n getConfigFromState = (config: AdminConfig) => {\n config.ElasticsearchSettings.ConnectionURL = this.state.connectionUrl;\n config.ElasticsearchSettings.Backend = this.state.backend;\n config.ElasticsearchSettings.SkipTLSVerification = this.state.skipTLSVerification;\n config.ElasticsearchSettings.CA = this.state.ca;\n config.ElasticsearchSettings.ClientCert = this.state.clientCert;\n config.ElasticsearchSettings.ClientKey = this.state.clientKey;\n config.ElasticsearchSettings.Username = this.state.username;\n config.ElasticsearchSettings.Password = this.state.password;\n config.ElasticsearchSettings.Sniff = this.state.sniff;\n config.ElasticsearchSettings.EnableIndexing = this.state.enableIndexing;\n config.ElasticsearchSettings.EnableSearching = this.state.enableSearching;\n config.ElasticsearchSettings.EnableAutocomplete = this.state.enableAutocomplete;\n config.ElasticsearchSettings.IgnoredPurgeIndexes = this.state.ignoredPurgeIndexes;\n\n return config;\n };\n\n getStateFromConfig(config: AdminConfig) {\n return {\n connectionUrl: config.ElasticsearchSettings.ConnectionURL,\n backend: config.ElasticsearchSettings.Backend,\n skipTLSVerification: config.ElasticsearchSettings.SkipTLSVerification,\n ca: config.ElasticsearchSettings.CA,\n clientCert: config.ElasticsearchSettings.ClientCert,\n clientKey: config.ElasticsearchSettings.ClientKey,\n username: config.ElasticsearchSettings.Username,\n password: config.ElasticsearchSettings.Password,\n sniff: config.ElasticsearchSettings.Sniff,\n enableIndexing: config.ElasticsearchSettings.EnableIndexing,\n enableSearching: config.ElasticsearchSettings.EnableSearching,\n enableAutocomplete: config.ElasticsearchSettings.EnableAutocomplete,\n configTested: true,\n canSave: true,\n canPurgeAndIndex: config.ElasticsearchSettings.EnableIndexing,\n ignoredPurgeIndexes: config.ElasticsearchSettings.IgnoredPurgeIndexes,\n };\n }\n\n handleSettingChanged = (id: string, value: boolean) => {\n if (id === 'enableIndexing') {\n if (value === false) {\n this.setState({\n enableSearching: false,\n enableAutocomplete: false,\n });\n } else {\n this.setState({\n canSave: false,\n configTested: false,\n });\n }\n }\n\n if (id === 'connectionUrl' || id === 'backend' || id === 'skipTLSVerification' || id === 'username' || id === 'password' || id === 'sniff' || id === 'ca' || id === 'clientCert' || id === 'clientKey') {\n this.setState({\n configTested: false,\n canSave: false,\n });\n }\n\n if (id !== 'enableSearching' && id !== 'enableAutocomplete') {\n this.setState({\n canPurgeAndIndex: false,\n });\n }\n\n this.handleChange(id, value);\n };\n\n handleSaved = () => {\n this.setState({\n canPurgeAndIndex: this.state.enableIndexing,\n });\n };\n\n canSave = () => {\n return this.state.canSave;\n };\n\n doTestConfig = (success: () => void, error: (error: {message: string; detailed_message?: string}) => void): void => {\n const config = JSON.parse(JSON.stringify(this.props.config));\n this.getConfigFromState(config);\n\n elasticsearchTest(\n config,\n () => {\n this.setState({\n configTested: true,\n canSave: true,\n });\n success();\n },\n (err: {message: string; detailed_message?: string}) => {\n this.setState({\n configTested: false,\n canSave: false,\n });\n error(err);\n },\n );\n };\n\n getExtraInfo(job: Job) {\n let jobSubType = null;\n if (job.data?.sub_type === 'channels_index_rebuild') {\n jobSubType = (\n <span>\n {'. '}\n <FormattedMessage\n id='admin.elasticsearch.channelIndexRebuildJobTitle'\n defaultMessage='Channels index rebuild job.'\n />\n </span>\n );\n }\n\n let jobProgress = null;\n if (job.status === JobStatuses.IN_PROGRESS) {\n jobProgress = (\n <FormattedMessage\n id='admin.elasticsearch.percentComplete'\n defaultMessage='{percent}% Complete'\n values={{percent: Number(job.progress)}}\n />\n );\n }\n\n return (<span>{jobProgress}{jobSubType}</span>);\n }\n\n renderTitle() {\n return (\n <FormattedMessage {...messages.title}/>\n );\n }\n\n renderSettings = () => {\n return (\n <SettingsGroup>\n <BooleanSetting\n id='enableIndexing'\n label={\n <FormattedMessage {...messages.enableIndexingTitle}/>\n }\n helpText={\n <FormattedMessage\n {...messages.enableIndexingDescription}\n values={{\n link: (chunks) => (\n <ExternalLink\n location='elasticsearch_settings'\n href={DocLinks.ELASTICSEARCH}\n >\n {chunks}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.EnableIndexing')}\n disabled={this.props.isDisabled}\n />\n <TextSetting\n id='backend'\n label={\n <FormattedMessage\n id='admin.elasticsearch.backendTitle'\n defaultMessage='Backend type:'\n />\n }\n placeholder={defineMessage({id: 'admin.elasticsearch.backendExample', defaultMessage: 'E.g.: \"elasticsearch\"'})}\n helpText={\n <FormattedMessage\n id='admin.elasticsearch.backendDescription'\n defaultMessage='The type of the search backend.'\n />\n }\n value={this.state.backend}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.Backend')}\n />\n <TextSetting\n id='connectionUrl'\n label={\n <FormattedMessage {...messages.connectionUrlTitle}/>\n }\n placeholder={defineMessage({id: 'admin.elasticsearch.connectionUrlExample', defaultMessage: 'E.g.: \"https://elasticsearch.example.org:9200\"'})}\n helpText={\n <FormattedMessage\n {...messages.connectionUrlDescription}\n values={{\n link: (chunks) => (\n <ExternalLink\n location='elasticsearch_settings'\n href={DocLinks.ELASTICSEARCH}\n >\n {chunks}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.connectionUrl}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.ConnectionURL')}\n />\n <TextSetting\n id='ca'\n label={\n <FormattedMessage\n id='admin.elasticsearch.caTitle'\n defaultMessage='CA path:'\n />\n }\n placeholder={defineMessage({id: 'admin.elasticsearch.caExample', defaultMessage: 'E.g.: \"./elasticsearch/ca.pem\"'})}\n helpText={\n <FormattedMessage\n id='admin.elasticsearch.caDescription'\n defaultMessage='(Optional) Custom Certificate Authority certificates for the Elasticsearch server. Leave this empty to use the default CAs from the operating system.'\n />\n }\n value={this.state.ca}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.CA')}\n />\n <TextSetting\n id='clientCert'\n label={\n <FormattedMessage\n id='admin.elasticsearch.clientCertTitle'\n defaultMessage='Client Certificate path:'\n />\n }\n placeholder={defineMessage({id: 'admin.elasticsearch.clientCertExample', defaultMessage: 'E.g.: \"./elasticsearch/client-cert.pem\"'})}\n helpText={\n <FormattedMessage\n id='admin.elasticsearch.clientCertDescription'\n defaultMessage='(Optional) The client certificate for the connection to the Elasticsearch server in the PEM format.'\n />\n }\n value={this.state.clientCert}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.ClientCert')}\n />\n <TextSetting\n id='clientKey'\n label={\n <FormattedMessage\n id='admin.elasticsearch.clientKeyTitle'\n defaultMessage='Client Certificate Key path:'\n />\n }\n placeholder={defineMessage({id: 'admin.elasticsearch.clientKeyExample', defaultMessage: 'E.g.: \"./elasticsearch/client-key.pem\"'})}\n helpText={\n <FormattedMessage\n id='admin.elasticsearch.clientKeyDescription'\n defaultMessage='(Optional) The key for the client certificate in the PEM format.'\n />\n }\n value={this.state.clientKey}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.ClientKey')}\n />\n <BooleanSetting\n id='skipTLSVerification'\n label={<FormattedMessage {...messages.skipTLSVerificationTitle}/>}\n helpText={<FormattedMessage {...messages.skipTLSVerificationDescription}/>}\n value={this.state.skipTLSVerification}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.SkipTLSVerification')}\n />\n <TextSetting\n id='username'\n label={<FormattedMessage {...messages.usernameTitle}/>}\n placeholder={defineMessage({id: 'admin.elasticsearch.usernameExample', defaultMessage: 'E.g.: \"elastic\"'})}\n helpText={<FormattedMessage {...messages.usernameDescription}/>}\n value={this.state.username}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.Username')}\n />\n <TextSetting\n id='password'\n label={<FormattedMessage {...messages.passwordTitle}/>}\n placeholder={defineMessage({id: 'admin.elasticsearch.password', defaultMessage: 'E.g.: \"yourpassword\"'})}\n helpText={<FormattedMessage {...messages.passwordDescription}/>}\n value={this.state.password}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.Password')}\n />\n <BooleanSetting\n id='sniff'\n label={<FormattedMessage {...messages.sniffTitle}/>}\n helpText={<FormattedMessage {...messages.sniffDescription}/>}\n value={this.state.sniff}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.Sniff')}\n />\n <RequestButton\n id='testConfig'\n requestAction={this.doTestConfig}\n helpText={<FormattedMessage {...messages.testHelpText}/>}\n buttonText={<FormattedMessage {...messages.elasticsearch_test_button}/>}\n successMessage={defineMessage({\n id: 'admin.elasticsearch.testConfigSuccess',\n defaultMessage: 'Test successful. Configuration saved.',\n })}\n disabled={!this.state.enableIndexing}\n />\n <SettingSet\n label={<FormattedMessage {...messages.bulkIndexingTitle}/>}\n >\n <div className='job-table-setting'>\n <JobsTable\n jobType={JobTypes.ELASTICSEARCH_POST_INDEXING as JobType}\n disabled={!this.state.canPurgeAndIndex || this.props.isDisabled!}\n createJobButtonText={\n <FormattedMessage\n id='admin.elasticsearch.createJob.title'\n defaultMessage='Index Now'\n />\n }\n createJobHelpText={<FormattedMessage {...messages.help}/>}\n getExtraInfoText={this.getExtraInfo}\n />\n </div>\n </SettingSet>\n <RequestButton\n id='rebuildChannelsIndexButton'\n requestAction={rebuildChannelsIndex}\n helpText={\n <FormattedMessage\n {...messages.rebuildChannelIndexHelpText}\n values={{\n b: (chunks: React.ReactNode) => (<b>{chunks}</b>),\n }}\n />\n }\n buttonText={<FormattedMessage {...messages.rebuildChannelsIndexButtonText}/>}\n successMessage={defineMessage({\n id: 'admin.elasticsearch.rebuildIndexSuccessfully.success',\n defaultMessage: 'Channels index rebuild job triggered successfully.',\n })}\n errorMessage={defineMessage({\n id: 'admin.elasticsearch.rebuildIndexSuccessfully.error',\n defaultMessage: 'Failed to trigger channels index rebuild job: {error}',\n })}\n disabled={!this.state.canPurgeAndIndex || this.props.isDisabled!}\n label={<FormattedMessage {...messages.rebuildChannelsIndexButtonText}/>}\n />\n <RequestButton\n id='purgeIndexesSection'\n requestAction={elasticsearchPurgeIndexes}\n helpText={<FormattedMessage {...messages.purgeIndexesHelpText}/>}\n buttonText={<FormattedMessage {...messages.purgeIndexesButton}/>}\n successMessage={defineMessage({\n id: 'admin.elasticsearch.purgeIndexesButton.success',\n defaultMessage: 'Indexes purged successfully.',\n })}\n errorMessage={defineMessage({\n id: 'admin.elasticsearch.purgeIndexesButton.error',\n defaultMessage: 'Failed to purge indexes: {error}',\n })}\n disabled={this.props.isDisabled || !this.state.canPurgeAndIndex}\n label={<FormattedMessage {...messages.label}/>}\n />\n <TextSetting\n id='ignoredPurgeIndexes'\n label={\n <FormattedMessage\n id='admin.elasticsearch.ignoredPurgeIndexes'\n defaultMessage='Indexes to skip while purging:'\n />\n }\n placeholder={defineMessage({id: 'admin.elasticsearch.ignoredPurgeIndexesDescription.example', defaultMessage: 'E.g.: .opendistro*,.security*'})}\n helpText={\n <FormattedMessage\n id='admin.elasticsearch.ignoredPurgeIndexesDescription'\n defaultMessage='When filled in, these indexes will be ignored during the purge, separated by commas.'\n />\n }\n value={this.state.ignoredPurgeIndexes}\n disabled={this.props.isDisabled || !this.state.enableIndexing}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.IgnoredPurgeIndexes')}\n />\n <BooleanSetting\n id='enableSearching'\n label={<FormattedMessage {...messages.enableSearchingTitle}/>}\n helpText={<FormattedMessage {...messages.enableSearchingDescription}/>}\n value={this.state.enableSearching}\n disabled={this.props.isDisabled || !this.state.enableIndexing || !this.state.configTested}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.EnableSearching')}\n />\n <BooleanSetting\n id='enableAutocomplete'\n label={\n <FormattedMessage\n id='admin.elasticsearch.enableAutocompleteTitle'\n defaultMessage='Enable Elasticsearch for autocomplete queries:'\n />\n }\n helpText={\n <FormattedMessage\n id='admin.elasticsearch.enableAutocompleteDescription'\n defaultMessage='Requires a successful connection to the Elasticsearch server. When true, Elasticsearch will be used for all autocompletion queries on users and channels using the latest index. Autocompletion results may be incomplete until a bulk index of the existing users and channels database is finished. When false, database autocomplete is used.'\n />\n }\n value={this.state.enableAutocomplete}\n disabled={this.props.isDisabled || !this.state.enableIndexing || !this.state.configTested}\n onChange={this.handleSettingChanged}\n setByEnv={this.isSetByEnv('ElasticsearchSettings.EnableAutocomplete')}\n />\n </SettingsGroup>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst AnnouncementBannerSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '184'}\n height={props.height ? props.height.toString() : '113'}\n viewBox='0 0 184 113'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x='2.745'\n y='15'\n width='181'\n height='78'\n rx='5.625'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <path\n d='M11.4834 28L16.9999 33.5618V59L172 59L172 68'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 7 29)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M59.1304 15H126.87L131 108H55L59.1304 15Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.24'\n />\n <rect\n width='92'\n height='5'\n transform='matrix(1 0 0 -1 47 113)'\n fill='var(--center-channel-color)'\n fillOpacity='0.4'\n />\n <rect\n x='27'\n y='9'\n width='131'\n height='86'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <circle\n cx='87.9995'\n cy='41.0007'\n r='5'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M95.9995 41.0007H149.056'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M95.9995 45.0007H149.056'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M95.9995 37.0007H109.175'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='87.9995'\n cy='60.0005'\n r='5'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M95.9995 60.0005H149.056'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M95.9995 64.0005H149.056'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M95.9995 56.0005H109.175'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='87.9995'\n cy='79.0003'\n r='5'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M95.9995 79.0003H149.056'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M95.9995 83.0003H149.056'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M95.9995 75.0003H109.175'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <rect\n x='31'\n y='13'\n width='46'\n height='78'\n fill='#1C58D9'\n fillOpacity='0.16'\n />\n <path\n d='M46.8109 20.0273L63.5002 20.0273'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M46.8109 22.6628L56.4732 22.6628'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='38.5092'\n cy='20.5105'\n r='4.34771'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='36.4795'\n cy='36.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M42.4189 36.1602H67.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='36.4795'\n cy='43.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M42.4189 43.1602H61.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='36.4795'\n cy='51.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M42.4189 51.1602H69.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='36.4795'\n cy='58.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M42.4189 58.1602H67.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='36.4795'\n cy='65.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M42.4189 65.1602H61.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='36.4795'\n cy='72.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M42.4189 72.1602H69.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M147 101.5H119.5'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M116 101.5H110'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M107 101.5H101'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M29 13C29 11.8954 29.8954 11 31 11H154C155.105 11 156 11.8954 156 13V30H29V13Z'\n fill='#28427B'\n />\n <path\n d='M50 18H74.5948'\n stroke='var(--neutral-0)'\n strokeLinecap='round'\n />\n <path\n d='M50 22H131'\n stroke='var(--neutral-0)'\n strokeLinecap='round'\n />\n <circle\n cx='39.5'\n cy='20.5'\n r='5'\n stroke='var(--neutral-0)'\n />\n <line\n x1='39.5'\n y1='20'\n x2='39.5'\n y2='23'\n stroke='var(--neutral-0)'\n />\n <line\n x1='39.5'\n y1='20'\n x2='39.5'\n y2='23'\n stroke='var(--neutral-0)'\n />\n <line\n x1='39.5'\n y1='18'\n x2='39.5'\n y2='19'\n stroke='white'\n />\n <circle\n cx='172'\n cy='84'\n r='2'\n transform='rotate(-90 172 84)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='172'\n cy='78'\n r='2'\n transform='rotate(-90 172 78)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='172'\n cy='72'\n r='2'\n transform='rotate(-90 172 72)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n </svg>\n);\n\nexport default AnnouncementBannerSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getBool as getBoolPreference} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport AlertBanner from 'components/alert_banner';\nimport withOpenStartTrialFormModal from 'components/common/hocs/cloud/with_open_start_trial_form_modal';\nimport type {TelemetryProps} from 'components/common/hooks/useOpenPricingModal';\nimport ExternalLink from 'components/external_link';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {AboutLinks, LicenseLinks, Preferences, Unique} from 'utils/constants';\nimport {format} from 'utils/markdown';\n\nimport type {GlobalState} from 'types/store';\n\ninterface TrialBannerProps {\n isDisabled: boolean;\n gettingTrialError: string | null;\n gettingTrialResponseCode: number | null;\n gettingTrial: boolean;\n enterpriseReady: boolean;\n upgradingPercentage: number;\n handleUpgrade: () => Promise<void>;\n upgradeError: string | null;\n restartError: string | null;\n openTrialForm?: (telemetryProps?: TelemetryProps) => void;\n\n handleRestart: () => Promise<void>;\n\n openEEModal: () => void;\n\n restarting: boolean;\n}\n\nexport const EmbargoedEntityTrialError = () => {\n return (\n <FormattedMessage\n id='admin.license.trial-request.embargoed'\n defaultMessage='We were unable to process the request due to limitations for embargoed countries. <link>Learn more in our documentation</link>, or reach out to legal@mattermost.com for questions around export limitations.'\n values={{\n link: (text: string) => (\n <ExternalLink\n location='trial_banner'\n href={LicenseLinks.EMBARGOED_COUNTRIES}\n >\n {text}\n </ExternalLink>\n ),\n }}\n />\n );\n};\n\nenum TrialLoadStatus {\n NotStarted = 'NOT_STARTED',\n Started = 'STARTED',\n Success = 'SUCCESS',\n Failed = 'FAILED',\n Embargoed = 'EMBARGOED',\n}\n\nconst TrialBanner = ({\n isDisabled,\n gettingTrialError,\n gettingTrialResponseCode,\n gettingTrial,\n enterpriseReady,\n upgradingPercentage,\n handleUpgrade,\n upgradeError,\n restartError,\n handleRestart,\n restarting,\n openEEModal,\n openTrialForm,\n}: TrialBannerProps) => {\n let trialButton;\n let upgradeTermsMessage;\n let content;\n let gettingTrialErrorMsg;\n\n const {formatMessage} = useIntl();\n\n const restartedAfterUpgradePrefs = useSelector<GlobalState>((state) => getBoolPreference(state, Preferences.UNIQUE, Unique.REQUEST_TRIAL_AFTER_SERVER_UPGRADE));\n const clickedUpgradeAndTrialBtn = useSelector<GlobalState>((state) => getBoolPreference(state, Preferences.UNIQUE, Unique.CLICKED_UPGRADE_AND_TRIAL_BTN));\n\n const userId = useSelector((state: GlobalState) => getCurrentUserId(state));\n\n const [status, setLoadStatus] = useState(TrialLoadStatus.NotStarted);\n\n const dispatch = useDispatch();\n\n const btnText = (status: TrialLoadStatus) => {\n switch (status) {\n case TrialLoadStatus.Started:\n return formatMessage({id: 'start_trial.modal.gettingTrial', defaultMessage: 'Getting Trial...'});\n case TrialLoadStatus.Success:\n return formatMessage({id: 'start_trial.modal.loaded', defaultMessage: 'Loaded!'});\n case TrialLoadStatus.Failed:\n return formatMessage({id: 'start_trial.modal.failed', defaultMessage: 'Failed'});\n case TrialLoadStatus.Embargoed:\n return formatMessage<ReactNode>(\n {\n id: 'admin.license.trial-request.embargoed',\n defaultMessage: 'We were unable to process the request due to limitations for embargoed countries. <link>Learn more in our documentation</link>, or reach out to legal@mattermost.com for questions around export limitations.',\n },\n {\n link: (text: string) => (\n <ExternalLink\n location='trial_banner'\n href={LicenseLinks.EMBARGOED_COUNTRIES}\n >\n {text}\n </ExternalLink>\n ),\n },\n );\n default:\n return formatMessage({id: 'admin.license.trial-request.startTrial', defaultMessage: 'Start trial'});\n }\n };\n\n const handleRequestLicense = () => {\n if (openTrialForm) {\n openTrialForm({trackingLocation: 'license_settings.trial_banner'});\n }\n };\n\n useEffect(() => {\n async function savePrefsAndRequestTrial() {\n await savePrefsRestartedAfterUpgrade();\n handleRestart();\n }\n if (upgradingPercentage === 100 && clickedUpgradeAndTrialBtn) {\n if (!restarting) {\n savePrefsAndRequestTrial();\n }\n }\n }, [upgradingPercentage, clickedUpgradeAndTrialBtn]);\n\n useEffect(() => {\n if (gettingTrial && !gettingTrialError && gettingTrialResponseCode !== 200) {\n setLoadStatus(TrialLoadStatus.Started);\n } else if (gettingTrialError) {\n setLoadStatus(TrialLoadStatus.Failed);\n } else if (gettingTrialResponseCode === 451) {\n setLoadStatus(TrialLoadStatus.Embargoed);\n }\n }, [gettingTrial, gettingTrialError, gettingTrialResponseCode]);\n\n useEffect(() => {\n // validating the percentage in 0 we make sure to only remove the prefs value on component load after restart\n if (restartedAfterUpgradePrefs && clickedUpgradeAndTrialBtn && upgradingPercentage === 0) {\n // remove the values from the preferences\n const category = Preferences.UNIQUE;\n const reqLicense = Unique.REQUEST_TRIAL_AFTER_SERVER_UPGRADE;\n const clickedBtn = Unique.CLICKED_UPGRADE_AND_TRIAL_BTN;\n dispatch(savePreferences(userId, [{category, name: reqLicense, user_id: userId, value: ''}, {category, name: clickedBtn, user_id: userId, value: ''}]));\n\n handleRequestLicense();\n }\n }, [restartedAfterUpgradePrefs, clickedUpgradeAndTrialBtn]);\n\n const onHandleUpgrade = () => {\n if (!handleUpgrade) {\n return;\n }\n handleUpgrade();\n const category = Preferences.UNIQUE;\n const name = Unique.CLICKED_UPGRADE_AND_TRIAL_BTN;\n dispatch(savePreferences(userId, [{category, name, user_id: userId, value: 'true'}]));\n };\n\n const savePrefsRestartedAfterUpgrade = () => {\n // save in the preferences that this customer wanted to request trial just after the upgrade\n const category = Preferences.UNIQUE;\n const name = Unique.REQUEST_TRIAL_AFTER_SERVER_UPGRADE;\n dispatch(savePreferences(userId, [{category, name, user_id: userId, value: 'true'}]));\n };\n\n const eeModalTerms = (\n <a\n role='button'\n onClick={openEEModal}\n >\n <FormattedMessage\n id='admin.license.enterprise.upgrade.eeLicenseLink'\n defaultMessage='Enterprise Edition License'\n />\n </a>\n );\n if (enterpriseReady && !restartedAfterUpgradePrefs) {\n if (gettingTrialError) {\n gettingTrialErrorMsg =\n gettingTrialResponseCode === 451 ? (\n <div className='trial-error'>\n <EmbargoedEntityTrialError/>\n </div>\n ) : (\n <p className='trial-error'>\n <FormattedMessage\n id='admin.trial_banner.trial-request.error'\n defaultMessage='Trial license could not be retrieved. Visit <link>{trialInfoLink}</link> to request a license.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n location='trial_banner'\n href={LicenseLinks.TRIAL_INFO_LINK}\n >\n {msg}\n </ExternalLink>\n ),\n trialInfoLink: LicenseLinks.TRIAL_INFO_LINK,\n }}\n />\n </p>\n );\n }\n trialButton = (\n <button\n type='button'\n className='btn btn-primary'\n onClick={handleRequestLicense}\n disabled={isDisabled || gettingTrialError !== null || gettingTrialResponseCode === 451}\n >\n {btnText(status)}\n </button>\n );\n content = (\n <>\n <FormattedMessage\n id='admin.license.trial-request.title'\n defaultMessage='Experience Mattermost Enterprise Edition for free for the next 30 days. No obligation to buy or credit card required. '\n />\n <FormattedMessage\n id='admin.license.trial-request.accept-terms'\n defaultMessage='By clicking <strong>Start trial</strong>, I agree to the <linkEvaluation>Mattermost Software and Services License Agreement</linkEvaluation>, <linkPrivacy>Privacy Policy</linkPrivacy>, and receiving product emails.'\n values={{\n strong: (msg: React.ReactNode) => <strong>{msg}</strong>,\n linkEvaluation: (msg: React.ReactNode) => (\n <ExternalLink\n href={LicenseLinks.SOFTWARE_SERVICES_LICENSE_AGREEMENT}\n location='trial_banner'\n >\n {msg}\n </ExternalLink>\n ),\n linkPrivacy: (msg: React.ReactNode) => (\n <ExternalLink\n href={AboutLinks.PRIVACY_POLICY}\n location='trial_banner'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </>\n );\n upgradeTermsMessage = null;\n } else {\n gettingTrialErrorMsg = null;\n trialButton = (\n <button\n type='button'\n onClick={onHandleUpgrade}\n className='btn btn-primary'\n >\n <LoadingWrapper\n loading={upgradingPercentage > 0}\n text={upgradingPercentage === 100 && restarting ? (\n <FormattedMessage\n id='admin.license.enterprise.restarting'\n defaultMessage='Restarting'\n />\n ) : (\n <FormattedMessage\n id='admin.license.enterprise.upgrading'\n defaultMessage='Upgrading {percentage}%'\n values={{percentage: upgradingPercentage}}\n />)}\n >\n <FormattedMessage\n id='admin.license.trialUpgradeAndRequest.submit'\n defaultMessage='Upgrade Server And Start trial'\n />\n </LoadingWrapper>\n </button>\n );\n\n content = (\n <>\n <FormattedMessage\n id='admin.license.upgrade-and-trial-request.title'\n defaultMessage='Upgrade to Enterprise Edition and Experience Mattermost Enterprise Edition for free for the next 30 days. No obligation to buy or credit card required. '\n />\n </>\n );\n\n upgradeTermsMessage = (\n <>\n <p className='upgrade-legal-terms'>\n <FormattedMessage\n id='admin.license.upgrade-and-trial-request.accept-terms-initial-part'\n defaultMessage='By selecting <strong>Upgrade Server And Start trial</strong>, I agree to the <linkEvaluation>Mattermost Software and Services License Agreement</linkEvaluation>, <linkPrivacy>Privacy Policy</linkPrivacy>, and receiving product emails. '\n values={{\n strong: (msg: React.ReactNode) => <strong>{msg}</strong>,\n linkEvaluation: (msg: React.ReactNode) => (\n <ExternalLink\n href={LicenseLinks.SOFTWARE_SERVICES_LICENSE_AGREEMENT}\n location='trial_banner'\n >\n {msg}\n </ExternalLink>\n ),\n linkPrivacy: (msg: React.ReactNode) => (\n <ExternalLink\n href={AboutLinks.PRIVACY_POLICY}\n location='trial_banner'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n <FormattedMessage\n id='admin.license.upgrade-and-trial-request.accept-terms-final-part'\n defaultMessage='Also, I agree to the terms of the Mattermost {eeModalTerms}. Upgrading will download the binary and update your Team Edition instance.'\n values={{eeModalTerms}}\n />\n </p>\n {upgradeError && (\n <div className='upgrade-error'>\n <div className='form-group has-error'>\n <div\n className='as-bs-label control-label'\n dangerouslySetInnerHTML={{\n __html: format(upgradeError),\n }}\n />\n </div>\n </div>\n )}\n {restartError && (\n <div className='upgrade-error'>\n <div className='form-group has-error'>\n <div className='as-bs-label control-label'>\n {restartError}\n </div>\n </div>\n </div>\n )}\n </>\n );\n }\n return (\n <AlertBanner\n mode='info'\n title={\n <FormattedMessage\n id='licensingPage.infoBanner.startTrialTitle'\n defaultMessage='Free 30 day trial!'\n />\n }\n message={\n <div className='banner-start-trial'>\n <p className='license-trial-legal-terms'>\n {content}\n </p>\n <div className='trial'>\n {trialButton}\n </div>\n {upgradeTermsMessage}\n {gettingTrialErrorMsg}\n </div>\n }\n />\n );\n};\n\nexport default withOpenStartTrialFormModal(TrialBanner);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ComponentType} from 'react';\n\nimport useOpenStartTrialFormModal from 'components/common/hooks/useOpenStartTrialFormModal';\n\nexport default function withOpenStartTrialFormModal<T>(WrappedComponent: ComponentType<T>) {\n return (props: T) => {\n const openTrialForm = useOpenStartTrialFormModal();\n return (\n <WrappedComponent\n openTrialForm={openTrialForm}\n {...props}\n />\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {AnalyticsState} from '@mattermost/types/admin';\nimport type {CloudCustomer} from '@mattermost/types/cloud';\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {EmbargoedEntityTrialError} from 'components/admin_console/license_settings/trial_banner/trial_banner';\nimport AlertBanner from 'components/alert_banner';\nimport PurchaseLink from 'components/announcement_bar/purchase_link/purchase_link';\nimport ExternalLink from 'components/external_link';\nimport StartTrialBtn from 'components/learn_more_trial_modal/start_trial_btn';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {TELEMETRY_CATEGORIES, AboutLinks, LicenseLinks, LicenseSkus} from 'utils/constants';\nimport {goToMattermostContactSalesForm} from 'utils/contact_support_sales';\n\nimport type {ModalData} from 'types/actions';\n\nimport './feature_discovery.scss';\n\ntype Props = {\n featureName: string;\n minimumSKURequiredForFeature: LicenseSkus;\n\n title: MessageDescriptor;\n copy: MessageDescriptor;\n\n learnMoreURL: string;\n\n featureDiscoveryImage: JSX.Element;\n\n prevTrialLicense: ClientLicense;\n\n stats?: AnalyticsState;\n actions: {\n getPrevTrialLicense: () => void;\n getCloudSubscription: () => void;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n isCloud: boolean;\n isCloudTrial: boolean;\n hadPrevCloudTrial: boolean;\n isSubscriptionLoaded: boolean;\n isPaidSubscription: boolean;\n customer?: CloudCustomer;\n}\n\ntype State = {\n gettingTrial: boolean;\n gettingTrialError: string | null;\n gettingTrialResponseCode: number | null;\n}\n\nexport default class FeatureDiscovery extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n gettingTrial: false,\n gettingTrialError: null,\n gettingTrialResponseCode: null,\n };\n }\n\n componentDidMount() {\n this.props.actions.getPrevTrialLicense();\n }\n\n contactSalesFunc = () => {\n const {customer, isCloud} = this.props;\n const customerEmail = customer?.email || '';\n const firstName = customer?.contact_first_name || '';\n const lastName = customer?.contact_last_name || '';\n const companyName = customer?.name || '';\n const utmMedium = isCloud ? 'in-product-cloud' : 'in-product';\n goToMattermostContactSalesForm(firstName, lastName, companyName, customerEmail, 'mattermost', utmMedium);\n };\n\n renderPostTrialCta = () => {\n const {\n minimumSKURequiredForFeature,\n learnMoreURL,\n } = this.props;\n if (minimumSKURequiredForFeature === LicenseSkus.Enterprise) {\n return (\n <div className='purchase-card'>\n <button\n className='btn btn-primary'\n data-testid='featureDiscovery_primaryCallToAction'\n onClick={() => {\n trackEvent(TELEMETRY_CATEGORIES.SELF_HOSTED_ADMIN, 'click_enterprise_contact_sales_feature_discovery');\n this.contactSalesFunc();\n }}\n >\n <FormattedMessage\n id='admin.ldap_feature_discovery_cloud.call_to_action.primary_sales'\n defaultMessage='Contact sales'\n />\n </button>\n <ExternalLink\n location='feature_discovery'\n className='btn btn-secondary'\n href={learnMoreURL}\n data-testid='featureDiscovery_secondaryCallToAction'\n >\n <FormattedMessage\n id='admin.ldap_feature_discovery.call_to_action.secondary'\n defaultMessage='Learn more'\n />\n </ExternalLink>\n </div>\n );\n }\n\n return (\n <div className='purchase-card'>\n <>\n <PurchaseLink\n eventID='post_trial_purchase_license'\n buttonTextElement={\n <FormattedMessage\n id='admin.license.trialCard.purchase_license'\n defaultMessage='Purchase a license'\n />\n }\n />\n </>\n\n </div>\n );\n };\n\n renderStartTrial = (learnMoreURL: string, gettingTrialError: React.ReactNode) => {\n const {\n isCloud,\n } = this.props;\n\n // by default we assume is not cloud, so the cta button is Start Trial (which will request a trial license)\n let ctaPrimaryButton = (\n <StartTrialBtn\n telemetryId={`start_self_hosted_trial_from_${this.props.featureName}`}\n btnClass='btn btn-primary'\n renderAsButton={true}\n trackingPage={this.props.featureName}\n />\n );\n\n if (isCloud) {\n // In cloud, only option is to contact sales.\n ctaPrimaryButton = (\n <button\n className='btn btn-primary'\n data-testid='featureDiscovery_primaryCallToAction'\n onClick={() => {\n trackEvent(TELEMETRY_CATEGORIES.CLOUD_ADMIN, 'click_enterprise_contact_sales_feature_discovery');\n this.contactSalesFunc();\n }}\n >\n <FormattedMessage\n id='admin.ldap_feature_discovery_cloud.call_to_action.primary_sales'\n defaultMessage='Contact sales'\n />\n </button>\n );\n }\n\n return (\n <>\n {ctaPrimaryButton}\n <ExternalLink\n location='feature_discovery'\n className='btn btn-secondary'\n href={learnMoreURL}\n data-testid='featureDiscovery_secondaryCallToAction'\n >\n <FormattedMessage\n id='admin.ldap_feature_discovery.call_to_action.secondary'\n defaultMessage='Learn more'\n />\n </ExternalLink>\n {gettingTrialError}\n {(!this.props.isCloud) && (<p className='trial-legal-terms'>\n\n <FormattedMessage\n id='admin.feature_discovery.trial-request.accept-terms'\n defaultMessage='By clicking <highlight>Start trial</highlight>, I agree to the <linkEvaluation>Mattermost Software and Services License Agreement</linkEvaluation>, <linkPrivacy>Privacy Policy</linkPrivacy> and receiving product emails.'\n values={{\n highlight: (msg: React.ReactNode) => (\n <strong>{msg}</strong>\n ),\n linkEvaluation: (msg: React.ReactNode) => (\n <ExternalLink\n location='feature_discovery'\n href={LicenseLinks.SOFTWARE_SERVICES_LICENSE_AGREEMENT}\n >\n {msg}\n </ExternalLink>\n ),\n linkPrivacy: (msg: React.ReactNode) => (\n <ExternalLink\n location='feature_discovery'\n href={AboutLinks.PRIVACY_POLICY}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n\n </p>)}\n </>\n );\n };\n\n render() {\n const {\n title,\n copy,\n learnMoreURL,\n featureDiscoveryImage,\n isCloud,\n isCloudTrial,\n isSubscriptionLoaded,\n } = this.props;\n\n // on first load the license information is available and we can know if it is cloud license, but the subscription is not loaded yet\n // so on initial load we check if it is cloud license and in the case the subscription is still undefined we show the loading spinner to avoid\n // component change flashing\n if (isCloud && !isSubscriptionLoaded) {\n return (<LoadingSpinner/>);\n }\n\n let gettingTrialError: React.ReactNode = '';\n if (this.state.gettingTrialError && this.state.gettingTrialResponseCode === 451) {\n gettingTrialError = (\n <p className='trial-error'>\n <EmbargoedEntityTrialError/>\n </p>\n );\n } else if (this.state.gettingTrialError) {\n gettingTrialError = (\n <p className='trial-error'>\n <FormattedMessage\n id='admin.feature_discovery.trial-request.error'\n defaultMessage='Trial license could not be retrieved. Visit <link>{trialInfoLink}</link> to request a license.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n location='feature_discovery'\n href={LicenseLinks.TRIAL_INFO_LINK}\n >\n {msg}\n </ExternalLink>\n ),\n trialInfoLink: LicenseLinks.TRIAL_INFO_LINK,\n }}\n />\n </p>\n );\n }\n\n // if it is cloud and is in trial, in the case this component get's shown that means that the license hasn't been updated yet\n // so let's notify to the user that the license is being updated\n if (isCloud && isCloudTrial && isSubscriptionLoaded) {\n return (\n <div className='FeatureDiscovery'>\n <AlertBanner\n mode='info'\n title={\n <FormattedMessage\n id='admin.featureDiscovery.WarningTitle'\n defaultMessage='Your trial has started and updates are being made to your license.'\n />\n }\n message={\n <>\n <FormattedMessage\n id='admin.featureDiscovery.WarningDescription'\n defaultMessage='Your License is being updated to give you full access to all the Enterprise Features. This page will automatically refresh once the license update is complete. Please wait '\n />\n <LoadingSpinner/>\n </>\n }\n />\n </div>\n );\n }\n\n return (\n <div className='FeatureDiscovery'>\n <div className='FeatureDiscovery_copyWrapper'>\n <div\n className='FeatureDiscovery_title'\n data-testid='featureDiscovery_title'\n >\n <FormattedMessage\n {...title}\n />\n </div>\n <div className='FeatureDiscovery_copy'>\n <FormattedMessage\n {...copy}\n />\n </div>\n {this.props.prevTrialLicense?.IsLicensed === 'true' ? this.renderPostTrialCta() : this.renderStartTrial(learnMoreURL, gettingTrialError)}\n </div>\n <div className='FeatureDiscovery_imageWrapper'>\n {featureDiscoveryImage}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {getCloudSubscription} from 'mattermost-redux/actions/cloud';\nimport {checkHadPriorTrial, getCloudCustomer} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {openModal} from 'actions/views/modals';\n\nimport withGetCloudSubscription from 'components/common/hocs/cloud/with_get_cloud_subscription';\n\nimport {LicenseSkus} from 'utils/constants';\nimport {isCloudLicense} from 'utils/license_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport FeatureDiscovery from './feature_discovery';\n\nfunction mapStateToProps(state: GlobalState) {\n const subscription = state.entities.cloud.subscription;\n const license = getLicense(state);\n const isCloud = isCloudLicense(license);\n const hasPriorTrial = checkHadPriorTrial(state);\n const isCloudTrial = subscription?.is_free_trial === 'true';\n const customer = getCloudCustomer(state);\n return {\n stats: state.entities.admin.analytics,\n prevTrialLicense: state.entities.admin.prevTrialLicense,\n isCloud,\n isCloudTrial,\n isSubscriptionLoaded: subscription !== undefined && subscription !== null,\n hadPrevCloudTrial: hasPriorTrial,\n isPaidSubscription: isCloud && license?.SkuShortName !== LicenseSkus.Starter && !isCloudTrial,\n customer,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getPrevTrialLicense,\n getCloudSubscription,\n openModal,\n }, dispatch),\n };\n}\n\nexport default withGetCloudSubscription(connect(mapStateToProps, mapDispatchToProps)(FeatureDiscovery));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst ComplianceExportSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '189'}\n height={props.height ? props.height.toString() : '116'}\n viewBox='0 0 186 116'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <g clipPath='url(#clip0_4441_159184)'>\n <rect\n x='0.745117'\n y='17'\n width='181'\n height='78'\n rx='5.625'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <path\n d='M9.5 30L15 35.5V74.5H172.5V103.5'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 170 107)'\n fill='var(--center-channel-color)'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 6 31)'\n fill='var(--center-channel-color)'\n />\n <rect\n x='25'\n y='11'\n width='131'\n height='86'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <rect\n x='29'\n y='15'\n width='46'\n height='78'\n fill='var(--button-bg)'\n fillOpacity='0.16'\n />\n <path\n d='M44.8109 22.0273L61.5002 22.0273'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M44.8109 24.6628L54.4732 24.6628'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M33.392 33.4453H46.5678'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='36.5092'\n cy='22.5105'\n r='4.34771'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='34.4795'\n cy='38.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M40.4189 38.1602H65.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='34.4795'\n cy='45.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M40.4189 45.1602H59.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='34.4795'\n cy='53.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M40.4189 53.1602H67.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='34.4795'\n cy='60.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M40.4189 60.1602H65.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='34.4795'\n cy='67.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M40.4189 67.1602H59.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='34.4795'\n cy='74.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M40.4189 74.1602H67.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M145 103.5H117.5'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M114 103.5H108'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M105 103.5H99'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M158.5 61C174.24 61 187 48.2401 187 32.5C187 16.7599 174.24 4 158.5 4C142.76 4 130 16.7599 130 32.5C130 48.2401 142.76 61 158.5 61Z'\n fill='var(--neutral-1200)'\n fillOpacity='0.24'\n />\n <path\n d='M158.5 57C174.24 57 187 44.2401 187 28.5C187 12.7599 174.24 0 158.5 0C142.76 0 130 12.7599 130 28.5C130 44.2401 142.76 57 158.5 57Z'\n fill='var(--indigo-400)'\n />\n <path\n d='M158.5 36V13M158.5 13L149 22.8305M158.5 13L168 22.8305'\n stroke='var(--center-channel-bg)'\n strokeLinecap='round'\n />\n <path\n d='M146 33V42H171V33'\n stroke='var(--center-channel-bg)'\n strokeLinecap='round'\n />\n <rect\n x='62'\n y='34'\n width='67'\n height='82'\n rx='2'\n fill='var(--neutral-1200'\n fillOpacity='0.24'\n />\n <rect\n x='55'\n y='21'\n width='70.3182'\n height='91'\n rx='2'\n fill='var(--center-channel-bg)'\n />\n <rect\n x='55.5'\n y='21.5'\n width='69.3182'\n height='90'\n rx='1.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n d='M65 30H77'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M64 76H97'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M64 94H103'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M65 35H87'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M64 82H115'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M64 100H115'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M65 41H74'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M64 88H83'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M76 41H85'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M88 88H100'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n </g>\n <defs>\n <clipPath id='clip0_4441_159184'>\n <rect\n width='189'\n height='116'\n fill='var(--center-channel-bg)'\n />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default ComplianceExportSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst CustomTermsOfServiceSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '193'}\n height={props.height ? props.height.toString() : '111'}\n viewBox='0 0 193 111'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <rect\n x='193'\n y='27'\n width='66'\n height='193'\n rx='2'\n transform='rotate(90 193 27)'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <path\n d='M10 45L10 53.7097L166.84 53.7097L166.84 63L182 63'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M19.0974 76.51L19.0974 60.445L34.8649 60.445'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <ellipse\n cx='1.5'\n cy='1.5'\n rx='1.5'\n ry='1.5'\n transform='matrix(1 8.74228e-08 8.74228e-08 -1 8.5 45)'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <ellipse\n cx='1.4875'\n cy='1.4875'\n rx='1.4875'\n ry='1.4875'\n transform='matrix(1 8.74228e-08 8.74228e-08 -1 17.61 79.485)'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <ellipse\n cx='1.4875'\n cy='1.4875'\n rx='1.4875'\n ry='1.4875'\n transform='matrix(1 8.74228e-08 8.74228e-08 -1 181.09 64.61)'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <rect\n x='35'\n y='16'\n width='132.5'\n height='87'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <path\n d='M37.2992 19.7992C37.2992 18.9708 37.9708 18.2992 38.7992 18.2992H163.701C164.529 18.2992 165.201 18.9708 165.201 19.7992V27.9724H37.2992V19.7992Z'\n fill='var(--button-bg)'\n fillOpacity='0.16'\n />\n <rect\n x='80.2914'\n y='82.7874'\n width='41.9173'\n height='8.59843'\n rx='2'\n fill='var(--button-bg)'\n />\n <path\n d='M71.1178 37H84.5296'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M71.1178 41H95.706'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M71.1178 45H81.1766'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M70.0001 55H106.882'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M70.0001 66.1646H113.588'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M70 71.5525H127'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M70.0001 60.7764H91.2354'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M96.8237 60.7764H112.105'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M116.69 60.7764H124.331'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <circle\n cx='41.5'\n cy='22.5'\n r='1.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='49.5'\n cy='22.5'\n r='1.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='57.5'\n cy='22.5'\n r='1.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M116 110L125 110'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M128 110L132 110'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M135 110L165 110'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M113 110L101 110L101 90'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M154.5 60C170.24 60 183 47.2401 183 31.5C183 15.7599 170.24 3 154.5 3C138.76 3 126 15.7599 126 31.5C126 47.2401 138.76 60 154.5 60Z'\n fill='var(--neutral-1200'\n fillOpacity='0.16'\n />\n <path\n d='M154.5 57C170.24 57 183 44.2401 183 28.5C183 12.7599 170.24 0 154.5 0C138.76 0 126 12.7599 126 28.5C126 44.2401 138.76 57 154.5 57Z'\n fill='var(--indigo-400)'\n />\n <path\n d='M142 29.3101L151.28 38L169 19'\n stroke='var(--neutral-0)'\n strokeWidth='1.5'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n);\n\nexport default CustomTermsOfServiceSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst DataRetentionSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '142'}\n height={props.height ? props.height.toString() : '104'}\n viewBox='0 0 142 104'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M5.50196 18L5.50195 33L94.002 33'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M4.002 90L14.5019 79.5L14.502 40.5L35.5019 40.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M133.502 52L133.502 66L46.002 66'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 8.74228e-08 8.74228e-08 -1 3.00195 18)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(-1 -1.74846e-07 -1.74846e-07 1 136.002 48.5)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <circle\n cx='2.50195'\n cy='91.5'\n r='2.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <rect\n x='11'\n y='14'\n width='94'\n height='40'\n rx='3.75'\n fill='#1C58D9'\n fillOpacity='0.12'\n />\n <rect\n x='37'\n y='57'\n width='105'\n height='37'\n rx='3.75'\n fill='#1C58D9'\n fillOpacity='0.12'\n />\n <rect\n x='33.3885'\n y='8.15259'\n width='50.505'\n height='65.3594'\n rx='2'\n transform='rotate(-8.6173 33.3885 8.15259)'\n fill='var(--center-channel-bg)'\n />\n <rect\n x='33.9578'\n y='8.57203'\n width='49.505'\n height='64.3594'\n rx='1.5'\n transform='rotate(-8.6173 33.9578 8.57203)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n d='M40.3696 14.1746L48.8912 12.8832'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M46.8125 56.6891L74.5075 52.4921'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M44.4152 40.8698L72.1101 36.6727'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M40.969 18.1294L56.5918 15.7618'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M48.0112 64.5989L84.2277 59.1105'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M45.6138 48.7794L81.8303 43.291'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M43.2165 32.9601L79.433 27.4717'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M41.5683 22.0842L47.9595 21.1157'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M50.4667 20.7357L56.8579 19.7672'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M36.2393 36.6232C36.4201 35.6811 37.2442 35 38.2035 35H127.58C128.836 35 129.781 36.1436 129.544 37.3768L119.761 88.3768C119.58 89.3189 118.756 90 117.796 90H28.4201C27.1645 90 26.2194 88.8564 26.4559 87.6232L36.2393 36.6232Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M36.2393 36.6232C36.4201 35.6811 37.2442 35 38.2035 35H127.58C128.836 35 129.781 36.1436 129.544 37.3768L119.761 88.3768C119.58 89.3189 118.756 90 117.796 90H28.4201C27.1645 90 26.2194 88.8564 26.4559 87.6232L36.2393 36.6232Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M36.7304 36.7174C36.8659 36.0108 37.4841 35.5 38.2035 35.5H127.58C128.522 35.5 129.23 36.3577 129.053 37.2826L119.27 88.2826C119.134 88.9892 118.516 89.5 117.796 89.5H28.4201C27.4784 89.5 26.7696 88.6423 26.947 87.7174L36.7304 36.7174Z'\n stroke='var(--center-channel-color)'\n />\n <rect\n x='72.5056'\n y='8.99988'\n width='50.505'\n height='65.3594'\n rx='2'\n transform='rotate(7.47748 72.5056 8.99988)'\n fill='var(--center-channel-color)'\n fillOpacity='0.24'\n />\n <rect\n x='75.5056'\n y='7'\n width='50.505'\n height='65.3594'\n rx='2'\n transform='rotate(7.47748 75.5056 7)'\n fill='var(--center-channel-bg)'\n />\n <rect\n x='75.9363'\n y='7.56082'\n width='49.505'\n height='64.3594'\n rx='1.5'\n transform='rotate(7.47748 75.9363 7.56082)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n d='M80.5437 14.7212L89.0892 15.8428'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M74.9478 57.3556L102.721 61.0009'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M77.03 41.4917L104.803 45.137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M80.0231 18.6873L95.6899 20.7436'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M73.9067 65.2876L110.225 70.0545'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M75.9889 49.4236L112.307 54.1905'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M78.0711 33.5597L114.39 38.3266'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M79.5026 22.6532L85.9117 23.4944'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M88.426 23.8245L94.8352 24.6657'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M35 23C33.8954 23 33 23.8954 33 25V28H28C26.8954 28 26 28.8954 26 30V88C26 89.1046 26.8954 90 28 90H117C118.105 90 119 89.1046 119 88V30C119 28.8954 118.105 28 117 28H65V25C65 23.8954 64.1046 23 63 23H35Z'\n fill='var(--center-channel-bg)'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M35 23C33.8954 23 33 23.8954 33 25V28H28C26.8954 28 26 28.8954 26 30V88C26 89.1046 26.8954 90 28 90H117C118.105 90 119 89.1046 119 88V30C119 28.8954 118.105 28 117 28H65V25C65 23.8954 64.1046 23 63 23H35Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n stroke='var(--center-channel-color)'\n d='M35 23C33.8954 23 33 23.8954 33 25V28H28C26.8954 28 26 28.8954 26 30V88C26 89.1046 26.8954 90 28 90H117C118.105 90 119 89.1046 119 88V30C119 28.8954 118.105 28 117 28H65V25C65 23.8954 64.1046 23 63 23H35Z'\n />\n <path\n opacity='0.32'\n d='M32.1407 103.389C26.137 103.269 21.158 101.213 17.2037 97.2224C13.2495 93.2314 11.1816 88.2605 11 82.3095C11.1785 76.3555 13.2464 71.383 17.2037 67.392C21.1611 63.4011 26.1401 61.3455 32.1407 61.2253C38.0859 61.3486 43.0357 63.4042 46.9899 67.392C50.9442 71.3799 53.0121 76.3524 53.1937 82.3095C53.009 88.2636 50.9411 93.2345 46.9899 97.2224C43.0387 101.21 38.089 103.266 32.1407 103.389Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M32.9469 99.6636C27.0678 99.5437 22.2191 97.5347 18.3653 93.6451C14.5091 89.7532 12.4876 84.9101 12.3066 79.084C12.4845 73.255 14.506 68.4106 18.3651 64.5187C22.2222 60.629 27.0709 58.62 32.9469 58.5001C38.7662 58.623 43.5863 60.6311 47.4412 64.5187C51.2971 68.4074 53.3187 73.2518 53.4998 79.084C53.3157 84.9133 51.2941 89.7564 47.4411 93.6451C43.5894 97.5326 38.7694 99.5407 32.9469 99.6636Z'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n />\n <path\n d='M32.8048 95.0918C28.2155 94.9998 24.4094 93.4274 21.3867 90.3745C18.364 87.3216 16.7832 83.5189 16.6444 78.9667C16.7808 74.412 18.3616 70.6082 21.3867 67.5553C24.4118 64.5024 28.2178 62.93 32.8048 62.838C37.3495 62.9323 41.1332 64.5047 44.1559 67.5553C47.1786 70.6059 48.7594 74.4097 48.8982 78.9667C48.757 83.5213 47.1763 87.3239 44.1559 90.3745C41.1355 93.425 37.3518 94.9975 32.8048 95.0918Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M32.8046 94.5917C28.34 94.5 24.6643 92.9742 21.742 90.0227C18.8173 87.0688 17.2829 83.394 17.1446 78.9665C17.2806 74.5369 18.815 70.8611 21.7418 67.9072C24.6667 64.9555 28.3425 63.4298 32.8046 63.3381C37.2233 63.432 40.8774 64.9569 43.8007 67.9072C46.7252 70.8586 48.2597 74.5344 48.3979 78.9666C48.2574 83.3965 46.7228 87.0712 43.8006 90.0227C40.8797 92.9728 37.2257 94.4978 32.8046 94.5917Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n />\n <path\n d='M32.7713 61.6285V78.9649L40.4316 86.6252'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinejoin='round'\n />\n <circle\n cx='32.7713'\n cy='78.965'\n r='1.61269'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n </svg>\n);\n\nexport default DataRetentionSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst GroupsSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '184'}\n height={props.height ? props.height.toString() : '113'}\n viewBox='0 0 184 113'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_4441_155270)'>\n <rect\n x='2.745'\n y='15'\n width='181'\n height='78'\n rx='5.625'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <path\n d='M11 4L16.5 9.5V63.5H37.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 7 5)'\n fill='#8C8C8C'\n />\n <path\n d='M4 28L9.5 33.5V72.5H174.5V101.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 172 105)'\n fill='#8C8C8C'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 0 29)'\n fill='#8C8C8C'\n />\n <path\n d='M59.1304 15H126.87L131 108H55L59.1304 15Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.24'\n />\n <rect\n width='92'\n height='5'\n transform='matrix(1 0 0 -1 47 113)'\n fill='var(--center-channel-color)'\n fillOpacity='0.4'\n />\n <rect\n x='27'\n y='9'\n width='131'\n height='86'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <path\n d='M147 101.5H119.5'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M116 101.5H110'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M107 101.5H101'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M138.518 43.1646C138.518 53.0156 130.498 61.0007 120.606 61.0007C114.997 61.0007 109.99 58.4339 106.706 54.4147C104.198 51.3453 102.694 47.4301 102.694 43.1646C102.694 33.3136 110.714 25.3285 120.606 25.3285C130.498 25.3285 138.518 33.3136 138.518 43.1646Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M138.518 43.1646C138.518 53.0156 130.498 61.0007 120.606 61.0007C114.997 61.0007 109.99 58.4339 106.706 54.4147C104.198 51.3453 102.694 47.4301 102.694 43.1646C102.694 33.3136 110.714 25.3285 120.606 25.3285C130.498 25.3285 138.518 33.3136 138.518 43.1646Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask0_4441_155270'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='102'\n y='25'\n width='37'\n height='37'\n >\n <path\n d='M138.518 43.1646C138.518 53.0156 130.498 61.0007 120.606 61.0007C114.997 61.0007 109.99 58.4339 106.706 54.4147C104.198 51.3453 102.694 47.4301 102.694 43.1646C102.694 33.3136 110.714 25.3285 120.606 25.3285C130.498 25.3285 138.518 33.3136 138.518 43.1646Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask0_4441_155270)'>\n <path\n d='M129.928 54.2452L129.228 40.2453C128.93 34.2984 125.16 29.6744 120.609 29.6744C116.058 29.6744 112.289 34.2984 111.991 40.2453L111.291 54.2452H129.928Z'\n fill='#1B1D22'\n />\n <path\n d='M134.117 54.695C133.453 52.3994 131.597 50.6436 129.268 50.107L124.343 48.9724H116.875L111.949 50.107C109.62 50.6436 107.765 52.3994 107.101 54.695L105.221 64.6223H135.996L134.117 54.695Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M134.117 54.695C133.453 52.3994 131.597 50.6436 129.268 50.107L124.343 48.9724H116.875L111.949 50.107C109.62 50.6436 107.765 52.3994 107.101 54.695L105.221 64.6223H135.996L134.117 54.695Z'\n fill='var(--button-bg)'\n />\n <path\n d='M123.844 49.1791L122.833 45.7231H118.4L117.58 49.1791C119.369 50.139 122.054 50.139 123.844 49.1791Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M123.844 49.1791L122.833 45.7231H118.4L117.58 49.1791C119.369 50.139 122.054 50.139 123.844 49.1791Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M126.947 38.5957C127.568 38.4195 127.597 39.3908 127.361 40.3985C127.146 41.3168 126.947 42.8174 126.3 42.4531C125.52 44.6153 124.099 46.2593 122.38 46.9103C121.846 47.1551 121.279 47.2891 120.691 47.2891C119.933 47.2891 119.211 47.067 118.55 46.6722C117.065 45.9043 115.85 44.3754 115.154 42.4298C114.515 42.5975 114.245 41.0113 114.101 40.3985C113.918 39.6201 113.687 38.5956 114.515 38.5956C114.533 33.8795 117.309 30.0635 120.731 30.0635C124.153 30.0635 126.93 33.8795 126.947 38.5957Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M126.947 38.5957C127.568 38.4195 127.597 39.3908 127.361 40.3985C127.146 41.3168 126.947 42.8174 126.3 42.4531C125.52 44.6153 124.099 46.2593 122.38 46.9103C121.846 47.1551 121.279 47.2891 120.691 47.2891C119.933 47.2891 119.211 47.067 118.55 46.6722C117.065 45.9043 115.85 44.3754 115.154 42.4298C114.515 42.5975 114.245 41.0113 114.101 40.3985C113.918 39.6201 113.687 38.5956 114.515 38.5956C114.533 33.8795 117.309 30.0635 120.731 30.0635C124.153 30.0635 126.93 33.8795 126.947 38.5957Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M127.453 38.6215C127.443 38.6928 127.396 38.756 127.324 38.7917C127.252 38.8273 127.164 38.8314 127.089 38.8018C125.182 38.0754 123.334 36.1163 122.749 34.2774C120.9 36.1958 117.847 38.4392 114.805 38.9322C114.789 38.9353 114.774 38.9363 114.757 38.9363L114.758 38.9373C114.704 38.9373 114.649 38.9221 114.604 38.8946C114.546 38.8579 114.509 38.8018 114.499 38.7407C114.193 36.5446 114.838 32.3895 116.797 31.1075C118.092 30.2596 119.089 29.6962 120.712 29.8026C122.36 29.9106 124.151 30.8035 125.427 31.708C127.32 33.0495 127.719 36.4791 127.453 38.6215Z'\n fill='#1B1D22'\n />\n </g>\n <path\n d='M82.12 42.589C82.12 52.4595 74.0844 60.4603 64.173 60.4603C58.553 60.4603 53.5359 57.8885 50.2457 53.8614C47.7322 50.7859 46.2261 46.863 46.2261 42.589C46.2261 32.7186 54.2616 24.7178 64.173 24.7178C74.0844 24.7178 82.12 32.7186 82.12 42.589Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M82.12 42.589C82.12 52.4595 74.0844 60.4603 64.173 60.4603C58.553 60.4603 53.5359 57.8885 50.2457 53.8614C47.7322 50.7859 46.2261 46.863 46.2261 42.589C46.2261 32.7186 54.2616 24.7178 64.173 24.7178C74.0844 24.7178 82.12 32.7186 82.12 42.589Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask1_4441_155270'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='46'\n y='24'\n width='37'\n height='37'\n >\n <path\n d='M82.12 42.589C82.12 52.4595 74.0844 60.4603 64.173 60.4603C58.553 60.4603 53.5359 57.8885 50.2457 53.8614C47.7322 50.7859 46.2261 46.863 46.2261 42.589C46.2261 32.7186 54.2616 24.7178 64.173 24.7178C74.0844 24.7178 82.12 32.7186 82.12 42.589Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1_4441_155270)'>\n <path\n d='M80.0061 57.257C79.227 54.7376 77.0521 52.8107 74.3228 52.2216L68.5489 50.9771H59.795L54.0211 52.2216C51.2905 52.8107 49.1156 54.7376 48.3378 57.257L46.1344 68.1522H82.2094L80.0061 57.257Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M80.0064 57.257C79.2273 54.7376 77.0525 52.8107 74.3231 52.2216L68.5492 50.9771H59.7953L54.0215 52.2216C51.2908 52.8107 49.116 54.7376 48.3381 57.257L46.1348 68.1522H82.2098L80.0064 57.257Z'\n fill='var(--button-bg)'\n />\n <path\n d='M67.6799 51.4614L66.4982 47.9237H61.3111L60.3518 51.4614C62.4455 52.4441 65.5862 52.4441 67.6799 51.4614Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M67.6799 51.4614L66.4982 47.9237H61.3111L60.3518 51.4614C62.4455 52.4441 65.5862 52.4441 67.6799 51.4614Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M70.749 40.818C71.4203 40.6368 71.4509 41.6354 71.1966 42.6715C70.9641 43.6156 70.749 45.1583 70.0505 44.7838C69.2088 47.0068 67.6738 48.697 65.8172 49.3662C65.2407 49.618 64.628 49.7557 63.9929 49.7557C63.1752 49.7557 62.3948 49.5274 61.6808 49.1214C60.0775 48.332 58.7654 46.7602 58.0138 44.7599C57.3243 44.9322 57.0319 43.3014 56.8767 42.6715C56.6796 41.8711 56.4292 40.8179 57.3243 40.8179C57.3428 35.9691 60.3409 32.046 64.0366 32.046C67.7324 32.046 70.7306 35.9692 70.749 40.818Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M70.749 40.818C71.4203 40.6368 71.4509 41.6354 71.1966 42.6715C70.9641 43.6156 70.749 45.1583 70.0505 44.7838C69.2088 47.0068 67.6738 48.697 65.8172 49.3662C65.2407 49.618 64.628 49.7557 63.9929 49.7557C63.1752 49.7557 62.3948 49.5274 61.6808 49.1214C60.0775 48.332 58.7654 46.7602 58.0138 44.7599C57.3243 44.9322 57.0319 43.3014 56.8767 42.6715C56.6796 41.8711 56.4292 40.8179 57.3243 40.8179C57.3428 35.9691 60.3409 32.046 64.0366 32.046C67.7324 32.046 70.7306 35.9692 70.749 40.818Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M56.7017 31.1748C54.9829 33.2751 54.9468 36.7042 56.6039 39.7757C57.1701 40.4565 57.735 41.136 58.3012 41.8169C58.2838 36.8541 59.0883 35.5172 59.87 35.2737C61.1591 34.8693 62.6864 37.3452 65.4826 37.2833C65.9083 37.2737 66.8627 37.2393 67.4463 36.5708C67.9496 35.9945 67.8733 35.2875 68.0245 35.2723C68.2748 35.2476 68.7259 36.5983 69.5933 41.8155C70.1515 41.1305 70.711 40.4442 71.2692 39.7592C71.5744 38.568 71.8555 37.0054 71.8742 35.165C71.8997 32.6768 70.6804 31.1017 70.2453 29.7028C68.6042 33.8448 66.9509 28.6788 61.6798 28.6872C59.9678 28.69 57.8274 29.7993 56.7017 31.1748Z'\n fill='#1B1D22'\n />\n </g>\n <circle\n cx='91.2669'\n cy='55.5572'\n r='25.3433'\n fill='var(--center-channel-bg)'\n />\n <circle\n cx='91.1111'\n cy='55.5572'\n r='23.5112'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <mask\n id='mask2_4441_155270'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='67'\n y='32'\n width='48'\n height='48'\n >\n <path\n d='M67.6584 55.5572C67.6584 68.5427 78.216 79.0685 91.2382 79.0685C98.6222 79.0685 105.214 75.685 109.537 70.387C112.839 66.3409 114.818 61.18 114.818 55.5572C114.818 42.5718 104.26 32.046 91.2382 32.046C78.216 32.046 67.6584 42.5718 67.6584 55.5572Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask2_4441_155270)'>\n <path\n d='M76.4501 68.3815C78.8909 66.6494 87.4336 65.0135 91.3998 64.4121C95.061 65.1338 103.421 67.0825 107.57 69.1033C111.719 71.1241 112.35 77.403 112.146 80.2898H70.6533C70.6533 72.351 73.3992 70.5467 76.4501 68.3815Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M76.4501 68.3815C78.8909 66.6494 87.4336 65.0135 91.3998 64.4121C95.061 65.1338 103.421 67.0825 107.57 69.1033C111.719 71.1241 112.35 77.403 112.146 80.2898H70.6533C70.6533 72.351 73.3992 70.5467 76.4501 68.3815Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M96.9126 65.6335L95.1893 60.1373H87.6247L86.2257 65.6335C89.2791 67.1602 93.8592 67.1602 96.9126 65.6335Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M96.9126 65.6335L95.1893 60.1373H87.6247L86.2257 65.6335C89.2791 67.1602 93.8592 67.1602 96.9126 65.6335Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M101.516 49.9382C102.523 49.6696 102.569 51.1503 102.188 52.6865C101.839 54.0864 101.516 56.3738 100.469 55.8186C99.2061 59.1147 96.9036 61.6209 94.1187 62.6132C93.2539 62.9865 92.335 63.1907 91.3823 63.1907C90.1558 63.1907 88.9852 62.8522 87.9141 62.2502C85.5092 61.0797 83.541 58.749 82.4137 55.7831C81.3794 56.0386 80.9408 53.6205 80.708 52.6865C80.4124 51.4998 80.0368 49.9381 81.3794 49.9381C81.4071 42.7486 85.9043 36.9314 91.4479 36.9314C96.9916 36.9314 101.489 42.7486 101.516 49.9382Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M101.516 49.9382C102.523 49.6696 102.569 51.1503 102.188 52.6865C101.839 54.0864 101.516 56.3738 100.469 55.8186C99.2061 59.1147 96.9036 61.6209 94.1187 62.6132C93.2539 62.9865 92.335 63.1907 91.3823 63.1907C90.1558 63.1907 88.9852 62.8522 87.9141 62.2502C85.5092 61.0797 83.541 58.749 82.4137 55.7831C81.3794 56.0386 80.9408 53.6205 80.708 52.6865C80.4124 51.4998 80.0368 49.9381 81.3794 49.9381C81.4071 42.7486 85.9043 36.9314 91.4479 36.9314C96.9916 36.9314 101.489 42.7486 101.516 49.9382Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M82.8511 38.9974C84.1737 37.1736 85.1199 36.8624 85.583 36.7102C85.7392 36.6588 85.8404 36.6255 85.8826 36.5583C87.7015 33.6613 95.4923 34.1993 97.5869 35.7793C102.353 39.3742 101.179 41.8552 101.718 44.8136C101.997 46.3312 101.466 48.1935 101.343 49.7558C101.193 48.7194 100.336 45.5263 100.271 45.1756C99.5161 43.3436 96.206 45.5727 94.4699 45.481C90.5698 45.275 87.6487 44.5902 85.583 42.1222C84.9645 44.3108 83.0668 46.9683 81.8883 47.2176L81.6386 49.4339C80.9294 45.5012 80.3681 42.4216 82.8511 38.9974Z'\n fill='#1B1D22'\n />\n </g>\n <path\n d='M120.463 23.147C124.25 23.1231 127.732 24.1039 130.904 26.0896C132.206 26.9048 133.456 27.8894 134.653 29.0434C136.133 30.5797 137.332 32.2129 138.25 33.9435M139.876 38.135C140.289 39.7447 140.495 41.4261 140.495 43.1797C140.493 45.3005 140.189 47.3175 139.584 49.2303M139.159 35.916C139.294 36.2601 139.419 36.6078 139.534 36.9591'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n <path\n d='M113.428 71.4636C110.58 75.6164 106.868 78.6732 102.293 80.6289C100.416 81.4318 98.3924 82.0491 96.2244 82.4805C93.4244 82.9302 90.7316 83.0003 88.1457 82.6895M82.3367 81.2836C80.2663 80.5129 78.2741 79.4627 76.3598 78.1322C74.0467 76.5201 72.0751 74.6584 70.446 72.5468M85.3034 82.1842C84.8251 82.0707 84.3507 81.9434 83.8802 81.8021'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n <path\n d='M64.4212 62.7429C59.9987 62.7094 55.9963 61.3878 52.4254 58.7668C51.6772 58.2175 50.9479 57.6113 50.2376 56.9478C48.3933 54.9693 46.9862 52.8652 46.0148 50.6342M44.3886 42.7102C44.3919 40.0664 44.8765 37.563 45.8423 35.1999C46.8182 32.8119 48.2856 30.5672 50.2444 28.4658'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n </g>\n <defs>\n <clipPath id='clip0_4441_155270'>\n <rect\n width='184'\n height='113'\n fill='white'\n />\n </clipPath>\n </defs>\n </svg>\n\n);\n\nexport default GroupsSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst GuestAccessSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '294'}\n height={props.height ? props.height.toString() : '180'}\n viewBox='0 0 196 120'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <circle\n cx='20.5'\n cy='35'\n r='2'\n transform='rotate(-90 20.5 35)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='20.5'\n cy='29'\n r='2'\n transform='rotate(-90 20.5 29)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='20.5005'\n cy='23'\n r='2'\n transform='rotate(-90 20.5005 23)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M20.5 39.5V79.5H43M45 79.5H49M51 79.5H53'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M29.5 79.5H177.5V108.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 175 112)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <path\n d='M62.1304 22H129.87L134 115H58L62.1304 22Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.24'\n />\n <rect\n width='92'\n height='5'\n transform='matrix(1 0 0 -1 50 120)'\n fill='var(--center-channel-color)'\n fillOpacity='0.4'\n />\n <rect\n x='30'\n y='16'\n width='131'\n height='86'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <rect\n x='34'\n y='20'\n width='46'\n height='78'\n fill='#1C58D9'\n fillOpacity='0.16'\n />\n <path\n d='M49.8109 27.0273L66.5002 27.0273'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M49.8109 29.6628L59.4732 29.6628'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M38.392 38.4453H51.5678'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='41.5092'\n cy='27.5105'\n r='4.34771'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='39.4795'\n cy='43.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 43.1602H70.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='50.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 50.1602H64.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='58.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 58.1602H72.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='65.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 65.1602H70.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='72.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 72.1602H64.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='79.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 79.1602H72.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M150 108.5H122.5'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M119 108.5H113'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M110 108.5H104'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <ellipse\n cx='138.058'\n cy='43.6274'\n rx='14.1972'\n ry='13.767'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <mask\n id='mask0_4441_155706'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='124'\n y='30'\n width='28'\n height='28'\n >\n <path\n d='M124.288 43.8848C124.288 51.5124 130.49 57.6952 138.139 57.6952C142.476 57.6952 146.348 55.7078 148.887 52.5958C150.827 50.2191 151.99 47.1876 151.99 43.8848C151.99 36.2573 145.788 30.0745 138.139 30.0745C130.49 30.0745 124.288 36.2573 124.288 43.8848Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask0_4441_155706)'>\n <path\n d='M129.452 51.4217C130.886 50.4043 135.904 49.4434 138.234 49.0901C140.384 49.514 145.295 50.6586 147.732 51.8456C150.169 53.0326 150.539 56.7208 150.42 58.4165H126.047C126.047 53.7533 127.66 52.6935 129.452 51.4217Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M129.452 51.4217C130.886 50.4043 135.904 49.4434 138.234 49.0901C140.384 49.514 145.295 50.6586 147.732 51.8456C150.169 53.0326 150.539 56.7208 150.42 58.4165H126.047C126.047 53.7533 127.66 52.6935 129.452 51.4217Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M141.472 49.8071L140.46 46.5787H136.016L135.195 49.8071C136.988 50.7038 139.678 50.7038 141.472 49.8071Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M141.472 49.8071L140.46 46.5787H136.016L135.195 49.8071C136.988 50.7038 139.678 50.7038 141.472 49.8071Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M144.176 40.5879C144.767 40.4301 144.794 41.2999 144.57 42.2022C144.365 43.0245 144.176 44.3681 143.56 44.042C142.819 45.9781 141.466 47.4502 139.831 48.0331C139.323 48.2524 138.783 48.3723 138.223 48.3723C137.503 48.3723 136.815 48.1735 136.186 47.8199C134.773 47.1323 133.617 45.7633 132.955 44.0211C132.348 44.1712 132.09 42.7509 131.953 42.2022C131.78 41.5052 131.559 40.5878 132.348 40.5878C132.364 36.3648 135.005 32.9478 138.262 32.9478C141.518 32.9478 144.16 36.3648 144.176 40.5879Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M144.176 40.5879C144.767 40.4301 144.794 41.2999 144.57 42.2022C144.365 43.0245 144.176 44.3681 143.56 44.042C142.819 45.9781 141.466 47.4502 139.831 48.0331C139.323 48.2524 138.783 48.3723 138.223 48.3723C137.503 48.3723 136.815 48.1735 136.186 47.8199C134.773 47.1323 133.617 45.7633 132.955 44.0211C132.348 44.1712 132.09 42.7509 131.953 42.2022C131.78 41.5052 131.559 40.5878 132.348 40.5878C132.364 36.3648 135.005 32.9478 138.262 32.9478C141.518 32.9478 144.16 36.3648 144.176 40.5879Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M133.213 34.161C133.989 33.0897 134.545 32.9069 134.817 32.8175C134.909 32.7873 134.968 32.7678 134.993 32.7283C136.062 31.0266 140.638 31.3426 141.868 32.2707C144.668 34.3823 143.978 35.8397 144.295 37.5774C144.459 38.4688 144.147 39.5627 144.075 40.4804C143.986 39.8716 143.483 37.996 143.445 37.7901C143.001 36.7139 141.057 38.0233 140.037 37.9694C137.746 37.8484 136.031 37.4462 134.817 35.9965C134.454 37.2821 133.339 38.8431 132.647 38.9895L132.5 40.2913C132.084 37.9813 131.754 36.1724 133.213 34.161Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <ellipse\n cx='101.058'\n cy='80.6274'\n rx='14.1972'\n ry='13.767'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <mask\n id='mask1_4441_155706'\n maskUnits='userSpaceOnUse'\n x='87'\n y='67'\n width='28'\n height='28'\n mask-type='luminance'\n >\n <path\n d='M87.2884 80.8848C87.2884 88.5124 93.4899 94.6952 101.139 94.6952C105.476 94.6952 109.348 92.7078 111.887 89.5958C113.827 87.2191 114.99 84.1876 114.99 80.8848C114.99 73.2573 108.788 67.0745 101.139 67.0745C93.4899 67.0745 87.2884 73.2573 87.2884 80.8848Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1_4441_155706)'>\n <path\n d='M92.4524 88.4217C93.8861 87.4043 98.904 86.4434 101.234 86.0901C103.384 86.514 108.295 87.6586 110.732 88.8456C113.169 90.0326 113.539 93.7208 113.42 95.4165H89.0474C89.0474 90.7533 90.6603 89.6935 92.4524 88.4217Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M92.4524 88.4217C93.8861 87.4043 98.904 86.4434 101.234 86.0901C103.384 86.514 108.295 87.6586 110.732 88.8456C113.169 90.0326 113.539 93.7208 113.42 95.4165H89.0474C89.0474 90.7533 90.6603 89.6935 92.4524 88.4217Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M104.472 86.8071L103.46 83.5787H99.0163L98.1945 86.8071C99.9881 87.7038 102.678 87.7038 104.472 86.8071Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M104.472 86.8071L103.46 83.5787H99.0163L98.1945 86.8071C99.9881 87.7038 102.678 87.7038 104.472 86.8071Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M107.176 77.5879C107.767 77.4301 107.794 78.2999 107.57 79.2022C107.365 80.0245 107.176 81.3681 106.56 81.042C105.819 82.9781 104.466 84.4502 102.831 85.0331C102.323 85.2524 101.783 85.3723 101.223 85.3723C100.503 85.3723 99.8151 85.1735 99.186 84.8199C97.7734 84.1323 96.6173 82.7633 95.9551 81.0211C95.3476 81.1712 95.0899 79.7509 94.9532 79.2022C94.7796 78.5052 94.5589 77.5878 95.3476 77.5878C95.3638 73.3648 98.0055 69.9478 101.262 69.9478C104.518 69.9478 107.16 73.3648 107.176 77.5879Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M107.176 77.5879C107.767 77.4301 107.794 78.2999 107.57 79.2022C107.365 80.0245 107.176 81.3681 106.56 81.042C105.819 82.9781 104.466 84.4502 102.831 85.0331C102.323 85.2524 101.783 85.3723 101.223 85.3723C100.503 85.3723 99.8151 85.1735 99.186 84.8199C97.7734 84.1323 96.6173 82.7633 95.9551 81.0211C95.3476 81.1712 95.0899 79.7509 94.9532 79.2022C94.7796 78.5052 94.5589 77.5878 95.3476 77.5878C95.3638 73.3648 98.0055 69.9478 101.262 69.9478C104.518 69.9478 107.16 73.3648 107.176 77.5879Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M96.2126 71.161C96.9894 70.0897 97.5452 69.9069 97.8172 69.8175C97.909 69.7873 97.9685 69.7678 97.9932 69.7283C99.0616 68.0266 103.638 68.3426 104.868 69.2707C107.668 71.3823 106.978 72.8397 107.295 74.5774C107.459 75.4688 107.147 76.5627 107.075 77.4804C106.986 76.8716 106.483 74.996 106.445 74.7901C106.001 73.7139 104.057 75.0233 103.037 74.9694C100.746 74.8484 99.0307 74.4462 97.8172 72.9965C97.4539 74.2821 96.3393 75.8431 95.647 75.9895L95.5003 77.2913C95.0838 74.9813 94.7541 73.1724 96.2126 71.161Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <path\n d='M115 43.942C115 51.6417 108.732 57.883 101 57.883C96.6159 57.883 92.7022 55.8768 90.1356 52.7353C88.1749 50.3362 87 47.276 87 43.942C87 36.2423 93.2684 30.001 101 30.001C108.732 30.001 115 36.2423 115 43.942Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M115 43.942C115 51.6417 108.732 57.883 101 57.883C96.6159 57.883 92.7022 55.8768 90.1356 52.7353C88.1749 50.3362 87 47.276 87 43.942C87 36.2423 93.2684 30.001 101 30.001C108.732 30.001 115 36.2423 115 43.942Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask2_4441_155706'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='87'\n y='30'\n width='28'\n height='28'\n >\n <path\n d='M115 43.941C115 51.6407 108.732 57.8819 101 57.8819C96.6159 57.8819 92.7022 55.8757 90.1356 52.7343C88.1749 50.3351 87 47.275 87 43.941C87 36.2413 93.2684 30 101 30C108.732 30 115 36.2413 115 43.941Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask2_4441_155706)'>\n <path\n d='M108.286 52.6015L107.739 41.6589C107.506 37.0108 104.56 33.3966 101.002 33.3966C97.4454 33.3966 94.4988 37.0108 94.2664 41.6589L93.7188 52.6015H108.286Z'\n fill='var(--neutral-1200)'\n />\n <path\n d='M111.559 52.9532C111.041 51.159 109.59 49.7866 107.77 49.3672L103.92 48.4804H98.083L94.233 49.3672C92.4123 49.7866 90.9622 51.159 90.4435 52.9532L88.9744 60.7126H113.028L111.559 52.9532Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M111.559 52.9532C111.041 51.159 109.59 49.7866 107.77 49.3672L103.92 48.4804H98.083L94.233 49.3672C92.4123 49.7866 90.9622 51.159 90.4435 52.9532L88.9744 60.7126H113.028L111.559 52.9532Z'\n fill='#1C58D9'\n />\n <path\n d='M103.531 48.6403L102.741 45.9391H99.2756L98.6347 48.6403C100.034 49.3906 102.132 49.3906 103.531 48.6403Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M103.531 48.6403L102.741 45.9391H99.2756L98.6347 48.6403C100.034 49.3906 102.132 49.3906 103.531 48.6403Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M105.956 40.3675C106.442 40.2298 106.464 40.989 106.28 41.7766C106.111 42.4944 105.956 43.6672 105.45 43.3825C104.841 45.0725 103.73 46.3575 102.386 46.8663C101.969 47.0577 101.526 47.1624 101.066 47.1624C100.474 47.1624 99.9092 46.9888 99.3924 46.6802C98.232 46.08 97.2824 44.885 96.7384 43.3643C96.2394 43.4953 96.0277 42.2555 95.9154 41.7766C95.7727 41.1682 95.5915 40.3674 96.2394 40.3674C96.2527 36.6812 98.4227 33.6986 101.098 33.6986C103.772 33.6986 105.942 36.6812 105.956 40.3675Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M105.956 40.3675C106.442 40.2298 106.464 40.989 106.28 41.7766C106.111 42.4944 105.956 43.6672 105.45 43.3825C104.841 45.0725 103.73 46.3575 102.386 46.8663C101.969 47.0577 101.526 47.1624 101.066 47.1624C100.474 47.1624 99.9092 46.9888 99.3924 46.6802C98.232 46.08 97.2824 44.885 96.7384 43.3643C96.2394 43.4953 96.0277 42.2555 95.9154 41.7766C95.7727 41.1682 95.5915 40.3674 96.2394 40.3674C96.2527 36.6812 98.4227 33.6986 101.098 33.6986C103.772 33.6986 105.942 36.6812 105.956 40.3675Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M106.351 40.3897C106.344 40.4455 106.307 40.4948 106.25 40.5227C106.194 40.5506 106.125 40.5538 106.066 40.5307C104.576 39.9629 103.131 38.4316 102.675 36.9943C101.229 38.4937 98.8432 40.2472 96.4657 40.6326C96.4527 40.635 96.4407 40.6358 96.4278 40.6358L96.4287 40.6366C96.3862 40.6366 96.3436 40.6246 96.3085 40.6031C96.2632 40.5745 96.2336 40.5307 96.2262 40.4829C95.9871 38.7663 96.4912 35.5187 98.0222 34.5167C99.0348 33.8539 99.8141 33.4136 101.082 33.4967C102.37 33.5811 103.77 34.2791 104.768 34.986C106.247 36.0345 106.559 38.7152 106.351 40.3897Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <path\n d='M152 80.9408C152 88.6405 145.731 94.8817 138 94.8817C133.616 94.8817 129.702 92.8755 127.136 89.7341C125.175 87.3349 124 84.2748 124 80.9408C124 73.2412 130.268 67 138 67C145.731 67 152 73.2412 152 80.9408Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M152 80.9408C152 88.6405 145.731 94.8817 138 94.8817C133.616 94.8817 129.702 92.8755 127.136 89.7341C125.175 87.3349 124 84.2748 124 80.9408C124 73.2412 130.268 67 138 67C145.731 67 152 73.2412 152 80.9408Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask3_4441_155706'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='124'\n y='67'\n width='29'\n height='28'\n >\n <path\n d='M152 80.9408C152 88.6405 145.732 94.8817 138 94.8817C133.616 94.8817 129.703 92.8755 127.136 89.7341C125.175 87.3349 124 84.2748 124 80.9408C124 73.2412 130.269 67 138 67C145.732 67 152 73.2412 152 80.9408Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask3_4441_155706)'>\n <path\n d='M150.352 92.3824C149.744 90.417 148.047 88.9139 145.918 88.4545L141.414 87.4836H134.586L130.081 88.4545C127.951 88.9139 126.255 90.417 125.648 92.3824L123.929 100.881H152.07L150.352 92.3824Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M150.352 92.3824C149.744 90.417 148.048 88.9139 145.919 88.4545L141.415 87.4836H134.586L130.082 88.4545C127.952 88.9139 126.255 90.417 125.649 92.3824L123.93 100.881H152.071L150.352 92.3824Z'\n fill='#1C58D9'\n />\n <path\n d='M140.736 87.8616L139.814 85.1019H135.768L135.019 87.8616C136.653 88.6282 139.103 88.6282 140.736 87.8616Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M140.736 87.8616L139.814 85.1019H135.768L135.019 87.8616C136.653 88.6282 139.103 88.6282 140.736 87.8616Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M143.13 79.5591C143.654 79.4178 143.678 80.1968 143.479 81.0049C143.298 81.7414 143.13 82.9448 142.585 82.6527C141.929 84.3868 140.731 85.7053 139.283 86.2273C138.833 86.4237 138.355 86.5312 137.86 86.5312C137.222 86.5312 136.613 86.3531 136.056 86.0364C134.806 85.4206 133.782 84.1944 133.196 82.634C132.658 82.7685 132.43 81.4963 132.309 81.0049C132.155 80.3806 131.96 79.559 132.658 79.559C132.672 75.7767 135.011 72.7163 137.894 72.7163C140.777 72.7163 143.116 75.7767 143.13 79.5591Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M143.13 79.5591C143.654 79.4178 143.678 80.1968 143.479 81.0049C143.298 81.7414 143.13 82.9448 142.585 82.6527C141.929 84.3868 140.731 85.7053 139.283 86.2273C138.833 86.4237 138.355 86.5312 137.86 86.5312C137.222 86.5312 136.613 86.3531 136.056 86.0364C134.806 85.4206 133.782 84.1944 133.196 82.634C132.658 82.7685 132.43 81.4963 132.309 81.0049C132.155 80.3806 131.96 79.559 132.658 79.559C132.672 75.7767 135.011 72.7163 137.894 72.7163C140.777 72.7163 143.116 75.7767 143.13 79.5591Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M132.172 72.0366C130.832 73.675 130.803 76.3499 132.096 78.7459C132.538 79.277 132.978 79.8071 133.42 80.3382C133.406 76.4669 134.034 75.424 134.644 75.234C135.649 74.9186 136.841 76.8499 139.022 76.8017C139.354 76.7942 140.099 76.7673 140.554 76.2459C140.946 75.7963 140.887 75.2448 141.005 75.233C141.2 75.2137 141.552 76.2673 142.229 80.3371C142.664 79.8028 143.101 79.2674 143.536 78.733C143.774 77.8038 143.993 76.5849 144.008 75.1493C144.028 73.2083 143.077 71.9796 142.737 70.8884C141.457 74.1194 140.167 70.0895 136.056 70.0961C134.72 70.0983 133.05 70.9636 132.172 72.0366Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <rect\n x='108'\n y='4'\n width='83'\n height='50'\n rx='4'\n fill='var(--neutral-1200)'\n fillOpacity='0.32'\n />\n <rect\n x='110.5'\n y='0.5'\n width='82'\n height='49'\n rx='3.5'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n />\n <path\n d='M152 10H166.481'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M152 16H175'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M152 22H182'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M152 28H182'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M168.891 10H178.525'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M180.932 10H183.946'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M127.509 6.91797H130.5L130.879 9.3795C131.794 9.58757 132.651 9.94891 133.422 10.4351L135.435 8.95885L137.55 11.0739L136.056 13.1106C136.521 13.8733 136.865 14.7179 137.061 15.6177L139.592 16.007V18.9982L136.996 19.3976C136.779 20.2497 136.428 21.0485 135.968 21.7704L137.55 23.9276L135.435 26.0426L133.226 24.4233C132.521 24.8414 131.747 25.1567 130.926 25.3485L130.505 28.0859H127.514L127.089 25.3257C126.282 25.127 125.522 24.8087 124.829 24.3908L122.577 26.0425L120.462 23.9274L122.097 21.6981C121.661 20.9993 121.328 20.2302 121.118 19.4116L118.422 18.9969V16.0057L121.053 15.601C121.243 14.7356 121.57 13.9214 122.01 13.1824L120.464 11.0737L122.579 8.95866L124.637 10.4677C125.391 9.98385 126.23 9.62025 127.127 9.40401L127.509 6.91797ZM133.041 17.3689C133.041 19.5704 131.256 21.355 129.054 21.355C126.853 21.355 125.068 19.5704 125.068 17.3689C125.068 15.1675 126.853 13.3828 129.054 13.3828C131.256 13.3828 133.041 15.1675 133.041 17.3689Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M138.405 30.9492H140.038L140.244 32.2907C140.745 32.4044 141.213 32.602 141.635 32.8679L142.73 32.0643L143.885 33.2188L143.071 34.3279C143.325 34.744 143.513 35.2048 143.619 35.6957L145 35.9081V37.5407L143.584 37.7585C143.465 38.2245 143.274 38.6613 143.022 39.0558L143.885 40.2329L142.73 41.3874L141.525 40.5032C141.14 40.7307 140.719 40.9023 140.272 41.0069L140.042 42.5039H138.409L138.177 40.9948C137.737 40.8867 137.324 40.7135 136.946 40.4861L135.715 41.3888L134.561 40.2344L135.453 39.0171C135.215 38.6355 135.033 38.2155 134.918 37.7683L133.445 37.5418V35.9092L134.881 35.6882C134.985 35.2163 135.163 34.7723 135.403 34.3692L134.56 33.2202L135.715 32.0657L136.835 32.887C137.247 32.6218 137.706 32.4226 138.197 32.3043L138.405 30.9492ZM141.426 36.6523C141.426 37.8539 140.452 38.828 139.25 38.828C138.048 38.828 137.074 37.8539 137.074 36.6523C137.074 35.4507 138.048 34.4766 139.25 34.4766C140.452 34.4766 141.426 35.4507 141.426 36.6523Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n </svg>\n);\n\nexport default GuestAccessSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport SystemRolesSVG from './images/system_roles_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst SystemRolesFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='system_roles'\n minimumSKURequiredForFeature={LicenseSkus.Enterprise}\n title={defineMessage({\n id: 'admin.system_roles_feature_discovery.title',\n defaultMessage: 'Provide controlled access to the System Console with Mattermost Enterprise',\n })}\n copy={defineMessage({\n id: 'admin.system_roles_feature_discovery.copy',\n defaultMessage: 'Assign customizable admin roles to give designated users read and/or write access to select sections of System Console.',\n })}\n learnMoreURL='https://docs.mattermost.com/deployment/admin-roles.html'\n featureDiscoveryImage={\n <SystemRolesSVG\n width={294}\n height={180}\n />}\n />\n );\n};\n\nexport default SystemRolesFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\ntype Props = {\n config: AdminConfig;\n};\n\nexport const messages = defineMessages({\n title: {id: 'admin.feature_flags.title', defaultMessage: 'Features Flags'},\n});\n\nconst FeatureFlags: React.FC<Props> = (props: Props) => {\n const flags = props.config.FeatureFlags;\n let settings = null;\n if (flags) {\n settings = Object.keys(flags).map((ffKey) => (\n <tr key={ffKey}>\n <td width='20px'/>\n <td className='whitespace--nowrap'>{ffKey}</td>\n <td className='whitespace--nowrap'>{String(flags[ffKey])}</td>\n </tr>\n ));\n }\n\n return (\n <div className='wrapper--admin'>\n <AdminHeader>\n <FormattedMessage {...messages.title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-logs-content admin-console__content'>\n <div className={'banner info'}>\n <div className='banner__content'>\n <FormattedMessage\n id='admin.feature_flags.introBanner'\n defaultMessage={'Feature flag values displayed here show the status of features enabled on this server. The values here are used only for troubleshooting by the Mattermost support team.'}\n />\n </div>\n </div>\n <div className='job-table__panel'>\n <div className='job-table__table'>\n <table\n className='table'\n >\n <thead>\n <tr>\n <th/>\n <th>\n <FormattedMessage\n id='admin.feature_flags.flag'\n defaultMessage='Flag'\n />\n </th>\n <th>\n <FormattedMessage\n id='admin.feature_flags.flag_value'\n defaultMessage='Value'\n />\n </th>\n </tr>\n </thead>\n <tbody>\n {settings}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FeatureFlags;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport MentionsIcon from 'components/widgets/icons/mentions_icon';\n\ntype Props = {\n name?: string;\n title: MessageDescriptor;\n customID: string;\n isDisabled?: boolean;\n showAtMention: boolean;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\nconst GroupProfile = ({\n name,\n title,\n customID,\n isDisabled,\n showAtMention,\n onChange,\n}: Props) => (\n <div\n className='group-profile form-horizontal'\n id={customID}\n >\n <div className='group-profile-field form-group mb-0'>\n <label\n className='control-label col-sm-4'\n htmlFor={customID + 'Input'}\n >\n <FormattedMessage {...title}/>\n </label>\n <div className='col-sm-8'>\n <div className='icon-over-input'>\n {showAtMention && (\n <MentionsIcon\n className='icon icon__mentions'\n aria-hidden='true'\n />\n )}\n </div>\n <input\n id={customID + 'Input'}\n type='text'\n className='form-control group-at-mention-input'\n value={name}\n disabled={isDisabled}\n onChange={onChange}\n />\n </div>\n </div>\n </div>\n);\n\nexport default memo(GroupProfile);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Toggle from 'components/toggle';\n\ntype Props = {\n id: string;\n title: JSX.Element;\n toggled: boolean;\n subTitle: JSX.Element;\n onToggle: () => void;\n last?: boolean;\n disabled?: boolean;\n singleLine?: boolean;\n children?: JSX.Element;\n offText?: JSX.Element;\n onText?: JSX.Element;\n};\n\nconst LineSwitch = (props: Props): JSX.Element => {\n const {title, subTitle, singleLine, toggled, onToggle, children, offText, onText, disabled, last, id} = props;\n return (<div>\n <div className='line-switch d-flex flex-sm-column flex-md-row align-items-sm-start align-items-center'>\n <label className='line-switch__label'>{title}</label>\n <div\n data-testid={id}\n className='line-switch__toggle'\n >\n <Toggle\n id={id}\n disabled={disabled}\n onToggle={onToggle}\n toggled={toggled}\n onText={onText}\n offText={offText}\n />\n </div>\n </div>\n <div className='row'>\n <div className='col-sm-10'>\n <div className={`help-text-small help-text-no-padding ${singleLine ? 'help-text-single-line' : ''}`}>{subTitle}</div>\n </div>\n </div>\n {children}\n {!last && <div className='section-separator'><hr className='separator__hr'/></div>}\n </div>);\n};\n\nexport default LineSwitch;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport './admin_panel.scss';\n\ntype Props = {\n id?: string;\n className?: string;\n onHeaderClick?: React.EventHandler<React.MouseEvent>;\n title: MessageDescriptor;\n subtitle: MessageDescriptor;\n subtitleValues?: any;\n button?: React.ReactNode;\n children?: React.ReactNode;\n};\n\nconst AdminPanel: React.FC<Props> = ({\n subtitle,\n title,\n button,\n children,\n className = '',\n id,\n onHeaderClick,\n subtitleValues,\n}: Props) => (\n <div\n className={'AdminPanel clearfix ' + className}\n id={id}\n >\n <div\n className='header'\n onClick={onHeaderClick}\n >\n <div>\n <h3>\n <FormattedMessage\n {...title}\n />\n </h3>\n <div className='mt-2'>\n <FormattedMessage\n {...subtitle}\n values={subtitleValues}\n />\n </div>\n </div>\n {button &&\n <div className='button'>\n {button}\n </div>\n }\n </div>\n {children}\n </div>\n);\n\nexport default AdminPanel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport GroupProfile from 'components/admin_console/group_settings/group_details/group_profile';\nimport LineSwitch from 'components/admin_console/team_channel_settings/line_switch';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\ntype GroupSettingsToggleProps = {\n isDefault: boolean;\n allowReference: boolean;\n onToggle: (allowReference: boolean) => void;\n isDisabled?: boolean;\n};\n\nconst GroupSettingsToggle = ({\n isDefault,\n allowReference,\n onToggle,\n isDisabled,\n}: GroupSettingsToggleProps) => (\n <LineSwitch\n id={'allowReferenceSwitch'}\n disabled={isDisabled || isDefault}\n toggled={allowReference}\n last={true}\n onToggle={() => {\n if (isDefault) {\n return;\n }\n onToggle(!allowReference);\n }}\n singleLine={false}\n title={\n <FormattedMessage\n id='admin.team_settings.team_details.groupDetailsToggle'\n defaultMessage='Enable Group Mention'\n />\n }\n subTitle={\n <FormattedMessage\n id='admin.team_settings.team_details.groupDetailsToggleDescr'\n defaultMessage='When enabled, this group can be mentioned in other channels and teams. This may result in the group member list being visible to all users.'\n />\n }\n />\n);\n\ntype GroupProfileAndSettingsProps = {\n displayname: string;\n mentionname?: string;\n allowReference: boolean;\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n onToggle: (allowReference: boolean) => void;\n readOnly?: boolean;\n};\n\nexport const GroupProfileAndSettings = ({\n displayname,\n mentionname,\n allowReference,\n onToggle,\n onChange,\n readOnly,\n}: GroupProfileAndSettingsProps) => (\n <AdminPanel\n id='group_profile'\n title={defineMessage({id: 'admin.group_settings.group_detail.groupProfileTitle', defaultMessage: 'Group Profile'})}\n subtitle={defineMessage({id: 'admin.group_settings.group_detail.groupProfileDescription', defaultMessage: 'The name for this group.'})}\n >\n <GroupProfile\n name={displayname}\n title={defineMessage({id: 'admin.group_settings.group_details.group_profile.name', defaultMessage: 'Name:'})}\n customID={'groupDisplayName'}\n isDisabled={true}\n showAtMention={false}\n />\n <div className='group-settings'>\n <div className='group-settings--body'>\n <div className='section-separator'>\n <hr className='separator__hr'/>\n </div>\n <GroupSettingsToggle\n isDefault={false}\n allowReference={allowReference}\n onToggle={onToggle}\n isDisabled={readOnly}\n />\n </div>\n </div>\n {allowReference && (\n <GroupProfile\n name={mentionname}\n title={defineMessage({id: 'admin.group_settings.group_details.group_mention.name', defaultMessage: 'Group Mention:'})}\n customID={'groupMention'}\n isDisabled={readOnly}\n showAtMention={true}\n onChange={onChange}\n />\n )}\n </AdminPanel>\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport isNil from 'lodash/isNil';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport GlobeIcon from 'components/widgets/icons/globe_icon';\nimport LockIcon from 'components/widgets/icons/lock_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {localizeMessage} from 'utils/utils';\n\ntype Props = {\n id: string;\n type: string;\n name: string;\n hasChildren?: boolean;\n collapsed?: boolean;\n onRemoveItem: (id: string, type: string) => void;\n onToggleCollapse: (id: string) => void;\n onChangeRoles: (id: string, type: string, schemeAdmin: boolean) => void;\n schemeAdmin?: boolean;\n isDisabled?: boolean;\n};\n\ntype State = {\n showConfirmationModal: boolean;\n};\n\nexport default class GroupTeamsAndChannelsRow extends React.PureComponent<\nProps,\nState\n> {\n constructor(props: Props) {\n super(props);\n this.state = {\n showConfirmationModal: false,\n };\n }\n\n removeItem = () => {\n this.props.onRemoveItem(this.props.id, this.props.type);\n this.setState({showConfirmationModal: false});\n };\n\n changeRoles = () => {\n this.props.onChangeRoles(\n this.props.id,\n this.props.type,\n !this.props.schemeAdmin,\n );\n };\n\n toggleCollapse = () => {\n this.props.onToggleCollapse(this.props.id);\n };\n\n displayAssignedRolesDropdown = () => {\n const {schemeAdmin, name, isDisabled} = this.props;\n const channelAdmin = (\n <FormattedMessage\n id='admin.group_teams_and_channels_row.channelAdmin'\n defaultMessage='Channel Admin'\n />\n );\n const teamAdmin = (\n <FormattedMessage\n id='admin.group_teams_and_channels_row.teamAdmin'\n defaultMessage='Team Admin'\n />\n );\n const member = (\n <FormattedMessage\n id='admin.group_teams_and_channels_row.member'\n defaultMessage='Member'\n />\n );\n let dropDown = null;\n if (!isNil(schemeAdmin)) {\n let currentRole = member;\n let roleToBe = this.props.type.includes('team') ? teamAdmin : channelAdmin;\n if (schemeAdmin) {\n currentRole = this.props.type.includes('team') ? teamAdmin : channelAdmin;\n roleToBe = member;\n }\n dropDown = (\n <div>\n <MenuWrapper isDisabled={isDisabled}>\n <div data-testid={`${name}_current_role`}>\n <a>\n <span>{currentRole} </span>\n <span className='caret'/>\n </a>\n </div>\n <Menu\n openLeft={true}\n openUp={true}\n ariaLabel={localizeMessage({\n id: 'admin.team_channel_settings.group_row.memberRole',\n defaultMessage: 'Member Role',\n })}\n id={`${name}_change_role_options`}\n >\n <Menu.ItemAction\n testid={`${name}_role_to_be`}\n onClick={this.changeRoles}\n text={roleToBe}\n />\n </Menu>\n </MenuWrapper>\n </div>\n );\n }\n\n return dropDown;\n };\n\n render = () => {\n let extraClasses = '';\n let arrowIcon = null;\n if (this.props.hasChildren) {\n arrowIcon = (\n <i\n className={\n 'fa ' +\n (this.props.collapsed ? 'fa-caret-right' : 'fa-caret-down')\n }\n onClick={this.toggleCollapse}\n />\n );\n extraClasses += ' has-children';\n }\n\n if (this.props.collapsed) {\n extraClasses += ' collapsed';\n }\n\n let channelIcon = null;\n let typeText = null;\n switch (this.props.type) {\n case 'public-team':\n typeText = (\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.publicTeam'\n defaultMessage='Team'\n />\n );\n break;\n case 'private-team':\n typeText = (\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.privateTeam'\n defaultMessage='Team (Private)'\n />\n );\n break;\n }\n\n switch (this.props.type) {\n case 'public-channel':\n channelIcon = (\n <span className='channel-icon'>\n <GlobeIcon className='icon icon__globe'/>\n </span>\n );\n typeText = (\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.publicChannel'\n defaultMessage='Channel'\n />\n );\n break;\n case 'private-channel':\n channelIcon = (\n <span className='channel-icon'>\n <LockIcon className='icon icon__lock'/>\n </span>\n );\n typeText = (\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.privateChannel'\n defaultMessage='Channel (Private)'\n />\n );\n break;\n }\n\n const displayType = this.props.type.split('-')[1];\n\n return (\n <tr className={'group-teams-and-channels-row' + extraClasses}>\n <ConfirmModal\n show={this.state.showConfirmationModal}\n title={\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.remove.confirm_header'\n defaultMessage='Remove Membership from the {name} {displayType}?'\n values={{name: this.props.name, displayType}}\n />\n }\n message={\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.remove.confirm_body'\n defaultMessage='Removing this membership will prevent future users in this group from being added to the {name} {displayType}.'\n values={{name: this.props.name, displayType}}\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.remove.confirm_button'\n defaultMessage='Yes, Remove'\n />\n }\n onConfirm={this.removeItem}\n onCancel={() =>\n this.setState({showConfirmationModal: false})\n }\n />\n <td>\n <span className='arrow-icon'>{arrowIcon}</span>\n {channelIcon}\n <span\n className={classNames({\n 'name-no-arrow':\n isNil(arrowIcon) && isNil(channelIcon),\n })}\n >\n {this.props.name}\n </span>\n </td>\n <td className='type'>{typeText}</td>\n <td>{this.displayAssignedRolesDropdown()}</td>\n <td className='text-right'>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={() =>\n this.setState({showConfirmationModal: true})\n }\n data-testid={`${this.props.name}_groupsyncable_remove`}\n disabled={this.props.isDisabled}\n >\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels_row.remove'\n defaultMessage='Remove'\n />\n </button>\n </td>\n </tr>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {GroupChannel, GroupTeam} from '@mattermost/types/groups';\n\nimport GroupTeamsAndChannelsRow from 'components/admin_console/group_settings/group_details/group_teams_and_channels_row';\n\nexport type Props = {\n id: string;\n teams?: GroupTeam[];\n channels?: GroupChannel[];\n loading: boolean;\n onChangeRoles: (id: string, type: string, roleToBe: boolean) => void;\n onRemoveItem: (id: string, type: string) => void;\n isDisabled?: boolean;\n};\n\nexport type State = {\n collapsed: Record<string, boolean>;\n};\n\ntype TeamType = `${'public' | 'private'}-${'channel' | 'team'}`;\n\ntype Team = {\n type: TeamType;\n hasChildren?: boolean;\n name: string;\n collapsed?: boolean;\n id: string;\n schemeAdmin?: boolean;\n};\nexport default class GroupTeamsAndChannels extends React.PureComponent<\nProps,\nState\n> {\n constructor(props: Props) {\n super(props);\n this.state = {\n collapsed: {},\n };\n }\n\n onToggleCollapse = (id: string) => {\n const collapsed = {...this.state.collapsed};\n collapsed[id] = !collapsed[id];\n this.setState({collapsed});\n };\n\n onRemoveItem = (id: string, type: string) => {\n this.props.onRemoveItem(id, type);\n };\n\n onChangeRoles = async (id: string, type: string, roleToBe: boolean) => {\n this.props.onChangeRoles(id, type, roleToBe);\n };\n\n teamsAndChannelsToEntries = (\n teams?: GroupTeam[],\n channels?: GroupChannel[],\n ) => {\n const entries: Team[] = [];\n\n const existingTeams = new Set();\n const teamEntries: Team[] = [];\n teams?.forEach((team) => {\n existingTeams.add(team.team_id);\n teamEntries.push({\n type: team.team_type === 'O' ? 'public-team' : 'private-team',\n hasChildren: channels?.some(\n (channel) => channel.team_id === team.team_id,\n ),\n name: team.team_display_name,\n collapsed: this.state.collapsed[team.team_id],\n id: team.team_id,\n schemeAdmin: team.scheme_admin,\n });\n });\n\n const channelEntriesByTeam: Record<string, Team[]> = {};\n channels?.forEach((channel: GroupChannel) => {\n channelEntriesByTeam[channel.team_id] =\n channelEntriesByTeam[channel.team_id] || [];\n channelEntriesByTeam[channel.team_id].push({\n type:\n channel.channel_type === 'O' ? 'public-channel' : 'private-channel',\n name: channel.channel_display_name,\n id: channel.channel_id,\n schemeAdmin: channel.scheme_admin,\n });\n\n if (!existingTeams.has(channel.team_id)) {\n existingTeams.add(channel.team_id);\n teamEntries.push({\n type:\n channel.team_type === 'O' ? 'public-team' : 'private-team',\n hasChildren: true,\n name: channel.team_display_name,\n collapsed: this.state.collapsed[channel.team_id],\n id: channel.team_id,\n });\n }\n });\n teamEntries.sort((a, b) =>\n (a.name && b.name ? a.name.localeCompare(b.name) : 0),\n );\n teamEntries.forEach((team) => {\n entries.push(team);\n if (team.hasChildren && !team.collapsed) {\n const teamChannels = channelEntriesByTeam[team.id];\n teamChannels.sort((a, b) => a.name.localeCompare(b.name));\n entries.push(...teamChannels);\n }\n });\n\n return entries;\n };\n\n render = () => {\n const entries = this.teamsAndChannelsToEntries(\n this.props.teams,\n this.props.channels,\n );\n\n if (this.props.loading) {\n return (\n <div className='group-teams-and-channels'>\n <div className='group-teams-and-channels-loading'>\n <i className='fa fa-spinner fa-pulse fa-2x'/>\n </div>\n </div>\n );\n }\n\n if (entries.length === 0) {\n return (\n <div className='group-teams-and-channels'>\n <div className='group-teams-and-channels-empty'>\n <FormattedMessage\n id='admin.group_settings.group_details.group_teams_and_channels.no-teams-or-channels-speicified'\n defaultMessage='No teams or channels specified yet'\n />\n </div>\n </div>\n );\n }\n\n return (\n <div className='AdminPanel__content'>\n <table\n id='team_and_channel_membership_table'\n className='AdminPanel__table group-teams-and-channels'\n >\n <thead className='group-teams-and-channels--header'>\n <tr>\n <th style={{width: '30%'}}>\n <FormattedMessage\n id='admin.group_settings.group_profile.group_teams_and_channels.name'\n defaultMessage='Name'\n />\n </th>\n <th style={{width: '25%'}}>\n <FormattedMessage\n id='admin.group_settings.group_profile.group_teams_and_channels.type'\n defaultMessage='Type'\n />\n </th>\n <th style={{width: '25%'}}>\n <FormattedMessage\n id='admin.group_settings.group_profile.group_teams_and_channels.assignedRoles'\n defaultMessage='Assigned Roles'\n />\n </th>\n <th style={{width: '20%'}}/>\n </tr>\n </thead>\n <tbody className='group-teams-and-channels--body'>\n {entries.map((entry) => (\n <GroupTeamsAndChannelsRow\n key={entry.id}\n onRemoveItem={this.onRemoveItem}\n onChangeRoles={this.onChangeRoles}\n onToggleCollapse={this.onToggleCollapse}\n isDisabled={this.props.isDisabled}\n {...entry}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport Avatar from 'components/widgets/users/avatar';\n\ntype Props = {\n username: string;\n displayName: string;\n email: string;\n userId: string;\n lastPictureUpdate: number;\n};\n\nconst GroupUsersRow = ({\n username,\n displayName,\n email,\n userId,\n lastPictureUpdate,\n}: Props) => {\n return (\n <div className='group-users-row'>\n <Avatar\n username={username}\n url={Client4.getProfilePictureUrl(\n userId,\n lastPictureUpdate,\n )}\n size='lg'\n />\n <div className='user-data'>\n <div className='name-row'>\n <span className='username'>\n {'@' + username}\n </span>\n {'-'}\n <span className='display-name'>\n {displayName}\n </span>\n </div>\n <div>\n <span className='email-label'>\n <FormattedMessage\n id='admin.group_settings.group_details.group_users.email'\n defaultMessage='Email:'\n />\n </span>\n <span className='email'>{email}</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default React.memo(GroupUsersRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport GroupUsersRow from 'components/admin_console/group_settings/group_details/group_users_row';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\n\nconst GROUP_MEMBERS_PAGE_SIZE = 20;\n\ntype Props = {\n groupID: string;\n members: UserProfile[];\n total: number;\n getMembers: (\n id: string,\n page?: number,\n perPage?: number\n ) => Promise<ActionResult>;\n};\n\ntype State = {\n loading: boolean;\n page: number;\n};\n\nexport default class GroupUsers extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n loading: true,\n page: 0,\n };\n }\n\n componentDidMount() {\n this.props.\n getMembers(this.props.groupID, 0, GROUP_MEMBERS_PAGE_SIZE).\n then(() => {\n this.setState({loading: false});\n });\n }\n\n previousPage = () => {\n const page = this.state.page < 1 ? 0 : this.state.page - 1;\n this.setState({page});\n };\n\n nextPage = async () => {\n const {total, members, groupID, getMembers} = this.props;\n const page =\n (this.state.page + 1) * GROUP_MEMBERS_PAGE_SIZE >= total ? this.state.page : this.state.page + 1;\n if (page === this.state.page) {\n return;\n }\n\n const numberOfMembersToLoad =\n (page + 1) * GROUP_MEMBERS_PAGE_SIZE >= total ? total : (page + 1) * GROUP_MEMBERS_PAGE_SIZE;\n if (members.length >= numberOfMembersToLoad) {\n this.setState({page});\n return;\n }\n\n this.setState({page, loading: true});\n await getMembers(groupID, page, GROUP_MEMBERS_PAGE_SIZE);\n this.setState({loading: false});\n };\n\n renderRows = () => {\n if (this.props.members.length === 0) {\n return (\n <div className='group-users-empty'>\n <FormattedMessage\n id='admin.group_settings.group_details.group_users.no-users-found'\n defaultMessage='No users found'\n />\n </div>\n );\n }\n\n const usersToDisplay = this.props.members.slice(\n this.state.page * GROUP_MEMBERS_PAGE_SIZE,\n (this.state.page + 1) * GROUP_MEMBERS_PAGE_SIZE,\n );\n return usersToDisplay.map((member) => {\n return (\n <GroupUsersRow\n key={member.id}\n username={member.username}\n displayName={member.first_name + ' ' + member.last_name}\n email={member.email}\n userId={member.id}\n lastPictureUpdate={member.last_picture_update}\n />\n );\n });\n };\n\n renderPagination = () => {\n if (this.props.members.length === 0) {\n return <div className='group-users--footer empty'/>;\n }\n\n const startCount = (this.state.page * GROUP_MEMBERS_PAGE_SIZE) + 1;\n let endCount = (this.state.page * GROUP_MEMBERS_PAGE_SIZE) + GROUP_MEMBERS_PAGE_SIZE;\n const total = this.props.total;\n if (endCount > total) {\n endCount = total;\n }\n const lastPage = endCount === total;\n const firstPage = this.state.page === 0;\n\n return (\n <div className='group-users--footer'>\n <div className='counter'>\n <FormattedMessage\n id='admin.group_settings.groups_list.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n values={{\n startCount,\n endCount,\n total,\n }}\n />\n </div>\n <button\n type='button'\n className={\n 'btn btn-tertiary prev ' + (firstPage ? 'disabled' : '')\n }\n onClick={this.previousPage}\n disabled={firstPage}\n >\n <PreviousIcon/>\n </button>\n <button\n type='button'\n className={\n 'btn btn-tertiary next ' + (lastPage ? 'disabled' : '')\n }\n onClick={this.nextPage}\n disabled={lastPage}\n >\n <NextIcon/>\n </button>\n </div>\n );\n };\n\n render = () => {\n return (\n <div className='group-users'>\n <div className='group-users--header'>\n <FormattedMessage\n id='admin.group_settings.group_profile.group_users.ldapConnectorText'\n defaultMessage={\n 'AD/LDAP Connector is configured to sync and manage this group and its users. <a>Click here to view</a>'\n }\n values={{\n a: (chunks: string) => (\n <Link to='/admin_console/authentication/ldap'>\n {chunks}\n </Link>\n ),\n }}\n />\n </div>\n <div className='group-users--body'>\n <div\n className={\n 'group-users-loading ' +\n (this.state.loading ? 'active' : '')\n }\n >\n <i className='fa fa-spinner fa-pulse fa-2x'/>\n </div>\n {this.renderRows()}\n </div>\n {this.renderPagination()}\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {MouseEvent} from 'react';\n\ntype Props = {\n id?: string;\n activeClassName?: string;\n\n // Bool whether navigation is blocked\n blocked: boolean;\n\n actions: {\n\n // Function for deferring navigation while blocked\n deferNavigation: (func: () => void) => void;\n };\n children?: React.ReactNode;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n onCancelConfirmed: () => void;\n};\n\nconst BlockableButton = ({blocked, actions, onClick, onCancelConfirmed, ...restProps}: Props) => {\n const handleClick = useCallback((e: MouseEvent) => {\n onClick?.(e);\n\n if (blocked) {\n e.preventDefault();\n actions.deferNavigation(() => {\n onCancelConfirmed();\n });\n }\n }, [actions, blocked, onClick, onCancelConfirmed]);\n\n return (\n <button\n {...restProps}\n onClick={handleClick}\n />\n );\n};\n\nexport default React.memo(BlockableButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {deferNavigation} from 'actions/admin_actions';\nimport {getNavigationBlocked} from 'selectors/views/admin';\n\nimport type {GlobalState} from 'types/store';\n\nimport BlockableButton from './blockable_button';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n blocked: getNavigationBlocked(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n deferNavigation,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(BlockableButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Either} from '@mattermost/types/utilities';\n\nimport BlockableButton from 'components/admin_console/blockable_button';\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport SaveButton from 'components/save_button';\n\ntype Props = {\n saving: boolean;\n saveNeeded: boolean;\n onClick: () => void;\n serverError?: JSX.Element | string;\n isDisabled?: boolean;\n savingMessage?: string;\n} & Either<{\n cancelLink: string;\n}, {\n onCancel: () => void;\n}>;\n\nconst SaveChangesPanel = ({saveNeeded, onClick, saving, serverError, cancelLink, onCancel, isDisabled, savingMessage}: Props) => {\n const {formatMessage} = useIntl();\n return (\n <div className='admin-console-save'>\n <SaveButton\n saving={saving}\n disabled={isDisabled || !saveNeeded}\n onClick={onClick}\n savingMessage={savingMessage ?? formatMessage({id: 'admin.team_channel_settings.saving', defaultMessage: 'Saving Config...'})}\n />\n {cancelLink ? (\n <BlockableLink\n id='cancelButtonSettings'\n className='btn btn-quaternary'\n to={cancelLink}\n >\n <FormattedMessage\n id='admin.team_channel_settings.cancel'\n defaultMessage='Cancel'\n />\n </BlockableLink>\n ) : onCancel && (\n <BlockableButton\n id='cancelButtonSettings'\n className='btn btn-quaternary'\n onCancelConfirmed={onCancel}\n >\n <FormattedMessage\n id='admin.team_channel_settings.cancel'\n defaultMessage='Cancel'\n />\n </BlockableButton>\n )}\n <div className='error-message'>\n {serverError}\n </div>\n </div>\n );\n};\n\nexport default SaveChangesPanel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessage, injectIntl} from 'react-intl';\n\nimport type {ChannelWithTeamData} from '@mattermost/types/channels';\nimport {\n SyncableType,\n} from '@mattermost/types/groups';\nimport type {\n Group,\n GroupChannel,\n GroupPatch,\n GroupTeam,\n SyncablePatch} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport {GroupProfileAndSettings} from 'components/admin_console/group_settings/group_details/group_profile_and_settings';\nimport GroupTeamsAndChannels from 'components/admin_console/group_settings/group_details/group_teams_and_channels';\nimport GroupUsers from 'components/admin_console/group_settings/group_details/group_users';\nimport SaveChangesPanel from 'components/admin_console/save_changes_panel';\nimport ChannelSelectorModal from 'components/channel_selector_modal';\nimport FormError from 'components/form_error';\nimport TeamSelectorModal from 'components/team_selector_modal';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nexport type Props = {\n groupID: string;\n group: Group;\n groupTeams: GroupTeam[];\n groupChannels: GroupChannel[];\n members: UserProfile[];\n memberCount: number;\n isDisabled?: boolean;\n actions: {\n getGroup: (id: string) => Promise<ActionResult>;\n getMembers: (\n id: string,\n page?: number,\n perPage?: number\n ) => Promise<ActionResult>;\n getGroupStats: (id: string) => Promise<ActionResult>;\n getGroupSyncables: (\n id: string,\n syncableType: SyncableType\n ) => Promise<ActionResult>;\n link: (\n id: string,\n syncableID: string,\n syncableType: SyncableType,\n patch: SyncablePatch\n ) => Promise<ActionResult>;\n unlink: (\n id: string,\n syncableID: string,\n syncableType: SyncableType\n ) => Promise<ActionResult>;\n patchGroupSyncable: (\n id: string,\n syncableID: string,\n syncableType: SyncableType,\n patch: SyncablePatch\n ) => Promise<ActionResult>;\n patchGroup: (id: string, patch: GroupPatch) => Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => {\n type: 'SET_NAVIGATION_BLOCKED';\n blocked: boolean;\n };\n };\n} & WrappedComponentProps;\n\nexport type State = {\n loadingTeamsAndChannels: boolean;\n addTeamOpen: boolean;\n addChannelOpen: boolean;\n allowReference: boolean;\n groupMentionName?: string;\n saving: boolean;\n saveNeeded: boolean;\n serverError: JSX.Element | undefined;\n hasAllowReferenceChanged: boolean;\n hasGroupMentionNameChanged: boolean;\n teamsToAdd: GroupTeam[];\n channelsToAdd: GroupChannel[];\n itemsToRemove: any[];\n rolesToChange: Record<string, boolean>;\n groupTeams: GroupTeam[];\n groupChannels: GroupChannel[];\n};\n\nclass GroupDetails extends React.PureComponent<Props, State> {\n static defaultProps: Partial<Props> = {\n groupID: '',\n members: [],\n groupTeams: [],\n groupChannels: [],\n group: {name: '', allow_reference: false} as Group,\n memberCount: 0,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n loadingTeamsAndChannels: true,\n addTeamOpen: false,\n addChannelOpen: false,\n allowReference: Boolean(props.group.allow_reference),\n groupMentionName: props.group.name,\n saving: false,\n saveNeeded: false,\n serverError: undefined,\n hasAllowReferenceChanged: false,\n hasGroupMentionNameChanged: false,\n teamsToAdd: [],\n channelsToAdd: [],\n itemsToRemove: [],\n rolesToChange: {},\n groupTeams: [],\n groupChannels: [],\n };\n }\n\n componentDidMount() {\n const {groupID, actions} = this.props;\n actions.getGroup(groupID);\n\n Promise.all([\n actions.getGroupSyncables(groupID, SyncableType.Team),\n actions.getGroupSyncables(groupID, SyncableType.Channel),\n actions.getGroupStats(groupID),\n ]).then(() => {\n this.setState({\n loadingTeamsAndChannels: false,\n allowReference: Boolean(this.props.group.allow_reference),\n groupMentionName: this.props.group.name,\n });\n });\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n // groupchannels\n if (\n prevState.saveNeeded !== this.state.saveNeeded &&\n !this.state.saveNeeded &&\n prevProps.groupChannels === this.props.groupChannels\n ) {\n this.setState({groupChannels: this.props.groupChannels});\n }\n if (prevProps.groupChannels !== this.props.groupChannels) {\n let gcs;\n if (this.state.saveNeeded) {\n const {groupChannels = []} = this.state;\n const stateIDs = groupChannels.map((gc) => gc.channel_id);\n gcs = this.props.groupChannels.\n filter((gc) => !stateIDs.includes(gc.channel_id)).\n concat(groupChannels);\n } else {\n gcs = this.props.groupChannels;\n }\n this.setState({groupChannels: gcs});\n }\n\n // groupteams\n if (\n prevState.saveNeeded !== this.state.saveNeeded &&\n !this.state.saveNeeded &&\n prevProps.groupTeams === this.props.groupTeams\n ) {\n this.setState({groupTeams: this.props.groupTeams});\n }\n if (prevProps.groupTeams !== this.props.groupTeams) {\n let gcs;\n if (this.state.saveNeeded) {\n const {groupTeams = []} = this.state;\n const stateIDs = groupTeams.map((gc) => gc.team_id);\n gcs = this.props.groupTeams.\n filter((gc) => !stateIDs.includes(gc.team_id)).\n concat(groupTeams);\n } else {\n gcs = this.props.groupTeams;\n }\n this.setState({groupTeams: gcs});\n }\n }\n\n openAddChannel = () => {\n this.setState({addChannelOpen: true});\n };\n\n closeAddChannel = () => {\n this.setState({addChannelOpen: false});\n };\n\n openAddTeam = () => {\n this.setState({addTeamOpen: true});\n };\n\n closeAddTeam = () => {\n this.setState({addTeamOpen: false});\n };\n\n addTeams = (teams: Team[]) => {\n const {groupID} = this.props;\n const {groupTeams = []} = this.state;\n const teamsToAdd: GroupTeam[] = teams.map((team) => ({\n group_id: groupID,\n scheme_admin: false,\n team_display_name: team.display_name,\n team_id: team.id,\n team_type: team.type,\n }));\n this.setState({\n saveNeeded: true,\n groupTeams: groupTeams.concat(teamsToAdd),\n teamsToAdd,\n });\n this.props.actions.setNavigationBlocked(true);\n };\n\n addChannels = (channels: ChannelWithTeamData[]) => {\n const {groupID} = this.props;\n const {groupChannels = []} = this.state;\n const channelsToAdd: GroupChannel[] = channels.map((channel) => ({\n channel_display_name: channel.display_name,\n channel_id: channel.id,\n channel_type: channel.type,\n group_id: groupID,\n scheme_admin: false,\n team_display_name: channel.team_display_name,\n team_id: channel.team_id,\n }));\n this.setState({\n saveNeeded: true,\n groupChannels: groupChannels.concat(channelsToAdd),\n channelsToAdd,\n });\n this.props.actions.setNavigationBlocked(true);\n };\n\n onRemoveTeamOrChannel = (id: string, type: string) => {\n const {\n groupTeams,\n groupChannels,\n itemsToRemove = [],\n channelsToAdd,\n teamsToAdd,\n } = this.state;\n const newState: Partial<State> = {\n saveNeeded: true,\n itemsToRemove,\n serverError: undefined,\n };\n const syncableType = this.syncableTypeFromEntryType(type);\n\n let makeAPIRequest = true;\n if (syncableType === SyncableType.Channel) {\n newState.channelsToAdd = channelsToAdd?.filter(\n (item) => item.channel_id !== id,\n );\n if (\n !this.props.groupChannels.some((item) => item.channel_id === id)\n ) {\n makeAPIRequest = false;\n }\n } else if (syncableType === SyncableType.Team) {\n newState.teamsToAdd = teamsToAdd?.filter(\n (item) => item.team_id !== id,\n );\n if (!this.props.groupTeams.some((item) => item.team_id === id)) {\n makeAPIRequest = false;\n }\n }\n if (makeAPIRequest) {\n itemsToRemove.push({id, type});\n }\n\n if (\n this.syncableTypeFromEntryType(type) === SyncableType.Team\n ) {\n newState.groupTeams = groupTeams?.filter((gt) => gt.team_id !== id);\n } else {\n newState.groupChannels = groupChannels?.filter(\n (gc) => gc.channel_id !== id,\n );\n }\n this.setState(newState as any);\n this.props.actions.setNavigationBlocked(true);\n };\n\n syncableTypeFromEntryType = (entryType?: string) => {\n switch (entryType) {\n case 'public-team':\n case 'private-team':\n return SyncableType.Team;\n case 'public-channel':\n case 'private-channel':\n return SyncableType.Channel;\n default:\n return null;\n }\n };\n\n onChangeRoles = (id: string, type: string, schemeAdmin: boolean) => {\n const {\n rolesToChange = {},\n groupTeams = [],\n groupChannels = [],\n } = this.state;\n let listToUpdate;\n let getId: (item: any) => string;\n let stateKey;\n\n const key = `${id}/${type}`;\n rolesToChange[key] = schemeAdmin;\n\n if (\n this.syncableTypeFromEntryType(type) === SyncableType.Team\n ) {\n listToUpdate = groupTeams;\n getId = (item: GroupTeam) => item.team_id;\n stateKey = 'groupTeams';\n } else {\n listToUpdate = groupChannels;\n getId = (item: GroupChannel) => item.channel_id;\n stateKey = 'groupChannels';\n }\n\n const updatedItems = listToUpdate.map((item) => {\n if (getId(item) === id) {\n item.scheme_admin = schemeAdmin;\n }\n return item;\n }); // clone list of objects\n\n this.setState({\n saveNeeded: true,\n rolesToChange,\n [stateKey]: updatedItems,\n } as any);\n this.props.actions.setNavigationBlocked(true);\n };\n\n onMentionToggle = (allowReference: boolean) => {\n const {group} = this.props;\n const originalAllowReference = group.allow_reference;\n const saveNeeded = true;\n let {groupMentionName} = this.state;\n\n if (!originalAllowReference && allowReference && !groupMentionName) {\n groupMentionName = group.display_name.\n toLowerCase().\n replace(/\\s/g, '-');\n }\n\n this.setState({\n saveNeeded,\n allowReference,\n groupMentionName,\n hasAllowReferenceChanged: allowReference !== originalAllowReference,\n });\n this.props.actions.setNavigationBlocked(saveNeeded);\n };\n\n onMentionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const {group} = this.props;\n const originalGroupMentionName = group.name;\n const groupMentionName = e.target.value;\n const saveNeeded = true;\n\n this.setState({\n saveNeeded,\n groupMentionName,\n hasGroupMentionNameChanged:\n groupMentionName !== originalGroupMentionName,\n });\n this.props.actions.setNavigationBlocked(saveNeeded);\n };\n\n handleSubmit = async () => {\n this.setState({saving: true});\n\n const patchGroupSuccessful = await this.handlePatchGroup();\n const addsSuccessful = await this.handleAddedTeamsAndChannels();\n const removesSuccessful = await this.handleRemovedTeamsAndChannels();\n const rolesSuccessful = await this.handleRolesToUpdate();\n\n await Promise.all([\n this.props.actions.getGroupSyncables(\n this.props.groupID,\n SyncableType.Channel,\n ),\n this.props.actions.getGroupSyncables(\n this.props.groupID,\n SyncableType.Team,\n ),\n ]);\n\n const allSuccuessful =\n patchGroupSuccessful &&\n addsSuccessful &&\n removesSuccessful &&\n rolesSuccessful;\n\n this.setState({saveNeeded: !allSuccuessful, saving: false});\n\n this.props.actions.setNavigationBlocked(!allSuccuessful);\n };\n\n roleChangeKey = (groupTeamOrChannel: {\n type?: SyncableType;\n team_id?: string;\n channel_id?: string;\n }) => {\n let id;\n if (\n this.syncableTypeFromEntryType(groupTeamOrChannel.type) ===\n SyncableType.Team\n ) {\n id = groupTeamOrChannel.team_id;\n } else {\n id = groupTeamOrChannel.channel_id;\n }\n return `${id}/${groupTeamOrChannel.type}`;\n };\n\n handlePatchGroup = async () => {\n const {\n allowReference,\n groupMentionName,\n hasAllowReferenceChanged,\n hasGroupMentionNameChanged,\n } = this.state;\n let serverError;\n\n const GroupNameIsTakenError = (\n <FormattedMessage\n id='admin.group_settings.group_detail.duplicateMentionNameError'\n defaultMessage='Group mention is already taken.'\n />\n );\n\n if (!groupMentionName && allowReference) {\n serverError = (\n <FormattedMessage\n id='admin.group_settings.need_groupname'\n defaultMessage='You must specify a group mention.'\n />\n );\n this.setState({allowReference, serverError});\n return false;\n } else if (hasAllowReferenceChanged || hasGroupMentionNameChanged) {\n let lcGroupMentionName;\n if (allowReference) {\n lcGroupMentionName = groupMentionName?.toLowerCase();\n }\n const result = await this.props.actions.patchGroup(\n this.props.groupID,\n {allow_reference: Boolean(allowReference), name: lcGroupMentionName},\n );\n if (result.error) {\n if (\n result.error.server_error_id ===\n 'store.sql_group.unique_constraint'\n ) {\n serverError = GroupNameIsTakenError;\n } else if (\n result.error.server_error_id ===\n 'model.group.name.invalid_chars.app_error'\n ) {\n serverError = (\n <FormattedMessage\n id='admin.group_settings.group_detail.invalidOrReservedMentionNameError'\n defaultMessage='Only letters (a-z), numbers(0-9), periods, dashes and underscores are allowed.'\n />\n );\n } else if (\n result.error.server_error_id ===\n 'api.ldap_groups.existing_reserved_name_error' ||\n result.error.server_error_id ===\n 'api.ldap_groups.existing_user_name_error' ||\n result.error.server_error_id ===\n 'api.ldap_groups.existing_group_name_error'\n ) {\n serverError = GroupNameIsTakenError;\n } else if (\n result.error.server_error_id ===\n 'model.group.name.invalid_length.app_error'\n ) {\n serverError = (\n <FormattedMessage\n id='admin.group_settings.group_detail.invalid_length'\n defaultMessage='Name must be 1 to 64 lowercase alphanumeric characters.'\n />\n );\n } else {\n serverError = result.error?.message;\n }\n }\n this.setState({\n allowReference,\n groupMentionName: lcGroupMentionName,\n serverError,\n hasAllowReferenceChanged: result.error ? hasAllowReferenceChanged : false,\n hasGroupMentionNameChanged: result.error ? hasGroupMentionNameChanged : false,\n });\n }\n\n return !serverError;\n };\n\n handleRolesToUpdate = async () => {\n const {rolesToChange} = this.state;\n const promises: Array<Promise<ActionResult>> = [];\n\n if (rolesToChange) {\n Object.entries(rolesToChange).forEach(([key, value]) => {\n const [syncableID, type] = key.split('/');\n const syncableType = this.syncableTypeFromEntryType(type);\n if (syncableType) {\n promises.push(\n this.props.actions.patchGroupSyncable(\n this.props.groupID,\n syncableID,\n syncableType,\n {scheme_admin: value, auto_add: false},\n ),\n );\n }\n });\n }\n const results = await Promise.all(promises);\n const errors = results.\n map((r) => r.error?.message).\n filter((item) => item);\n if (errors.length) {\n this.setState({serverError: <>{errors[0]}</>});\n return false;\n }\n this.setState({rolesToChange: {}});\n return true;\n };\n\n handleAddedTeamsAndChannels = async () => {\n const {teamsToAdd, channelsToAdd, rolesToChange} = this.state;\n const promises: Array<Promise<ActionResult>> = [];\n if (teamsToAdd?.length) {\n teamsToAdd.forEach((groupTeam) => {\n const roleChangeKey = this.roleChangeKey(groupTeam);\n groupTeam.scheme_admin = rolesToChange?.[roleChangeKey];\n delete rolesToChange?.[roleChangeKey]; // delete the key because it won't need a patch, it's being handled by the link request.\n promises.push(\n this.props.actions.link(\n this.props.groupID,\n groupTeam.team_id,\n SyncableType.Team,\n {\n auto_add: true,\n scheme_admin: Boolean(groupTeam.scheme_admin),\n },\n ),\n );\n });\n }\n if (channelsToAdd?.length) {\n channelsToAdd.forEach((groupChannel) => {\n const roleChangeKey = this.roleChangeKey(groupChannel);\n groupChannel.scheme_admin = rolesToChange?.[roleChangeKey];\n delete rolesToChange?.[roleChangeKey]; // delete the key because it won't need a patch, it's being handled by the link request.\n promises.push(\n this.props.actions.link(\n this.props.groupID,\n groupChannel.channel_id,\n SyncableType.Channel,\n {\n auto_add: true,\n scheme_admin: groupChannel.scheme_admin,\n },\n ),\n );\n });\n }\n const results = await Promise.all(promises);\n const errors = results.\n map((r) => r.error?.message).\n filter((item) => item);\n if (errors.length) {\n this.setState({serverError: <>{errors[0]}</>});\n return false;\n }\n this.setState({teamsToAdd: [], channelsToAdd: []});\n return true;\n };\n\n handleRemovedTeamsAndChannels = async () => {\n const {itemsToRemove, rolesToChange} = this.state;\n const promises: Array<Promise<ActionResult>> = [];\n if (itemsToRemove.length) {\n itemsToRemove.forEach((item) => {\n delete rolesToChange[this.roleChangeKey(item)]; // no need to update the roles of group-teams that were unlinked.\n const syncableType = this.syncableTypeFromEntryType(item.type);\n if (syncableType) {\n promises.push(\n this.props.actions.unlink(\n this.props.groupID,\n item.id,\n syncableType,\n ),\n );\n }\n });\n }\n const results = await Promise.all(promises);\n const errors = results.\n map((r) => r.error?.message).\n filter((item) => item);\n if (errors.length) {\n this.setState({serverError: <>{errors[0]}</>});\n return false;\n }\n this.setState({itemsToRemove: []});\n return true;\n };\n\n render = () => {\n const {group, members, memberCount, isDisabled} = this.props;\n const {groupTeams, groupChannels} = this.state;\n const {\n allowReference,\n groupMentionName,\n saving,\n saveNeeded,\n serverError,\n } = this.state;\n\n return (\n <div className='wrapper--fixed'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/groups'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.group_settings.group_detail.group_configuration'\n defaultMessage='Group Configuration'\n />\n </div>\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className='banner info'>\n <div className='banner__content'>\n <FormattedMessage\n id='admin.group_settings.group_detail.introBanner'\n defaultMessage='Configure default teams and channels and view users belonging to this group.'\n />\n </div>\n </div>\n\n <GroupProfileAndSettings\n displayname={group.display_name || ''}\n mentionname={groupMentionName}\n allowReference={allowReference}\n onToggle={this.onMentionToggle}\n onChange={this.onMentionChange}\n readOnly={isDisabled}\n />\n\n <AdminPanel\n id='group_teams_and_channels'\n title={defineMessage({id: 'admin.group_settings.group_detail.groupTeamsAndChannelsTitle', defaultMessage: 'Team and Channel Membership'})}\n subtitle={defineMessage({id: 'admin.group_settings.group_detail.groupTeamsAndChannelsDescription', defaultMessage: 'Set default teams and channels for group members. Teams added will include default channels, town-square, and off-topic. Adding a channel without setting the team will add the implied team to the listing below.'})}\n button={\n <div className='group-profile-add-menu'>\n <MenuWrapper isDisabled={isDisabled}>\n <button\n type='button'\n id='add_team_or_channel'\n className='btn btn-primary'\n >\n <FormattedMessage\n id='admin.group_settings.group_details.add_team_or_channel'\n defaultMessage='Add Team or Channel'\n />\n <i className={'fa fa-caret-down'}/>\n </button>\n <Menu\n ariaLabel={this.props.intl.formatMessage({\n id: 'admin.group_settings.group_details.menuAriaLabel',\n defaultMessage: 'Add Team or Channel Menu',\n })}\n >\n <Menu.ItemAction\n id='add_team'\n onClick={this.openAddTeam}\n text={this.props.intl.formatMessage({\n id: 'admin.group_settings.group_details.add_team',\n defaultMessage: 'Add Team',\n })}\n />\n <Menu.ItemAction\n id='add_channel'\n onClick={this.openAddChannel}\n text={this.props.intl.formatMessage({\n id: 'admin.group_settings.group_details.add_channel',\n defaultMessage: 'Add Channel',\n })}\n />\n </Menu>\n </MenuWrapper>\n </div>\n }\n >\n <GroupTeamsAndChannels\n id={this.props.groupID}\n teams={groupTeams}\n channels={groupChannels}\n loading={this.state.loadingTeamsAndChannels}\n onChangeRoles={this.onChangeRoles}\n onRemoveItem={this.onRemoveTeamOrChannel}\n isDisabled={isDisabled}\n />\n </AdminPanel>\n {this.state.addTeamOpen && (\n <TeamSelectorModal\n onModalDismissed={this.closeAddTeam}\n onTeamsSelected={this.addTeams}\n alreadySelected={this.props.groupTeams.map(\n (team) => team.team_id,\n )}\n />\n )}\n {this.state.addChannelOpen && (\n <ChannelSelectorModal\n onModalDismissed={this.closeAddChannel}\n onChannelsSelected={this.addChannels}\n alreadySelected={this.props.groupChannels.map(\n (channel) => channel.channel_id,\n )}\n groupID={this.props.groupID}\n />\n )}\n\n <AdminPanel\n id='group_users'\n title={defineMessage({id: 'admin.group_settings.group_detail.groupUsersTitle', defaultMessage: 'Users'})}\n subtitle={defineMessage({id: 'admin.group_settings.group_detail.groupUsersDescription', defaultMessage: 'Listing of users in Mattermost associated with this group.'})}\n >\n <GroupUsers\n members={members}\n total={memberCount}\n groupID={this.props.groupID}\n getMembers={this.props.actions.getMembers}\n />\n </AdminPanel>\n </div>\n </div>\n\n <SaveChangesPanel\n saving={saving}\n cancelLink='/admin_console/user_management/groups'\n saveNeeded={saveNeeded}\n onClick={this.handleSubmit}\n serverError={\n serverError && (\n <FormError\n iconClassName={'fa-exclamation-triangle'}\n textClassName={'has-error'}\n error={serverError}\n />\n )\n }\n />\n </div>\n );\n };\n}\n\nexport default injectIntl(GroupDetails);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {\n getGroup as fetchGroup,\n getGroupStats,\n getGroupSyncables as fetchGroupSyncables,\n linkGroupSyncable,\n patchGroup,\n patchGroupSyncable,\n unlinkGroupSyncable,\n} from 'mattermost-redux/actions/groups';\nimport {getProfilesInGroup} from 'mattermost-redux/actions/users';\nimport {\n getGroup,\n getGroupChannels,\n getGroupMemberCount,\n getGroupTeams,\n} from 'mattermost-redux/selectors/entities/groups';\nimport {getProfilesInGroup as selectProfilesInGroup} from 'mattermost-redux/selectors/entities/users';\n\nimport {setNavigationBlocked} from 'actions/admin_actions';\n\nimport GroupDetails from './group_details';\n\ntype OwnProps = {\n match: {\n params: {\n group_id: string;\n };\n };\n};\n\nfunction mapStateToProps(state: GlobalState, props: OwnProps) {\n const groupID = props.match.params.group_id;\n const group = getGroup(state, groupID);\n const groupTeams = getGroupTeams(state, groupID);\n const groupChannels = getGroupChannels(state, groupID);\n const members = selectProfilesInGroup(state, groupID);\n const memberCount = getGroupMemberCount(state, groupID);\n\n return {\n groupID,\n group,\n groupTeams,\n groupChannels,\n members,\n memberCount,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators(\n {\n setNavigationBlocked,\n getGroup: fetchGroup,\n getMembers: getProfilesInGroup,\n getGroupStats,\n getGroupSyncables: fetchGroupSyncables,\n link: linkGroupSyncable,\n unlink: unlinkGroupSyncable,\n patchGroupSyncable,\n patchGroup,\n },\n dispatch,\n ),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GroupDetails);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport CheckboxCheckedIcon from 'components/widgets/icons/checkbox_checked_icon';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n checked: boolean;\n name: string;\n onCheckToggle: (primary_key: string) => void;\n primary_key: string;\n failed?: boolean;\n has_syncables?: boolean;\n mattermost_group_id?: string;\n readOnly?: boolean;\n actions: {\n link: (group_id: string) => void;\n unlink: (group_id: string) => void;\n };\n}\n\nconst GroupRow = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const {formatMessage} = useIntl();\n\n const onRowClick = () => {\n if (props.readOnly) {\n return;\n }\n props.onCheckToggle(props.primary_key);\n };\n\n const linkHandler = async (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (props.readOnly) {\n return;\n }\n setLoading(true);\n await props.actions.link(props.primary_key);\n setLoading(false);\n };\n\n const unlinkHandler = async (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (props.readOnly) {\n return;\n }\n setLoading(true);\n await props.actions.unlink(props.primary_key);\n setLoading(false);\n };\n\n const renderActions = () => {\n if (!props.mattermost_group_id) {\n return null;\n }\n if (props.has_syncables) {\n return (\n <Link\n to={'/admin_console/user_management/groups/' + props.mattermost_group_id}\n id={`${props.name}_edit`}\n >\n <FormattedMessage\n id='admin.group_settings.group_row.edit'\n defaultMessage='Edit'\n />\n </Link>\n );\n }\n return (\n <Link\n to={'/admin_console/user_management/groups/' + props.mattermost_group_id}\n id={`${props.name}_configure`}\n >\n <FormattedMessage\n id='admin.group_settings.group_row.configure'\n defaultMessage='Configure'\n />\n </Link>\n );\n };\n\n const renderLinked = () => {\n if (loading) {\n return (\n <a href='#'>\n <LoadingSpinner\n text={props.mattermost_group_id ? formatMessage({id: 'admin.group_settings.group_row.unlinking', defaultMessage: 'Unlinking'}) : formatMessage({id: 'admin.group_settings.group_row.linking', defaultMessage: 'Linking'})}\n />\n </a>\n );\n }\n if (props.mattermost_group_id) {\n if (props.failed) {\n return (\n <a\n href='#'\n onClick={unlinkHandler}\n className='warning'\n >\n <i className='icon fa fa-exclamation-triangle'/>\n <FormattedMessage\n id='admin.group_settings.group_row.unlink_failed'\n defaultMessage='Unlink failed'\n />\n </a>\n );\n }\n return (\n <a\n href='#'\n onClick={unlinkHandler}\n className={props.readOnly ? 'disabled' : ''}\n >\n <i className='icon fa fa-link'/>\n <FormattedMessage\n id='admin.group_settings.group_row.linked'\n defaultMessage='Linked'\n />\n </a>\n );\n }\n if (props.failed) {\n return (\n <a\n href='#'\n onClick={linkHandler}\n className='warning'\n >\n <i className='icon fa fa-exclamation-triangle'/>\n <FormattedMessage\n id='admin.group_settings.group_row.link_failed'\n defaultMessage='Link failed'\n />\n </a>\n );\n }\n return (\n <a\n href='#'\n onClick={linkHandler}\n className={props.readOnly ? 'disabled' : ''}\n >\n <i className='icon fa fa-unlink'/>\n <FormattedMessage\n id='admin.group_settings.group_row.not_linked'\n defaultMessage='Not Linked'\n />\n </a>\n );\n };\n\n return (\n <div\n id={`${props.name}_group`}\n className={'group ' + (props.checked ? 'checked' : '')}\n onClick={onRowClick}\n >\n <div className='group-row'>\n <div className='group-name'>\n <div\n className={'group-check ' + (props.checked ? 'checked' : '')}\n >\n {props.checked && <CheckboxCheckedIcon/>}\n </div>\n <span>\n {props.name}\n </span>\n </div>\n <div className='group-content'>\n <span className='group-description'>\n {renderLinked()}\n </span>\n <span className='group-actions'>\n {renderActions()}\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default GroupRow;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport type {GroupSearchOpts, MixedUnlinkedGroupRedux} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport GroupRow from 'components/admin_console/group_settings/group_row';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport CheckboxCheckedIcon from 'components/widgets/icons/checkbox_checked_icon';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport SearchIcon from 'components/widgets/icons/search_icon';\n\nimport {Constants} from 'utils/constants';\n\nconst LDAP_GROUPS_PAGE_SIZE = 200;\n\ntype Props = {\n groups: MixedUnlinkedGroupRedux[];\n total: number;\n readOnly?: boolean;\n actions: {\n getLdapGroups: (page?: number, perPage?: number, opts?: GroupSearchOpts) => Promise<ActionResult>;\n link: (key: string) => Promise<ActionResult>;\n unlink: (key: string) => Promise<ActionResult>;\n };\n}\n\ntype FilterOption = {\n is_configured?: boolean;\n is_linked?: boolean;\n}\n\ntype FilterConfig = {\n filter: string;\n option: FilterOption;\n}\n\ntype FilterSearchMap = {\n filterIsConfigured: FilterConfig;\n filterIsUnconfigured: FilterConfig;\n filterIsLinked: FilterConfig;\n filterIsUnlinked: FilterConfig;\n}\n\ntype State = {\n checked?: any;\n loading: boolean;\n fetchError: boolean;\n page: number;\n showFilters: boolean;\n searchString: string;\n filterIsConfigured?: boolean;\n filterIsUnconfigured?: boolean;\n filterIsLinked?: boolean;\n filterIsUnlinked?: boolean;\n}\n\ntype FilterUpdates = [string, boolean];\n\nconst FILTER_STATE_SEARCH_KEY_MAPPING: FilterSearchMap = {\n filterIsConfigured: {filter: 'is:configured', option: {is_configured: true}},\n filterIsUnconfigured: {filter: 'is:notconfigured', option: {is_configured: false}},\n filterIsLinked: {filter: 'is:linked', option: {is_linked: true}},\n filterIsUnlinked: {filter: 'is:notlinked', option: {is_linked: false}},\n};\n\nexport default class GroupsList extends React.PureComponent<Props, State> {\n public static defaultProps: Partial<Props> = {\n groups: [],\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n checked: {},\n fetchError: false,\n loading: true,\n page: 0,\n showFilters: false,\n searchString: '',\n filterIsConfigured: false,\n filterIsUnconfigured: false,\n filterIsLinked: false,\n filterIsUnlinked: false,\n };\n }\n\n public closeFilters = () => {\n this.setState({showFilters: false});\n };\n\n public componentDidMount() {\n this.props.actions.getLdapGroups(this.state.page, LDAP_GROUPS_PAGE_SIZE).then(this.handleGetGroupsResponse);\n }\n\n public async previousPage(e: any): Promise<void> {\n e.preventDefault();\n const page = this.state.page < 1 ? 0 : this.state.page - 1;\n this.setState({checked: {}, page, loading: true}, () => {\n this.searchGroups(page);\n });\n }\n\n public async nextPage(e: any): Promise<void> {\n e.preventDefault();\n const page = this.state.page + 1;\n this.setState({checked: {}, page, loading: true}, () => {\n this.searchGroups(page);\n });\n }\n\n public onCheckToggle(key: string) {\n const newChecked = {...this.state.checked};\n newChecked[key] = !newChecked[key];\n this.setState({checked: newChecked});\n }\n\n public linkSelectedGroups() {\n for (const group of this.props.groups) {\n if (this.state.checked[group.primary_key] && !group.mattermost_group_id) {\n this.props.actions.link(group.primary_key);\n }\n }\n }\n\n public unlinkSelectedGroups() {\n for (const group of this.props.groups) {\n if (this.state.checked[group.primary_key] && group.mattermost_group_id) {\n this.props.actions.unlink(group.primary_key);\n }\n }\n }\n\n public selectionActionButtonType(): string {\n let hasSelectedLinked = false;\n for (const group of this.props.groups) {\n if (this.state.checked[group.primary_key]) {\n if (!group.mattermost_group_id) {\n return 'link';\n }\n hasSelectedLinked = true;\n }\n }\n if (hasSelectedLinked) {\n return 'unlink';\n }\n\n return 'disabled';\n }\n\n public renderSelectionActionButton(): JSX.Element {\n switch (this.selectionActionButtonType()) {\n case 'link':\n return (\n <button\n type='button'\n className='btn btn-primary'\n onClick={() => this.linkSelectedGroups()}\n disabled={this.props.readOnly}\n >\n <i className='icon fa fa-link'/>\n <FormattedMessage\n id='admin.group_settings.groups_list.link_selected'\n defaultMessage='Link Selected Groups'\n />\n </button>\n );\n case 'unlink':\n return (\n <button\n type='button'\n className='btn btn-primary'\n onClick={() => this.unlinkSelectedGroups()}\n disabled={this.props.readOnly}\n >\n <i className='icon fa fa-unlink'/>\n <FormattedMessage\n id='admin.group_settings.groups_list.unlink_selected'\n defaultMessage='Unlink Selected Groups'\n />\n </button>\n );\n default:\n return (\n <button\n type='button'\n className='btn btn-primary'\n disabled={this.props.readOnly}\n >\n <i className='icon icon-link-variant'/>\n <FormattedMessage\n id='admin.group_settings.groups_list.link_selected'\n defaultMessage='Link Selected Groups'\n />\n </button>\n );\n }\n }\n renderHeader = () => {\n if (this.props.groups.length === 0) {\n return null;\n }\n return (\n <div className='groups-list--header'>\n <div className='group-name'>\n <FormattedMessage\n id='admin.group_settings.groups_list.nameHeader'\n defaultMessage='Name'\n />\n </div>\n <div className='group-content'>\n <div className='group-description'>\n <FormattedMessage\n id='admin.group_settings.groups_list.mappingHeader'\n defaultMessage='Mattermost Linking'\n />\n </div>\n <div className='group-actions'/>\n </div>\n </div>\n );\n };\n\n public renderRows(): JSX.Element | JSX.Element[] {\n if (this.state.loading) {\n return (\n <div className='groups-list-loading'>\n <i className='fa fa-spinner fa-pulse fa-2x'/>\n </div>\n );\n }\n if (this.state.fetchError) {\n return (\n <div className='groups-list-empty'>\n <FormattedMessage\n id='admin.group_settings.groups_list.groups_list_error'\n defaultMessage='Failed to retrieve LDAP groups. Please check your logs for details.'\n />\n </div>\n );\n }\n if (this.props.groups.length === 0) {\n return (\n <div className='groups-list-empty'>\n <FormattedMessage\n id='admin.group_settings.groups_list.no_groups_found'\n defaultMessage='No groups found'\n />\n </div>\n );\n }\n return this.props.groups.map((item) => {\n return (\n <GroupRow\n key={item.primary_key}\n primary_key={item.primary_key}\n name={item.name}\n mattermost_group_id={item.mattermost_group_id}\n has_syncables={item.has_syncables}\n failed={item.failed}\n checked={Boolean(this.state.checked[item.primary_key])}\n onCheckToggle={(key: string) => this.onCheckToggle(key)}\n readOnly={this.props.readOnly}\n actions={{\n link: this.props.actions.link,\n unlink: this.props.actions.unlink,\n }}\n />\n );\n });\n }\n\n public regex(str: string): RegExp {\n return new RegExp(`(${str})`, 'i');\n }\n\n public searchGroups(page?: number) {\n let {searchString} = this.state;\n\n const newState = {...this.state};\n\n let q = searchString;\n let opts = {q: ''};\n\n Object.entries(FILTER_STATE_SEARCH_KEY_MAPPING).forEach(([key, value]) => {\n const re = this.regex(value.filter);\n if (re.test(searchString)) {\n (newState as any)[key] = true;\n q = q.replace(re, '');\n opts = Object.assign(opts, value.option);\n } else if ((this.state as any)[key]) {\n searchString += ' ' + value.filter;\n }\n });\n\n opts.q = q.trim();\n\n newState.searchString = searchString;\n newState.showFilters = false;\n newState.loading = true;\n newState.showFilters = false;\n this.setState(newState);\n\n this.props.actions.getLdapGroups(page, LDAP_GROUPS_PAGE_SIZE, opts).then(this.handleGetGroupsResponse);\n }\n\n public handleGroupSearchKeyUp(e: any) {\n const {key} = e;\n const {searchString} = this.state;\n if (key === Constants.KeyCodes.ENTER[0]) {\n this.setState({page: 0});\n this.searchGroups();\n }\n const newState = {};\n Object.entries(FILTER_STATE_SEARCH_KEY_MAPPING).forEach(([k, value]) => {\n if (!this.regex(value.filter).test(searchString)) {\n (newState as any)[k] = false;\n }\n });\n this.setState(newState);\n }\n\n public newSearchString(searchString: string, stateKey: string, checked: boolean): string {\n let newSearchString = searchString;\n const {filter} = (FILTER_STATE_SEARCH_KEY_MAPPING as any)[stateKey];\n const re = this.regex(filter);\n const stringFilterPresent = re.test(searchString);\n\n if (stringFilterPresent && !checked) {\n newSearchString = searchString.replace(re, '').trim();\n }\n\n if (!stringFilterPresent && checked) {\n newSearchString += ' ' + filter;\n }\n\n return newSearchString.replace(/\\s{2,}/g, ' ');\n }\n\n public handleFilterCheck(updates: FilterUpdates[]) {\n let {searchString} = this.state;\n updates.forEach((item: FilterUpdates) => {\n searchString = this.newSearchString(searchString, item[0], item[1]);\n this.setState({[item[0]]: item[1]} as any);\n });\n this.setState({searchString});\n }\n\n public renderSearchFilters(): JSX.Element {\n return (\n <div\n id='group-filters'\n className='group-search-filters'\n onClick={(e) => {\n e.nativeEvent.stopImmediatePropagation();\n }}\n >\n <div className='filter-row'>\n <span\n className={'filter-check ' + (this.state.filterIsLinked ? 'checked' : '')}\n onClick={() => this.handleFilterCheck([['filterIsLinked', !this.state.filterIsLinked], ['filterIsUnlinked', false]])}\n >\n {this.state.filterIsLinked && <CheckboxCheckedIcon/>}\n </span>\n <span>\n <FormattedMessage\n id='admin.group_settings.filters.isLinked'\n defaultMessage='Is Linked'\n />\n </span>\n </div>\n <div className='filter-row'>\n <span\n className={'filter-check ' + (this.state.filterIsUnlinked ? 'checked' : '')}\n onClick={() => this.handleFilterCheck([['filterIsUnlinked', !this.state.filterIsUnlinked], ['filterIsLinked', false]])}\n >\n {this.state.filterIsUnlinked && <CheckboxCheckedIcon/>}\n </span>\n <span>\n <FormattedMessage\n id='admin.group_settings.filters.isUnlinked'\n defaultMessage='Is Not Linked'\n />\n </span>\n </div>\n <div className='filter-row'>\n <span\n className={'filter-check ' + (this.state.filterIsConfigured ? 'checked' : '')}\n onClick={() => this.handleFilterCheck([['filterIsConfigured', !this.state.filterIsConfigured], ['filterIsUnconfigured', false]])}\n >\n {this.state.filterIsConfigured && <CheckboxCheckedIcon/>}\n </span>\n <span>\n <FormattedMessage\n id='admin.group_settings.filters.isConfigured'\n defaultMessage='Is Configured'\n />\n </span>\n </div>\n <div className='filter-row'>\n <span\n className={'filter-check ' + (this.state.filterIsUnconfigured ? 'checked' : '')}\n onClick={() => this.handleFilterCheck([['filterIsUnconfigured', !this.state.filterIsUnconfigured], ['filterIsConfigured', false]])}\n >\n {this.state.filterIsUnconfigured && <CheckboxCheckedIcon/>}\n </span>\n <span>\n <FormattedMessage\n id='admin.group_settings.filters.isUnconfigured'\n defaultMessage='Is Not Configured'\n />\n </span>\n </div>\n <a\n onClick={() => {\n this.setState({page: 0});\n this.searchGroups(0);\n }}\n className='btn btn-primary search-groups-btn'\n >\n <FormattedMessage\n id='search_bar.search'\n defaultMessage='Search'\n />\n </a>\n </div>\n );\n }\n\n resetFiltersAndSearch = () => {\n const newState: Partial<State> = {\n showFilters: false,\n searchString: '',\n loading: true,\n page: 0,\n filterIsConfigured: false,\n filterIsUnconfigured: false,\n filterIsLinked: false,\n filterIsUnlinked: false,\n };\n this.setState(newState as any);\n this.props.actions.getLdapGroups(this.state.page, LDAP_GROUPS_PAGE_SIZE, {q: ''}).then(this.handleGetGroupsResponse);\n };\n\n handleGetGroupsResponse = (response: ActionResult) => {\n if (response?.error) {\n this.setState({fetchError: true});\n } else {\n this.setState({fetchError: false});\n }\n this.setState({loading: false});\n };\n\n public render(): JSX.Element {\n const startCount = (this.state.page * LDAP_GROUPS_PAGE_SIZE) + 1;\n let endCount = (this.state.page * LDAP_GROUPS_PAGE_SIZE) + LDAP_GROUPS_PAGE_SIZE;\n const total = this.props.total;\n if (endCount > total) {\n endCount = total;\n }\n const lastPage = endCount === total;\n const firstPage = this.state.page === 0;\n return (\n <div className='groups-list'>\n <div className='groups-list--global-actions'>\n <div className='group-list-search'>\n <LocalizedPlaceholderInput\n type='text'\n placeholder={defineMessage({id: 'search_bar.search', defaultMessage: 'Search'})}\n onKeyUp={(e: any) => this.handleGroupSearchKeyUp(e)}\n onChange={(e) => this.setState({searchString: e.target.value})}\n value={this.state.searchString}\n />\n <SearchIcon\n className='search__icon'\n aria-hidden='true'\n />\n <i\n className={'fa fa-times-circle group-filter-action ' + (this.state.searchString.length ? '' : 'hidden')}\n onClick={() => this.resetFiltersAndSearch()}\n />\n <i\n className={'fa fa-caret-down group-filter-action ' + (this.state.showFilters ? 'hidden' : '')}\n onClick={() => {\n document.addEventListener('click', this.closeFilters, {once: true});\n this.setState({showFilters: true});\n }}\n />\n </div>\n {this.state.showFilters && this.renderSearchFilters()}\n <div className='group-list-link-unlink'>\n {this.renderSelectionActionButton()}\n </div>\n </div>\n {this.renderHeader()}\n <div\n id='groups-list--body'\n className='groups-list--body'\n >\n {this.renderRows()}\n </div>\n {total > 0 &&\n <div className='groups-list--footer'>\n <div className='counter'>\n <FormattedMessage\n id='admin.group_settings.groups_list.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n values={{\n startCount,\n endCount,\n total,\n }}\n />\n </div>\n <button\n type='button'\n className={'btn btn-tertiary prev ' + (firstPage ? 'disabled' : '')}\n onClick={(e: any) => this.previousPage(e)}\n disabled={firstPage}\n >\n <PreviousIcon/>\n </button>\n <button\n type='button'\n className={'btn btn-tertiary next ' + (lastPage ? 'disabled' : '')}\n onClick={(e: any) => this.nextPage(e)}\n disabled={lastPage}\n >\n <NextIcon/>\n </button>\n </div>\n }\n </div>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {linkLdapGroup, unlinkLdapGroup, getLdapGroups as fetchLdapGroups} from 'mattermost-redux/actions/admin';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getLdapGroups, getLdapGroupsCount} from 'mattermost-redux/selectors/entities/admin';\n\nimport GroupsList from './groups_list';\n\nconst getSortedListOfLdapGroups = createSelector(\n 'getSortedListOfLdapGroups',\n getLdapGroups,\n (ldapGroups) => {\n const groups = Object.values(ldapGroups);\n groups.sort((a, b) => a.name.localeCompare(b.name));\n return groups;\n },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n groups: getSortedListOfLdapGroups(state),\n total: getLdapGroupsCount(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getLdapGroups: fetchLdapGroups,\n link: linkLdapGroup,\n unlink: unlinkLdapGroup,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GroupsList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport GroupsList from 'components/admin_console/group_settings/groups_list';\nimport ExternalLink from 'components/external_link';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport {DocLinks} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\ntype Props = {\n isDisabled?: boolean;\n}\n\nconst GroupSettings = ({isDisabled}: Props) => {\n const siteURL = getSiteURL();\n return (\n <div className='wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage\n id='admin.group_settings.groupsPageTitle'\n defaultMessage='Groups'\n />\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className={'banner info'}>\n <div className='banner__content'>\n <FormattedMessage\n id='admin.group_settings.introBanner'\n defaultMessage={'Groups are a way to organize users and apply actions to all users within that group.\\nFor more information on Groups, please see <link>documentation</link>.'}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n location='group_settings'\n href={DocLinks.DEFAULT_LDAP_GROUP_SYNC}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n\n <AdminPanel\n id='ldap_groups'\n title={defineMessage({id: 'admin.group_settings.ldapGroupsTitle', defaultMessage: 'AD/LDAP Groups'})}\n subtitle={defineMessage({id: 'admin.group_settings.ldapGroupsDescription', defaultMessage: 'Connect AD/LDAP and create groups in Mattermost. To get started, configure group attributes on the <link>AD/LDAP</link> configuration page.'})}\n subtitleValues={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n location='group_settings.ldap_groups'\n href={`${siteURL}/admin_console/authentication/ldap`}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n >\n <GroupsList\n readOnly={isDisabled}\n />\n </AdminPanel>\n </div>\n </div>\n </div>\n );\n};\n\nexport default GroupSettings;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {InformationOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {AllowedIPRange} from '@mattermost/types/config';\n\nimport ExternalLink from 'components/external_link';\nimport type {CustomMessageInputType} from 'components/widgets/inputs/input/input';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport './add_edit_ip_filter_modal.scss';\nimport {validateCIDR} from './ip_filtering_utils';\n\ntype Props = {\n onExited: () => void;\n onSave: (allowedIPRange: AllowedIPRange, oldIPRange?: AllowedIPRange) => void;\n existingRange?: AllowedIPRange;\n currentIP?: string;\n}\n\nexport default function IPFilteringAddOrEditModal({onExited, onSave, existingRange, currentIP}: Props) {\n const {formatMessage} = useIntl();\n const [name, setName] = useState(existingRange?.description || '');\n const [CIDR, setCIDR] = useState(existingRange?.cidr_block || '');\n\n const [CIDRError, setCIDRError] = useState<CustomMessageInputType>(null);\n\n const handleSave = () => {\n const allowedIPRange: AllowedIPRange = {\n cidr_block: CIDR,\n description: name,\n enabled: true,\n owner_id: '',\n };\n\n if (existingRange) {\n onSave(allowedIPRange, existingRange);\n } else {\n onSave(allowedIPRange);\n }\n\n onExited();\n };\n\n const handleCIDRChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const cidr = e.target.value;\n setCIDR(cidr);\n setCIDRError(null);\n };\n\n const validateCIDRInput = () => {\n if (!validateCIDR(CIDR)) {\n setCIDRError({type: 'error', value: 'Invalid CIDR address range'});\n }\n };\n\n return (\n <Modal\n className={'IPFilteringAddOrEditModal'}\n dialogClassName={'IPFilteringAddOrEditModal__dialog'}\n show={true}\n onExited={onExited}\n onHide={onExited}\n >\n <Modal.Header closeButton={true}>\n <div className='title'>\n {existingRange?.cidr_block ? formatMessage({id: 'admin.ip_filtering.edit_ip_filter', defaultMessage: 'Edit IP Filter'}) : formatMessage({id: 'admin.ip_filtering.add_ip_filter', defaultMessage: 'Add IP Filter'})}\n </div>\n </Modal.Header>\n <Modal.Body>\n <div className='body'>\n <div className='current_ip_notice'>\n <div className='Content'>\n <span><InformationOutlineIcon/>{formatMessage({id: 'admin.ip_filtering.your_current_ip_is', defaultMessage: 'Your current IP address is {ip}'}, {ip: currentIP})}</span>\n </div>\n </div>\n <div className='inputs'>\n <div>\n {formatMessage({id: 'admin.ip_filtering.name', defaultMessage: 'Name'})}\n <Input\n type='text'\n name='name'\n onChange={(e) => setName(e.target.value)}\n value={name}\n placeholder={formatMessage({id: 'admin.ip_filtering.rule_name_placeholder', defaultMessage: 'Enter a name for this rule'})}\n required={true}\n useLegend={false}\n />\n </div>\n <div>{formatMessage({id: 'admin.ip_filtering.allow_following_range', defaultMessage: 'Allow the following range of IP Addresses'})}\n <Input\n type='text'\n name='ip_address_range'\n onChange={handleCIDRChange}\n onBlur={validateCIDRInput}\n value={CIDR}\n placeholder={'Enter IP Range'}\n required={true}\n useLegend={false}\n customMessage={CIDRError}\n />\n </div>\n <p>\n <FormattedMessage\n id={'admin.ip_filtering.more_info'}\n defaultMessage={'Enter ranges in CIDR format (e.g. 192.168.0.1/8). <link>More info</link>'}\n values={{\n link: (msg) => (\n <ExternalLink\n href='https://mattermost.com/pl/cloud-ip-filtering'\n location={'ip_filtering_add_edit_rule_modal'}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn-cancel'\n onClick={onExited}\n >\n {formatMessage({id: 'admin.ip_filtering.cancel', defaultMessage: 'Cancel'})}\n </button>\n <button\n data-testid='save-add-edit-button'\n type='button'\n className='btn-save'\n onClick={handleSave}\n disabled={Boolean(CIDRError) || !CIDR.length || !name.length}\n >\n {existingRange ? formatMessage({id: 'admin.ip_filtering.update_filter', defaultMessage: 'Update filter'}) : formatMessage({id: 'admin.ip_filtering.save', defaultMessage: 'Save'})}\n </button>\n </Modal.Footer>\n </Modal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport ipaddr from 'ipaddr.js';\n\nimport type {AllowedIPRange} from '@mattermost/types/config';\n\nexport function isIPAddressInRanges(ipAddress: string, allowedIPRanges: AllowedIPRange[]): boolean {\n const usersAddr = ipaddr.parse(ipAddress);\n\n for (const allowedIPRange of allowedIPRanges) {\n const cidrBlock = allowedIPRange.cidr_block;\n const [addr, mask] = ipaddr.parseCIDR(cidrBlock);\n\n if (usersAddr.kind() !== addr.kind()) {\n // We can only compare ipv4 to ipv4 and ipv6 to ipv6, cannot compare ipv4 to ipv6\n continue;\n }\n\n if (usersAddr.match([addr, mask])) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function validateCIDR(cidr: string) {\n try {\n ipaddr.parseCIDR(cidr);\n } catch (e) {\n return false;\n }\n\n return true;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {useIntl} from 'react-intl';\n\nimport type {AllowedIPRange} from '@mattermost/types/config';\n\nimport './delete_confirmation.scss';\n\ntype Props = {\n onExited: () => void;\n onConfirm?: (filter: AllowedIPRange) => void;\n filterToDelete?: AllowedIPRange;\n}\n\nexport default function DeleteConfirmationModal({onExited, onConfirm, filterToDelete}: Props) {\n const {formatMessage} = useIntl();\n return (\n <Modal\n className={'DeleteConfirmationModal'}\n dialogClassName={'DeleteConfirmationModal__dialog'}\n show={true}\n onExited={onExited}\n onHide={onExited}\n >\n <Modal.Header closeButton={true}>\n <div className='title'>\n {formatMessage({id: 'admin.ip_filtering.delete_confirmation_title', defaultMessage: 'Delete IP Filter'})}\n </div>\n </Modal.Header>\n <Modal.Body>\n {formatMessage({\n id: 'admin.ip_filtering.delete_confirmation_body',\n defaultMessage: 'Are you sure you want to delete IP filter {filter}? Users with IP addresses outside of this range won\\'t be able to access the workspace when IP Filtering is enabled',\n },\n {filter: (<strong>{filterToDelete?.description}</strong>)},\n )}\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn-cancel'\n onClick={onExited}\n >\n {formatMessage({id: 'admin.ip_filtering.cancel', defaultMessage: 'Cancel'})}\n </button>\n <button\n type='button'\n className='btn-delete'\n onClick={() => onConfirm?.(filterToDelete!)}\n >\n {formatMessage({id: 'admin.ip_filtering.delete_filter', defaultMessage: 'Delete filter'})}\n </button>\n </Modal.Footer>\n </Modal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {\n PencilOutlineIcon,\n TrashCanOutlineIcon,\n} from '@mattermost/compass-icons/components';\nimport type {AllowedIPRange} from '@mattermost/types/config';\n\nimport WithTooltip from 'components/with_tooltip';\n\ntype EditTableRowProps = {\n allowedIPRange: AllowedIPRange;\n index: number;\n handleRowMouseEnter: (index: number) => void;\n handleRowMouseLeave: () => void;\n setEditFilter: (filter: AllowedIPRange) => void;\n handleConfirmDeleteFilter: (filter: AllowedIPRange) => void;\n hoveredRow: number | null;\n};\n\nconst EditTableRow = ({\n allowedIPRange,\n index,\n handleRowMouseEnter,\n handleRowMouseLeave,\n setEditFilter,\n handleConfirmDeleteFilter,\n hoveredRow,\n}: EditTableRowProps) => {\n const {formatMessage} = useIntl();\n return (\n <div\n className='Row'\n onMouseEnter={() => handleRowMouseEnter(index)}\n onMouseLeave={handleRowMouseLeave}\n >\n <div className='FilterName'>{allowedIPRange.description}</div>\n <div className='IpAddressRange'>{allowedIPRange.cidr_block}</div>\n <div className='Actions'>\n {hoveredRow === index && (\n <>\n <WithTooltip\n title={formatMessage({id: 'admin.ip_filtering.edit', defaultMessage: 'Edit'})}\n >\n <div\n className='edit'\n aria-label='Edit'\n role='button'\n onClick={() => setEditFilter(allowedIPRange)}\n >\n <PencilOutlineIcon size={20}/>\n </div>\n </WithTooltip>\n <WithTooltip\n title={formatMessage({id: 'admin.ip_filtering.delete', defaultMessage: 'Delete'})}\n >\n <div\n className='delete'\n aria-label='Delete'\n role='button'\n onClick={() => handleConfirmDeleteFilter(allowedIPRange)}\n >\n <TrashCanOutlineIcon\n size={20}\n color='red'\n />\n </div>\n </WithTooltip>\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport default EditTableRow;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {AlertOutlineIcon} from '@mattermost/compass-icons/components';\n\ntype IPNotInRangeErrorPanelProps = {\n currentUsersIP: string | null;\n setShowAddModal: (show: boolean) => void;\n};\n\nconst IPNotInRangeErrorPanel = ({\n currentUsersIP,\n setShowAddModal,\n}: IPNotInRangeErrorPanelProps) => (\n <div className='NotInRangeErrorPanel'>\n <div className='Icon'>\n <AlertOutlineIcon size={20}/>\n </div>\n <div className='Content'>\n <div className='Title'>\n <FormattedMessage\n id='admin.ip_filtering.your_current_ip_is_not_in_allowed_rules'\n defaultMessage='Your IP address {ip} is not included in your allowed IP address rules.'\n values={{ip: currentUsersIP}}\n />\n </div>\n <div className='Body'>\n <FormattedMessage\n id='admin.ip_filtering.include_your_ip'\n defaultMessage='Include your IP address in at least one of the rules below to continue.'\n />\n <div\n className='Button'\n onClick={() => setShowAddModal(true)}\n >\n <FormattedMessage\n id='admin.ip_filtering.add_your_ip'\n defaultMessage='Add your IP address'\n />\n </div>\n </div>\n </div>\n </div>\n);\n\nexport default IPNotInRangeErrorPanel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport IPNotInRangeErrorPanel from './edit_section_ip_not_in_range_panel';\n\ntype EditSectionHeaderProps = {\n setShowAddModal: (show: boolean) => void;\n currentIPIsInRange: boolean;\n currentUsersIP: string | null;\n};\n\nconst EditSectionHeader = ({\n setShowAddModal,\n currentIPIsInRange,\n currentUsersIP,\n}: EditSectionHeaderProps) => (\n <div className='AllowedIPAddressesSection'>\n <div className='SectionHeaderContent'>\n <div className='HeaderContent'>\n <div className='TitleSubtitle'>\n <div className='Title'>\n <FormattedMessage\n id='admin.ip_filtering.allowed_ip_addresses'\n defaultMessage='Allowed IP Addresses'\n />\n </div>\n <div className='Subtitle'>\n <FormattedMessage\n id='admin.ip_filtering.edit_section_description_line_1'\n defaultMessage='Create rules to allow access to the workspace for specified IP addresses only.'\n />\n </div>\n <div className='Subtitle'>\n <FormattedMessage\n id='admin.ip_filtering.edit_section_description_line_2'\n defaultMessage='<strong>NOTE:</strong> If no rules are added, all IP addresses will be allowed.'\n values={{\n strong: (msg) => <strong>{msg}</strong>,\n }}\n />\n </div>\n </div>\n <div className='AddIPFilterButton'>\n <button\n className='Button'\n onClick={() => {\n setShowAddModal(true);\n }}\n type='button'\n >\n <FormattedMessage\n id='admin.ip_filtering.add_filter'\n defaultMessage='Add Filter'\n />\n </button>\n </div>\n </div>\n {\n !currentIPIsInRange &&\n <IPNotInRangeErrorPanel\n setShowAddModal={setShowAddModal}\n currentUsersIP={currentUsersIP}\n />\n }\n </div>\n </div>\n);\n\nexport default EditSectionHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst IPFilteringEarthSvg = ({width, height}: SvgProps) => (\n <svg\n width={width}\n height={height}\n viewBox='0 0 140 140'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <ellipse\n cx='69.5'\n cy='120'\n rx='29.5'\n ry='3'\n fill='black'\n fillOpacity='0.06'\n />\n <path\n d='M113.191 70.0004C113.19 78.1542 110.882 86.1411 106.533 93.0378C102.184 99.9345 95.9719 105.459 88.6152 108.974C81.2586 112.488 73.0577 113.848 64.9607 112.897C56.8636 111.945 49.2012 108.721 42.8592 103.598C36.5172 98.4739 31.7546 91.6597 29.1222 83.9427C26.4897 76.2257 26.0948 67.9212 27.9832 59.9892C29.8715 52.0572 33.9661 44.8217 39.7933 39.1192C45.6205 33.4168 52.9425 29.4802 60.9128 27.7647H62.1351L63.0116 27.3418C63.7189 27.2342 64.4339 27.1342 65.1489 27.0496L66.6865 27.0958L67.7397 26.8421H68.3548L70.0538 27.0804L71.1763 26.8267H71.8221L74.19 27.4264L76.9884 27.3495L77.9802 27.5187L88.2206 34.0467L99.3991 38.2987C103.764 42.3429 107.242 47.2479 109.616 52.7043C111.99 58.1607 113.208 64.0499 113.191 70.0004Z'\n fill='#1C58D9'\n />\n <path\n d='M72.0989 40.4363C74.9127 41.3359 74.7974 39.5598 76.5734 41.6281C77.5959 42.8199 79.441 44.9882 81.6321 45.5264C81.9396 45.6033 82.6238 44.9421 82.6238 44.4192C82.6238 43.8964 81.0863 42.7892 80.2406 42.5585C79.3949 42.3278 80.5865 40.6978 79.4256 40.198C78.2647 39.6982 76.9808 37.8451 76.5195 36.3919C76.0583 34.9387 74.0133 36.1612 73.3136 35.8691C72.614 35.5769 71.776 35.7537 71.0072 36.8609C70.2384 37.9682 71.3762 40.2057 72.0989 40.4363Z'\n fill='#FFBC1F'\n />\n <path\n d='M87.3369 81.1265C87.3369 80.5191 81.7708 77.4896 81.0942 77.4512C79.9871 77.382 78.4803 76.8284 77.4654 77.4512C77.0368 77.6945 76.6729 78.0374 76.4045 78.4508C76.2123 78.8122 75.1283 78.1432 74.7132 78.3662C73.7137 78.8967 73.1755 77.1667 73.4292 76.5055C74.1288 74.8831 71.661 75.9057 71.4073 75.4597C71.7071 75.9903 71.3227 70.8463 70.4616 73.7451C69.8082 75.9442 67.2481 73.4298 67.5556 71.8305C68.0322 69.3624 71.7532 69.001 72.5682 69.4393C72.9833 69.6622 74.4979 71.8536 74.6901 71.7921C75.1052 71.6614 74.4441 69.2086 74.3595 68.8856C74.0673 67.6862 76.3584 67.2863 76.5198 66.033C76.6582 64.9719 77.3809 65.341 78.0574 64.7797C79.0953 63.957 78.2804 62.4192 79.595 61.6349C80.0486 61.3658 81.7477 61.1736 81.9707 60.6968C82.1936 60.2201 80.5407 59.0745 81.9707 58.7361C83.2315 58.4286 84.5154 58.9745 84.8613 57.1522C85.1688 55.4991 83.3237 55.1223 82.7932 53.8382C82.6241 53.4538 82.4166 51.2394 81.6324 51.6469C80.6714 52.1543 80.0948 53.3769 79.2799 51.9237C77.8576 49.3017 74.3364 48.1714 75.9893 52.2927C76.835 54.4226 73.6829 60.9044 73.1986 54.9147C73.0371 52.831 66.8098 52.2082 68.901 49.9015C70.9921 47.5948 73.9213 47.4871 74.7055 43.8964C75.7972 38.9139 72.3452 43.1275 70.5846 42.1894C67.9553 40.7516 70.1849 41.5281 68.8241 43.3889C68.309 44.0963 66.6176 42.9429 65.8642 43.0583C65.1108 43.1736 63.3809 44.7037 62.8966 43.7426C62.0202 41.9818 55.8467 40.8976 54.1784 41.5205C50.6957 42.8276 49.4887 41.0591 46.0137 40.3748C44.8067 40.1364 38.8792 39.9673 39.2636 42.0202C39.5404 42.7727 39.864 43.5071 40.2323 44.2193C40.609 45.3496 38.9099 44.4807 38.5179 44.7498C39.21 45.3637 39.9337 45.9412 40.6859 46.4799C41.2548 47.0642 38.5102 47.7716 38.2334 48.7404C37.6875 50.7088 42.0082 50.1475 41.2164 52.5157C40.9703 53.2308 38.5025 54.4072 38.2641 56.8293C38.218 57.2906 41.3393 53.8306 43.3536 54.5226C45.1295 55.1685 44.9758 50.3398 47.1976 50.3398C51.3184 50.3398 52.118 54.3534 54.286 57.0446C55.3008 58.2979 56.1158 58.8207 56.3003 60.4585C56.4848 62.0963 56.1388 63.8416 56.6924 65.2949C57.2459 66.7481 58.2915 66.7789 58.9988 67.9014C59.8445 69.2163 60.3211 70.5003 61.4666 71.646C63.1272 73.3145 65.9564 75.8673 68.5704 75.4905C69.0855 75.4136 71.0306 76.5208 71.4688 76.8514C72.0759 77.4221 72.5941 78.0804 73.0064 78.8045C73.4677 79.4196 74.9284 79.0351 75.5665 79.3273C76.2046 79.6195 74.0827 83.9407 74.8515 85.0479C75.6203 86.1551 75.6895 87.7006 76.9427 88.6848C78.1958 89.669 78.4803 89.6921 78.6417 91.3145C78.8801 93.9441 78.1112 96.6045 77.4808 99.0573C77.1502 100.311 77.8114 101.702 77.3194 102.902C76.7043 104.401 76.2892 105.693 76.8274 107.361C77.7576 110.26 82.9778 110.729 79.9026 108.2C78.5879 107.123 81.3249 104.524 80.4715 104.278C79.0031 103.663 80.7405 103.109 80.9328 102.471C81.3248 101.203 87.1447 95.951 87.5752 95.0821C87.9366 94.3516 87.7059 93.5981 88.2979 92.9676C88.8899 92.3371 89.8355 92.514 90.6043 92.0219C92.1419 90.9915 91.5884 89.2461 92.2265 87.8237C93.4873 85.0018 94.0178 86.1167 92.288 83.91C91.6345 83.1103 87.4522 83.4025 87.3369 81.1265Z'\n fill='#FFBC1F'\n />\n <path\n d='M56.2 38.4295C57.261 39.5367 58.3142 37.8528 58.5064 38.4295C58.6986 39.0062 58.714 40.1134 59.9748 40.198C61.2357 40.2826 58.7986 41.1053 59.6135 41.4513C60.4284 41.7973 62.1736 42.9045 62.8117 42.4432C63.4498 41.9818 64.2109 41.6282 64.4954 41.9742C64.7798 42.3202 66.5327 41.9203 66.033 41.336C65.5333 40.7516 64.2032 39.3753 64.2571 38.5833C64.3109 37.7913 65.7947 35.7537 64.1418 35.9306C63.743 35.9807 63.3796 36.185 63.1296 36.4998C62.8796 36.8145 62.7627 37.2146 62.804 37.6145C62.804 38.1989 61.2664 36.7456 60.9435 36.7687C60.6206 36.7918 59.5443 35.0002 59.1368 35.0002C58.7294 35.0002 56.0001 34.1237 56.2307 35.0002C56.4614 35.8768 55.1391 37.3223 56.2 38.4295Z'\n fill='#FFBC1F'\n />\n <path\n d='M80.6022 46.749C79.7796 46.28 78.2189 44.1347 77.527 44.8268C76.8351 45.5188 77.7038 47.1335 78.2958 47.7947C78.8878 48.456 81.3248 50.0092 80.9712 49.3325C80.6175 48.6559 82.2167 47.6794 80.6022 46.749Z'\n fill='#FFBC1F'\n />\n <path\n d='M57.8068 31.9554C58.2297 31.9169 58.8909 33.3855 59.5136 33.547C60.1363 33.7085 60.4439 34.4389 60.6745 34.6081C60.9051 34.7772 63.5114 33.7777 64.1264 33.547C64.7415 33.3163 63.3576 31.8785 62.8425 30.8712C62.3274 29.864 62.7272 32.5397 61.9968 32.1015C61.2665 31.6632 61.3741 31.0634 60.4592 31.0634C59.5443 31.0634 60.1824 29.2412 59.06 29.6256C57.9375 30.0101 57.384 31.9938 57.8068 31.9554Z'\n fill='#FFBC1F'\n />\n <path\n d='M67.1554 35.4462C66.3866 35.5999 66.5326 36.0997 66.1021 36.5303C65.9011 36.7358 65.7886 37.0118 65.7886 37.2992C65.7886 37.5866 65.9011 37.8626 66.1021 38.0681C66.4942 38.5679 67.1092 39.4598 67.5782 38.6063C68.0472 37.7529 67.5782 37.0685 67.5782 36.5149C67.5782 35.9613 67.5321 35.3693 67.1554 35.4462Z'\n fill='#FFBC1F'\n />\n <path\n d='M68.7011 38.1604C68.8933 38.6218 69.2469 37.3454 70.0003 36.6841C70.7538 36.0229 69.6313 34.3774 68.9317 35.2155C68.4627 35.7922 68.5089 37.6914 68.7011 38.1604Z'\n fill='#FFBC1F'\n />\n <path\n d='M68.5626 38.737C68.1628 39.306 67.8399 40.8284 68.5626 40.9514C68.7209 40.9697 68.8811 40.9437 69.0256 40.8763C69.17 40.8089 69.2928 40.7028 69.3805 40.5697C69.4681 40.4366 69.5172 40.2818 69.5221 40.1225C69.527 39.9632 69.4876 39.8056 69.4083 39.6674C69.07 39.0907 68.7317 38.5063 68.5626 38.737Z'\n fill='#FFBC1F'\n />\n <path\n d='M71.4916 28.9256C70.7996 29.2409 72.5064 29.8176 71.3378 30.1328C70.1692 30.4481 70.1385 31.4092 69.1313 30.5941C68.1242 29.7791 67.0248 30.8709 67.7859 31.363C68.547 31.8551 69.8232 33.07 69.7848 33.7313C69.7464 34.3925 70.9918 34.7001 72.1527 34.6232C73.3136 34.5463 74.7129 34.8923 74.7513 34.3925C74.7897 33.8927 74.9281 33.6775 74.7897 33.3007C74.5898 32.7548 74.0901 32.2165 72.8908 32.6856C71.6914 33.1546 70.9072 32.9162 70.7381 32.3319C70.569 31.7475 73.0907 30.6249 74.2054 31.4015C75.3202 32.1781 76.3812 30.9786 75.5662 30.4327C74.7513 29.8868 75.2971 29.3101 75.8584 29.2332C76.2658 29.1794 76.6271 28.149 76.9347 27.3494C75.2246 27.0728 73.4993 26.9007 71.7683 26.8342C71.776 27.9338 72.1835 28.6104 71.4916 28.9256Z'\n fill='#FFBC1F'\n />\n <path\n d='M61.1819 27.957C61.9507 28.2877 63.227 27.957 62.9886 27.365C62.289 27.488 61.5894 27.6187 60.8975 27.7648C60.9744 27.852 61.0723 27.9182 61.1819 27.957Z'\n fill='#FFBC1F'\n />\n <path\n d='M61.6585 28.6107C60.5668 28.0494 60.6283 29.4257 61.128 29.9716C61.6277 30.5175 63.0731 29.3027 61.6585 28.6107Z'\n fill='#FFBC1F'\n />\n <path\n d='M68.3013 26.8345C68.6367 26.895 68.9503 27.0427 69.2108 27.2627C69.4712 27.4826 69.6692 27.7672 69.7851 28.0878C69.9311 28.5799 71.1074 27.5111 71.1228 26.8114H70.0003C69.4314 26.8037 68.8702 26.8114 68.3013 26.8345Z'\n fill='#FFBC1F'\n />\n <path\n d='M65.9942 28.4492C65.5022 29.1258 65.925 29.9408 66.5093 29.2642C67.0936 28.5876 66.6246 26.8729 67.0859 27.6111C67.5472 28.3492 68.4083 29.5179 68.9849 29.5718C69.5615 29.6256 69.0618 28.8874 68.9849 28.2723C68.908 27.6572 67.5319 27.0728 67.6856 26.8652C66.8246 26.9114 65.9712 26.9806 65.1255 27.0728C65.7328 27.4727 66.371 27.9648 65.9942 28.4492Z'\n fill='#FFBC1F'\n />\n <path\n d='M68.5625 34.2775C69.2467 34.5543 68.5625 32.8858 68.5625 32.8858C67.8475 33.3087 67.8859 33.993 68.5625 34.2775Z'\n fill='#FFBC1F'\n />\n <path\n d='M66.1024 33.224C66.2177 33.693 66.9558 33.8468 67.3478 33.224C67.7399 32.6012 67.3478 30.3406 66.7943 31.0557C66.2407 31.7708 65.6026 31.4401 64.4879 31.0557C63.3731 30.6712 65.9948 32.7319 66.1024 33.224Z'\n fill='#FFBC1F'\n />\n <path\n d='M73.6826 72.8378C74.6359 72.7225 75.2202 73.8835 76.2966 73.8297C77.3729 73.7759 79.0027 75.4059 79.933 74.4371C80.7018 73.6682 76.6118 73.0147 75.3202 72.315C74.0286 71.6153 72.737 72.9531 73.6826 72.8378Z'\n fill='#FFBC1F'\n />\n <path\n d='M78.4337 29.1181C79.7714 29.7639 79.5408 29.7409 78.7259 30.3637C77.9109 30.9865 78.2031 32.3398 80.0021 32.2475C81.8011 32.1552 82.9159 30.3637 83.7308 32.8857C84.5457 35.4077 83.9614 38.1603 85.007 38.9369C86.0526 39.7135 85.1838 40.2364 85.007 40.9591C84.8302 41.6819 85.2991 42.2047 86.1141 41.9741C86.929 41.7434 86.6984 43.2581 86.1141 43.8963C85.5298 44.5345 84.8379 45.7571 86.6369 47.9715C88.4359 50.1859 88.6742 49.8861 89.2508 50.6473C89.8274 51.4085 90.3041 50.3628 90.4732 49.4862C90.6424 48.6097 90.0657 45.5264 92.1338 45.5264C92.778 45.5195 93.4029 45.3057 93.9164 44.9167C94.4299 44.5277 94.8049 43.984 94.9861 43.3658C95.2167 42.8429 96.8466 42.8968 97.7153 42.1432C98.5841 41.3897 99.3529 40.9053 99.3759 38.2987C93.4007 32.7528 85.9725 29.0196 77.9571 27.5341C77.7649 28.1339 77.7726 28.8105 78.4337 29.1181Z'\n fill='#FFBC1F'\n />\n </svg>\n\n);\n\nexport default IPFilteringEarthSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport IPFilteringEarthSvg from 'components/common/svg_images_components/ip_filtering_earth_svg';\n\ntype NoFiltersPanelProps = {\n setShowAddModal: (show: boolean) => void;\n};\n\nconst NoFiltersPanel = ({setShowAddModal}: NoFiltersPanelProps) => (\n <div className='NoFilters'>\n <div>\n <IPFilteringEarthSvg\n width={149}\n height={140}\n />\n </div>\n <div className='Title'>\n <FormattedMessage\n id='admin.ip_filtering.no_filters'\n defaultMessage='No IP filtering rules added'\n />\n </div>\n <div className='Subtitle'>\n <FormattedMessage\n id='admin.ip_filtering.any_ip_can_access_add_filter'\n defaultMessage='Any IP can access your workspace. To limit access to selected IP Addresses, <add>Add a filter</add>'\n values={{\n add: (msg) => (\n <div\n onClick={() => setShowAddModal(true)}\n className='Button'\n >\n {msg}\n </div>\n ),\n }}\n />\n </div>\n </div>\n);\n\nexport default NoFiltersPanel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {AllowedIPRange} from '@mattermost/types/config';\n\nimport EditTableRow from './edit_section_edit_table_row';\nimport EditSectionHeader from './edit_section_header';\nimport NoFiltersPanel from './edit_section_no_filters_panel';\n\nimport './edit_sections.scss';\n\ntype EditSectionProps = {\n ipFilters: AllowedIPRange[] | null;\n currentUsersIP: string | null;\n currentIPIsInRange: boolean;\n setShowAddModal: (show: boolean) => void;\n setEditFilter: (filter: AllowedIPRange) => void;\n handleConfirmDeleteFilter: (filter: AllowedIPRange) => void;\n};\n\nconst EditSection = ({\n ipFilters,\n currentUsersIP,\n setShowAddModal,\n setEditFilter,\n handleConfirmDeleteFilter,\n currentIPIsInRange,\n}: EditSectionProps) => {\n const {formatMessage} = useIntl();\n const [hoveredRow, setHoveredRow] = useState<number | null>(null);\n return (\n <div className='EditSection'>\n <EditSectionHeader\n setShowAddModal={setShowAddModal}\n currentIPIsInRange={currentIPIsInRange}\n currentUsersIP={currentUsersIP}\n />\n {Boolean(ipFilters?.length) && (\n <div className='TableSectionContent'>\n <div className='Table'>\n <div className='HeaderRow'>\n <div className='FilterName'>\n {formatMessage({\n id: 'admin.ip_filtering.filter_name',\n defaultMessage: 'Filter Name',\n })}\n </div>\n <div className='IpAddressRange'>\n {formatMessage({\n id: 'admin.ip_filtering.ip_address_range',\n defaultMessage: 'IP Address Range',\n })}\n </div>\n </div>\n {ipFilters?.map((allowedIPRange, index) => (\n <EditTableRow\n key={allowedIPRange.cidr_block}\n allowedIPRange={allowedIPRange}\n index={index}\n handleRowMouseEnter={(index) => setHoveredRow(index)}\n handleRowMouseLeave={() => setHoveredRow(null)}\n setEditFilter={setEditFilter}\n handleConfirmDeleteFilter={handleConfirmDeleteFilter}\n hoveredRow={hoveredRow}\n />\n ))}\n </div>\n </div>\n )}\n {ipFilters?.length === 0 && <NoFiltersPanel setShowAddModal={setShowAddModal}/>}\n </div>\n );\n};\n\nexport default EditSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport ExternalLink from 'components/external_link';\nimport Toggle from 'components/toggle';\n\ntype Props = {\n filterToggle: boolean;\n setFilterToggle: (value: boolean) => void;\n};\n\nconst EnableSectionContent: React.FC<Props> = ({filterToggle, setFilterToggle}) => {\n const {formatMessage} = useIntl();\n\n return (\n <div className='EnableSectionContent'>\n <div className='TitleSubtitleContent'>\n <div className='TitleSubtitle'>\n <div className='Title'>\n {formatMessage({id: 'admin.ip_filtering.enable_ip_filtering', defaultMessage: 'Enable IP Filtering'})}\n </div>\n <div className='Subtitle'>\n <FormattedMessage\n id={'admin.ip_filtering.enable_ip_filtering_description'}\n defaultMessage={'Limit access to your workspace by IP address. <learnmore>Learn more in the docs</learnmore>'}\n values={{\n learnmore: (msg) => (\n <ExternalLink\n href='https://mattermost.com/pl/cloud-ip-filtering'\n location={'ip_filtering_enable_section'}\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n <div className='SwitchSelector'>\n <Toggle\n size={'btn-md'}\n id={'filterToggle'}\n disabled={false}\n onToggle={() => setFilterToggle(!filterToggle)}\n toggled={filterToggle}\n toggleClassName='btn-toggle-primary'\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default EnableSectionContent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {InformationOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport ExternalLink from 'components/external_link';\n\nimport './save_confirmation_modal.scss';\n\ntype Props = {\n onExited: () => void;\n onConfirm?: () => void;\n title?: string;\n subtitle: JSX.Element | string;\n buttonText?: string;\n includeDisclaimer?: boolean;\n}\n\nexport default function SaveConfirmationModal({onExited, onConfirm, title, subtitle, includeDisclaimer, buttonText}: Props) {\n const {formatMessage} = useIntl();\n return (\n <Modal\n className={'SaveConfirmationModal'}\n dialogClassName={'SaveConfirmationModal__dialog'}\n show={true}\n onExited={onExited}\n onHide={onExited}\n >\n <Modal.Header closeButton={true}>\n <div className='title'>\n {title}\n </div>\n </Modal.Header>\n <Modal.Body>\n {subtitle}\n {includeDisclaimer &&\n <div className='disclaimer'>\n <div className='Icon'>\n <InformationOutlineIcon/>\n </div>\n <div className='Body'>\n <div className='Title'>{formatMessage({id: 'admin.ip_filtering.save_disclaimer_title', defaultMessage: 'Using the Customer Portal to restore access'})}</div>\n {/* TODO - replace \"workspace owner\" with owner's email address? */}\n <div className='Subtitle'>\n <FormattedMessage\n id={'admin.ip_filtering.save_disclaimer_subtitle'}\n defaultMessage={'If you happen to block yourself with these settings, your workspace owner can log in to the <customerportal>Customer Portal</customerportal> to disable IP filtering to restore access.'}\n values={{\n customerportal: (msg) => (\n <ExternalLink\n location='save_confirmation_modal'\n href='https://customers.mattermost.com/console/ip_filtering'\n >\n {msg}\n </ExternalLink>),\n }}\n />\n </div>\n </div>\n </div>\n }\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn-cancel'\n onClick={onExited}\n >\n {formatMessage({id: 'admin.ip_filtering.cancel', defaultMessage: 'Cancel'})}\n </button>\n <button\n data-testid='save-confirmation-button'\n type='button'\n className='btn-delete'\n onClick={() => onConfirm?.()}\n >\n {buttonText}\n </button>\n </Modal.Footer>\n </Modal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useState} from 'react';\nimport type {RefObject} from 'react';\nimport {FormattedDate, FormattedMessage, FormattedNumber, FormattedTime, defineMessages, useIntl} from 'react-intl';\n\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport Tag from 'components/widgets/tag/tag';\n\nimport {FileTypes} from 'utils/constants';\nimport {calculateOverageUserActivated} from 'utils/overage_team';\nimport {getSkuDisplayName} from 'utils/subscription';\nimport {getRemainingDaysFromFutureTimestamp, toTitleCase} from 'utils/utils';\n\nimport './enterprise_edition.scss';\n\nconst DAYS_UNTIL_EXPIRY_WARNING_DISPLAY_THRESHOLD = 30;\nconst DAYS_UNTIL_EXPIRY_DANGER_DISPLAY_THRESHOLD = 5;\n\nexport interface EnterpriseEditionProps {\n openEELicenseModal: () => void;\n upgradedFromTE: boolean;\n license: ClientLicense;\n isTrialLicense: boolean;\n handleRemove: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void>;\n isDisabled: boolean;\n removing: boolean;\n fileInputRef: RefObject<HTMLInputElement>;\n handleChange: () => void;\n statsActiveUsers: number;\n}\n\nexport const messages = defineMessages({\n keyRemove: {id: 'admin.license.keyRemove', defaultMessage: 'Remove license and downgrade to Mattermost Free'},\n});\n\nconst EnterpriseEditionLeftPanel = ({\n openEELicenseModal,\n upgradedFromTE,\n license,\n isTrialLicense,\n handleRemove,\n isDisabled,\n removing,\n fileInputRef,\n handleChange,\n statsActiveUsers,\n}: EnterpriseEditionProps) => {\n const {formatMessage} = useIntl();\n const [unsanitizedLicense, setUnsanitizedLicense] = useState(license);\n const openPricingModal = useOpenPricingModal();\n const [openContactSales] = useOpenSalesLink();\n\n useEffect(() => {\n async function fetchUnSanitizedLicense() {\n try {\n const unsanitizedL = await Client4.getClientLicenseOld();\n setUnsanitizedLicense(unsanitizedL);\n } catch {\n // do nothing\n }\n }\n fetchUnSanitizedLicense();\n }, [license]);\n\n const skuName = getSkuDisplayName(unsanitizedLicense.SkuShortName, unsanitizedLicense.IsGovSku === 'true');\n const expirationDays = getRemainingDaysFromFutureTimestamp(parseInt(unsanitizedLicense.ExpiresAt, 10));\n\n const viewPlansButton = (\n <button\n id='enterprise_edition_view_plans'\n onClick={() => openPricingModal({trackingLocation: 'license_settings_view_plans'})}\n className='btn btn-secondary PlanDetails__viewPlansButton'\n >\n {formatMessage({\n id: 'workspace_limits.menu_limit.view_plans',\n defaultMessage: 'View plans',\n })}\n </button>\n );\n\n return (\n <div\n className='EnterpriseEditionLeftPanel'\n data-testid='EnterpriseEditionLeftPanel'\n >\n <div className='EnterpriseEditionLeftPanel__Grid'>\n <div>\n <div className='pre-title'>\n <FormattedMessage\n id='admin.license.enterpriseEdition'\n defaultMessage='Enterprise Edition'\n />\n </div>\n <div className='title'>\n {`Mattermost ${skuName}`}\n {isTrialLicense && (\n <Tag\n text={formatMessage({\n id: 'admin.license.Trial',\n defaultMessage: 'Trial',\n })}\n variant={'success'}\n uppercase={true}\n size={'sm'}\n />\n )}\n </div>\n </div>\n {viewPlansButton}\n </div>\n <div className='subtitle'>\n <FormattedMessage\n id='admin.license.enterpriseEdition.subtitle'\n defaultMessage='This is an Enterprise Edition for the Mattermost {skuName} plan'\n values={{skuName}}\n />\n </div>\n <div className='licenseInformation'>\n <div className='license-details-top'>\n <span className='title'>{'License details'}</span>\n <button\n className='add-seats-button btn btn-primary'\n onClick={openContactSales}\n >\n <FormattedMessage\n id={'admin.license.enterpriseEdition.add.seats'}\n defaultMessage='+ Add seats'\n />\n </button>\n </div>\n {\n renderLicenseContent(\n unsanitizedLicense,\n isTrialLicense,\n handleRemove,\n isDisabled,\n removing,\n skuName,\n fileInputRef,\n handleChange,\n statsActiveUsers,\n expirationDays,\n )\n }\n </div>\n <div className='license-notices'>\n {/* This notice should not be translated */}\n {upgradedFromTE ? <>\n <p>\n {'When using Mattermost Enterprise Edition, the software is offered under a commercial license. See '}\n <a\n role='button'\n onClick={openEELicenseModal}\n className='openEELicenseModal'\n >\n {'here'}\n </a>\n {' for “Enterprise Edition License” for details. '}\n {'See NOTICE.txt for information about open source software used in the system.'}\n </p>\n </> : <p>\n {'This software is offered under a commercial license.\\n\\nSee ENTERPRISE-EDITION-LICENSE.txt in your root install directory for details. See NOTICE.txt for information about open source software used in this system.'}\n </p>\n }\n </div>\n </div>\n );\n};\n\ntype LegendValues = 'START DATE:' | 'EXPIRES:' | 'LICENSED SEATS:' | 'ACTIVE USERS:' | 'EDITION:' | 'LICENSE ISSUED:' | 'NAME:' | 'COMPANY / ORG:'\n\nconst renderLicenseValues = (activeUsers: number, seatsPurchased: number, expirationDays: number) => ({legend, value}: {legend: LegendValues; value: string | JSX.Element | null}, index: number): React.ReactNode => {\n if (legend === 'ACTIVE USERS:') {\n const {isBetween5PercerntAnd10PercentPurchasedSeats, isOver10PercerntPurchasedSeats} = calculateOverageUserActivated({activeUsers, seatsPurchased});\n return (\n <div\n className='item-element'\n key={value + index.toString()}\n >\n <span\n className={classNames({\n legend: true,\n 'legend--warning-over-seats-purchased': isBetween5PercerntAnd10PercentPurchasedSeats,\n 'legend--over-seats-purchased': isOver10PercerntPurchasedSeats,\n })}\n >{legend}</span>\n <span\n className={classNames({\n value: true,\n 'value--warning-over-seats-purchased': isBetween5PercerntAnd10PercentPurchasedSeats,\n 'value--over-seats-purchased': isOver10PercerntPurchasedSeats,\n })}\n >{value}</span>\n </div>\n );\n } else if (legend === 'EXPIRES:') {\n return (\n <div\n className='item-element'\n key={value + index.toString()}\n >\n <span className='legend'>{legend}</span>\n <span className='value'>{value}</span>\n {(expirationDays <= DAYS_UNTIL_EXPIRY_WARNING_DISPLAY_THRESHOLD) &&\n <span\n className={classNames('expiration-days', {\n 'expiration-days-warning': expirationDays <= DAYS_UNTIL_EXPIRY_WARNING_DISPLAY_THRESHOLD,\n 'expiration-days-danger': expirationDays <= DAYS_UNTIL_EXPIRY_DANGER_DISPLAY_THRESHOLD,\n })}\n >\n {`Expires in ${expirationDays} day${expirationDays > 1 ? 's' : ''}`}\n </span>\n }\n </div>\n );\n }\n\n return (\n <div\n className='item-element'\n key={value + index.toString()}\n >\n <span className='legend'>{legend}</span>\n <span className='value'>{value}</span>\n </div>\n );\n};\n\nconst renderLicenseContent = (\n license: ClientLicense,\n isTrialLicense: boolean,\n handleRemove: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void>,\n isDisabled: boolean,\n removing: boolean,\n skuName: string,\n fileInputRef: RefObject<HTMLInputElement>,\n handleChange: () => void,\n statsActiveUsers: number,\n expirationDays: number,\n) => {\n // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.\n\n const sku = license.SkuShortName ? <>{`Mattermost ${toTitleCase(skuName)}${isTrialLicense ? ' License Trial' : ''}`}</> : null;\n\n const users = <FormattedNumber value={parseInt(license.Users, 10)}/>;\n const activeUsers = <FormattedNumber value={statsActiveUsers}/>;\n const startsAt = <FormattedDate value={new Date(parseInt(license.StartsAt, 10))}/>;\n const expiresAt = <FormattedDate value={new Date(parseInt(license.ExpiresAt, 10))}/>;\n\n const issued = (\n <>\n <FormattedDate value={new Date(parseInt(license.IssuedAt, 10))}/>\n {' '}\n <FormattedTime value={new Date(parseInt(license.IssuedAt, 10))}/>\n </>\n );\n\n const licenseValues: Array<{\n legend: LegendValues;\n value: string;\n } | {\n legend: LegendValues;\n value: JSX.Element | null;\n }> = [\n {legend: 'START DATE:', value: startsAt},\n {legend: 'EXPIRES:', value: expiresAt},\n {legend: 'LICENSED SEATS:', value: users},\n {legend: 'ACTIVE USERS:', value: activeUsers},\n {legend: 'EDITION:', value: sku},\n {legend: 'LICENSE ISSUED:', value: issued},\n {legend: 'NAME:', value: license.Name},\n {legend: 'COMPANY / ORG:', value: license.Company},\n ];\n\n return (\n <div className='licenseElements'>\n {licenseValues.map(renderLicenseValues(statsActiveUsers, parseInt(license.Users, 10), expirationDays))}\n <hr/>\n {renderAddNewLicenseButton(fileInputRef, handleChange)}\n {renderRemoveButton(handleRemove, isDisabled, removing)}\n </div>\n );\n};\n\nconst renderAddNewLicenseButton = (\n fileInputRef: RefObject<HTMLInputElement>,\n handleChange: () => void,\n) => {\n return (\n <>\n <button\n className='add-new-licence-btn'\n onClick={() => fileInputRef.current?.click()}\n >\n <FormattedMessage\n id='admin.license.keyAddNew'\n defaultMessage='Add a new license'\n />\n </button>\n <input\n ref={fileInputRef}\n type='file'\n accept={FileTypes.LICENSE_EXTENSION}\n onChange={handleChange}\n style={{display: 'none'}}\n />\n </>\n );\n};\n\nconst renderRemoveButton = (\n handleRemove: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void>,\n isDisabled: boolean,\n removing: boolean,\n) => {\n let removeButtonText = (<FormattedMessage {...messages.keyRemove}/>);\n if (removing) {\n removeButtonText = (\n <FormattedMessage\n id='admin.license.removing'\n defaultMessage='Removing License...'\n />\n );\n }\n\n return (\n <>\n <div className='remove-button'>\n <button\n type='button'\n className='btn btn-danger'\n onClick={handleRemove}\n disabled={isDisabled}\n id='remove-button'\n data-testid='remove-button'\n >\n {removeButtonText}\n </button>\n </div>\n </>\n );\n};\n\nexport default React.memo(EnterpriseEditionLeftPanel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nimport './contact_us.scss';\n\nexport interface Props {\n buttonTextElement?: JSX.Element;\n eventID?: string;\n customClass?: string;\n}\n\nconst ContactUsButton: React.FC<Props> = (props: Props) => {\n const [openContactSales] = useOpenSalesLink();\n\n const handleContactUsLinkClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n trackEvent('admin', props.eventID || 'in_trial_contact_sales');\n openContactSales();\n };\n\n return (\n <button\n className={`contact-us ${props.customClass ? props.customClass : ''}`}\n onClick={(e) => handleContactUsLinkClick(e)}\n >\n {props.buttonTextElement || (\n <FormattedMessage\n id={'admin.license.trialCard.contactSales'}\n defaultMessage={'Contact sales'}\n />\n )}\n </button>\n );\n};\n\nexport default ContactUsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n};\n\nconst SetupSystemSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '197'}\n height={props.height ? props.height.toString() : '120'}\n viewBox='0 0 197 120'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x='6'\n y='22'\n width='181'\n height='78'\n rx='5.625'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <path\n d='M14.255 11L19.755 16.5V70.5H40.755'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 10.255 12)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <path\n d='M7.255 35L12.755 40.5V79.5H177.755V108.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 175.255 112)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 3.255 36)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <path\n opacity='0.32'\n d='M62.1304 22H129.87L134 115H58L62.1304 22Z'\n fill='#BABEC9'\n />\n <rect\n opacity='0.32'\n width='92'\n height='5'\n transform='matrix(1 0 0 -1 50 120)'\n fill='var(--center-channel-color)'\n />\n <rect\n x='30'\n y='16'\n width='131'\n height='86'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <path\n d='M60.2804 44.2423C64.7656 44.2423 68.4016 40.6063 68.4016 36.1211C68.4016 31.636 64.7656 28 60.2804 28C55.7953 28 52.1593 31.636 52.1593 36.1211C52.1593 40.6063 55.7953 44.2423 60.2804 44.2423Z'\n fill='var(--online-indicator)'\n />\n <path\n d='M56.4581 35.723L59.2741 38.5097L64.1015 33.7325'\n stroke='var(--center-channel-bg)'\n strokeWidth='1.19'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M72.3077 32.4158H94.7884'\n stroke='#1B1D22'\n strokeLinecap='round'\n />\n <path\n d='M97.1984 32.4158H106.833'\n stroke='#1B1D22'\n strokeLinecap='round'\n />\n <path\n d='M109.239 32.4158H113.254'\n stroke='#1B1D22'\n strokeLinecap='round'\n />\n <path\n opacity='0.5'\n d='M123.242 35.226H72.3077V41.3016H123.242V35.226Z'\n fill='#BABEC9'\n />\n <path\n d='M60.2804 67.5113C64.7656 67.5113 68.4016 63.8753 68.4016 59.3902C68.4016 54.905 64.7656 51.269 60.2804 51.269C55.7953 51.269 52.1593 54.905 52.1593 59.3902C52.1593 63.8753 55.7953 67.5113 60.2804 67.5113Z'\n fill='var(--online-indicator)'\n />\n <path\n d='M56.4581 58.9921L59.2741 61.7787L64.1015 57.0016'\n stroke='var(--center-channel-bg)'\n strokeWidth='1.19'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M72.3077 55.6848H94.7884'\n stroke='#1B1D22'\n strokeLinecap='round'\n />\n <path\n d='M97.1984 55.6848H106.833'\n stroke='#1B1D22'\n strokeLinecap='round'\n />\n <path\n d='M109.239 55.6848H113.254'\n stroke='#1B1D22'\n strokeLinecap='round'\n />\n <path\n opacity='0.5'\n d='M139.242 58.495H72.3077V64.5706H139.242V58.495Z'\n fill='#BABEC9'\n />\n <rect\n x='110.255'\n width='83'\n height='50'\n rx='4'\n fill='var(--indigo-400)'\n />\n <path\n d='M152.255 10H166.736'\n stroke='var(--neutral-0)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M152.255 16H175.255'\n stroke='var(--neutral-0)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M152.255 22H182.255'\n stroke='var(--neutral-0)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M152.255 28H182.255'\n stroke='var(--neutral-0)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M169.146 10H178.78'\n stroke='var(--neutral-0)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M181.187 10H184.201'\n stroke='var(--neutral-0)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M127.764 6.9187H130.755L131.134 9.38061C132.05 9.58876 132.907 9.95029 133.678 10.4368L135.69 8.96111L137.805 11.0762L136.312 13.1123C136.776 13.8746 137.12 14.7186 137.316 15.6178L139.847 16.0072V18.9983L137.251 19.3976C137.034 20.2503 136.683 21.0495 136.223 21.7718L137.805 23.9292L135.69 26.0442L133.481 24.4246C132.776 24.8427 132.002 25.158 131.181 25.3498L130.76 28.0866H127.768L127.344 25.3268C126.537 25.1281 125.778 24.81 125.085 24.3922L122.832 26.0441L120.717 23.9291L122.352 21.6996C121.916 21.0008 121.583 20.2316 121.373 19.413L118.677 18.9982V16.0071L121.308 15.6023C121.498 14.7371 121.825 13.9232 122.265 13.1843L120.719 11.0762L122.834 8.96117L124.891 10.4695C125.646 9.98536 126.485 9.62157 127.381 9.40523L127.764 6.9187ZM133.296 17.3707C133.296 19.5721 131.511 21.3568 129.31 21.3568C127.108 21.3568 125.323 19.5721 125.323 17.3707C125.323 15.1692 127.108 13.3846 129.31 13.3846C131.511 13.3846 133.296 15.1692 133.296 17.3707Z'\n fill='var(--neutral-0)'\n fillOpacity='0.40'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M138.66 30.9484H140.293L140.5 32.292C140.999 32.4055 141.467 32.6027 141.888 32.868L142.985 32.0631L144.14 33.2176L143.326 34.3277C143.58 34.7441 143.767 35.2053 143.874 35.6966L145.255 35.909V37.5416L143.839 37.7594C143.721 38.2253 143.529 38.662 143.277 39.0566L144.14 40.233L142.985 41.3875L141.781 40.504C141.396 40.7318 140.974 40.9037 140.526 41.0083L140.297 42.5023H138.664L138.432 40.9961C137.992 40.8878 137.577 40.7142 137.199 40.4862L135.97 41.3876L134.815 40.2331L135.707 39.0169C135.469 38.6353 135.287 38.2152 135.172 37.7681L133.7 37.5416V35.909L135.137 35.688C135.241 35.2158 135.419 34.7717 135.659 34.3684L134.815 33.2176L135.97 32.0631L137.093 32.8865C137.504 32.6223 137.962 32.4237 138.451 32.3056L138.66 30.9484ZM141.681 36.6532C141.681 37.8549 140.707 38.829 139.505 38.829C138.303 38.829 137.329 37.8549 137.329 36.6532C137.329 35.4516 138.303 34.4775 139.505 34.4775C140.707 34.4775 141.681 35.4516 141.681 36.6532Z'\n fill='var(--neutral-0)'\n fillOpacity='0.40'\n />\n <rect\n x='54.755'\n y='79.4823'\n width='84'\n height='11.0354'\n fill='var(--center-channel-bg)'\n stroke='#1B1D22'\n />\n <rect\n opacity='0.3'\n x='57.2648'\n y='81.9911'\n width='78.9823'\n height='6.0177'\n fill='#BABEC9'\n />\n <rect\n x='57.2648'\n y='81.9911'\n width='52.6549'\n height='6.0177'\n fill='#BABEC9'\n />\n <path\n d='M150.255 108.5H122.755'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M119.255 108.5H113.255'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M110.255 108.5H104.255'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n </svg>\n);\n\nexport default SetupSystemSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport ContactUsButton from 'components/announcement_bar/contact_sales/contact_us';\nimport SetupSystemSvg from 'components/common/svg_images_components/setup_system';\n\nimport {isEnterpriseOrE20License} from 'utils/license_utils';\n\nexport interface EnterpriseEditionProps {\n isTrialLicense: boolean;\n license: ClientLicense;\n}\n\nconst EnterpriseEditionRightPanel = ({\n isTrialLicense,\n license,\n\n}: EnterpriseEditionProps) => {\n const upgradeAdvantages = [\n 'AD/LDAP Group sync',\n 'High Availability',\n 'Advanced compliance',\n 'Advanced roles and permissions',\n 'And more...',\n ];\n\n const isEnterpriseOrE20 = isEnterpriseOrE20License(license);\n\n const contactSalesBtn = (\n <div className='purchase-card'>\n <ContactUsButton\n eventID='post_trial_contact_sales'\n customClass='light-blue-btn'\n />\n </div>\n );\n\n const isGovSku = license.IsGovSku === 'true';\n\n const title = () => {\n if (isTrialLicense) {\n if (isGovSku) {\n return (\n <FormattedMessage\n id='admin.license.purchaseEnterpriseGovPlanTitle'\n defaultMessage='Purchase the Enterprise Gov Plan'\n />\n );\n }\n return (\n <FormattedMessage\n id='admin.license.purchaseEnterprisePlanTitle'\n defaultMessage='Purchase the Enterprise Plan'\n />\n );\n }\n if (isEnterpriseOrE20) {\n return (\n <FormattedMessage\n id='admin.license.enterprisePlanTitle'\n defaultMessage='Need to increase your headcount?'\n />\n );\n }\n if (isGovSku) {\n return (\n <FormattedMessage\n id='admin.license.upgradeToEnterpriseGov'\n defaultMessage='Upgrade to the Enterprise Gov Plan'\n />\n );\n }\n return (\n <FormattedMessage\n id='admin.license.upgradeToEnterprise'\n defaultMessage='Upgrade to the Enterprise Plan'\n />\n );\n };\n\n const svgImage = () => {\n if (isEnterpriseOrE20) {\n return null; //No image\n }\n return (\n <SetupSystemSvg\n width={197}\n height={120}\n />\n );\n };\n\n const subtitle = () => {\n if (isTrialLicense) {\n return (\n <FormattedMessage\n id='admin.license.purchaseEnterprisePlanSubtitle'\n defaultMessage='Continue your access to Enterprise features by purchasing a license today.'\n />\n );\n }\n if (isEnterpriseOrE20) {\n return (\n <FormattedMessage\n id='admin.license.enterprisePlanSubtitle'\n defaultMessage='We’re here to work with you and your needs. Contact us today to get more seats on your plan.'\n />\n );\n }\n return (\n <div className='advantages-list'>\n {upgradeAdvantages.map((item: string, i: number) => {\n return (\n <div\n className='item'\n key={i.toString()}\n >\n <i className='fa fa-lock'/>{item}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className='EnterpriseEditionRightPannel'>\n <div className='svg-image'>\n {svgImage()}\n </div>\n <div className='upgrade-title'>\n {title()}\n </div>\n <div className='upgrade-subtitle'>\n {subtitle()}\n </div>\n <div className='purchase_buttons'>\n {contactSalesBtn}\n </div>\n </div>\n );\n};\n\nexport default memo(EnterpriseEditionRightPanel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport AlertSvg from 'components/common/svg_images_components/alert_svg';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport './confirm_license_removal_modal.scss';\n\ntype Props = {\n currentLicenseSKU: string;\n onExited?: () => void;\n handleRemove?: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void>;\n}\n\nconst ConfirmLicenseRemovalModal: React.FC<Props> = (props: Props): JSX.Element | null => {\n const dispatch = useDispatch();\n\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.CONFIRM_LICENSE_REMOVAL));\n if (!show) {\n return null;\n }\n\n const handleOnClose = () => {\n if (props.onExited) {\n props.onExited();\n }\n dispatch(closeModal(ModalIdentifiers.CONFIRM_LICENSE_REMOVAL));\n };\n\n const handleRemoval = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (props.handleRemove) {\n props.handleRemove(e);\n }\n dispatch(closeModal(ModalIdentifiers.CONFIRM_LICENSE_REMOVAL));\n };\n\n return (\n <GenericModal\n compassDesign={true}\n className={'ConfirmLicenseRemovalModal'}\n show={show}\n id='ConfirmLicenseRemovalModal'\n onExited={handleOnClose}\n >\n <>\n <div className='content-body'>\n <div className='alert-svg'>\n <AlertSvg\n width={130.5}\n height={103.5}\n />\n </div>\n <div className='title'>\n <FormattedMessage\n id='admin.license.confirm-license-removal.title'\n defaultMessage='Are you sure?'\n />\n </div>\n <div className='subtitle'>\n <FormattedMessage\n id='admin.license.confirm-license-removal.subtitle'\n defaultMessage='Removing the license will downgrade your server from {currentSKU} to Free. You may lose information. '\n values={{currentSKU: props.currentLicenseSKU}}\n />\n </div>\n </div>\n <div className='content-footer'>\n <button\n onClick={handleOnClose}\n className='btn light-blue-btn'\n id='cancel-removal'\n >\n <FormattedMessage\n id='admin.license.confirm-license-removal.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n onClick={handleRemoval}\n className='btn btn-primary'\n id='confirm-removal'\n >\n <FormattedMessage\n id='admin.license.confirm-license-removal.confirm'\n defaultMessage='Confirm'\n />\n </button>\n </div>\n </>\n </GenericModal>\n );\n};\n\nexport default ConfirmLicenseRemovalModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport './ee_license_modal.scss';\n\ntype Props = {\n onClose?: () => void;\n}\n\nconst EELicenseModal: React.FC<Props> = (props: Props): JSX.Element | null => {\n const dispatch = useDispatch();\n\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.ENTERPRISE_EDITION_LICENSE));\n if (!show) {\n return null;\n }\n\n const handleOnClose = () => {\n if (props.onClose) {\n props.onClose();\n }\n dispatch(closeModal(ModalIdentifiers.ENTERPRISE_EDITION_LICENSE));\n };\n\n // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.\n return (\n <GenericModal\n compassDesign={true}\n className={'EELicenseModal'}\n show={show}\n id='EELicenseModal'\n onExited={handleOnClose}\n >\n <>\n <div\n className='title'\n >\n {'Enterprise Edition License:'}\n </div>\n <div className='enterprise-license-text'>\n <div>\n <p>{'The Mattermost Enterprise Edition (EE) license (the “EE License”)'}</p>\n <p>{'Copyright (c) 2016-present Mattermost, Inc.'}</p>\n <p>{'The subscription-only features of the Mattermost Enterprise Edition software and associated documentation files (the \"Software\") may only be used if you (and any entity that you represent) (i) have agreed to, and are in compliance with, the Mattermost Subscription Terms of Service, available at https://mattermost.com/enterprise-edition-terms/ (the “EE Terms”), and (ii) otherwise have a valid Mattermost Enterprise Edition subscription for the correct features, number of user seats and instances of Mattermost Enterprise Edition that you are running, accessing, or using. You may, however, utilize the free version of the Software (with several features not enabled) under this license without a license key or subscription provided that you otherwise comply with the terms and conditions of this Agreement. Subject to the foregoing, except as explicitly permitted in the EE Terms, it is forbidden to copy, merge, modify, publish, distribute, sublicense, stream, perform, display, create derivative works of and/or sell the Software in either source or executable form without written agreement from Mattermost. Notwithstanding anything to the contrary, free versions of the Software are provided “AS-IS” without indemnification, support, or warranties of any kind, expressed or implied. You assume all risk associated with any use of free versions of the Software.'}</p>\n <p>{'EXCEPT AS OTHERWISE SET FORTH IN A BINDING WRITTEN AGREEMENT BETWEEN YOU AND MATTERMOST, THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.'}</p>\n </div>\n </div>\n <div className='content-footer'>\n <button\n onClick={handleOnClose}\n className='btn btn-primary'\n >\n {'Close'}\n </button>\n </div>\n </>\n </GenericModal>\n );\n};\n\nexport default EELicenseModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n};\n\nconst FileSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '110'}\n height={props.height ? props.height.toString() : '100'}\n viewBox='0 0 20 22'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M16 0.991902H7.96C7.544 0.991902 7.192 1.1359 6.904 1.4239L2.44 5.8159C2.152 6.1359 2.008 6.4959 2.008 6.8959V18.9919C2.008 19.5519 2.2 20.0239 2.584 20.4079C2.984 20.8079 3.456 21.0079 4 21.0079H16C16.544 21.0079 17.008 20.8079 17.392 20.4079C17.792 20.0239 17.992 19.5519 17.992 18.9919V3.0079C17.992 2.4479 17.792 1.9759 17.392 1.5919C17.008 1.1919 16.544 0.991902 16 0.991902ZM7 2.7439V6.4879H3.184L7 2.7439ZM17.008 18.9919C17.008 19.2639 16.904 19.4959 16.696 19.6879C16.504 19.8959 16.272 19.9999 16 19.9999H4C3.728 19.9999 3.488 19.8959 3.28 19.6879C3.088 19.4959 2.992 19.2639 2.992 18.9919V7.4959H7C7.272 7.4959 7.504 7.3999 7.696 7.2079C7.904 6.9999 8.008 6.7599 8.008 6.4879V1.9999H16C16.272 1.9999 16.504 2.1039 16.696 2.3119C16.904 2.5039 17.008 2.7359 17.008 3.0079V18.9919ZM13.504 9.9919H6.496C6.368 9.9919 6.248 10.0479 6.136 10.1599C6.04 10.2559 5.992 10.3679 5.992 10.4959C5.992 10.6239 6.04 10.7439 6.136 10.8559C6.248 10.9519 6.368 10.9999 6.496 10.9999H13.504C13.632 10.9999 13.744 10.9519 13.84 10.8559C13.952 10.7599 14.008 10.6399 14.008 10.4959C14.008 10.3519 13.952 10.2319 13.84 10.1359C13.744 10.0399 13.632 9.9919 13.504 9.9919ZM13.504 12.0079H6.496C6.368 12.0079 6.248 12.0559 6.136 12.1519C6.04 12.2479 5.992 12.3599 5.992 12.4879C5.992 12.6159 6.04 12.7359 6.136 12.8479C6.248 12.9439 6.368 12.9919 6.496 12.9919H13.504C13.632 12.9919 13.744 12.9439 13.84 12.8479C13.952 12.7519 14.008 12.6319 14.008 12.4879C14.008 12.3439 13.96 12.2319 13.864 12.1519C13.768 12.0559 13.648 12.0079 13.504 12.0079ZM13.504 13.9999H6.496C6.368 13.9999 6.248 14.0479 6.136 14.1439C6.04 14.2399 5.992 14.3599 5.992 14.5039C5.992 14.6479 6.04 14.7679 6.136 14.8639C6.248 14.9599 6.368 15.0079 6.496 15.0079H13.504C13.632 15.0079 13.744 14.9599 13.84 14.8639C13.952 14.7519 14.008 14.6319 14.008 14.5039C14.008 14.3759 13.952 14.2639 13.84 14.1679C13.744 14.0559 13.632 13.9999 13.504 13.9999ZM11.512 15.9919H6.496C6.368 15.9919 6.248 16.0479 6.136 16.1599C6.04 16.2559 5.992 16.3679 5.992 16.4959C5.992 16.6239 6.04 16.7439 6.136 16.8559C6.248 16.9519 6.368 16.9999 6.496 16.9999H11.512C11.64 16.9999 11.752 16.9519 11.848 16.8559C11.944 16.7599 11.992 16.6399 11.992 16.4959C11.992 16.3519 11.944 16.2319 11.848 16.1359C11.752 16.0399 11.64 15.9919 11.512 15.9919Z'\n fill='#999999'\n />\n </svg>\n);\n\nexport default FileSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// https://www.figma.com/file/MYVj0NUudT9V7GV9KepBy3/%E2%9C%85Foundations---Illustrations?node-id=665%3A9992\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n};\n\nconst UploadLicenseSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '101'}\n height={props.height ? props.height.toString() : '69'}\n viewBox='0 0 101 69'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x='0.000976562'\n y='9'\n width='84'\n height='24'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <rect\n x='14.001'\n y='36'\n width='87'\n height='25'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <rect\n x='28.0286'\n y='9.33704'\n width='48.1218'\n height='58.8953'\n rx='2'\n fill='var(--indigo-400)'\n />\n <rect\n x='23.001'\n width='50.505'\n height='65.3594'\n rx='2'\n fill='var(--center-channel-bg)'\n />\n <rect\n x='23.501'\n y='0.5'\n width='49.505'\n height='64.3594'\n rx='1.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n d='M48.001 49C56.2853 49 63.001 42.2843 63.001 34C63.001 25.7157 56.2853 19 48.001 19C39.7167 19 33.001 25.7157 33.001 34C33.001 42.2843 39.7167 49 48.001 49Z'\n fill='var(--button-bg)'\n />\n <path\n d='M29 7H37.6188'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M29 54H57.0112'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M29 11H44.8012'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M29 58H65.63'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M38 15H44.4641'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M49.0192 42H46.9828V29.8788L41.4313 35.4303L40.001 34L48.001 26L56.001 34L54.5707 35.4303L49.0192 29.8788V42Z'\n fill='white'\n />\n </svg>\n);\n\nexport default UploadLicenseSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport marked from 'marked';\nimport React, {useRef} from 'react';\nimport {defineMessage, FormattedDate, FormattedMessage} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport {uploadLicense} from 'mattermost-redux/actions/admin';\nimport {getLicenseConfig} from 'mattermost-redux/actions/general';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {closeModal} from 'actions/views/modals';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport FileSvg from 'components/common/svg_images_components/file_svg';\nimport SuccessSvg from 'components/common/svg_images_components/success_svg';\nimport UploadLicenseSvg from 'components/common/svg_images_components/upload_license';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {FileTypes, ModalIdentifiers} from 'utils/constants';\nimport {getMonthLong} from 'utils/i18n';\nimport {getSkuDisplayName} from 'utils/subscription';\nimport {fileSizeToString} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './upload_license_modal.scss';\n\ntype Props = {\n onExited?: () => void;\n fileObjFromProps: File | null;\n}\n\nconst UploadLicenseModal = (props: Props): JSX.Element | null => {\n const dispatch = useDispatch();\n\n const [fileObj, setFileObj] = React.useState<File | null>(props.fileObjFromProps);\n const [isUploading, setIsUploading] = React.useState(false);\n const [serverError, setServerError] = React.useState<string | null>(null);\n const [uploadSuccessful, setUploadSuccessful] = React.useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const currentLicense: ClientLicense = useSelector(getLicense);\n const locale = useSelector(getCurrentLocale);\n\n const handleChange = () => {\n const element = fileInputRef.current;\n if (element === null || element.files === null || element.files.length === 0 || element.files[0].size === 0) {\n return;\n }\n setFileObj(element.files[0]);\n setServerError(null);\n };\n\n const handleSubmit = async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (fileObj === null) {\n return;\n }\n\n setIsUploading(true);\n const {error} = await dispatch(uploadLicense(fileObj));\n\n if (error) {\n setFileObj(null);\n setServerError(error.message);\n setIsUploading(false);\n return;\n }\n\n await dispatch(getLicenseConfig());\n setFileObj(null);\n setServerError(null);\n setIsUploading(false);\n setUploadSuccessful(true);\n };\n\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.UPLOAD_LICENSE));\n if (!show) {\n return null;\n }\n\n const handleOnClose = () => {\n if (isUploading) {\n return;\n }\n if (props.onExited) {\n props.onExited();\n }\n dispatch(closeModal(ModalIdentifiers.UPLOAD_LICENSE));\n };\n\n const handleRemoveFile = () => {\n setFileObj(null);\n };\n\n const displayFileName = (fileName: string) => {\n const extLen = FileTypes.LICENSE_EXTENSION.length;\n let fileNameWithoutExt = fileName.split(FileTypes.LICENSE_EXTENSION)[0];\n fileNameWithoutExt = fileNameWithoutExt.length < (40 - extLen) ? fileNameWithoutExt : `${fileNameWithoutExt.substr(0, (37 - extLen))}...`;\n return `${fileNameWithoutExt}${FileTypes.LICENSE_EXTENSION}`;\n };\n\n let uploadLicenseContent = (\n <>\n <div className='content-body'>\n <div className='svg-image'>\n <UploadLicenseSvg\n width={151}\n height={103}\n />\n </div>\n <div className='title'>\n <FormattedMessage\n id='admin.license.upload-modal.title'\n defaultMessage='Upload a License Key'\n />\n </div>\n <div className='subtitle'>\n <FormattedMessage\n id='admin.license.upload-modal.subtitle'\n defaultMessage='Upload a license key for Mattermost Enterprise Edition to upgrade this server. '\n />\n </div>\n <div className='file-upload'>\n <div className='file-upload__titleSection'>\n <FormattedMessage\n id='admin.license.upload-modal.file'\n defaultMessage='File'\n />\n </div>\n <div className='file-upload__inputSection'>\n <div className='help-text file-name-section'>\n {fileObj?.name && fileObj?.size ? (\n <>\n <FileSvg\n width={20}\n height={20}\n />\n <span className='file-name'>\n {displayFileName(fileObj.name)}\n </span>\n <span className='file-size'>\n {fileSizeToString(fileObj.size)}\n </span>\n </>\n ) : (\n <FormattedMessage\n id='admin.license.no-file-selected'\n defaultMessage='No file selected'\n />\n )}\n </div>\n <div className='file__upload'>\n {fileObj?.name ? (\n <a\n onClick={handleRemoveFile}\n >\n <FormattedMessage\n id='admin.license.remove'\n defaultMessage='Remove'\n />\n </a>\n ) : (\n <>\n <input\n ref={fileInputRef}\n type='file'\n accept={FileTypes.LICENSE_EXTENSION}\n onChange={handleChange}\n />\n <a\n className='btn-select'\n >\n <FormattedMessage\n id='admin.license.choose'\n defaultMessage='Choose File'\n />\n </a>\n </>\n )}\n </div>\n </div>\n </div>\n {serverError && <div className='serverError'>\n <i className='icon icon-alert-outline'/>\n <span\n className='server-error-text'\n dangerouslySetInnerHTML={{__html: marked(serverError)}}\n />\n </div>}\n </div>\n <div className='content-footer'>\n <div className='btn-upload-wrapper'>\n <button\n className={`btn ${(fileObj?.name && fileObj?.name.length > 0) && 'btn-primary'}`}\n disabled={!(fileObj?.name && fileObj?.name.length > 0)}\n onClick={handleSubmit}\n id='upload-button'\n >\n <LoadingWrapper\n loading={Boolean(isUploading)}\n text={defineMessage({id: 'admin.license.modal.uploading', defaultMessage: 'Uploading'})}\n >\n <FormattedMessage\n id='admin.license.modal.upload'\n defaultMessage='Upload'\n />\n </LoadingWrapper>\n </button>\n </div>\n </div>\n </>\n );\n\n if (uploadSuccessful) {\n const startsAt = (\n <FormattedDate\n value={new Date(parseInt(currentLicense.StartsAt, 10))}\n day='2-digit'\n month={getMonthLong(locale)}\n year='numeric'\n />\n );\n const expiresAt = (\n <FormattedDate\n value={new Date(parseInt(currentLicense.ExpiresAt, 10))}\n day='2-digit'\n month={getMonthLong(locale)}\n year='numeric'\n />\n );\n\n const licensedUsersNum = currentLicense.Users;\n const skuName = getSkuDisplayName(currentLicense.SkuShortName, currentLicense.IsGovSku === 'true');\n uploadLicenseContent = (\n <>\n <div className='content-body'>\n <div className='svg-image hands-svg'>\n <SuccessSvg\n width={162}\n height={103.5}\n />\n </div>\n <div className='title'>\n <FormattedMessage\n id='admin.license.upload-modal.successfulUpgrade'\n defaultMessage='Successful Upgrade!'\n />\n </div>\n <div className='subtitle'>\n <FormattedMessage\n id='admin.license.upload-modal.successfulUpgradeText'\n defaultMessage='You have upgraded to the {skuName} plan for {licensedUsersNum, number} seats. This is effective from {startsAt} until {expiresAt}. '\n values={{\n expiresAt,\n startsAt,\n licensedUsersNum,\n skuName,\n }}\n />\n </div>\n </div>\n <div className='content-footer'>\n <div className='btn-upload-wrapper'>\n <button\n className='btn btn-primary'\n onClick={handleOnClose}\n id='done-button'\n >\n <FormattedMessage\n id='admin.license.modal.done'\n defaultMessage='Done'\n />\n </button>\n </div>\n </div>\n </>\n );\n }\n\n return (\n <GenericModal\n className={'UploadLicenseModal'}\n show={show}\n id='UploadLicenseModal'\n compassDesign={true}\n onExited={handleOnClose}\n >\n {uploadLicenseContent}\n </GenericModal>\n );\n};\n\nexport default UploadLicenseModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport AlertBanner from 'components/alert_banner';\nimport ContactUsButton from 'components/announcement_bar/contact_sales/contact_us';\n\nimport {getSkuDisplayName} from 'utils/subscription';\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils';\n\nimport './renew_license_card.scss';\n\nexport interface RenewLicenseCardProps {\n license: ClientLicense;\n isLicenseExpired: boolean;\n totalUsers: number;\n}\n\nconst RenewLicenseCard: React.FC<RenewLicenseCardProps> = ({license, totalUsers, isLicenseExpired}: RenewLicenseCardProps) => {\n let bannerType: 'info' | 'warning' | 'danger' = 'info';\n const endOfLicense = moment.utc(new Date(parseInt(license?.ExpiresAt, 10)));\n const daysToEndLicense = getRemainingDaysFromFutureTimestamp(parseInt(license?.ExpiresAt, 10));\n const contactSalesBtn = (\n <div className='purchase-card'>\n <ContactUsButton\n eventID='post_trial_contact_sales'\n customClass='light-blue-btn'\n />\n </div>\n );\n\n let cardTitle = (\n <FormattedMessage\n id='admin.license.renewalCard.licenseExpiring'\n defaultMessage='License expires in {days} days on {date, date, long}.'\n values={{\n date: endOfLicense,\n days: daysToEndLicense,\n }}\n />\n );\n if (isLicenseExpired) {\n bannerType = 'danger';\n cardTitle = (\n <FormattedMessage\n id='admin.license.renewalCard.licenseExpired'\n defaultMessage='License expired on {date, date, long}.'\n values={{\n date: endOfLicense,\n }}\n />\n );\n }\n const message = (\n <div className='RenewLicenseCard__text'>\n <div className='RenewLicenseCard__text-description bolder'>\n <FormattedMessage\n id='admin.license.renewalCard.description.contact_sales'\n defaultMessage='Renew your {licenseSku} license by contacting sales to avoid any disruption.'\n values={{\n licenseSku: getSkuDisplayName(license.SkuShortName, license.IsGovSku === 'true'),\n }}\n />\n </div>\n <div className='RenewLicenseCard__text-description'>\n <FormattedMessage\n id='admin.license.renewalCard.reviewNumbers'\n defaultMessage='Review your numbers below to ensure you renew for the right number of users.'\n />\n </div>\n <div className='RenewLicenseCard__licensedUsersNum'>\n <strong>\n <FormattedMessage\n id='admin.license.renewalCard.usersNumbers_licensed'\n defaultMessage='Licensed Users: '\n />\n </strong>\n {license.Users}\n </div>\n <div className='RenewLicenseCard__activeUsersNum'>\n <strong>\n <FormattedMessage\n id='admin.license.renewalCard.usersNumbers_active'\n defaultMessage='Active Users: '\n />\n </strong>\n {totalUsers}\n </div>\n <div className='RenewLicenseCard__buttons'>\n {contactSalesBtn}\n </div>\n </div>\n );\n return (\n <AlertBanner\n mode={bannerType}\n title={cardTitle}\n message={message}\n />\n );\n};\n\nexport default RenewLicenseCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {RefObject} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\n\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\n\nimport {FileTypes} from 'utils/constants';\n\nimport './starter_edition.scss';\nexport interface StarterEditionProps {\n openEELicenseModal: () => void;\n currentPlan: JSX.Element;\n upgradedFromTE: boolean;\n fileInputRef: RefObject<HTMLInputElement>;\n handleChange: () => void;\n}\n\nexport const messages = defineMessages({\n key: {id: 'admin.license.key', defaultMessage: 'License Key: '},\n});\n\nconst StarterLeftPanel: React.FC<StarterEditionProps> = ({\n openEELicenseModal,\n currentPlan,\n upgradedFromTE,\n fileInputRef,\n handleChange,\n}: StarterEditionProps) => {\n const openPricingModal = useOpenPricingModal();\n const intl = useIntl();\n\n const viewPlansButton = (\n <button\n id='starter_edition_view_plans'\n onClick={() => openPricingModal({trackingLocation: 'license_settings_view_plans'})}\n className='btn btn-secondary PlanDetails__viewPlansButton'\n >\n {intl.formatMessage({\n id: 'workspace_limits.menu_limit.view_plans',\n defaultMessage: 'View plans',\n })}\n </button>\n );\n\n return (\n <div className='StarterLeftPanel'>\n {viewPlansButton}\n <div className='pre-title'>\n <FormattedMessage\n id='admin.license.enterpriseEdition'\n defaultMessage='Enterprise Edition'\n />\n </div>\n <div className='title'>\n <FormattedMessage\n id='admin.license.freeEdition.title'\n defaultMessage='Free'\n />\n </div>\n <div className='currentPlanLegend'>\n {currentPlan}\n </div>\n <div className='subtitle'>\n <FormattedMessage\n id='admin.license.freeEdition.subtitle'\n defaultMessage='Purchase Professional or Enterprise to unlock enterprise features.'\n />\n </div>\n <hr/>\n <div className='content'>\n {upgradedFromTE ? <>\n <p>\n {'When using Mattermost Enterprise Edition, the software is offered under a commercial license. See '}\n <a\n role='button'\n onClick={openEELicenseModal}\n className='openEELicenseModal'\n >\n {'here'}\n </a>\n {' for “Enterprise Edition License” for details. '}\n {'See NOTICE.txt for information about open source software used in the system.'}\n </p>\n </> : <p>\n {'This software is offered under a commercial license.\\n\\nSee ENTERPRISE-EDITION-LICENSE.txt in your root install directory for details. See NOTICE.txt for information about open source software used in this system.'}\n </p>\n }\n </div>\n <div className='licenseInformation'>\n <div className='licenseKeyTitle'>\n <FormattedMessage {...messages.key}/>\n </div>\n <div className='uploadButtons'>\n <button\n className='btn btn-upload light-blue-btn'\n onClick={() => fileInputRef.current?.click()}\n id='open-modal'\n >\n <FormattedMessage\n id='admin.license.uploadFile'\n defaultMessage='Upload File'\n />\n </button>\n <input\n ref={fileInputRef}\n type='file'\n accept={FileTypes.LICENSE_EXTENSION}\n onChange={handleChange}\n style={{display: 'none'}}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default React.memo(StarterLeftPanel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ContactUsButton from 'components/announcement_bar/contact_sales/contact_us';\nimport SetupSystemSvg from 'components/common/svg_images_components/setup_system';\n\nconst StarterRightPanel = () => {\n const upgradeAdvantages = [\n 'OneLogin/ADFS SAML 2.0',\n 'OpenID Connect',\n 'Office365 suite integration',\n 'Read-only announcement channels',\n 'And more...',\n ];\n\n return (\n <div className='StarterEditionRightPannel'>\n <div className='svg-image'>\n <SetupSystemSvg\n width={197}\n height={120}\n />\n </div>\n <div className='upgrade-title'>\n <FormattedMessage\n id='admin.license.upgradeTitle'\n defaultMessage='Upgrade to the Professional Plan'\n />\n </div>\n <div className='advantages-list'>\n {upgradeAdvantages.map((item: string, i: number) => {\n return (\n <div\n className='item'\n key={i.toString()}\n >\n <i className='fa fa-lock'/>{item}\n </div>\n );\n })}\n </div>\n <div className='purchase_buttons'>\n <ContactUsButton\n eventID='post_trial_contact_sales'\n />\n </div>\n </div>\n );\n};\n\nexport default memo(StarterRightPanel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './team_edition.scss';\nexport interface TeamEditionProps {\n openEELicenseModal: () => void;\n currentPlan: JSX.Element;\n}\n\nconst TeamEdition: React.FC<TeamEditionProps> = ({openEELicenseModal, currentPlan}: TeamEditionProps) => {\n const title = 'Team Edition';\n return (\n <div className='TeamEditionLeftPanel'>\n <div className='title'>{title}</div>\n <div className='currentPlanLegend'>\n {currentPlan}\n </div>\n <hr/>\n <div>\n <p>{'When using Mattermost Team Edition, the software is offered under a Mattermost MIT Compiled License. See MIT-COMPILED-LICENSE.md in your root install directory for details.'}</p>\n <p>\n {'When using Mattermost Enterprise Edition, the software is offered under a commercial license. See '}\n <a\n role='button'\n onClick={openEELicenseModal}\n className='openEELicenseModal'\n >\n {'here'}\n </a>\n {' for “Enterprise Edition License” for details.'}\n </p>\n <p>{'See NOTICE.txt for information about open source software used in the system.'}</p>\n </div>\n </div>\n );\n};\n\nexport default TeamEdition;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport SetupSystemSvg from 'components/common/svg_images_components/setup_system';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {format} from 'utils/markdown';\n\ninterface TeamEditionRightPanelProps {\n upgradingPercentage: number;\n handleUpgrade: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void>;\n upgradeError: string | null;\n restartError: string | null;\n\n handleRestart: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void>;\n\n setClickNormalUpgradeBtn: () => void;\n\n openEEModal: () => void;\n\n restarting: boolean;\n}\n\nconst TeamEditionRightPanel: React.FC<TeamEditionRightPanelProps> = ({\n upgradingPercentage,\n handleUpgrade,\n upgradeError,\n restartError,\n handleRestart,\n restarting,\n openEEModal,\n setClickNormalUpgradeBtn,\n}: TeamEditionRightPanelProps) => {\n let upgradeButton = null;\n const intl = useIntl();\n\n const onHandleUpgrade = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!handleUpgrade) {\n return;\n }\n setClickNormalUpgradeBtn();\n handleUpgrade(e);\n };\n const upgradeAdvantages = [\n 'AD/LDAP Group Sync',\n 'High Availability',\n 'Advanced compliance',\n 'And more...',\n ];\n if (upgradingPercentage !== 100) {\n upgradeButton = (\n <div>\n <p>\n <button\n type='button'\n onClick={onHandleUpgrade}\n className='btn btn-primary'\n >\n <LoadingWrapper\n loading={upgradingPercentage > 0}\n text={\n <FormattedMessage\n id='admin.license.enterprise.upgrading'\n defaultMessage='Upgrading {percentage}%'\n values={{percentage: upgradingPercentage}}\n />\n }\n >\n <FormattedMessage\n id='admin.license.enterprise.upgrade'\n defaultMessage='Upgrade to Enterprise Edition'\n />\n </LoadingWrapper>\n </button>\n </p>\n <p className='upgrade-legal-terms'>\n <FormattedMessage\n id='admin.licenseSettings.teamEdition.teamEditionRightPanel.acceptTermsInitial'\n defaultMessage='By clicking <b>Upgrade</b>, I agree to the terms of the Mattermost '\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <a\n role='button'\n onClick={openEEModal}\n >\n <FormattedMessage\n id='admin.licenseSettings.teamEdition.teamEditionRightPanel.eeLicenseLink'\n defaultMessage='Enterprise Edition License'\n />\n </a>\n <FormattedMessage\n id='admin.licenseSettings.teamEdition.teamEditionRightPanel.acceptTermsFinal'\n defaultMessage='. Upgrading will download the binary and update your team edition.'\n />\n </p>\n {upgradeError && (\n <div className='upgrade-error'>\n <div className='form-group has-error'>\n <div\n className='as-bs-label control-label'\n dangerouslySetInnerHTML={{\n __html: format(upgradeError),\n }}\n />\n </div>\n </div>\n )}\n </div>\n );\n } else if (upgradingPercentage === 100) {\n upgradeButton = (\n <div>\n <p>\n <FormattedMessage\n id='admin.licenseSettings.teamEdition.teamEditionRightPanel.upgradedRestart'\n defaultMessage='You have upgraded your binary to mattermost enterprise, please restart the server to start using the new binary. You can do it right here:'\n />\n </p>\n <p>\n <button\n type='button'\n onClick={handleRestart}\n className='btn btn-primary'\n >\n <LoadingWrapper\n loading={restarting}\n text={intl.formatMessage({\n id: 'admin.licenseSettings.teamEdition.teamEditionRightPanel.restarting',\n defaultMessage: 'Restarting',\n })}\n >\n <FormattedMessage\n id='admin.licenseSettings.teamEdition.teamEditionRightPanel.restart'\n defaultMessage='Restart Server'\n />\n </LoadingWrapper>\n </button>\n </p>\n {restartError && (\n <div className='upgrade-error'>\n <div className='form-group has-error'>\n <div className='as-bs-label control-label'>\n {restartError}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className='TeamEditionRightPanel'>\n <div className='svg-image'>\n <SetupSystemSvg\n width={197}\n height={120}\n />\n </div>\n <div className='upgrade-title'>\n <FormattedMessage\n id='admin.license.enterprise.upgrade'\n defaultMessage='Upgrade to Enterprise Edition'\n />\n </div>\n <div className='upgrade-subtitle'>\n <FormattedMessage\n id='admin.license.enterprise.license_required_upgrade'\n defaultMessage='A license is required to unlock enterprise features'\n />\n </div>\n <div className='advantages-list'>\n {upgradeAdvantages.map((item: string, i: number) => {\n return (\n <div\n className='item'\n key={i.toString()}\n >\n <i className='fa fa-lock'/>{item}\n </div>\n );\n })}\n </div>\n {upgradeButton}\n </div>\n );\n};\n\nexport default React.memo(TeamEditionRightPanel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport AlertBanner from 'components/alert_banner';\nimport ContactUsButton from 'components/announcement_bar/contact_sales/contact_us';\n\nimport {daysToLicenseExpire} from 'utils/license_utils';\nimport {getBrowserTimezone} from 'utils/timezone';\n\nimport './trial_license_card.scss';\n\nexport interface Props {\n license: ClientLicense;\n}\n\nconst TrialLicenseCard: React.FC<Props> = ({license}: Props) => {\n const currentDate = new Date();\n const endDate = new Date(parseInt(license?.ExpiresAt, 10));\n const daysToEndLicense = daysToLicenseExpire(license);\n\n const messageBody = () => {\n if (currentDate.toDateString() === endDate.toDateString()) {\n return (\n <FormattedMessage\n id='admin.license.trialLicenseCard.expiringToday'\n defaultMessage='Your free trial expires <b>Today at {time}</b>. Visit our customer portal to purchase a license now to continue using Mattermost Professional and Enterprise features after trial ends'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n time: moment(endDate).endOf('day').format('h:mm a ') + moment().tz(getBrowserTimezone()).format('z'),\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='admin.license.trialLicenseCard.expiringAfterFewDays'\n defaultMessage='Your free trial will expire in <b>{daysCount} {daysCount, plural, one {day} other {days}}</b>. Visit our customer portal to purchase a license now to continue using Mattermost Professional and Enterprise features after trial ends.'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n daysCount: daysToEndLicense,\n }}\n />\n );\n };\n\n const message = (\n <div className='RenewLicenseCard TrialLicense'>\n <div className='RenewLicenseCard__text'>\n <div className='RenewLicenseCard__text-description'>\n {messageBody()}\n </div>\n <div className='RenewLicenseCard__buttons'>\n <ContactUsButton\n customClass='contact_us_primary_cta'\n />\n </div>\n </div>\n </div>\n );\n\n const cardTitle = (\n <FormattedMessage\n id='admin.license.trialCard.licenseExpiring'\n defaultMessage='You’re currently on a free trial of our Mattermost Enterprise license.'\n />\n );\n return (\n <AlertBanner\n mode={'info'}\n title={cardTitle}\n message={message}\n />\n );\n};\n\nexport default TrialLicenseCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {StatusOK} from '@mattermost/types/client4';\nimport type {ClientLicense} from '@mattermost/types/config';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {ServerLimits} from '@mattermost/types/limits';\nimport type {GetFilteredUsersStatsOpts, UsersStats} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport ExternalLink from 'components/external_link';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {AboutLinks, CloudLinks, ModalIdentifiers} from 'utils/constants';\nimport {isLicenseExpired, isLicenseExpiring, isTrialLicense, isEnterpriseOrE20License, licenseSKUWithFirstLetterCapitalized} from 'utils/license_utils';\n\nimport type {ModalData} from 'types/actions';\n\nimport EnterpriseEditionLeftPanel, {messages as enterpriseEditionLeftPanelMessages} from './enterprise_edition/enterprise_edition_left_panel';\nimport EnterpriseEditionRightPanel from './enterprise_edition/enterprise_edition_right_panel';\nimport ConfirmLicenseRemovalModal from './modals/confirm_license_removal_modal';\nimport EELicenseModal from './modals/ee_license_modal';\nimport UploadLicenseModal from './modals/upload_license_modal';\nimport RenewLinkCard from './renew_license_card/renew_license_card';\nimport StarterLeftPanel, {messages as licenseSettingsStarterEditionMessages} from './starter_edition/starter_left_panel';\nimport StarterRightPanel from './starter_edition/starter_right_panel';\nimport TeamEditionLeftPanel from './team_edition/team_edition_left_panel';\nimport TeamEditionRightPanel from './team_edition/team_edition_right_panel';\nimport TrialBanner from './trial_banner/trial_banner';\nimport TrialLicenseCard from './trial_license_card/trial_license_card';\n\nimport './license_settings.scss';\n\ntype Props = {\n license: ClientLicense;\n enterpriseReady: boolean;\n upgradedFromTE: boolean;\n totalUsers: number;\n isDisabled: boolean;\n prevTrialLicense: ClientLicense;\n actions: {\n getLicenseConfig: () => void;\n uploadLicense: (file: File) => Promise<ActionResult>;\n removeLicense: () => Promise<ActionResult<boolean, ServerError>>;\n getPrevTrialLicense: () => void;\n upgradeToE0: () => Promise<StatusOK>;\n upgradeToE0Status: () => Promise<{percentage: number; error: string | JSX.Element | null}>;\n restartServer: () => Promise<StatusOK>;\n ping: () => Promise<{status: string}>;\n requestTrialLicense: (users: number, termsAccepted: boolean, receiveEmailsAccepted: boolean, featureName: string) => Promise<ActionResult>;\n openModal: <P>(modalData: ModalData<P>) => void;\n getServerLimits: () => Promise<ActionResult<ServerLimits, ServerError>>;\n getFilteredUsersStats: (filters: GetFilteredUsersStatsOpts) => Promise<{\n data?: UsersStats;\n error?: ServerError;\n }>;\n };\n}\n\nconst messages = defineMessages({\n title: {id: 'admin.license.title', defaultMessage: 'Edition and License'},\n});\n\nexport const searchableStrings = [\n licenseSettingsStarterEditionMessages.key,\n enterpriseEditionLeftPanelMessages.keyRemove,\n messages.title,\n];\n\ntype State = {\n fileSelected: boolean;\n file: File | null;\n serverError: string | null;\n gettingTrialError: string | null;\n gettingTrialResponseCode: number | null;\n gettingTrial: boolean;\n removing: boolean;\n upgradingPercentage: number;\n upgradeError: string | null;\n restarting: boolean;\n restartError: string | null;\n clickNormalUpgradeBtn: boolean;\n};\nexport default class LicenseSettings extends React.PureComponent<Props, State> {\n private interval: ReturnType<typeof setInterval> | null;\n private fileInputRef: React.RefObject<HTMLInputElement>;\n constructor(props: Props) {\n super(props);\n\n this.interval = null;\n this.state = {\n fileSelected: false,\n file: null,\n serverError: null,\n gettingTrialResponseCode: null,\n gettingTrialError: null,\n gettingTrial: false,\n removing: false,\n upgradingPercentage: 0,\n upgradeError: null,\n restarting: false,\n restartError: null,\n clickNormalUpgradeBtn: false,\n };\n this.fileInputRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.enterpriseReady) {\n this.props.actions.getPrevTrialLicense();\n } else {\n this.reloadPercentage();\n }\n this.props.actions.getLicenseConfig();\n this.props.actions.getFilteredUsersStats({include_bots: false, include_deleted: false});\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (prevState.fileSelected !== this.state.fileSelected && this.state.fileSelected) {\n this.props.actions.openModal({\n modalId: ModalIdentifiers.UPLOAD_LICENSE,\n dialogType: UploadLicenseModal,\n dialogProps: {\n fileObjFromProps: this.state.file,\n },\n });\n }\n this.setState({fileSelected: false, file: null});\n }\n\n componentWillUnmount() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n reloadPercentage = async () => {\n const {percentage, error} = await this.props.actions.upgradeToE0Status();\n if (percentage === 100 || error) {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n if (error) {\n trackEvent('api', 'upgrade_to_e0_failed', {error});\n } else {\n trackEvent('api', 'upgrade_to_e0_success');\n }\n }\n } else if (percentage > 0 && !this.interval) {\n this.interval = setInterval(this.reloadPercentage, 2000);\n }\n this.setState({upgradingPercentage: percentage || 0, upgradeError: error as string});\n };\n\n handleChange = () => {\n const element = this.fileInputRef.current;\n if (element?.files?.length) {\n this.setState({fileSelected: true, file: element.files[0]});\n }\n };\n\n openEELicenseModal = async () => {\n this.props.actions.openModal({\n modalId: ModalIdentifiers.ENTERPRISE_EDITION_LICENSE,\n dialogType: EELicenseModal,\n });\n };\n\n confirmLicenseRemoval = async () => {\n this.props.actions.openModal({\n modalId: ModalIdentifiers.CONFIRM_LICENSE_REMOVAL,\n dialogType: ConfirmLicenseRemovalModal,\n dialogProps: {handleRemove: this.handleRemove, currentLicenseSKU: licenseSKUWithFirstLetterCapitalized(this.props.license)},\n });\n };\n\n handleRemove = async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n this.setState({removing: true});\n\n const {error} = await this.props.actions.removeLicense();\n if (error) {\n this.setState({serverError: error.message, removing: false});\n return;\n }\n\n await Promise.all([\n this.props.actions.getPrevTrialLicense(),\n this.props.actions.getLicenseConfig(),\n ]);\n\n await this.props.actions.getServerLimits();\n\n this.setState({serverError: null, removing: false});\n };\n\n handleUpgrade = async (e?: React.MouseEvent<HTMLButtonElement>) => {\n if (e) {\n e.preventDefault();\n }\n if (this.state.upgradingPercentage > 0) {\n return;\n }\n try {\n await this.props.actions.upgradeToE0();\n this.setState({upgradingPercentage: 1});\n await this.reloadPercentage();\n } catch (error: any) {\n trackEvent('api', 'upgrade_to_e0_failed', {error: error.message as string});\n this.setState({upgradeError: error.message, upgradingPercentage: 0});\n }\n };\n\n checkRestarted = () => {\n this.props.actions.ping().then(() => {\n window.location.reload();\n }).catch(() => {\n setTimeout(this.checkRestarted, 1000);\n });\n };\n\n handleRestart = async (e?: React.MouseEvent<HTMLButtonElement>) => {\n if (e) {\n e.preventDefault();\n }\n this.setState({restarting: true});\n try {\n await this.props.actions.restartServer();\n } catch (err) {\n this.setState({restarting: false, restartError: err as string});\n }\n setTimeout(this.checkRestarted, 1000);\n };\n\n setClickNormalUpgradeBtn = () => {\n this.setState({clickNormalUpgradeBtn: true});\n };\n\n currentPlan = (\n <div className='current-plan-legend'>\n <i className='icon-check-circle'/>\n {'Current Plan'}\n </div>\n );\n\n createLink = (link: string, text: string) => {\n return (\n <ExternalLink\n location='license_settings'\n id='privacyLink'\n href={link}\n >\n {text}\n </ExternalLink>\n );\n };\n\n termsAndPolicy = (\n <div className='terms-and-policy'>\n {'See also '}\n {this.createLink(AboutLinks.TERMS_OF_SERVICE, 'Enterprise Edition Terms of Use')}\n {' and '}\n {this.createLink(AboutLinks.PRIVACY_POLICY, 'Privacy Policy')}\n </div>\n );\n\n comparePlans = (\n <div className='compare-plans-text'>\n {'Curious about upgrading? '}\n {this.createLink(CloudLinks.PRICING, 'Compare Plans')}\n </div>\n );\n\n render() {\n const {license, upgradedFromTE, isDisabled} = this.props;\n\n let leftPanel = null;\n let rightPanel = null;\n\n if (!this.props.enterpriseReady) { // Team Edition\n // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.\n leftPanel = (\n <TeamEditionLeftPanel\n openEELicenseModal={this.openEELicenseModal}\n currentPlan={this.currentPlan}\n />\n );\n\n rightPanel = (\n <TeamEditionRightPanel\n upgradingPercentage={this.state.upgradingPercentage}\n upgradeError={this.state.upgradeError}\n restartError={this.state.restartError}\n handleRestart={this.handleRestart}\n handleUpgrade={this.handleUpgrade}\n restarting={this.state.restarting}\n openEEModal={this.openEELicenseModal}\n setClickNormalUpgradeBtn={this.setClickNormalUpgradeBtn}\n />\n );\n } else if (license.IsLicensed === 'true') {\n // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.\n leftPanel = (\n <EnterpriseEditionLeftPanel\n openEELicenseModal={this.openEELicenseModal}\n upgradedFromTE={upgradedFromTE}\n license={license}\n isTrialLicense={isTrialLicense(license)}\n handleRemove={this.confirmLicenseRemoval}\n isDisabled={isDisabled}\n removing={this.state.removing}\n fileInputRef={this.fileInputRef}\n handleChange={this.handleChange}\n statsActiveUsers={this.props.totalUsers || 0}\n />\n );\n\n rightPanel = (\n <EnterpriseEditionRightPanel\n isTrialLicense={isTrialLicense(license)}\n license={license}\n />\n );\n } else {\n // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.\n // This is Mattermost Starter (Already downloaded the binary but no license has been set, or ended the trial period)\n leftPanel = (\n <StarterLeftPanel\n openEELicenseModal={this.openEELicenseModal}\n currentPlan={this.currentPlan}\n upgradedFromTE={this.props.upgradedFromTE}\n fileInputRef={this.fileInputRef}\n handleChange={this.handleChange}\n />\n );\n\n rightPanel = (\n <StarterRightPanel/>\n );\n }\n\n return (\n <div className='wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage {...messages.title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className='admin-console__banner_section'>\n {!this.state.clickNormalUpgradeBtn && license.IsLicensed !== 'true' &&\n this.props.prevTrialLicense?.IsLicensed !== 'true' &&\n <TrialBanner\n isDisabled={isDisabled}\n gettingTrialResponseCode={this.state.gettingTrialResponseCode}\n gettingTrialError={this.state.gettingTrialError}\n gettingTrial={this.state.gettingTrial}\n enterpriseReady={this.props.enterpriseReady}\n upgradingPercentage={this.state.upgradingPercentage}\n handleUpgrade={this.handleUpgrade}\n upgradeError={this.state.upgradeError}\n restartError={this.state.restartError}\n handleRestart={this.handleRestart}\n restarting={this.state.restarting}\n openEEModal={this.openEELicenseModal}\n />\n }\n {this.renewLicenseCard()}\n </div>\n <div className='top-wrapper'>\n <div className='left-panel'>\n <div className='panel-card'>\n {leftPanel}\n </div>\n {(!isTrialLicense(license)) && this.termsAndPolicy}\n </div>\n <div className='right-panel'>\n <div className='panel-card'>\n {rightPanel}\n </div>\n {!isEnterpriseOrE20License(license) && this.comparePlans}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n renewLicenseCard = () => {\n if (isTrialLicense(this.props.license)) {\n return (\n <TrialLicenseCard\n license={this.props.license}\n />\n );\n }\n if (isLicenseExpired(this.props.license) || isLicenseExpiring(this.props.license)) {\n return (\n <RenewLinkCard\n license={this.props.license}\n isLicenseExpired={isLicenseExpired(this.props.license)}\n totalUsers={this.props.totalUsers}\n />\n );\n }\n return null;\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {uploadLicense, removeLicense, getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {getLicenseConfig} from 'mattermost-redux/actions/general';\nimport {getServerLimits} from 'mattermost-redux/actions/limits';\nimport {getFilteredUsersStats} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getFilteredUsersStats as selectFilteredUserStats} from 'mattermost-redux/selectors/entities/users';\n\nimport {requestTrialLicense, upgradeToE0Status, upgradeToE0, restartServer, ping} from 'actions/admin_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport LicenseSettings from './license_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n return {\n totalUsers: selectFilteredUserStats(state)?.total_users_count || 0,\n upgradedFromTE: config.UpgradedFromTE === 'true',\n prevTrialLicense: state.entities.admin.prevTrialLicense,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getLicenseConfig,\n uploadLicense,\n removeLicense,\n getPrevTrialLicense,\n upgradeToE0,\n upgradeToE0Status,\n restartServer,\n ping,\n requestTrialLicense,\n openModal,\n getFilteredUsersStats,\n getServerLimits,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LicenseSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport type {MessageDescriptor, WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages, injectIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {Job} from '@mattermost/types/jobs';\n\nimport ExternalLink from 'components/external_link';\n\nimport {DocLinks, JobTypes, exportFormats} from 'utils/constants';\n\nimport BooleanSetting from './boolean_setting';\nimport DropdownSetting from './dropdown_setting';\nimport JobsTable from './jobs';\nimport OLDAdminSettings from './old_admin_settings';\nimport type {BaseProps, BaseState} from './old_admin_settings';\nimport RadioSetting from './radio_setting';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ninterface State extends BaseState {\n enableComplianceExport: AdminConfig['MessageExportSettings']['EnableExport'];\n exportFormat: AdminConfig['MessageExportSettings']['ExportFormat'];\n exportJobStartTime: AdminConfig['MessageExportSettings']['DailyRunTime'];\n globalRelayCustomerType: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['CustomerType'];\n globalRelaySMTPUsername: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['SMTPUsername'];\n globalRelaySMTPPassword: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['SMTPPassword'];\n globalRelayEmailAddress: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['EmailAddress'];\n globalRelayCustomSMTPServerName: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['CustomSMTPServerName'];\n globalRelayCustomSMTPPort: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['CustomSMTPPort'];\n globalRelaySMTPServerTimeout: AdminConfig['MessageExportSettings']['GlobalRelaySettings']['SMTPServerTimeout'];\n}\n\nconst messages = defineMessages({\n globalRelayCustomerType_title: {id: 'admin.complianceExport.globalRelayCustomerType.title', defaultMessage: 'Customer Type:'},\n globalRelayCustomerType_description: {id: 'admin.complianceExport.globalRelayCustomerType.description', defaultMessage: 'The type of GlobalRelay customer account that your organization has.'},\n globalRelaySMTPUsername_title: {id: 'admin.complianceExport.globalRelaySMTPUsername.title', defaultMessage: 'SMTP Username:'},\n globalRelaySMTPUsername_description: {id: 'admin.complianceExport.globalRelaySMTPUsername.description', defaultMessage: 'The username that is used to authenticate against the GlobalRelay SMTP server.'},\n globalRelaySMTPPassword_title: {id: 'admin.complianceExport.globalRelaySMTPPassword.title', defaultMessage: 'SMTP Password:'},\n globalRelaySMTPPassword_description: {id: 'admin.complianceExport.globalRelaySMTPPassword.description', defaultMessage: 'The password that is used to authenticate against the GlobalRelay SMTP server.'},\n globalRelayEmailAddress_title: {id: 'admin.complianceExport.globalRelayEmailAddress.title', defaultMessage: 'Email Address:'},\n globalRelayEmailAddress_description: {id: 'admin.complianceExport.globalRelayEmailAddress.description', defaultMessage: 'The email address that your GlobalRelay server monitors for incoming Compliance Exports.'},\n complianceExportTitle: {id: 'admin.service.complianceExportTitle', defaultMessage: 'Enable Compliance Export:'},\n complianceExportDesc: {id: 'admin.service.complianceExportDesc', defaultMessage: 'When true, Mattermost will export all messages that were posted in the last 24 hours. The export task is scheduled to run once per day. See <link>the documentation</link> to learn more.'},\n exportJobStartTime_title: {id: 'admin.complianceExport.exportJobStartTime.title', defaultMessage: 'Compliance Export Time:'},\n exportJobStartTime_description: {id: 'admin.complianceExport.exportJobStartTime.description', defaultMessage: 'Set the start time of the daily scheduled compliance export job. Choose a time when fewer people are using your system. Must be a 24-hour time stamp in the form HH:MM.'},\n exportFormat_title: {id: 'admin.complianceExport.exportFormat.title', defaultMessage: 'Export Format:'},\n exportFormat_description_intro: {\n id: 'admin.complianceExport.exportFormatDetail.intro',\n defaultMessage: 'Format of the compliance export. Corresponds to the system that you want to import the data into.'},\n exportFormat_description_details: {\n id: 'admin.complianceExport.exportFormatDetail.details',\n defaultMessage: 'For Actiance XML, compliance export files are written to the exports subdirectory of the configured <a>Local Storage Directory</a>. For Global Relay EML, they are emailed to the configured email address.'},\n createJob_title: {id: 'admin.complianceExport.createJob.title', defaultMessage: 'Run Compliance Export Job Now'},\n createJob_help: {id: 'admin.complianceExport.createJob.help', defaultMessage: 'Initiates a Compliance Export job immediately.'},\n});\n\nexport const searchableStrings: Array<\nstring | MessageDescriptor | [MessageDescriptor, { [key: string]: any }]\n> = [\n messages.exportFormat_description_intro,\n messages.exportFormat_description_details,\n messages.complianceExportTitle,\n messages.complianceExportDesc,\n messages.exportJobStartTime_title,\n messages.exportJobStartTime_description,\n messages.exportFormat_title,\n messages.createJob_title,\n messages.createJob_help,\n messages.globalRelayCustomerType_title,\n messages.globalRelayCustomerType_description,\n messages.globalRelaySMTPUsername_title,\n messages.globalRelaySMTPUsername_description,\n messages.globalRelaySMTPPassword_title,\n messages.globalRelaySMTPPassword_description,\n messages.globalRelayEmailAddress_title,\n messages.globalRelayEmailAddress_description,\n];\n\nexport class MessageExportSettings extends OLDAdminSettings<BaseProps & WrappedComponentProps, State> {\n getConfigFromState = (config: AdminConfig) => {\n config.MessageExportSettings.EnableExport = this.state.enableComplianceExport;\n config.MessageExportSettings.ExportFormat = this.state.exportFormat;\n config.MessageExportSettings.DailyRunTime = this.state.exportJobStartTime;\n\n if (this.state.exportFormat === exportFormats.EXPORT_FORMAT_GLOBALRELAY) {\n config.MessageExportSettings.GlobalRelaySettings = {\n CustomerType: this.state.globalRelayCustomerType,\n SMTPUsername: this.state.globalRelaySMTPUsername,\n SMTPPassword: this.state.globalRelaySMTPPassword,\n EmailAddress: this.state.globalRelayEmailAddress,\n CustomSMTPServerName: this.state.globalRelayCustomSMTPServerName,\n CustomSMTPPort: this.state.globalRelayCustomSMTPPort,\n SMTPServerTimeout: this.state.globalRelaySMTPServerTimeout,\n };\n }\n return config;\n };\n\n getStateFromConfig(config: AdminConfig) {\n const state: State = {\n enableComplianceExport: config.MessageExportSettings.EnableExport,\n exportFormat: config.MessageExportSettings.ExportFormat,\n exportJobStartTime: config.MessageExportSettings.DailyRunTime,\n globalRelayCustomerType: '',\n globalRelaySMTPUsername: '',\n globalRelaySMTPPassword: '',\n globalRelayEmailAddress: '',\n globalRelaySMTPServerTimeout: 0,\n globalRelayCustomSMTPServerName: '',\n globalRelayCustomSMTPPort: '',\n saveNeeded: false,\n saving: false,\n serverError: null,\n };\n if (config.MessageExportSettings.GlobalRelaySettings) {\n state.globalRelayCustomerType = config.MessageExportSettings.GlobalRelaySettings.CustomerType;\n state.globalRelaySMTPUsername = config.MessageExportSettings.GlobalRelaySettings.SMTPUsername;\n state.globalRelaySMTPPassword = config.MessageExportSettings.GlobalRelaySettings.SMTPPassword;\n state.globalRelayEmailAddress = config.MessageExportSettings.GlobalRelaySettings.EmailAddress;\n state.globalRelayCustomSMTPServerName = config.MessageExportSettings.GlobalRelaySettings.CustomSMTPServerName;\n state.globalRelayCustomSMTPPort = config.MessageExportSettings.GlobalRelaySettings.CustomSMTPPort;\n }\n return state;\n }\n\n getJobDetails = (job: Job) => {\n if (job.data) {\n const message = [];\n if (job.data.messages_exported) {\n message.push(\n <FormattedMessage\n id='admin.complianceExport.messagesExportedCount'\n defaultMessage='{count} messages exported.'\n values={{\n count: job.data.messages_exported,\n }}\n />,\n );\n }\n if (job.data.warning_count > 0) {\n if (job.data.export_type === exportFormats.EXPORT_FORMAT_GLOBALRELAY) {\n message.push(\n <div>\n <FormattedMessage\n id='admin.complianceExport.warningCount.globalrelay'\n defaultMessage='{count} warning(s) encountered, see log for details'\n values={{\n count: job.data.warning_count,\n }}\n />\n </div>,\n );\n } else {\n message.push(\n <div>\n <FormattedMessage\n id='admin.complianceExport.warningCount'\n defaultMessage='{count} warning(s) encountered, see warning.txt for details'\n values={{\n count: job.data.warning_count,\n }}\n />\n </div>,\n );\n }\n }\n if (job.data.progress_message) {\n message.push(\n <div>{job.data.progress_message}</div>,\n );\n }\n return message;\n }\n return null;\n };\n\n renderTitle() {\n return (\n <FormattedMessage\n id='admin.complianceExport.title'\n defaultMessage='Compliance Export'\n />\n );\n }\n\n renderSettings = () => {\n const exportFormatOptions = [\n {value: exportFormats.EXPORT_FORMAT_ACTIANCE, text: this.props.intl.formatMessage({id: 'admin.complianceExport.exportFormat.actiance', defaultMessage: 'Actiance XML'})},\n {value: exportFormats.EXPORT_FORMAT_CSV, text: this.props.intl.formatMessage({id: 'admin.complianceExport.exportFormat.csv', defaultMessage: 'CSV'})},\n {value: exportFormats.EXPORT_FORMAT_GLOBALRELAY, text: this.props.intl.formatMessage({id: 'admin.complianceExport.exportFormat.globalrelay', defaultMessage: 'GlobalRelay EML'})},\n ];\n\n // if the export format is globalrelay, the user needs to set some additional parameters\n let globalRelaySettings;\n if (this.state.exportFormat === exportFormats.EXPORT_FORMAT_GLOBALRELAY) {\n const globalRelayCustomerType = (\n <RadioSetting\n id='globalRelayCustomerType'\n values={[\n {value: 'A9', text: this.props.intl.formatMessage({id: 'admin.complianceExport.globalRelayCustomerType.a9.description', defaultMessage: 'A9/Type 9'})},\n {value: 'A10', text: this.props.intl.formatMessage({id: 'admin.complianceExport.globalRelayCustomerType.a10.description', defaultMessage: 'A10/Type 10'})},\n {value: 'CUSTOM', text: this.props.intl.formatMessage({id: 'admin.complianceExport.globalRelayCustomerType.custom.description', defaultMessage: 'Custom'})},\n ]}\n label={<FormattedMessage {...messages.globalRelayCustomerType_title}/>}\n helpText={<FormattedMessage {...messages.globalRelayCustomerType_description}/>}\n value={this.state.globalRelayCustomerType ? this.state.globalRelayCustomerType : ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.GlobalRelaySettings.CustomerType')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n );\n\n const globalRelaySMTPUsername = (\n <TextSetting\n id='globalRelaySMTPUsername'\n label={<FormattedMessage {...messages.globalRelaySMTPUsername_title}/>}\n placeholder={defineMessage({id: 'admin.complianceExport.globalRelaySMTPUsername.example', defaultMessage: 'E.g.: \"globalRelayUser\"'})}\n helpText={<FormattedMessage {...messages.globalRelaySMTPUsername_description}/>}\n value={this.state.globalRelaySMTPUsername ? this.state.globalRelaySMTPUsername : ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.GlobalRelaySettings.SMTPUsername')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n );\n\n const globalRelaySMTPPassword = (\n <TextSetting\n id='globalRelaySMTPPassword'\n label={<FormattedMessage {...messages.globalRelaySMTPPassword_title}/>}\n placeholder={defineMessage({id: 'admin.complianceExport.globalRelaySMTPPassword.example', defaultMessage: 'E.g.: \"globalRelayPassword\"'})}\n helpText={<FormattedMessage {...messages.globalRelaySMTPPassword_description}/>}\n value={this.state.globalRelaySMTPPassword ? this.state.globalRelaySMTPPassword : ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.GlobalRelaySettings.SMTPPassword')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n );\n\n const globalRelayEmail = (\n <TextSetting\n id='globalRelayEmailAddress'\n label={<FormattedMessage {...messages.globalRelayEmailAddress_title}/>}\n placeholder={defineMessage({id: 'admin.complianceExport.globalRelayEmailAddress.example', defaultMessage: 'E.g.: \"globalrelay@mattermost.com\"'})}\n helpText={<FormattedMessage {...messages.globalRelayEmailAddress_description}/>}\n value={this.state.globalRelayEmailAddress ? this.state.globalRelayEmailAddress : ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.GlobalRelaySettings.EmailAddress')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n );\n\n const globalRelaySMTPServerName = (\n <TextSetting\n id='globalRelayCustomSMTPServerName'\n label={\n <FormattedMessage\n id='admin.complianceExport.globalRelayCustomSMTPServerName.title'\n defaultMessage='SMTP Server Name:'\n />\n }\n placeholder={defineMessage({id: 'admin.complianceExport.globalRelayCustomSMTPServerName.example', defaultMessage: 'E.g.: \"feeds.globalrelay.com\"'})}\n helpText={\n <FormattedMessage\n id='admin.complianceExport.globalRelayCustomSMTPServerName.description'\n defaultMessage='The SMTP server name that will receive your Global Relay EML.'\n />\n }\n value={this.state.globalRelayCustomSMTPServerName ? this.state.globalRelayCustomSMTPServerName : ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.GlobalRelaySettings.CustomSMTPServerName')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n );\n\n const globalRelaySMTPPort = (\n <TextSetting\n id='globalRelayCustomSMTPPort'\n label={\n <FormattedMessage\n id='admin.complianceExport.globalRelayCustomSMTPPort.title'\n defaultMessage='SMTP Server Port:'\n />\n }\n placeholder={defineMessage({id: 'admin.complianceExport.globalRelayCustomSMTPPort.example', defaultMessage: 'E.g.: \"25\"'})}\n helpText={\n <FormattedMessage\n id='admin.complianceExport.globalRelayCustomSMTPPort.description'\n defaultMessage='The SMTP server port that will receive your Global Relay EML.'\n />\n }\n value={this.state.globalRelayCustomSMTPPort ? this.state.globalRelayCustomSMTPPort : ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.GlobalRelaySettings.CustomSMTPPort')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n );\n\n globalRelaySettings = (\n <SettingsGroup id={'globalRelaySettings'} >\n {globalRelayCustomerType}\n {globalRelaySMTPUsername}\n {globalRelaySMTPPassword}\n {globalRelayEmail}\n {\n this.state.globalRelayCustomerType === 'CUSTOM' &&\n globalRelaySMTPServerName\n }\n {\n this.state.globalRelayCustomerType === 'CUSTOM' &&\n globalRelaySMTPPort\n }\n </SettingsGroup>\n );\n }\n\n const dropdownHelpText = (\n <>\n <p>\n <FormattedMessage\n {...messages.exportFormat_description_intro}\n />\n </p>\n <p>\n <FormattedMessage\n {...messages.exportFormat_description_details}\n values={{\n a: (chunks: string) => (\n <Link to='/admin_console/environment/file_storage'>\n {chunks}\n </Link>\n ),\n }}\n />\n </p>\n </>\n );\n\n return (\n <SettingsGroup>\n <BooleanSetting\n id='enableComplianceExport'\n label={<FormattedMessage {...messages.complianceExportTitle}/>}\n helpText={\n <FormattedMessage\n {...messages.complianceExportDesc}\n values={{\n link: (msg: ReactNode) => (\n <ExternalLink\n href={DocLinks.COMPILANCE_EXPORT}\n location='message_export_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n }\n value={this.state.enableComplianceExport}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.EnableExport')}\n disabled={this.props.isDisabled}\n />\n\n <TextSetting\n id='exportJobStartTime'\n label={<FormattedMessage {...messages.exportJobStartTime_title}/>}\n placeholder={defineMessage({id: 'admin.complianceExport.exportJobStartTime.example', defaultMessage: 'E.g.: \"02:00\"'})}\n helpText={<FormattedMessage {...messages.exportJobStartTime_description}/>}\n value={this.state.exportJobStartTime}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.DailyRunTime')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n\n <DropdownSetting\n id='exportFormat'\n values={exportFormatOptions}\n label={<FormattedMessage {...messages.exportFormat_title}/>}\n helpText={dropdownHelpText}\n value={this.state.exportFormat}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('DataRetentionSettings.ExportFormat')}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n\n {globalRelaySettings}\n\n <JobsTable\n jobType={JobTypes.MESSAGE_EXPORT}\n createJobButtonText={<FormattedMessage {...messages.createJob_title}/>}\n createJobHelpText={<FormattedMessage {...messages.createJob_help}/>}\n getExtraInfoText={this.getJobDetails}\n disabled={this.props.isDisabled || !this.state.enableComplianceExport}\n />\n </SettingsGroup>\n );\n };\n}\n\nexport default injectIntl(MessageExportSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport type {BaseProps} from 'components/admin_console/old_admin_settings';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\n\nimport imagePath from 'images/openid-convert/emoticon-outline.svg';\nimport {getHistory} from 'utils/browser_history';\nimport {Constants} from 'utils/constants';\n\nimport './openid_convert.scss';\n\ntype Props = BaseProps & {\n disabled?: boolean;\n actions: {\n patchConfig: (config: DeepPartial<AdminConfig>) => Promise<ActionResult>;\n };\n};\ntype State = {\n serverError?: string;\n}\n\nexport default class OpenIdConvert extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n serverError: undefined,\n };\n }\n\n upgradeConfig = async (e: React.MouseEvent) => {\n e.preventDefault();\n\n const newConfig = JSON.parse(JSON.stringify(this.props.config));\n\n if (newConfig.Office365Settings.DirectoryId) {\n newConfig.Office365Settings.DiscoveryEndpoint = 'https://login.microsoftonline.com/' + newConfig.Office365Settings.DirectoryId + '/v2.0/.well-known/openid-configuration';\n }\n newConfig.GoogleSettings.DiscoveryEndpoint = 'https://accounts.google.com/.well-known/openid-configuration';\n\n if (newConfig.GitLabSettings.UserAPIEndpoint) {\n const url = newConfig.GitLabSettings.UserAPIEndpoint.replace('/api/v4/user', '');\n newConfig.GitLabSettings.DiscoveryEndpoint = url + '/.well-known/openid-configuration';\n }\n\n ['Office365Settings', 'GoogleSettings', 'GitLabSettings'].forEach((setting) => {\n newConfig[setting].Scope = Constants.OPENID_SCOPES;\n newConfig[setting].UserAPIEndpoint = '';\n newConfig[setting].AuthEndpoint = '';\n newConfig[setting].TokenEndpoint = '';\n });\n\n const {error: err} = await this.props.actions.patchConfig(newConfig);\n if (err) {\n this.setState({serverError: err.message});\n } else {\n getHistory().push('/admin_console/authentication/openid');\n }\n };\n\n render() {\n return (\n <div className='OpenIdConvert'>\n <div className='OpenIdConvert_imageWrapper'>\n <img\n className='OpenIdConvert_image'\n src={imagePath}\n alt='OpenId Convert Image'\n />\n </div>\n\n <div className='OpenIdConvert_copyWrapper'>\n <p>\n <FormattedMessage\n id='admin.openIdConvert.message'\n defaultMessage='You can now convert your OAuth2.0 configuration to OpenID Connect.'\n />\n </p>\n <div className='OpenIdConvert_actionWrapper'>\n <button\n className='btn'\n data-testid='openIdConvert'\n disabled={this.props.disabled}\n onClick={this.upgradeConfig}\n >\n <FormattedMessage\n id='admin.openIdConvert.text'\n defaultMessage='Convert to OpenID Connect'\n />\n </button>\n <ExternalLink\n className='btn-secondary'\n location='openid_convert'\n href='https://www.mattermost.com/default-openid-docs'\n data-testid='openIdLearnMore'\n >\n <FormattedMessage\n id='admin.openIdConvert.help'\n defaultMessage='Learn more'\n />\n </ExternalLink>\n <div\n className='error-message'\n data-testid='errorMessage'\n >\n <FormError error={this.state.serverError}/>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {patchConfig} from 'mattermost-redux/actions/admin';\n\nimport OpenIdConvert from './openid_convert';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchConfig,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(OpenIdConvert);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport SetByEnv from './set_by_env';\n\ntype Props = {\n id: string;\n label: React.ReactNode;\n defaultChecked?: boolean;\n onChange: (id: string, foo: boolean) => void;\n disabled: boolean;\n setByEnv: boolean;\n}\n\nexport default class CheckboxSetting extends React.PureComponent<Props> {\n public static defaultProps = {\n disabled: false,\n };\n\n private handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.props.onChange(this.props.id, e.target.checked);\n };\n\n public render() {\n return (\n <div>\n <label className='checkbox-inline'>\n <input\n data-testid={this.props.id}\n type='checkbox'\n id={this.props.id}\n name={this.props.id}\n defaultChecked={this.props.defaultChecked}\n onChange={this.handleChange}\n disabled={this.props.disabled || this.props.setByEnv}\n />\n {this.props.label}\n </label>\n {this.props.setByEnv ? <SetByEnv/> : null}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport Constants from 'utils/constants';\nimport {passwordErrors} from 'utils/password';\n\nimport BlockableLink from './blockable_link';\nimport BooleanSetting from './boolean_setting';\nimport CheckboxSetting from './checkbox_setting';\nimport type {BaseProps, BaseState} from './old_admin_settings';\nimport OLDAdminSettings from './old_admin_settings';\nimport SettingSet from './setting_set';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ntype Props = BaseProps & {\n config: AdminConfig;\n};\n\ntype State = BaseState & {\n passwordMinimumLength?: string;\n passwordLowercase?: boolean;\n passwordNumber?: boolean;\n passwordUppercase?: boolean;\n passwordSymbol?: boolean;\n passwordEnableForgotLink?: boolean;\n maximumLoginAttempts?: string;\n};\n\nconst messages = defineMessages({\n passwordMinLength: {id: 'user.settings.security.passwordMinLength', defaultMessage: 'Invalid minimum length, cannot show preview.'},\n password: {id: 'admin.security.password', defaultMessage: 'Password'},\n minimumLength: {id: 'admin.password.minimumLength', defaultMessage: 'Minimum Password Length:'},\n minimumLengthDescription: {id: 'admin.password.minimumLengthDescription', defaultMessage: 'Minimum number of characters required for a valid password. Must be a whole number greater than or equal to {min} and less than or equal to {max}.'},\n lowercase: {id: 'admin.password.lowercase', defaultMessage: 'At least one lowercase letter'},\n uppercase: {id: 'admin.password.uppercase', defaultMessage: 'At least one uppercase letter'},\n number: {id: 'admin.password.number', defaultMessage: 'At least one number'},\n symbol: {id: 'admin.password.symbol', defaultMessage: 'At least one symbol (e.g. \"~!@#$%^&*()\")'},\n preview: {id: 'admin.password.preview', defaultMessage: 'Error message preview:'},\n attemptTitle: {id: 'admin.service.attemptTitle', defaultMessage: 'Maximum Login Attempts:'},\n attemptDescription: {id: 'admin.service.attemptDescription', defaultMessage: 'Login attempts allowed before user is locked out and required to reset password via email.'},\n passwordRequirements: {id: 'passwordRequirements', defaultMessage: 'Password Requirements:'},\n});\n\nexport const searchableStrings: Array<string|MessageDescriptor|[MessageDescriptor, {[key: string]: any}]> = [\n [messages.minimumLength, {max: '', min: ''}],\n [messages.minimumLengthDescription, {max: '', min: ''}],\n messages.passwordMinLength,\n messages.password,\n messages.passwordRequirements,\n messages.lowercase,\n messages.uppercase,\n messages.number,\n messages.symbol,\n messages.preview,\n messages.attemptTitle,\n messages.attemptDescription,\n];\n\nfunction getPasswordErrorsMessage(lowercase?: boolean, uppercase?: boolean, number?: boolean, symbol?: boolean) {\n type KeyType = keyof typeof passwordErrors;\n\n let key: KeyType = 'passwordError';\n\n if (lowercase) {\n key += 'Lowercase';\n }\n if (uppercase) {\n key += 'Uppercase';\n }\n if (number) {\n key += 'Number';\n }\n if (symbol) {\n key += 'Symbol';\n }\n\n return passwordErrors[key as KeyType];\n}\nexport default class PasswordSettings extends OLDAdminSettings<Props, State> {\n sampleErrorMsg: React.ReactNode;\n\n constructor(props: Props) {\n super(props);\n\n this.state = Object.assign(this.state, {\n passwordMinimumLength: props.config.PasswordSettings.MinimumLength,\n passwordLowercase: props.config.PasswordSettings.Lowercase,\n passwordNumber: props.config.PasswordSettings.Number,\n passwordUppercase: props.config.PasswordSettings.Uppercase,\n passwordSymbol: props.config.PasswordSettings.Symbol,\n passwordEnableForgotLink: props.config.PasswordSettings.EnableForgotLink,\n maximumLoginAttempts: props.config.ServiceSettings.MaximumLoginAttempts,\n });\n\n this.sampleErrorMsg = (\n <FormattedMessage\n {...getPasswordErrorsMessage(\n props.config.PasswordSettings.Lowercase,\n props.config.PasswordSettings.Uppercase,\n props.config.PasswordSettings.Number,\n props.config.PasswordSettings.Symbol,\n )}\n values={{\n min: (this.state.passwordMinimumLength || Constants.MIN_PASSWORD_LENGTH),\n max: Constants.MAX_PASSWORD_LENGTH,\n }}\n />\n );\n }\n\n getConfigFromState = (config: DeepPartial<AdminConfig>) => {\n if (config.PasswordSettings) {\n config.PasswordSettings.MinimumLength = this.parseIntNonZero(this.state.passwordMinimumLength ?? '', Constants.MIN_PASSWORD_LENGTH);\n config.PasswordSettings.Lowercase = this.state.passwordLowercase;\n config.PasswordSettings.Uppercase = this.state.passwordUppercase;\n config.PasswordSettings.Number = this.state.passwordNumber;\n config.PasswordSettings.Symbol = this.state.passwordSymbol;\n config.PasswordSettings.EnableForgotLink = this.state.passwordEnableForgotLink;\n }\n\n if (config.ServiceSettings) {\n config.ServiceSettings.MaximumLoginAttempts = this.parseIntNonZero(this.state.maximumLoginAttempts ?? '', Constants.MAXIMUM_LOGIN_ATTEMPTS_DEFAULT);\n }\n\n return config;\n };\n\n getStateFromConfig(config: DeepPartial<AdminConfig>) {\n return {\n passwordMinimumLength: String(config.PasswordSettings?.MinimumLength),\n passwordLowercase: config.PasswordSettings?.Lowercase,\n passwordNumber: config.PasswordSettings?.Number,\n passwordUppercase: config.PasswordSettings?.Uppercase,\n passwordSymbol: config.PasswordSettings?.Symbol,\n passwordEnableForgotLink: config.PasswordSettings?.EnableForgotLink,\n maximumLoginAttempts: String(config.ServiceSettings?.MaximumLoginAttempts),\n };\n }\n\n getSampleErrorMsg = () => {\n if (this.props.config.PasswordSettings.MinimumLength > Constants.MAX_PASSWORD_LENGTH || this.props.config.PasswordSettings.MinimumLength < Constants.MIN_PASSWORD_LENGTH) {\n return (<FormattedMessage {...messages.passwordMinLength}/>);\n }\n return (\n <FormattedMessage\n {...getPasswordErrorsMessage(\n this.state.passwordLowercase,\n this.state.passwordUppercase,\n this.state.passwordNumber,\n this.state.passwordSymbol,\n )}\n values={{\n min: (this.state.passwordMinimumLength || Constants.MIN_PASSWORD_LENGTH),\n max: Constants.MAX_PASSWORD_LENGTH,\n }}\n />\n );\n };\n\n handleBooleanChange = (id: string) => {\n return (_: string, value: boolean) => {\n this.handleChange(id, value);\n };\n };\n\n renderTitle() {\n return (\n <FormattedMessage {...messages.password}/>\n );\n }\n\n renderSettings = () => {\n return (\n <SettingsGroup>\n <div>\n <TextSetting\n id='passwordMinimumLength'\n label={<FormattedMessage {...messages.minimumLength}/>}\n placeholder={defineMessage({id: 'admin.password.minimumLengthExample', defaultMessage: 'E.g.: \"5\"'})}\n helpText={\n <FormattedMessage\n {...messages.minimumLengthDescription}\n values={{\n min: Constants.MIN_PASSWORD_LENGTH,\n max: Constants.MAX_PASSWORD_LENGTH,\n }}\n />\n }\n value={this.state.passwordMinimumLength ?? ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('PasswordSettings.MinimumLength')}\n disabled={this.props.isDisabled}\n />\n <SettingSet\n label={<FormattedMessage {...messages.passwordRequirements}/>}\n >\n <ul className='admin-console__checkbox-list'>\n <div>\n <CheckboxSetting\n id='admin.password.lowercase'\n label={\n <FormattedMessage {...messages.lowercase}/>\n }\n defaultChecked={this.state.passwordLowercase}\n onChange={this.handleBooleanChange('passwordLowercase')}\n setByEnv={this.isSetByEnv('PasswordSettings.Lowercase')}\n disabled={this.props.isDisabled}\n />\n </div>\n <div>\n <CheckboxSetting\n id='admin.password.uppercase'\n label={\n <FormattedMessage {...messages.uppercase}/>\n }\n defaultChecked={this.state.passwordUppercase}\n onChange={this.handleBooleanChange('passwordUppercase')}\n setByEnv={this.isSetByEnv('PasswordSettings.Uppercase')}\n disabled={this.props.isDisabled}\n />\n </div>\n <div>\n <CheckboxSetting\n id='admin.password.number'\n label={\n <FormattedMessage {...messages.number}/>\n }\n defaultChecked={this.state.passwordNumber}\n onChange={this.handleBooleanChange('passwordNumber')}\n setByEnv={this.isSetByEnv('PasswordSettings.Number')}\n disabled={this.props.isDisabled}\n />\n </div>\n <div>\n <CheckboxSetting\n id='admin.password.symbol'\n label={\n <FormattedMessage {...messages.symbol}/>\n }\n defaultChecked={this.state.passwordSymbol}\n onChange={this.handleBooleanChange('passwordSymbol')}\n setByEnv={this.isSetByEnv('PasswordSettings.Symbol')}\n disabled={this.props.isDisabled}\n />\n </div>\n </ul>\n <div>\n <br/>\n <div className='password-settings__preview-heading'>\n <FormattedMessage {...messages.preview}/>\n </div>\n {this.getSampleErrorMsg()}\n </div>\n </SettingSet>\n </div>\n {!this.props.config.ExperimentalSettings?.RestrictSystemAdmin &&\n (\n <TextSetting\n id='maximumLoginAttempts'\n label={\n <FormattedMessage {...messages.attemptTitle}/>\n }\n placeholder={defineMessage({id: 'admin.service.attemptExample', defaultMessage: 'E.g.: \"10\"'})}\n helpText={\n <FormattedMessage {...messages.attemptDescription}/>\n }\n value={this.state.maximumLoginAttempts ?? ''}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.MaximumLoginAttempts')}\n disabled={this.props.isDisabled}\n />\n )\n }\n <BooleanSetting\n id='passwordEnableForgotLink'\n label={\n <FormattedMessage\n id='admin.password.enableForgotLink.title'\n defaultMessage='Enable Forgot Password Link:'\n />\n }\n helpText={\n <FormattedMessage\n id='admin.password.enableForgotLink.description'\n defaultMessage='When true, “Forgot password” link appears on the Mattermost login page, which allows users to reset their password. When false, the link is hidden from users. This link can be customized to redirect to a URL of your choice from <a>Site Configuration > Customization.</a>'\n values={{\n a: (chunks) => (\n <BlockableLink to='/admin_console/site_config/customization'>\n {chunks}\n </BlockableLink>\n ),\n }}\n />\n }\n value={this.state.passwordEnableForgotLink ?? false}\n setByEnv={false}\n onChange={this.handleChange}\n disabled={this.props.isDisabled}\n />\n </SettingsGroup>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Scheme, SchemeScope, SchemePatch} from '@mattermost/types/schemes';\n\nimport {SchemeTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\n\nimport {General} from '../constants';\n\nexport function getScheme(schemeId: string) {\n return bindClientFunc({\n clientFunc: Client4.getScheme,\n onSuccess: [SchemeTypes.RECEIVED_SCHEME],\n params: [\n schemeId,\n ],\n });\n}\n\nexport function getSchemes(scope: SchemeScope, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getSchemes,\n onSuccess: [SchemeTypes.RECEIVED_SCHEMES],\n params: [\n scope,\n page,\n perPage,\n ],\n });\n}\n\nexport function createScheme(scheme: Scheme) {\n return bindClientFunc({\n clientFunc: Client4.createScheme,\n onSuccess: [SchemeTypes.CREATED_SCHEME],\n params: [\n scheme,\n ],\n });\n}\n\nexport function deleteScheme(schemeId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n let data = null;\n try {\n data = await Client4.deleteScheme(schemeId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({type: SchemeTypes.DELETED_SCHEME, data: {schemeId}});\n\n return {data};\n };\n}\n\nexport function patchScheme(schemeId: string, scheme: SchemePatch) {\n return bindClientFunc({\n clientFunc: Client4.patchScheme,\n onSuccess: [SchemeTypes.PATCHED_SCHEME],\n params: [\n schemeId,\n scheme,\n ],\n });\n}\n\nexport function getSchemeTeams(schemeId: string, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getSchemeTeams,\n onSuccess: [SchemeTypes.RECEIVED_SCHEME_TEAMS],\n params: [\n schemeId,\n page,\n perPage,\n ],\n });\n}\n\nexport function getSchemeChannels(schemeId: string, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getSchemeChannels,\n onSuccess: [SchemeTypes.RECEIVED_SCHEME_CHANNELS],\n params: [\n schemeId,\n page,\n perPage,\n ],\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Scheme} from '@mattermost/types/schemes';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {ScopeTypes} from 'mattermost-redux/constants/schemes';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeams} from 'mattermost-redux/selectors/entities/teams';\n\nexport function getSchemes(state: GlobalState): {\n [x: string]: Scheme;\n} {\n return state.entities.schemes.schemes;\n}\n\nexport function getScheme(state: GlobalState, id: string): Scheme {\n const schemes = getSchemes(state);\n return schemes[id];\n}\n\nexport function makeGetSchemeChannels() {\n return (createSelector(\n 'makeGetSchemeChannels',\n getAllChannels,\n (state: GlobalState, props: {schemeId: string}) => getScheme(state, props.schemeId),\n (allChannels, scheme) => {\n if (!scheme) {\n return [];\n }\n\n if (scheme.scope === ScopeTypes.TEAM) {\n const msg = `Not implemented: scheme '${scheme.id}' is team-scope but 'getSchemeChannels' only accepts channel-scoped schemes.`;\n console.log(msg); // eslint-disable-line no-console\n return [];\n }\n\n const schemeChannels: Channel[] = [];\n\n Object.entries(allChannels).forEach((item: [string, Channel]) => {\n const [, channel] = item;\n if (channel.scheme_id === scheme.id) {\n schemeChannels.push(channel);\n }\n });\n\n return schemeChannels;\n }) as (b: GlobalState, a: {\n schemeId: string;\n }) => Channel[]);\n}\n\nexport function makeGetSchemeTeams() {\n return (createSelector(\n 'makeGetSchemeTeams',\n getTeams,\n (state: GlobalState, props: {schemeId: string}) => getScheme(state, props.schemeId),\n (allTeams, scheme) => {\n if (!scheme) {\n return [];\n }\n\n if (scheme.scope === ScopeTypes.CHANNEL) {\n const msg = `Error: scheme '${scheme.id}' is channel-scoped but 'getSchemeChannels' only accepts team-scoped schemes.`;\n console.log(msg); // eslint-disable-line no-console\n return [];\n }\n\n const schemeTeams: Team[] = [];\n\n Object.entries(allTeams).forEach((item: [string, Team]) => {\n const [, team] = item;\n if (team.scheme_id === scheme.id) {\n schemeTeams.push(team);\n }\n });\n\n return schemeTeams;\n }) as (b: GlobalState, a: {\n schemeId: string;\n }) => Team[]);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const ScopeTypes = {\n TEAM: 'team',\n CHANNEL: 'channel',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport AdminPanel from './admin_panel';\n\ntype Props = {\n children?: React.ReactNode;\n className?: string;\n id?: string;\n title: MessageDescriptor;\n subtitle: MessageDescriptor;\n subtitleValues?: any;\n url: string;\n disabled?: boolean;\n linkText: MessageDescriptor;\n}\n\nconst AdminPanelWithLink = ({\n className = '',\n linkText,\n subtitle,\n title,\n url,\n children,\n disabled,\n id,\n subtitleValues,\n}: Props) => {\n const button = (\n <Link\n data-testid={`${id}-link`}\n className={classNames(['btn', 'btn-primary', {disabled}])}\n to={url}\n onClick={disabled ? (e) => e.preventDefault() : () => null}\n >\n <FormattedMessage\n {...linkText}\n />\n </Link>\n );\n\n return (\n <AdminPanel\n className={'AdminPanelWithLink ' + className}\n id={id}\n data-testid={id}\n title={title}\n subtitle={subtitle}\n subtitleValues={subtitleValues}\n button={button}\n >\n {children}\n </AdminPanel>\n );\n};\n\nexport default AdminPanelWithLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport type {Scheme} from '@mattermost/types/schemes';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nconst MAX_TEAMS_PER_SCHEME_SUMMARY = 8;\n\nexport type Props = {\n scheme: Scheme;\n teams?: Team[];\n isDisabled?: boolean;\n actions?: {\n deleteScheme: (id: string) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n showConfirmModal: boolean;\n deleting: boolean;\n serverError?: string;\n}\n\nexport default class PermissionsSchemeSummary extends React.PureComponent<Props & RouteComponentProps, State> {\n constructor(props: Props & RouteComponentProps) {\n super(props);\n this.state = {\n showConfirmModal: false,\n deleting: false,\n serverError: undefined,\n };\n }\n\n renderConfirmModal = () => {\n const title = (\n <FormattedMessage\n id='admin.permissions.permissionsSchemeSummary.deleteSchemeTitle'\n defaultMessage='Delete {scheme} scheme?'\n values={{scheme: this.props.scheme.display_name}}\n />\n );\n\n let serverError = null;\n if (this.state.serverError) {\n serverError = (\n <div className='permission-scheme-summary-error-message'>\n <i className='fa fa-exclamation-circle'/> {this.state.serverError}\n </div>\n );\n }\n\n const message = (\n <div>\n <p>\n <FormattedMessage\n id='admin.permissions.permissionsSchemeSummary.deleteConfirmQuestion'\n defaultMessage='The permissions in the teams using this scheme will reset to the defaults in the System Scheme. Are you sure you want to delete the {schemeName} scheme?'\n values={{schemeName: this.props.scheme.display_name}}\n />\n </p>\n {serverError}\n </div>\n );\n\n const confirmButton = (\n <LoadingWrapper\n loading={this.state.deleting}\n text={defineMessage({id: 'admin.permissions.permissionsSchemeSummary.deleting', defaultMessage: 'Deleting...'})}\n >\n <FormattedMessage\n id='admin.permissions.permissionsSchemeSummary.deleteConfirmButton'\n defaultMessage='Yes, Delete'\n />\n </LoadingWrapper>\n );\n\n return (\n <ConfirmModal\n show={this.state.showConfirmModal}\n title={title}\n message={message}\n confirmButtonText={confirmButton}\n onConfirm={this.handleDeleteConfirmed}\n onCancel={this.handleDeleteCanceled}\n />\n );\n };\n\n stopPropagation = (e: React.MouseEvent<HTMLElement, MouseEvent>): void => {\n e.stopPropagation();\n };\n\n handleDeleteCanceled = (): void => {\n this.setState({\n showConfirmModal: false,\n });\n };\n\n handleDeleteConfirmed = async (): Promise<void> => {\n this.setState({deleting: true, serverError: undefined});\n const data = await this.props.actions?.deleteScheme(this.props.scheme.id);\n if (data?.error) {\n this.setState({deleting: false, serverError: data.error.message});\n } else {\n this.setState({deleting: false, showConfirmModal: false});\n }\n };\n\n delete = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n e.stopPropagation();\n if (this.props.isDisabled) {\n return;\n }\n this.setState({showConfirmModal: true, serverError: undefined});\n };\n\n goToEdit = (): void => {\n this.props.history.push('/admin_console/user_management/permissions/team_override_scheme/' + this.props.scheme.id);\n };\n\n render = () => {\n const {scheme, isDisabled} = this.props;\n\n let teams = this.props.teams ? this.props.teams.map((team) => (\n <span\n className='team'\n key={team.id}\n >\n {team.display_name}\n </span>\n )) : [];\n\n let extraTeams = null;\n if (teams.length > MAX_TEAMS_PER_SCHEME_SUMMARY) {\n extraTeams = (\n <WithTooltip\n title={this.props?.teams?.slice(MAX_TEAMS_PER_SCHEME_SUMMARY).map((team) => team.display_name).join(', ') ?? ''}\n >\n <span\n className='team'\n key='extra-teams'\n >\n <FormattedMessage\n id='admin.permissions.permissionsSchemeSummary.moreTeams'\n defaultMessage='+{number} more'\n values={{number: teams.length - MAX_TEAMS_PER_SCHEME_SUMMARY}}\n />\n </span>\n </WithTooltip>\n );\n teams = teams.slice(0, MAX_TEAMS_PER_SCHEME_SUMMARY);\n }\n const confirmModal = this.renderConfirmModal();\n\n return (\n <div\n className='permissions-scheme-summary'\n data-testid='permissions-scheme-summary'\n onClick={this.goToEdit}\n >\n <div onClick={this.stopPropagation}>{confirmModal}</div>\n <div\n className='permissions-scheme-summary--header'\n >\n <div className='title'>\n {scheme.display_name}\n </div>\n <div className='actions'>\n <Link\n data-testid={`${scheme.display_name}-edit`}\n className='edit-button'\n to={'/admin_console/user_management/permissions/team_override_scheme/' + scheme.id}\n >\n <FormattedMessage\n id='admin.permissions.permissionsSchemeSummary.edit'\n defaultMessage='Edit'\n />\n </Link>\n {'-'}\n <a\n data-testid={`${scheme.display_name}-delete`}\n className={isDisabled ? 'delete-button disabled' : 'delete-button'}\n onClick={this.delete}\n >\n <FormattedMessage\n id='admin.permissions.permissionsSchemeSummary.delete'\n defaultMessage='Delete'\n />\n </a>\n </div>\n </div>\n <div className='permissions-scheme-summary--description'>\n {scheme.description}\n </div>\n <div className='permissions-scheme-summary--teams'>\n {teams}\n {extraTeams}\n </div>\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {deleteScheme} from 'mattermost-redux/actions/schemes';\nimport {makeGetSchemeTeams} from 'mattermost-redux/selectors/entities/schemes';\n\nimport PermissionsSchemeSummary from './permissions_scheme_summary';\nimport type {Props} from './permissions_scheme_summary';\n\nfunction makeMapStateToProps() {\n const getSchemeTeams = makeGetSchemeTeams();\n\n return function mapStateToProps(state: GlobalState, props: Props & RouteComponentProps) {\n return {\n teams: getSchemeTeams(state, {schemeId: props.scheme.id}),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n deleteScheme,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PermissionsSchemeSummary);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {type MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport type {Scheme, SchemeScope, SchemesState} from '@mattermost/types/schemes';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ExternalLink from 'components/external_link';\nimport LoadingScreen from 'components/loading_screen';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanelWithLink from 'components/widgets/admin_console/admin_panel_with_link';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {DocLinks, LicenseSkus} from 'utils/constants';\n\nimport PermissionsSchemeSummary from './permissions_scheme_summary';\n\nconst PAGE_SIZE = 30;\nconst PHASE_2_MIGRATION_IMCOMPLETE_STATUS_CODE = 501;\n\nexport type Props = {\n schemes: SchemesState['schemes'];\n jobsAreEnabled?: boolean;\n clusterIsEnabled?: boolean;\n license: {\n CustomPermissionsSchemes: string;\n SkuShortName: string;\n };\n actions: {\n loadSchemes: (scope: SchemeScope, page: number, perPage: number) => Promise<ActionResult>;\n loadSchemeTeams: (id: string) => Promise<ActionResult>;\n };\n isDisabled?: boolean;\n};\n\ntype State = {\n loading: boolean;\n loadingMore: boolean;\n page: number;\n phase2MigrationIsComplete: boolean;\n};\n\nconst messages = defineMessages({\n teamOverrideSchemesNoSchemes: {id: 'admin.permissions.teamOverrideSchemesNoSchemes', defaultMessage: 'No team override schemes created.'},\n loadMoreSchemes: {id: 'admin.permissions.loadMoreSchemes', defaultMessage: 'Load more schemes'},\n introBanner: {id: 'admin.permissions.introBanner', defaultMessage: 'Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our <link>documentation</link>.'},\n systemSchemeBannerTitle: {id: 'admin.permissions.systemSchemeBannerTitle', defaultMessage: 'System Scheme'},\n systemSchemeBannerText: {id: 'admin.permissions.systemSchemeBannerText', defaultMessage: 'Set the default permissions inherited by all teams unless a <link>Team Override Scheme</link> is applied.'},\n systemSchemeBannerButton: {id: 'admin.permissions.systemSchemeBannerButton', defaultMessage: 'Edit Scheme'},\n teamOverrideSchemesTitle: {id: 'admin.permissions.teamOverrideSchemesTitle', defaultMessage: 'Team Override Schemes'},\n teamOverrideSchemesBannerText: {id: 'admin.permissions.teamOverrideSchemesBannerText', defaultMessage: 'Use when specific teams need permission exceptions to the <link>System Scheme</link>'},\n teamOverrideSchemesNewButton: {id: 'admin.permissions.teamOverrideSchemesNewButton', defaultMessage: 'New Team Override Scheme'},\n});\n\nexport const searchableStrings = [\n messages.teamOverrideSchemesNoSchemes,\n messages.loadMoreSchemes,\n messages.introBanner,\n messages.systemSchemeBannerTitle,\n messages.systemSchemeBannerText,\n messages.systemSchemeBannerButton,\n messages.teamOverrideSchemesTitle,\n messages.teamOverrideSchemesBannerText,\n messages.teamOverrideSchemesNewButton,\n];\n\nexport default class PermissionSchemesSettings extends React.PureComponent<Props & RouteComponentProps, State> {\n constructor(props: Props & RouteComponentProps) {\n super(props);\n this.state = {\n loading: true,\n loadingMore: false,\n page: 0,\n phase2MigrationIsComplete: false,\n };\n }\n\n static defaultProps = {\n schemes: {},\n };\n\n componentDidMount() {\n let phase2MigrationIsComplete = true; // Assume migration is complete unless HTTP status code says otherwise.\n this.props.actions.loadSchemes('team', 0, PAGE_SIZE).then((schemes) => {\n if (schemes.error.status_code === PHASE_2_MIGRATION_IMCOMPLETE_STATUS_CODE) {\n phase2MigrationIsComplete = false;\n }\n const promises = [];\n for (const scheme of schemes.data) {\n promises.push(this.props.actions.loadSchemeTeams(scheme.id));\n }\n Promise.all(promises).then(() => this.setState({loading: false, phase2MigrationIsComplete}));\n }).catch(() => {\n this.setState({loading: false, phase2MigrationIsComplete});\n });\n }\n\n loadMoreSchemes = () => {\n this.setState({loadingMore: true});\n this.props.actions.loadSchemes('team', this.state.page + 1, PAGE_SIZE).then((schemes) => {\n const promises = [];\n for (const scheme of schemes.data) {\n promises.push(this.props.actions.loadSchemeTeams(scheme.id));\n }\n Promise.all(promises).then(() => this.setState({loadingMore: false, page: this.state.page + 1}));\n });\n };\n\n // |RunJobs && !EnableCluster|(*App).IsPhase2MigrationCompleted|View |\n // |-------------------------|---------------------------------|-------------------------------------------------------|\n // |true |true |null |\n // |false |true |null (Jobs were disabled after a successful migration.)|\n // |false |false |On hold view. |\n // |true |false |In progress view. |\n teamOverrideSchemesMigrationView = () => {\n if (this.state.phase2MigrationIsComplete) {\n return null;\n }\n\n if (this.props.jobsAreEnabled && !this.props.clusterIsEnabled) {\n return this.teamOverrideUnavalableView(\n defineMessage({\n id: 'admin.permissions.teamOverrideSchemesInProgress',\n defaultMessage: 'Migration job in progress: Team Override Schemes are not available until the job server completes the permissions migration. Learn more in the <link>documentation</link>.',\n }),\n );\n }\n\n return this.teamOverrideUnavalableView(\n defineMessage({\n id: 'admin.permissions.teamOverrideSchemesNoJobsEnabled',\n defaultMessage: 'Migration job on hold: Team Override Schemes are not available until the job server can execute the permissions migration. The job will be automatically started when the job server is enabled. Learn more in the <link>documentation</link>.',\n }),\n );\n };\n\n teamOverrideUnavalableView = (message: MessageDescriptor) => {\n return (\n <div className='team-override-unavailable'>\n <div className='team-override-unavailable__inner'>\n <FormattedMessage\n {...message}\n values={{\n link: (chunks) => (\n <ExternalLink\n href='https://docs.mattermost.com/administration/config-settings.html#jobs'\n location='permission_scheme_settings'\n >\n {chunks}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n );\n };\n\n renderTeamOverrideSchemes = () => {\n const schemes = Object.values(this.props.schemes).map((scheme: Scheme) => (\n <PermissionsSchemeSummary\n scheme={scheme}\n history={this.props.history}\n key={scheme.id}\n isDisabled={this.props.isDisabled}\n location={this.props.location}\n match={this.props.match}\n />\n ));\n const hasCustomSchemes = this.props.license.CustomPermissionsSchemes === 'true' || this.props.license.SkuShortName === LicenseSkus.Professional;\n const teamOverrideView = this.teamOverrideSchemesMigrationView();\n\n if (hasCustomSchemes) {\n return (\n <AdminPanelWithLink\n id='team-override-schemes'\n className='permissions-block'\n title={messages.teamOverrideSchemesTitle}\n subtitle={messages.teamOverrideSchemesBannerText}\n subtitleValues={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='permission_scheme_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n url='/admin_console/user_management/permissions/team_override_scheme'\n disabled={(teamOverrideView !== null) || this.props.isDisabled}\n linkText={messages.teamOverrideSchemesNewButton}\n >\n {schemes.length === 0 && teamOverrideView === null &&\n <div className='no-team-schemes'>\n <FormattedMessage\n {...messages.teamOverrideSchemesNoSchemes}\n />\n </div>}\n {teamOverrideView}\n {schemes.length > 0 && schemes}\n {schemes.length === (PAGE_SIZE * (this.state.page + 1)) &&\n <button\n type='button'\n className='more-schemes theme style--none color--link'\n onClick={this.loadMoreSchemes}\n disabled={this.props.isDisabled || this.state.loadingMore}\n >\n <LoadingWrapper\n loading={this.state.loadingMore}\n text={defineMessage({id: 'admin.permissions.loadingMoreSchemes', defaultMessage: 'Loading...'})}\n >\n <FormattedMessage {...messages.loadMoreSchemes}/>\n </LoadingWrapper>\n </button>}\n </AdminPanelWithLink>\n );\n }\n return false;\n };\n\n render = () => {\n if (this.state.loading) {\n return (<LoadingScreen/>);\n }\n\n const teamOverrideView = this.teamOverrideSchemesMigrationView();\n\n return (\n <div className='wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage\n id='admin.permissions.permissionSchemes'\n defaultMessage='Permission Schemes'\n />\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className='banner info'>\n <div className='banner__content'>\n <span>\n <FormattedMessage\n {...messages.introBanner}\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='permission_scheme_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </span>\n </div>\n </div>\n\n <AdminPanelWithLink\n id='systemScheme'\n title={messages.systemSchemeBannerTitle}\n subtitle={messages.systemSchemeBannerText}\n subtitleValues={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='permission_scheme_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n url='/admin_console/user_management/permissions/system_scheme'\n disabled={teamOverrideView !== null}\n linkText={messages.systemSchemeBannerButton}\n />\n\n {this.renderTeamOverrideSchemes()}\n </div>\n </div>\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getSchemeTeams as loadSchemeTeams, getSchemes as loadSchemes} from 'mattermost-redux/actions/schemes';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getSchemes} from 'mattermost-redux/selectors/entities/schemes';\n\nimport type {GlobalState} from 'types/store';\n\nimport PermissionSchemesSettings from './permission_schemes_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n const schemes = getSchemes(state);\n const config = getConfig(state);\n\n return {\n schemes,\n jobsAreEnabled: config.RunJobs === 'true',\n clusterIsEnabled: config.EnableCluster === 'true',\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadSchemes,\n loadSchemeTeams,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PermissionSchemesSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default function AccordionToggleIcon(\n props: React.HTMLAttributes<HTMLSpanElement>,\n) {\n return (\n <span {...props}>\n <svg\n width='30px'\n height='30px'\n viewBox='0 0 30 30'\n >\n <g\n id='Developer-Export'\n stroke='none'\n strokeWidth='1'\n fill='none'\n fillRule='evenodd'\n >\n <g\n transform='translate(-995.000000, -1372.000000)'\n id='All-Team-Members'\n >\n <g transform='translate(245.000000, 698.000000)'>\n <g\n id='Team-Administrators'\n transform='translate(0.000000, 651.000000)'\n >\n <g id='accordion-header'>\n <g\n id='accordion---expanded'\n transform='translate(750.000000, 23.000000)'\n >\n <path\n d='M23.1484532,13.3124932 C23.3437659,13.1171805 23.3437659,12.7968676 23.1484532,12.6015549 L21.8515766,11.3124908 C21.6562639,11.1171781 21.3437635,11.1171781 21.1484508,11.3124908 L15.0000083,17.4609333 L8.8515659,11.3124908 C8.65625317,11.1171781 8.34375279,11.1171781 8.14844006,11.3124908 L6.85156352,12.6015549 C6.65625078,12.7968676 6.65625078,13.1171805 6.85156352,13.3124932 L14.6484454,21.1015626 C14.8437582,21.2968754 15.1562585,21.2968754 15.3515713,21.1015626 L23.1484532,13.3124932 Z'\n id=''\n fill='#979797'\n />\n <circle\n id='Oval-2'\n stroke='#989898'\n strokeWidth='2'\n cx='15'\n cy='15'\n r='14'\n />\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\n\nimport AccordionToggleIcon from 'components/widgets/icons/accordion_toggle_icon';\n\nimport AdminPanel from './admin_panel';\n\ntype Props = {\n children?: React.ReactNode;\n className: string;\n id?: string;\n open: boolean;\n title: MessageDescriptor;\n subtitle: MessageDescriptor;\n onToggle?: React.EventHandler<React.MouseEvent>;\n};\n\nconst AdminPanelTogglable = ({\n className,\n open,\n subtitle,\n title,\n children,\n id,\n onToggle,\n}: Props) => {\n return (\n <AdminPanel\n className={'AdminPanelTogglable ' + className + (open ? '' : ' closed')}\n id={id}\n title={title}\n subtitle={subtitle}\n onHeaderClick={onToggle}\n button={<AccordionToggleIcon/>}\n >\n {children}\n </AdminPanel>\n );\n};\n\nAdminPanelTogglable.defaultProps = {\n className: '',\n open: true,\n};\n\nexport default AdminPanelTogglable;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {Constants} from 'utils/constants';\n\ntype Props = {\n timeLimit: number;\n onClick: () => void;\n isDisabled: boolean | undefined;\n}\n\nexport default function EditPostTimeLimitButton(props: Props) {\n return (\n <button\n type='button'\n className='edit-post-time-limit-button'\n onClick={props.onClick}\n disabled={props.isDisabled}\n >\n <i className='fa fa-gear'/>\n {props.timeLimit === Constants.UNSET_POST_EDIT_TIME_LIMIT ? (\n <FormattedMessage\n id='edit_post.time_limit_button.no_limit'\n defaultMessage='Anytime'\n />\n ) : (\n <FormattedMessage\n id='edit_post.time_limit_button.for_n_seconds'\n defaultMessage='For {n} seconds'\n values={{n: props.timeLimit}}\n />\n )}\n </button>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {Constants} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport EditPostTimeLimitButton from './edit_post_time_limit_button';\n\nfunction mapStateToProps(state: GlobalState) {\n const {PostEditTimeLimit} = getConfig(state);\n\n return {\n timeLimit: PostEditTimeLimit ? parseInt(PostEditTimeLimit, 10) : Constants.UNSET_POST_EDIT_TIME_LIMIT,\n };\n}\n\nexport default connect(mapStateToProps)(EditPostTimeLimitButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {Constants} from 'utils/constants';\n\nconst INT32_MAX = 2147483647;\n\ntype Props ={\n config: Partial<AdminConfig>;\n show: boolean;\n onClose: () => void;\n actions: {\n patchConfig: (config: DeepPartial<AdminConfig>) => Promise<ActionResult>;\n };\n}\n\nexport default function EditPostTimeLimitModal(props: Props) {\n const {ServiceSettings} = props.config;\n\n const intl = useIntl();\n\n const [saving, setSaving] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n const [postEditTimeLimit, setPostEditTimeLimit] = useState<number>(ServiceSettings?.PostEditTimeLimit || Constants.UNSET_POST_EDIT_TIME_LIMIT);\n const [alwaysAllowPostEditing, setAlwaysAllowPostEditing] = useState(postEditTimeLimit < 0);\n\n const save = async () => {\n setSaving(true);\n setErrorMessage('');\n\n if (isNaN(postEditTimeLimit) || postEditTimeLimit < 0 || postEditTimeLimit > INT32_MAX) {\n setErrorMessage(intl.formatMessage({id: 'edit_post.time_limit_modal.invalid_time_limit', defaultMessage: 'Invalid time limit'}));\n setSaving(false);\n setPostEditTimeLimit(0);\n return false;\n }\n\n const newConfig = JSON.parse(JSON.stringify(props.config));\n newConfig.ServiceSettings.PostEditTimeLimit = alwaysAllowPostEditing ? Constants.UNSET_POST_EDIT_TIME_LIMIT : postEditTimeLimit;\n\n const {error} = await props.actions.patchConfig(newConfig);\n if (error) {\n setErrorMessage(error.message);\n setSaving(false);\n } else {\n setSaving(false);\n props.onClose();\n }\n\n return true;\n };\n\n const handleOptionChange = ({currentTarget}: React.FormEvent<HTMLInputElement>) => {\n setAlwaysAllowPostEditing(currentTarget.value === Constants.ALLOW_EDIT_POST_ALWAYS);\n };\n\n const handleSecondsChange = ({currentTarget}: React.FormEvent<HTMLInputElement>) => setPostEditTimeLimit(parseInt(currentTarget.value, 10));\n\n return (\n <Modal\n dialogClassName='a11y__modal admin-modal edit-post-time-limit-modal'\n show={props.show}\n role='none'\n aria-labelledby='editPostTimeModalLabel'\n onHide={props.onClose}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='editPostTimeModalLabel'\n >\n <FormattedMessage\n id='edit_post.time_limit_modal.title'\n defaultMessage='Configure Global Edit Post Time Limit'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <FormattedMessage\n id='editPost.timeLimitModal.description'\n defaultMessage='Setting a time limit <b>applies to all users</b> who have the \"Edit Post\" permissions in any permission scheme.'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <div className='pt-3'>\n <div className='pt-3'>\n <input\n id='anytime'\n type='radio'\n name='limit'\n value={Constants.ALLOW_EDIT_POST_ALWAYS}\n checked={alwaysAllowPostEditing}\n onChange={handleOptionChange}\n />\n <label htmlFor='anytime'>\n <FormattedMessage\n id='edit_post.time_limit_modal.option_label_anytime'\n defaultMessage='Anytime'\n />\n </label>\n </div>\n <div className='pt-2'>\n <input\n id='timelimit'\n type='radio'\n name='limit'\n value={Constants.ALLOW_EDIT_POST_TIME_LIMIT}\n checked={!alwaysAllowPostEditing}\n onChange={handleOptionChange}\n />\n <label htmlFor='timelimit'>\n <FormattedMessage\n id='edit_post.time_limit_modal.option_label_time_limit.preinput'\n defaultMessage='Can edit for'\n />\n </label>\n <input\n type='number'\n className='form-control inline'\n min='0'\n step='1'\n max={INT32_MAX}\n id='editPostTimeLimit'\n readOnly={alwaysAllowPostEditing}\n onChange={handleSecondsChange}\n value={alwaysAllowPostEditing ? '' : postEditTimeLimit}\n />\n <label htmlFor='timelimit'>\n <FormattedMessage\n id='edit_post.time_limit_modal.option_label_time_limit.postinput'\n defaultMessage='seconds after posting'\n />\n </label>\n </div>\n <div className='pt-3 light'>\n <FormattedMessage\n id='edit_post.time_limit_modal.subscript'\n defaultMessage='Set the length of time users have to edit their messages after posting.'\n />\n </div>\n <div className='edit-post-time-limit-modal__error'>\n {errorMessage}\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={props.onClose}\n >\n <FormattedMessage\n id='confirm_modal.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n id='linkModalCloseButton'\n type='button'\n className='btn btn-primary'\n onClick={save}\n disabled={saving}\n >\n {saving ? (\n <FormattedMessage\n id='save_button.saving'\n defaultMessage='Saving'\n />\n ) : (\n <FormattedMessage\n id='edit_post.time_limit_modal.save_button'\n defaultMessage='Save Edit Time'\n />\n )}\n </button>\n </Modal.Footer>\n </Modal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {patchConfig} from 'mattermost-redux/actions/admin';\nimport {getConfig} from 'mattermost-redux/selectors/entities/admin';\n\nimport type {GlobalState} from 'types/store';\n\nimport EditPostTimeLimitModal from './edit_post_time_limit_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n config: getConfig(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({patchConfig}, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditPostTimeLimitModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nconst CheckboxPartialIcon = () => (\n <svg\n width='18px'\n height='18px'\n viewBox='0 0 18 18'\n >\n <g\n id='Developer-Export'\n stroke='none'\n strokeWidth='1'\n fillRule='evenodd'\n >\n <g\n transform='translate(-298.000000, -1273.000000)'\n id='All-Team-Members'\n >\n <g transform='translate(245.000000, 698.000000)'>\n <g\n id='Channel-Administrators'\n transform='translate(0.000000, 106.000000)'\n >\n <g\n id='data-table/column-1'\n transform='translate(11.000000, 86.000000)'\n >\n <g\n id='row-checkbox---@all-@channel-Mentions'\n transform='translate(0.000000, 375.000000)'\n >\n <g id='Stacked-Group'>\n <g\n id='data-table/1st/row-checkbox-label-base'\n transform='translate(25.000000, 5.000000)'\n >\n <g\n id='check-on-copy-11'\n transform='translate(14.000000, 0.000000)'\n >\n <path\n d='M19,3 C20.1,3 21,3.9 21,5 L21,19 C21,20.1 20.1,21 19,21 L5,21 C3.9,21 3,20.1 3,19 L3,5 C3,3.9 3.9,3 5,3 L19,3 Z M7,11 L7,13 L17,13 L17,11 L7,11 Z'\n id='checkbox---partial'\n />\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n);\n\nexport default memo(CheckboxPartialIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport CheckboxCheckedIcon from 'components/widgets/icons/checkbox_checked_icon';\nimport CheckboxPartialIcon from 'components/widgets/icons/checkbox_partial_icon';\n\ntype Props = {\n value?: string;\n id?: string;\n};\n\nconst PermissionCheckbox = ({value = '', id = ''}: Props): JSX.Element => {\n let icon = null;\n let extraClass = '';\n if (value === 'checked') {\n icon = <CheckboxCheckedIcon/>;\n extraClass = 'checked';\n } else if (value === 'intermediate') {\n icon = <CheckboxPartialIcon/>;\n extraClass = 'intermediate';\n }\n return (\n <div\n className={'permission-check ' + extraClass}\n data-testid={id}\n >\n {icon}\n </div>\n );\n};\n\nexport default PermissionCheckbox;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessages} from 'react-intl';\n\nexport const rolesRolesStrings: Record<string, MessageDescriptor> = defineMessages({\n all_users: {\n id: 'admin.permissions.roles.all_users.name',\n defaultMessage: 'All Members',\n },\n channel_admin: {\n id: 'admin.permissions.roles.channel_admin.name',\n defaultMessage: 'Channel Admin',\n },\n channel_user: {\n id: 'admin.permissions.roles.channel_user.name',\n defaultMessage: 'Channel User',\n },\n system_admin: {\n id: 'admin.permissions.roles.system_admin.name',\n defaultMessage: 'System Admin',\n },\n system_user: {\n id: 'admin.permissions.roles.system_user.name',\n defaultMessage: 'System User',\n },\n team_admin: {\n id: 'admin.permissions.roles.team_admin.name',\n defaultMessage: 'Team Admin',\n },\n team_user: {\n id: 'admin.permissions.roles.team_user.name',\n defaultMessage: 'Team User',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MouseEvent} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {AdditionalValues} from './permissions_tree/types';\nimport {rolesRolesStrings} from './strings/roles';\n\ntype Props = {\n id: string;\n inherited?: Partial<Role>;\n selectRow: (id: string) => void;\n additionalValues?: AdditionalValues | AdditionalValues['edit_post'];\n description: string | JSX.Element;\n}\n\nconst PermissionDescription = ({\n id,\n selectRow,\n description,\n additionalValues,\n inherited,\n}: Props): JSX.Element => {\n const {formatMessage} = useIntl();\n\n const parentPermissionClicked = (e: MouseEvent) => {\n const parent = (e.target as HTMLSpanElement).parentElement;\n const isInheritLink = parent?.parentElement?.className === 'inherit-link-wrapper';\n if (parent?.className !== 'permission-description' && !isInheritLink) {\n e.stopPropagation();\n } else if (isInheritLink) {\n selectRow(id);\n e.stopPropagation();\n }\n };\n\n let content: string | JSX.Element = '';\n if (inherited && inherited.name) {\n const formattedName = formatMessage(rolesRolesStrings[inherited.name]);\n content = (\n <span className='inherit-link-wrapper'>\n <FormattedMessage\n id='admin.permissions.inherited_from'\n defaultMessage='Inherited from <link>{name}</link>.'\n values={{\n name: formattedName,\n link: (text: string) => (\n <a>{text}</a>\n ),\n }}\n />\n </span>\n );\n } else {\n content = description;\n }\n\n let showTooltip = true;\n if (!inherited && additionalValues) {\n showTooltip = false;\n }\n\n return (\n <WithTooltip\n title={content}\n disabled={!showTooltip}\n >\n <span\n className='permission-description'\n onClick={parentPermissionClicked}\n >\n {content}\n </span>\n </WithTooltip>\n );\n};\n\nexport default PermissionDescription;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessages} from 'react-intl';\n\nexport const permissionRolesStrings: Record<string, Record<string, MessageDescriptor>> = {\n assign_system_admin_role: defineMessages({\n name: {\n id: 'admin.permissions.permission.assign_system_admin_role.name',\n defaultMessage: 'Assign system admin role',\n },\n description: {\n id: 'admin.permissions.permission.assign_system_admin_role.description',\n defaultMessage: 'Assign system admin role',\n },\n }),\n convert_public_channel_to_private: defineMessages({\n name: {\n id: 'admin.permissions.permission.convert_public_channel_to_private.name',\n defaultMessage: 'Convert to private',\n },\n description: {\n id: 'admin.permissions.permission.convert_public_channel_to_private.description',\n defaultMessage: 'Convert public channels to private',\n },\n }),\n convert_private_channel_to_public: defineMessages({\n name: {\n id: 'admin.permissions.permission.convert_private_channel_to_public.name',\n defaultMessage: 'Convert to public',\n },\n description: {\n id: 'admin.permissions.permission.convert_private_channel_to_public.description',\n defaultMessage: 'Convert private channels to public',\n },\n }),\n create_direct_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_direct_channel.name',\n defaultMessage: 'Create direct channel',\n },\n description: {\n id: 'admin.permissions.permission.create_direct_channel.description',\n defaultMessage: 'Create direct channel',\n },\n }),\n create_group_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_group_channel.name',\n defaultMessage: 'Create group channel',\n },\n description: {\n id: 'admin.permissions.permission.create_group_channel.description',\n defaultMessage: 'Create group channel',\n },\n }),\n create_post: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_post.name',\n defaultMessage: 'Create Posts',\n },\n description: {\n id: 'admin.permissions.permission.create_post.description',\n defaultMessage: 'Allow users to create posts.',\n },\n }),\n create_private_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_private_channel.name',\n defaultMessage: 'Create Channels',\n },\n description: {\n id: 'admin.permissions.permission.create_private_channel.description',\n defaultMessage: 'Create new private channels.',\n },\n }),\n create_public_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_public_channel.name',\n defaultMessage: 'Create Channels',\n },\n description: {\n id: 'admin.permissions.permission.create_public_channel.description',\n defaultMessage: 'Create new public channels.',\n },\n }),\n create_team: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_team.name',\n defaultMessage: 'Create Teams',\n },\n description: {\n id: 'admin.permissions.permission.create_team.description',\n defaultMessage: 'Create new teams.',\n },\n }),\n create_user_access_token: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_user_access_token.name',\n defaultMessage: 'Create user access token',\n },\n description: {\n id: 'admin.permissions.permission.create_user_access_token.description',\n defaultMessage: 'Create user access token',\n },\n }),\n delete_others_posts: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_others_posts.name',\n defaultMessage: 'Delete Others\\' Posts',\n },\n description: {\n id: 'admin.permissions.permission.delete_others_posts.description',\n defaultMessage: 'Posts made by other users can be deleted.',\n },\n }),\n delete_post: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_post.name',\n defaultMessage: 'Delete Own Posts',\n },\n description: {\n id: 'admin.permissions.permission.delete_post.description',\n defaultMessage: 'Author\\'s own posts can be deleted.',\n },\n }),\n delete_private_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_private_channel.name',\n defaultMessage: 'Archive Channels',\n },\n description: {\n id: 'admin.permissions.permission.delete_private_channel.description',\n defaultMessage: 'Archive private channels.',\n },\n }),\n delete_public_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_public_channel.name',\n defaultMessage: 'Archive Channels',\n },\n description: {\n id: 'admin.permissions.permission.delete_public_channel.description',\n defaultMessage: 'Archive public channels.',\n },\n }),\n edit_other_users: defineMessages({\n name: {\n id: 'admin.permissions.permission.edit_other_users.name',\n defaultMessage: 'Edit other users',\n },\n description: {\n id: 'admin.permissions.permission.edit_other_users.description',\n defaultMessage: 'Edit other users',\n },\n }),\n edit_post: defineMessages({\n name: {\n id: 'admin.permissions.permission.edit_post.name',\n defaultMessage: 'Edit Own Posts',\n },\n description: {\n id: 'admin.permissions.permission.edit_post.description',\n defaultMessage: '{editTimeLimitButton} after posting, allow users to edit their own posts.',\n },\n }),\n import_team: defineMessages({\n name: {\n id: 'admin.permissions.permission.import_team.name',\n defaultMessage: 'Import team',\n },\n description: {\n id: 'admin.permissions.permission.import_team.description',\n defaultMessage: 'Import team',\n },\n }),\n list_team_channels: defineMessages({\n name: {\n id: 'admin.permissions.permission.list_team_channels.name',\n defaultMessage: 'List team channels',\n },\n description: {\n id: 'admin.permissions.permission.list_team_channels.description',\n defaultMessage: 'List team channels',\n },\n }),\n list_users_without_team: defineMessages({\n name: {\n id: 'admin.permissions.permission.list_users_without_team.name',\n defaultMessage: 'List users without team',\n },\n description: {\n id: 'admin.permissions.permission.list_users_without_team.description',\n defaultMessage: 'List users without team',\n },\n }),\n manage_channel_roles: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_channel_roles.name',\n defaultMessage: 'Manage channel roles',\n },\n description: {\n id: 'admin.permissions.permission.manage_channel_roles.description',\n defaultMessage: 'Manage channel roles',\n },\n }),\n create_emojis: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_emojis.name',\n defaultMessage: 'Create Custom Emoji',\n },\n description: {\n id: 'admin.permissions.permission.create_emojis.description',\n defaultMessage: 'Allow users to create custom emoji.',\n },\n }),\n delete_emojis: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_emojis.name',\n defaultMessage: 'Delete Own Custom Emoji',\n },\n description: {\n id: 'admin.permissions.permission.delete_emojis.description',\n defaultMessage: 'Allow users to delete custom emoji that they created.',\n },\n }),\n delete_others_emojis: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_others_emojis.name',\n defaultMessage: 'Delete Others\\' Custom Emoji',\n },\n description: {\n id: 'admin.permissions.permission.delete_others_emojis.description',\n defaultMessage: 'Allow users to delete custom emoji that were created by other users.',\n },\n }),\n manage_jobs: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_jobs.name',\n defaultMessage: 'Manage jobs',\n },\n description: {\n id: 'admin.permissions.permission.manage_jobs.description',\n defaultMessage: 'Manage jobs',\n },\n }),\n manage_oauth: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_oauth.name',\n defaultMessage: 'Manage OAuth Applications',\n },\n description: {\n id: 'admin.permissions.permission.manage_oauth.description',\n defaultMessage: 'Create, edit and delete OAuth 2.0 application tokens.',\n },\n }),\n manage_private_channel_properties: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_private_channel_properties.name',\n defaultMessage: 'Manage Channel Settings',\n },\n description: {\n id: 'admin.permissions.permission.manage_private_channel_properties.description',\n defaultMessage: 'Update private channel names, headers and purposes.',\n },\n }),\n manage_public_channel_properties: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_public_channel_properties.name',\n defaultMessage: 'Manage Channel Settings',\n },\n description: {\n id: 'admin.permissions.permission.manage_public_channel_properties.description',\n defaultMessage: 'Update public channel names, headers and purposes.',\n },\n }),\n manage_roles: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_roles.name',\n defaultMessage: 'Manage roles',\n },\n description: {\n id: 'admin.permissions.permission.manage_roles.description',\n defaultMessage: 'Manage roles',\n },\n }),\n manage_slash_commands: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_slash_commands.name',\n defaultMessage: 'Manage Slash Commands',\n },\n description: {\n id: 'admin.permissions.permission.manage_slash_commands.description',\n defaultMessage: 'Create, edit and delete custom slash commands.',\n },\n }),\n manage_system: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_system.name',\n defaultMessage: 'Manage system',\n },\n description: {\n id: 'admin.permissions.permission.manage_system.description',\n defaultMessage: 'Manage system',\n },\n }),\n manage_team: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_team.name',\n defaultMessage: 'Manage team',\n },\n description: {\n id: 'admin.permissions.permission.manage_team.description',\n defaultMessage: 'Manage team',\n },\n }),\n manage_team_roles: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_team_roles.name',\n defaultMessage: 'Manage team roles',\n },\n description: {\n id: 'admin.permissions.permission.manage_team_roles.description',\n defaultMessage: 'Manage team roles',\n },\n }),\n manage_incoming_webhooks: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_incoming_webhooks.name',\n defaultMessage: 'Manage Incoming Webhooks',\n },\n description: {\n id: 'admin.permissions.permission.manage_incoming_webhooks.description',\n defaultMessage: 'Create, edit, and delete incoming webhooks.',\n },\n }),\n manage_outgoing_webhooks: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_outgoing_webhooks.name',\n defaultMessage: 'Manage Outgoing Webhooks',\n },\n description: {\n id: 'admin.permissions.permission.manage_outgoing_webhooks.description',\n defaultMessage: 'Create, edit, and delete outgoing webhooks.',\n },\n }),\n permanent_delete_user: defineMessages({\n name: {\n id: 'admin.permissions.permission.permanent_delete_user.name',\n defaultMessage: 'Permanent delete user',\n },\n description: {\n id: 'admin.permissions.permission.permanent_delete_user.description',\n defaultMessage: 'Permanent delete user',\n },\n }),\n read_channel: defineMessages({\n name: {\n id: 'admin.permissions.permission.read_channel.name',\n defaultMessage: 'Read channel',\n },\n description: {\n id: 'admin.permissions.permission.read_channel.description',\n defaultMessage: 'Read channel',\n },\n }),\n read_user_access_token: defineMessages({\n name: {\n id: 'admin.permissions.permission.read_user_access_token.name',\n defaultMessage: 'Read user access token',\n },\n description: {\n id: 'admin.permissions.permission.read_user_access_token.description',\n defaultMessage: 'Read user access token',\n },\n }),\n remove_user_from_team: defineMessages({\n name: {\n id: 'admin.permissions.permission.remove_user_from_team.name',\n defaultMessage: 'Remove user from team',\n },\n description: {\n id: 'admin.permissions.permission.remove_user_from_team.description',\n defaultMessage: 'Remove user from team',\n },\n }),\n revoke_user_access_token: defineMessages({\n name: {\n id: 'admin.permissions.permission.revoke_user_access_token.name',\n defaultMessage: 'Revoke user access token',\n },\n description: {\n id: 'admin.permissions.permission.revoke_user_access_token.description',\n defaultMessage: 'Revoke user access token',\n },\n }),\n upload_file: defineMessages({\n name: {\n id: 'admin.permissions.permission.upload_file.name',\n defaultMessage: 'Upload file',\n },\n description: {\n id: 'admin.permissions.permission.upload_file.description',\n defaultMessage: 'Upload file',\n },\n }),\n use_channel_mentions: defineMessages({\n name: {\n id: 'admin.permissions.permission.use_channel_mentions.name',\n defaultMessage: 'Channel Mentions',\n },\n description: {\n id: 'admin.permissions.permission.use_channel_mentions.description',\n defaultMessage: 'Notify channel members with @all, @channel and @here',\n },\n }),\n use_group_mentions: defineMessages({\n name: {\n id: 'admin.permissions.permission.use_group_mentions.name',\n defaultMessage: 'Group Mentions',\n },\n description: {\n id: 'admin.permissions.permission.use_group_mentions.description',\n defaultMessage: 'Notify group members with a group mention',\n },\n }),\n view_team: defineMessages({\n name: {\n id: 'admin.permissions.permission.view_team.name',\n defaultMessage: 'View team',\n },\n description: {\n id: 'admin.permissions.permission.view_team.description',\n defaultMessage: 'View team',\n },\n }),\n edit_others_posts: defineMessages({\n name: {\n id: 'admin.permissions.permission.edit_others_posts.name',\n defaultMessage: 'Edit Others\\' Posts',\n },\n description: {\n id: 'admin.permissions.permission.edit_others_posts.description',\n defaultMessage: 'Allow users to edit others\\' posts.',\n },\n }),\n invite_guest: defineMessages({\n name: {\n id: 'admin.permissions.permission.invite_guest.name',\n defaultMessage: 'Invite guests',\n },\n description: {\n id: 'admin.permissions.permission.invite_guest.description',\n defaultMessage: 'Invite guests to channels and send guest email invites.',\n },\n }),\n manage_shared_channels: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_shared_channels.name',\n defaultMessage: 'Manage Shared Channels',\n },\n description: {\n id: 'admin.permissions.permission.manage_shared_channels.description',\n defaultMessage: 'Share, unshare and invite another instance to sync with a shared channel',\n },\n }),\n manage_secure_connections: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_secure_connections.name',\n defaultMessage: 'Manage Secure Connections',\n },\n description: {\n id: 'admin.permissions.permission.manage_secure_connections.description',\n defaultMessage: 'Create, remove and view secure connections for shared channels',\n },\n }),\n playbook_public_create: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_public_create.name',\n defaultMessage: 'Create Public Playbook',\n },\n description: {\n id: 'admin.permissions.permission.playbook_public_create.description',\n defaultMessage: 'Create new public playbooks.',\n },\n }),\n playbook_public_manage_properties: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_public_manage_properties.name',\n defaultMessage: 'Manage Playbook Configurations',\n },\n description: {\n id: 'admin.permissions.permission.playbook_public_manage_properties.description',\n defaultMessage: 'Prescribe checklists, actions, and templates.',\n },\n }),\n playbook_public_manage_members: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_public_manage_members.name',\n defaultMessage: 'Manage Playbook Members',\n },\n description: {\n id: 'admin.permissions.permission.playbook_public_manage_members.description',\n defaultMessage: 'Add and remove public playbook members.',\n },\n }),\n playbook_public_make_private: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_public_make_private.name',\n defaultMessage: 'Convert Playbooks',\n },\n description: {\n id: 'admin.permissions.permission.playbook_public_make_private.description',\n defaultMessage: 'Convert public playbooks to private.',\n },\n }),\n playbook_private_create: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_private_create.name',\n defaultMessage: 'Create Private Playbook',\n },\n description: {\n id: 'admin.permissions.permission.playbook_private_create.description',\n defaultMessage: 'Create new private playbooks.',\n },\n }),\n playbook_private_manage_properties: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_private_manage_properties.name',\n defaultMessage: 'Manage Playbook Configurations',\n },\n description: {\n id: 'admin.permissions.permission.playbook_private_manage_properties.description',\n defaultMessage: 'Prescribe checklists, actions, and templates.',\n },\n }),\n playbook_private_manage_members: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_private_manage_members.name',\n defaultMessage: 'Manage Playbook Members',\n },\n description: {\n id: 'admin.permissions.permission.playbook_private_manage_members.description',\n defaultMessage: 'Add and remove private playbook members.',\n },\n }),\n playbook_private_make_public: defineMessages({\n name: {\n id: 'admin.permissions.permission.playbook_private_make_public.name',\n defaultMessage: 'Convert Playbooks',\n },\n description: {\n id: 'admin.permissions.permission.playbook_private_make_public.description',\n defaultMessage: 'Convert private playbooks to public.',\n },\n }),\n run_create: defineMessages({\n name: {\n id: 'admin.permissions.permission.run_create.name',\n defaultMessage: 'Create Runs',\n },\n description: {\n id: 'admin.permissions.permission.run_create.description',\n defaultMessage: 'Run playbooks.',\n },\n }),\n create_custom_group: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_custom_group.name',\n defaultMessage: 'Create',\n },\n description: {\n id: 'admin.permissions.permission.create_custom_group.description',\n defaultMessage: 'Create custom groups.',\n },\n }),\n manage_custom_group_members: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_custom_group_members.name',\n defaultMessage: 'Manage members',\n },\n description: {\n id: 'admin.permissions.permission.manage_custom_group_members.description',\n defaultMessage: 'Add and remove custom group members.',\n },\n }),\n delete_custom_group: defineMessages({\n name: {\n id: 'admin.permissions.permission.delete_custom_group.name',\n defaultMessage: 'Delete',\n },\n description: {\n id: 'admin.permissions.permission.delete_custom_group.description',\n defaultMessage: 'Delete custom groups.',\n },\n }),\n restore_custom_group: defineMessages({\n name: {\n id: 'admin.permissions.permission.restore_custom_group.name',\n defaultMessage: 'Restore',\n },\n description: {\n id: 'admin.permissions.permission.restore_custom_group.description',\n defaultMessage: 'Restore archived user groups.',\n },\n }),\n edit_custom_group: defineMessages({\n name: {\n id: 'admin.permissions.permission.edit_custom_group.name',\n defaultMessage: 'Edit',\n },\n description: {\n id: 'admin.permissions.permission.edit_custom_group.description',\n defaultMessage: 'Rename custom groups.',\n },\n }),\n manage_outgoing_oauth_connections: defineMessages({\n name: {\n id: 'admin.permissions.permission.manage_outgoing_oauth_connections.name',\n defaultMessage: 'Manage Outgoing OAuth Credentials',\n },\n description: {\n id: 'admin.permissions.permission.manage_outgoing_oauth_connections.description',\n defaultMessage: 'Create, edit, and delete outgoing OAuth credentials.',\n },\n }),\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\n\nimport PermissionCheckbox from './permission_checkbox';\nimport PermissionDescription from './permission_description';\nimport type {AdditionalValues} from './permissions_tree/types';\nimport {permissionRolesStrings} from './strings/permissions';\n\ntype Props = {\n id: string;\n uniqId: string;\n inherited?: Partial<Role>;\n readOnly?: boolean;\n selected?: string;\n selectRow: (id: string) => void;\n value: string;\n onChange: (id: string) => void;\n additionalValues: AdditionalValues;\n}\n\nconst PermissionRow = ({\n additionalValues,\n id,\n onChange,\n selectRow,\n uniqId,\n value,\n inherited,\n readOnly,\n selected,\n}: Props) => {\n const toggleSelect = useCallback(() => {\n if (readOnly) {\n return;\n }\n onChange(id);\n }, [readOnly, onChange, id]);\n\n const name = permissionRolesStrings[id] ? <FormattedMessage {...permissionRolesStrings[id].name}/> : id;\n let description: React.JSX.Element | string = '';\n if (permissionRolesStrings[id]) {\n description = (\n <FormattedMessage\n id={permissionRolesStrings[id].description.id}\n values={additionalValues}\n />\n );\n }\n\n return (\n <div\n className={classNames('permission-row', {'read-only': readOnly, selected: selected === id})}\n onClick={toggleSelect}\n id={uniqId}\n >\n <PermissionCheckbox\n value={value}\n id={`${uniqId}-checkbox`}\n />\n <span className='permission-name'>\n {name}\n </span>\n <PermissionDescription\n inherited={inherited}\n id={id}\n selectRow={selectRow}\n description={description}\n additionalValues={additionalValues}\n />\n </div>\n );\n};\n\nexport default PermissionRow;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessages} from 'react-intl';\n\nexport const groupRolesStrings: Record<string, Record<string, MessageDescriptor>> = {\n delete_posts: defineMessages({\n name: {\n id: 'admin.permissions.group.delete_posts.name',\n defaultMessage: 'Delete Posts',\n },\n description: {\n id: 'admin.permissions.group.delete_posts.description',\n defaultMessage: 'Delete own and others\\' posts.',\n },\n }),\n integrations: defineMessages({\n name: {\n id: 'admin.permissions.group.integrations.name',\n defaultMessage: 'Integrations & Customizations',\n },\n description: {\n id: 'admin.permissions.group.integrations.description',\n defaultMessage: 'Manage OAuth 2.0, slash commands, webhooks and emoji.',\n },\n }),\n posts: defineMessages({\n name: {\n id: 'admin.permissions.group.posts.name',\n defaultMessage: 'Manage Posts',\n },\n description: {\n id: 'admin.permissions.group.posts.description',\n defaultMessage: 'Write, edit and delete posts.',\n },\n }),\n create_post: defineMessages({\n name: {\n id: 'admin.permissions.permission.create_post.name',\n defaultMessage: 'Create Posts',\n },\n description: {\n id: 'admin.permissions.permission.create_post.description',\n defaultMessage: 'Allow users to create posts.',\n },\n }),\n private_channel: defineMessages({\n name: {\n id: 'admin.permissions.group.private_channel.name',\n defaultMessage: 'Manage Private Channels',\n },\n description: {\n id: 'admin.permissions.group.private_channel.description',\n defaultMessage: 'Create and archive channels, manage settings and members.',\n },\n }),\n public_channel: defineMessages({\n name: {\n id: 'admin.permissions.group.public_channel.name',\n defaultMessage: 'Manage Public Channels',\n },\n description: {\n id: 'admin.permissions.group.public_channel.description',\n defaultMessage: 'Join, create and archive channels, manage settings and members.',\n },\n }),\n reactions: defineMessages({\n name: {\n id: 'admin.permissions.group.reactions.name',\n defaultMessage: 'Post Reactions',\n },\n description: {\n id: 'admin.permissions.group.reactions.description',\n defaultMessage: 'Add and delete reactions on posts.',\n },\n }),\n send_invites: defineMessages({\n name: {\n id: 'admin.permissions.group.send_invites.name',\n defaultMessage: 'Add Team Members',\n },\n description: {\n id: 'admin.permissions.group.send_invites.description',\n defaultMessage: 'Add team members, send email invites and share team invite link.',\n },\n }),\n teams: defineMessages({\n name: {\n id: 'admin.permissions.group.teams.name',\n defaultMessage: 'Teams',\n },\n description: {\n id: 'admin.permissions.group.teams.description',\n defaultMessage: 'Create teams and manage members.',\n },\n }),\n edit_posts: defineMessages({\n name: {\n id: 'admin.permissions.group.edit_posts.name',\n defaultMessage: 'Edit Posts',\n },\n description: {\n id: 'admin.permissions.group.edit_posts.description',\n defaultMessage: 'Edit own and others\\' posts.',\n },\n }),\n teams_team_scope: defineMessages({\n name: {\n id: 'admin.permissions.group.teams_team_scope.name',\n defaultMessage: 'Teams',\n },\n description: {\n id: 'admin.permissions.group.teams_team_scope.description',\n defaultMessage: 'Manage team members.',\n },\n }),\n guest_reactions: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_reactions.name',\n defaultMessage: 'Post Reactions',\n },\n description: {\n id: 'admin.permissions.group.guest_reactions.description',\n defaultMessage: 'Add and delete reactions on posts.',\n },\n }),\n guest_create_post: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_create_post.name',\n defaultMessage: 'Create Posts',\n },\n description: {\n id: 'admin.permissions.group.guest_create_post.description',\n defaultMessage: 'Allow users to create posts.',\n },\n }),\n guest_create_private_channel: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_create_private_channel.name',\n defaultMessage: 'Create Channels',\n },\n description: {\n id: 'admin.permissions.group.guest_create_private_channel.description',\n defaultMessage: 'Create new private channels.',\n },\n }),\n guest_delete_post: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_delete_post.name',\n defaultMessage: 'Delete Own Posts',\n },\n description: {\n id: 'admin.permissions.group.guest_delete_post.description',\n defaultMessage: 'Author\\'s own posts can be deleted.',\n },\n }),\n guest_edit_post: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_edit_post.name',\n defaultMessage: 'Edit Own Posts',\n },\n description: {\n id: 'admin.permissions.group.guest_edit_post.description',\n defaultMessage: '{editTimeLimitButton} after posting, allow users to edit their own posts.',\n },\n }),\n guest_use_channel_mentions: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_use_channel_mentions.name',\n defaultMessage: 'Channel Mentions',\n },\n description: {\n id: 'admin.permissions.group.guest_use_channel_mentions.description',\n defaultMessage: 'Notify channel members with @all, @channel and @here',\n },\n }),\n guest_use_group_mentions: defineMessages({\n name: {\n id: 'admin.permissions.group.guest_use_group_mentions.name',\n defaultMessage: 'Group Mentions',\n },\n description: {\n id: 'admin.permissions.group.guest_use_group_mentions.description',\n defaultMessage: 'Notify group members with a group mention',\n },\n }),\n manage_private_channel_members_and_read_groups: defineMessages({\n name: {\n id: 'admin.permissions.group.manage_private_channel_members_and_read_groups.name',\n defaultMessage: 'Manage Channel Members',\n },\n description: {\n id: 'admin.permissions.group.manage_private_channel_members_and_read_groups.description',\n defaultMessage: 'Add and remove private channel members.',\n },\n }),\n manage_public_channel_members_and_read_groups: defineMessages({\n name: {\n id: 'admin.permissions.group.manage_public_channel_members_and_read_groups.name',\n defaultMessage: 'Manage Channel Members',\n },\n description: {\n id: 'admin.permissions.group.manage_public_channel_members_and_read_groups.description',\n defaultMessage: 'Add and remove public channel members.',\n },\n }),\n convert_public_channel_to_private: defineMessages({\n name: {\n id: 'admin.permissions.group.convert_public_channel_to_private.name',\n defaultMessage: 'Convert to private',\n },\n description: {\n id: 'admin.permissions.group.convert_public_channel_to_private.description',\n defaultMessage: 'Convert public channels to private',\n },\n }),\n convert_private_channel_to_public: defineMessages({\n name: {\n id: 'admin.permissions.group.convert_private_channel_to_public.name',\n defaultMessage: 'Convert to public',\n },\n description: {\n id: 'admin.permissions.group.convert_private_channel_to_public.description',\n defaultMessage: 'Convert private channels to public',\n },\n }),\n manage_shared_channels: defineMessages({\n name: {\n id: 'admin.permissions.group.manage_shared_channels.name',\n defaultMessage: 'Shared Channels',\n },\n description: {\n id: 'admin.permissions.group.manage_shared_channels.description',\n defaultMessage: 'Manage Shared Channels',\n },\n }),\n playbook_public: defineMessages({\n name: {\n id: 'admin.permissions.group.playbook_public.name',\n defaultMessage: 'Manage Public Playbooks',\n },\n description: {\n id: 'admin.permissions.group.playbook_public.description',\n defaultMessage: 'Manage public playbooks.',\n },\n }),\n playbook_private: defineMessages({\n name: {\n id: 'admin.permissions.group.playbook_private.name',\n defaultMessage: 'Manage Private Playbooks',\n },\n description: {\n id: 'admin.permissions.group.playbook_private.description',\n defaultMessage: 'Manage private playbooks.',\n },\n }),\n runs: defineMessages({\n name: {\n id: 'admin.permissions.group.runs.name',\n defaultMessage: 'Manage Runs',\n },\n description: {\n id: 'admin.permissions.group.runs.description',\n defaultMessage: 'Manage runs.',\n },\n }),\n custom_groups: defineMessages({\n name: {\n id: 'admin.permissions.group.custom_groups.name',\n defaultMessage: 'Custom Groups',\n },\n description: {\n id: 'admin.permissions.group.custom_groups.description',\n defaultMessage: 'Create, edit, delete and manage the members of custom groups.',\n },\n }),\n manage_public_channel_bookmarks: defineMessages({\n name: {\n id: 'admin.permissions.group.manage_public_channel_bookmarks.name',\n defaultMessage: 'Manage Bookmarks',\n },\n description: {\n id: 'admin.permissions.group.manage_public_channel_bookmarks.description',\n defaultMessage: 'Add, edit, delete and sort bookmarks',\n },\n }),\n manage_private_channel_bookmarks: defineMessages({\n name: {\n id: 'admin.permissions.group.manage_private_channel_bookmarks.name',\n defaultMessage: 'Manage Bookmarks',\n },\n description: {\n id: 'admin.permissions.group.manage_private_channel_bookmarks.description',\n defaultMessage: 'Add, edit, delete and sort bookmarks',\n },\n }),\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\n\nimport {PermissionsScope} from 'utils/constants';\n\nimport PermissionCheckbox from './permission_checkbox';\nimport PermissionDescription from './permission_description';\nimport PermissionRow from './permission_row';\nimport type {AdditionalValues, Permission, Permissions} from './permissions_tree/types';\nimport {groupRolesStrings} from './strings/groups';\n\ntype Props = {\n id: string;\n uniqId?: string;\n permissions: Permissions;\n onChange: (ids: string[]) => void;\n scope: string;\n readOnly?: boolean;\n role?: Partial<Role>;\n parentRole?: Partial<Role>;\n combined?: boolean;\n selected?: string;\n selectRow: (id: string) => void;\n root?: boolean;\n additionalValues?: AdditionalValues;\n};\n\ntype State = {\n expanded: boolean;\n prevPermissions: Permissions;\n selected: string | undefined;\n};\n\nconst getRecursivePermissions = (permissions: Permissions): string[] => {\n let result: string[] = [];\n for (const permission of permissions) {\n if (typeof permission === 'string') {\n result.push(permission);\n } else {\n result = result.concat(getRecursivePermissions(permission.permissions));\n }\n }\n return result;\n};\n\nexport default class PermissionGroup extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n expanded: true,\n prevPermissions: [],\n selected: props.selected,\n };\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.selected !== state.selected) {\n if (getRecursivePermissions(props.permissions).indexOf(props.selected ? props.selected : '') !== -1) {\n return {expanded: true, selected: props.selected};\n }\n return {selected: props.selected};\n }\n return null;\n }\n\n toggleExpanded = (e: MouseEvent) => {\n e.stopPropagation();\n this.setState({expanded: !this.state.expanded});\n };\n\n toggleSelectRow = (id: string) => {\n if (this.props.readOnly) {\n return;\n }\n this.props.onChange([id]);\n };\n\n toggleSelectSubGroup = (ids: string[]) => {\n if (this.props.readOnly) {\n return;\n }\n this.props.onChange(ids);\n };\n\n toggleSelectGroup = () => {\n const {readOnly, permissions, role, onChange} = this.props;\n if (readOnly || !role) {\n return;\n }\n if (this.getStatus(permissions) === 'checked') {\n const permissionsToToggle: string[] = [];\n for (const permission of getRecursivePermissions(permissions)) {\n if (!this.fromParent(permission)) {\n permissionsToToggle.push(permission);\n }\n }\n this.setState({expanded: true});\n onChange(permissionsToToggle);\n } else if (this.getStatus(permissions) === '') {\n const permissionsToToggle = [];\n let expanded = true;\n if (this.state.prevPermissions.length === 0) {\n for (const permission of getRecursivePermissions(permissions)) {\n if (!this.fromParent(permission)) {\n permissionsToToggle.push(permission);\n expanded = false;\n }\n }\n } else {\n for (const permission of getRecursivePermissions(permissions)) {\n if (this.state.prevPermissions.indexOf(permission) !== -1 && !this.fromParent(permission)) {\n permissionsToToggle.push(permission);\n }\n }\n }\n onChange(permissionsToToggle);\n this.setState({prevPermissions: [], expanded});\n } else {\n const permissionsToToggle = [];\n for (const permission of getRecursivePermissions(permissions)) {\n if (role.permissions?.indexOf(permission) === -1 && !this.fromParent(permission)) {\n permissionsToToggle.push(permission);\n }\n }\n this.setState({prevPermissions: role.permissions || [], expanded: false});\n onChange(permissionsToToggle);\n }\n };\n\n isInScope = (permission: string) => {\n if (this.props.scope === 'channel_scope' && PermissionsScope[permission] !== 'channel_scope') {\n return false;\n }\n if (this.props.scope === 'team_scope' && PermissionsScope[permission] === 'system_scope') {\n return false;\n }\n return true;\n };\n\n renderPermission = (permission: string, additionalValues: AdditionalValues) => {\n if (!this.isInScope(permission)) {\n return null;\n }\n const comesFromParent = this.fromParent(permission);\n const active = comesFromParent || this.props.role?.permissions?.indexOf(permission) !== -1;\n const inherited = comesFromParent ? this.props.parentRole : undefined;\n return (\n <PermissionRow\n key={permission}\n id={permission}\n uniqId={this.props.uniqId + '-' + permission}\n selected={this.props.selected}\n selectRow={this.props.selectRow}\n readOnly={this.props.readOnly || comesFromParent}\n inherited={inherited}\n value={active ? 'checked' : ''}\n onChange={this.toggleSelectRow}\n additionalValues={additionalValues}\n />\n );\n };\n\n renderGroup = (g: Permission) => {\n return (\n <PermissionGroup\n key={g.id}\n id={g.id}\n uniqId={this.props.uniqId + '-' + g.id}\n selected={this.props.selected}\n selectRow={this.props.selectRow}\n readOnly={this.props.readOnly}\n permissions={g.permissions}\n additionalValues={this.props.additionalValues}\n role={this.props.role}\n parentRole={this.props.parentRole}\n scope={this.props.scope}\n onChange={this.toggleSelectSubGroup}\n combined={g.combined}\n root={false}\n />\n );\n };\n\n fromParent = (id: string) => {\n return this.props.parentRole && this.props.parentRole.permissions?.indexOf(id) !== -1;\n };\n\n getStatus = (permissions: Permissions) => {\n let anyChecked = false;\n let anyUnchecked = false;\n for (const permission of permissions) {\n if (typeof permission === 'string') {\n if (!this.isInScope(permission)) {\n continue;\n }\n anyChecked = anyChecked || this.fromParent(permission) || this.props.role?.permissions?.indexOf(permission) !== -1;\n anyUnchecked = anyUnchecked || (!this.fromParent(permission) && this.props.role?.permissions?.indexOf(permission) === -1);\n } else {\n const status = this.getStatus(permission.permissions);\n if (status === 'intermediate') {\n return 'intermediate';\n }\n if (status === 'checked') {\n anyChecked = true;\n }\n if (status === '') {\n anyUnchecked = true;\n }\n }\n }\n if (anyChecked && anyUnchecked) {\n return 'intermediate';\n }\n if (anyChecked && !anyUnchecked) {\n return 'checked';\n }\n return '';\n };\n\n hasPermissionsOnScope = () => {\n return getRecursivePermissions(this.props.permissions).some((permission) => this.isInScope(permission));\n };\n\n allPermissionsFromParent = (permissions: Permissions) => {\n for (const permission of permissions) {\n if (typeof permission !== 'string') {\n if (!this.allPermissionsFromParent(permission.permissions)) {\n return false;\n }\n continue;\n }\n if (this.isInScope(permission) && !this.fromParent(permission)) {\n return false;\n }\n }\n return true;\n };\n\n render = () => {\n const {id, uniqId, permissions, readOnly, combined, root, selected, additionalValues} = this.props;\n if (!this.hasPermissionsOnScope()) {\n return null;\n }\n const permissionsRows = permissions.map((group) => {\n if (typeof group === 'string') {\n const addVals = additionalValues && additionalValues[group] ? additionalValues[group] : {};\n return this.renderPermission(group, addVals);\n }\n return this.renderGroup(group as Permission);\n });\n if (root) {\n return (\n <div className={'permission-group-permissions ' + (this.state.expanded ? 'open' : '')}>\n {permissionsRows}\n </div>\n );\n }\n\n let inherited;\n if (this.allPermissionsFromParent(this.props.permissions) && this.props.combined) {\n inherited = this.props.parentRole;\n }\n\n let classes = '';\n if (selected === id) {\n classes += ' selected';\n }\n\n if (readOnly || this.allPermissionsFromParent(this.props.permissions)) {\n classes += ' read-only';\n }\n\n if (combined) {\n classes += ' combined';\n }\n const additionalValuesProp = additionalValues?.[id] ? additionalValues[id] : undefined;\n const name = groupRolesStrings[id] ? <FormattedMessage {...groupRolesStrings[id].name}/> : id;\n let description: React.JSX.Element | string = '';\n if (groupRolesStrings[id]) {\n description = (\n <FormattedMessage\n id={groupRolesStrings[id].description.id}\n defaultMessage={groupRolesStrings[id].description.defaultMessage}\n values={additionalValuesProp}\n />\n );\n }\n\n return (\n <div className='permission-group'>\n {!root &&\n <div\n className={'permission-group-row ' + classes}\n onClick={this.toggleSelectGroup}\n id={uniqId}\n >\n {!combined &&\n <div\n className={'fa fa-caret-right permission-arrow ' + (this.state.expanded ? 'open' : '')}\n onClick={this.toggleExpanded}\n />}\n <PermissionCheckbox\n value={this.getStatus(this.props.permissions)}\n id={`${uniqId}-checkbox`}\n />\n <span className='permission-name'>\n {name}\n </span>\n <PermissionDescription\n additionalValues={additionalValuesProp}\n inherited={inherited}\n id={id}\n selectRow={this.props.selectRow}\n description={description}\n />\n </div>}\n {!combined &&\n <div className={'permission-group-permissions ' + (this.state.expanded ? 'open' : '')}>\n {permissionsRows}\n </div>}\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientLicense} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport EditPostTimeLimitButton from '../edit_post_time_limit_button';\nimport EditPostTimeLimitModal from '../edit_post_time_limit_modal';\nimport PermissionGroup from '../permission_group';\nimport type {Permissions as PermissionsType} from '../permissions_tree/types';\n\ntype Props = {\n license: ClientLicense;\n onToggle: (role: string, permissions: string[]) => void;\n readOnly: boolean;\n scope: string;\n selectRow: (permission: string) => void;\n parentRole?: Role;\n selected?: string;\n role?: Partial<Role>;\n}\n\nconst GuestPermissionsTree = ({license, onToggle, readOnly, scope, selectRow, parentRole, selected, role = {permissions: []}}: Props) => {\n const setPermissions = () => {\n const defaultPermissions = [\n Permissions.CREATE_PRIVATE_CHANNEL,\n Permissions.EDIT_POST,\n Permissions.DELETE_POST,\n {\n id: 'guest_' + Permissions.CREATE_POST,\n combined: true,\n permissions: [\n Permissions.CREATE_POST,\n Permissions.UPLOAD_FILE,\n ],\n },\n {\n id: 'guest_reactions',\n combined: true,\n permissions: [\n Permissions.ADD_REACTION,\n Permissions.REMOVE_REACTION,\n ],\n },\n Permissions.USE_CHANNEL_MENTIONS,\n ];\n if (license && license.IsLicensed === 'true' && license.LDAPGroups === 'true') {\n defaultPermissions.push(Permissions.USE_GROUP_MENTIONS);\n }\n return defaultPermissions.map((permission) => {\n if (typeof (permission) === 'string') {\n return {\n id: `guest_${permission}`,\n combined: true,\n permissions: [permission],\n };\n }\n return permission;\n });\n };\n\n const [editTimeLimitModalIsVisible, setEditTimeLimitModalIsVisible] = React.useState(false);\n const permissions = useMemo<PermissionsType>(setPermissions, [license]);\n\n const openPostTimeLimitModal = useCallback(() => {\n setEditTimeLimitModalIsVisible(true);\n }, []);\n const closePostTimeLimitModal = useCallback(() => {\n setEditTimeLimitModalIsVisible(false);\n }, []);\n const toggleGroup = useCallback((ids: string[]) => {\n if (readOnly) {\n return;\n }\n onToggle(role.name!, ids);\n }, [onToggle, readOnly, role.name]);\n\n const ADDITIONAL_VALUES = useMemo(() => {\n return {\n guest_edit_post: {\n editTimeLimitButton: (\n <EditPostTimeLimitButton\n onClick={openPostTimeLimitModal}\n isDisabled={readOnly}\n />\n ),\n },\n };\n }, [openPostTimeLimitModal, readOnly]);\n\n return (\n <div className='permissions-tree guest'>\n <div className='permissions-tree--header'>\n <div className='permission-name'>\n <FormattedMessage\n id='admin.permissions.permissionsTree.permission'\n defaultMessage='Permission'\n />\n </div>\n <div className='permission-description'>\n <FormattedMessage\n id='admin.permissions.permissionsTree.description'\n defaultMessage='Description'\n />\n </div>\n </div>\n <div className='permissions-tree--body'>\n <PermissionGroup\n key='all'\n id='all'\n uniqId={role.name}\n selected={selected}\n selectRow={selectRow}\n readOnly={readOnly}\n permissions={permissions}\n additionalValues={ADDITIONAL_VALUES}\n role={role}\n parentRole={parentRole}\n scope={scope}\n combined={false}\n onChange={toggleGroup}\n root={true}\n />\n </div>\n <EditPostTimeLimitModal\n onClose={closePostTimeLimitModal}\n show={editTimeLimitModalIsVisible}\n />\n </div>\n );\n};\n\nexport default GuestPermissionsTree;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport GuestPermissionsTree from './guest_permissions_tree';\n\nexport const GUEST_INCLUDED_PERMISSIONS = [\n Permissions.CREATE_PRIVATE_CHANNEL,\n Permissions.EDIT_POST,\n Permissions.DELETE_POST,\n Permissions.ADD_REACTION,\n Permissions.REMOVE_REACTION,\n Permissions.READ_CHANNEL,\n Permissions.UPLOAD_FILE,\n Permissions.USE_CHANNEL_MENTIONS,\n Permissions.USE_GROUP_MENTIONS,\n Permissions.CREATE_POST,\n];\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n return {license};\n}\n\nexport default connect(mapStateToProps)(GuestPermissionsTree);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientConfig, ClientLicense} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\n\nimport GeneralConstants from 'mattermost-redux/constants/general';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {isEnterpriseLicense, isNonEnterpriseLicense} from 'utils/license_utils';\n\nimport type {AdditionalValues, Group} from './types';\n\nimport EditPostTimeLimitButton from '../edit_post_time_limit_button';\nimport EditPostTimeLimitModal from '../edit_post_time_limit_modal';\nimport PermissionGroup from '../permission_group';\n\ntype Props = {\n scope: string;\n config: Partial<ClientConfig>;\n role: Partial<Role>;\n onToggle: (name: string, ids: string[]) => void;\n parentRole?: Partial<Role>;\n selected?: string;\n selectRow: (id: string) => void;\n readOnly?: boolean;\n license?: ClientLicense;\n customGroupsEnabled: boolean;\n}\n\ntype State = {\n editTimeLimitModalIsVisible: boolean;\n}\n\nexport default class PermissionsTree extends React.PureComponent<Props, State> {\n static defaultProps: Partial<Props> = {\n role: {\n permissions: [],\n },\n };\n\n private ADDITIONAL_VALUES: AdditionalValues;\n private groups: Group[];\n constructor(props: Props) {\n super(props);\n\n this.state = {\n editTimeLimitModalIsVisible: false,\n };\n\n this.ADDITIONAL_VALUES = {\n edit_post: {\n editTimeLimitButton: (\n <EditPostTimeLimitButton\n onClick={this.openPostTimeLimitModal}\n isDisabled={this.props.readOnly}\n />\n ),\n },\n };\n\n this.groups = [\n {\n id: 'teams',\n permissions: [\n {\n id: 'send_invites',\n combined: true,\n permissions: [\n Permissions.INVITE_USER,\n Permissions.GET_PUBLIC_LINK,\n Permissions.ADD_USER_TO_TEAM,\n ],\n },\n Permissions.CREATE_TEAM,\n ],\n },\n {\n id: 'public_channel',\n permissions: [\n Permissions.CREATE_PUBLIC_CHANNEL,\n Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES,\n {\n id: 'manage_public_channel_members_and_read_groups',\n combined: true,\n permissions: [\n Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS,\n Permissions.READ_PUBLIC_CHANNEL_GROUPS,\n ],\n },\n Permissions.DELETE_PUBLIC_CHANNEL,\n Permissions.CONVERT_PUBLIC_CHANNEL_TO_PRIVATE,\n ],\n },\n {\n id: 'private_channel',\n permissions: [\n Permissions.CREATE_PRIVATE_CHANNEL,\n Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES,\n {\n id: 'manage_private_channel_members_and_read_groups',\n combined: true,\n permissions: [\n Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS,\n Permissions.READ_PRIVATE_CHANNEL_GROUPS,\n ],\n },\n Permissions.DELETE_PRIVATE_CHANNEL,\n ],\n },\n {\n id: 'playbook_public',\n permissions: [\n Permissions.PLAYBOOK_PUBLIC_CREATE,\n Permissions.PLAYBOOK_PUBLIC_MANAGE_PROPERTIES,\n Permissions.PLAYBOOK_PUBLIC_MANAGE_MEMBERS,\n ],\n isVisible: isNonEnterpriseLicense,\n },\n {\n id: 'playbook_public',\n permissions: [\n Permissions.PLAYBOOK_PUBLIC_CREATE,\n Permissions.PLAYBOOK_PUBLIC_MANAGE_PROPERTIES,\n Permissions.PLAYBOOK_PUBLIC_MANAGE_MEMBERS,\n Permissions.PLAYBOOK_PUBLIC_MAKE_PRIVATE,\n ],\n isVisible: isEnterpriseLicense,\n },\n {\n id: 'playbook_private',\n permissions: [\n Permissions.PLAYBOOK_PRIVATE_CREATE,\n Permissions.PLAYBOOK_PRIVATE_MANAGE_PROPERTIES,\n Permissions.PLAYBOOK_PRIVATE_MANAGE_MEMBERS,\n Permissions.PLAYBOOK_PRIVATE_MAKE_PUBLIC,\n ],\n isVisible: isEnterpriseLicense,\n },\n {\n id: 'runs',\n permissions: [\n Permissions.RUN_CREATE,\n ],\n },\n {\n id: 'posts',\n permissions: [\n {\n id: 'edit_posts',\n permissions: [\n Permissions.EDIT_POST,\n Permissions.EDIT_OTHERS_POSTS,\n ],\n },\n {\n id: 'delete_posts',\n permissions: [\n Permissions.DELETE_POST,\n Permissions.DELETE_OTHERS_POSTS,\n ],\n },\n {\n id: 'reactions',\n combined: true,\n permissions: [\n Permissions.ADD_REACTION,\n Permissions.REMOVE_REACTION,\n ],\n },\n Permissions.USE_CHANNEL_MENTIONS,\n ],\n },\n {\n id: 'integrations',\n permissions: [\n ],\n },\n {\n id: 'manage_shared_channels',\n permissions: [\n ],\n },\n {\n id: 'custom_groups',\n permissions: [\n Permissions.CREATE_CUSTOM_GROUP,\n Permissions.MANAGE_CUSTOM_GROUP_MEMBERS,\n Permissions.EDIT_CUSTOM_GROUP,\n Permissions.DELETE_CUSTOM_GROUP,\n Permissions.RESTORE_CUSTOM_GROUP,\n ],\n },\n ];\n this.updateGroups();\n }\n\n updateGroups = () => {\n const {config, scope, license, role} = this.props;\n\n const teamsGroup = this.groups[0];\n const publicChannelsGroup = this.groups[1];\n const privateChannelsGroup = this.groups[2];\n const postsGroup = this.groups[7];\n const integrationsGroup = this.groups[8];\n const sharedChannelsGroup = this.groups[9];\n const customGroupsGroup = this.groups[10];\n\n if (config.EnableIncomingWebhooks === 'true' && !integrationsGroup.permissions.includes(Permissions.MANAGE_INCOMING_WEBHOOKS)) {\n integrationsGroup.permissions.push(Permissions.MANAGE_INCOMING_WEBHOOKS);\n }\n if (config.EnableOutgoingWebhooks === 'true' && !integrationsGroup.permissions.includes(Permissions.MANAGE_OUTGOING_WEBHOOKS)) {\n integrationsGroup.permissions.push(Permissions.MANAGE_OUTGOING_WEBHOOKS);\n }\n if (config.EnableOAuthServiceProvider === 'true' && !integrationsGroup.permissions.includes(Permissions.MANAGE_OAUTH)) {\n integrationsGroup.permissions.push(Permissions.MANAGE_OAUTH);\n }\n if (config.EnableOutgoingOAuthConnections === 'true' && !integrationsGroup.permissions.includes(Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS)) {\n integrationsGroup.permissions.push(Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS);\n }\n if (config.EnableCommands === 'true' && !integrationsGroup.permissions.includes(Permissions.MANAGE_SLASH_COMMANDS)) {\n integrationsGroup.permissions.push(Permissions.MANAGE_SLASH_COMMANDS);\n }\n if (config.EnableCustomEmoji === 'true' && !integrationsGroup.permissions.includes(Permissions.CREATE_EMOJIS)) {\n integrationsGroup.permissions.push(Permissions.CREATE_EMOJIS);\n }\n if (config.EnableCustomEmoji === 'true' && !integrationsGroup.permissions.includes(Permissions.DELETE_EMOJIS)) {\n integrationsGroup.permissions.push(Permissions.DELETE_EMOJIS);\n }\n if (config.EnableCustomEmoji === 'true' && !integrationsGroup.permissions.includes(Permissions.DELETE_OTHERS_EMOJIS)) {\n integrationsGroup.permissions.push(Permissions.DELETE_OTHERS_EMOJIS);\n }\n\n if (config.EnableGuestAccounts === 'true' && !teamsGroup.permissions.includes(Permissions.INVITE_GUEST)) {\n teamsGroup.permissions.push(Permissions.INVITE_GUEST);\n }\n if (scope === 'team_scope' && this.groups[0].id !== 'teams_team_scope') {\n this.groups[0].id = 'teams_team_scope';\n }\n if (license?.IsLicensed === 'true' && license?.LDAPGroups === 'true' && !postsGroup.permissions.includes(Permissions.USE_GROUP_MENTIONS)) {\n postsGroup.permissions.push(Permissions.USE_GROUP_MENTIONS);\n }\n postsGroup.permissions.push({\n id: Permissions.CREATE_POST,\n combined: true,\n permissions: [\n Permissions.CREATE_POST,\n Permissions.UPLOAD_FILE,\n ],\n });\n if (config.ExperimentalSharedChannels === 'true') {\n sharedChannelsGroup.permissions.push(Permissions.MANAGE_SHARED_CHANNELS);\n sharedChannelsGroup.permissions.push(Permissions.MANAGE_SECURE_CONNECTIONS);\n }\n if (!this.props.customGroupsEnabled) {\n customGroupsGroup?.permissions.pop();\n }\n\n if ([GeneralConstants.TEAM_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE].includes(role.name || '')) {\n privateChannelsGroup.permissions.push(Permissions.CONVERT_PRIVATE_CHANNEL_TO_PUBLIC);\n }\n\n if (license?.IsLicensed === 'true') {\n publicChannelsGroup.permissions.push({\n id: 'manage_public_channel_bookmarks',\n combined: true,\n permissions: [\n Permissions.ADD_BOOKMARK_PUBLIC_CHANNEL,\n Permissions.EDIT_BOOKMARK_PUBLIC_CHANNEL,\n Permissions.DELETE_BOOKMARK_PUBLIC_CHANNEL,\n Permissions.ORDER_BOOKMARK_PUBLIC_CHANNEL,\n ],\n });\n privateChannelsGroup.permissions.push({\n id: 'manage_private_channel_bookmarks',\n combined: true,\n permissions: [\n Permissions.ADD_BOOKMARK_PRIVATE_CHANNEL,\n Permissions.EDIT_BOOKMARK_PRIVATE_CHANNEL,\n Permissions.DELETE_BOOKMARK_PRIVATE_CHANNEL,\n Permissions.ORDER_BOOKMARK_PRIVATE_CHANNEL,\n ],\n });\n }\n\n this.groups = this.groups.filter((group) => {\n if (group.isVisible) {\n return group.isVisible(this.props.license);\n }\n\n return true;\n });\n };\n\n openPostTimeLimitModal = () => {\n this.setState({editTimeLimitModalIsVisible: true});\n };\n\n closePostTimeLimitModal = () => {\n this.setState({editTimeLimitModalIsVisible: false});\n };\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.config !== prevProps.config || this.props.license !== prevProps.license) {\n this.updateGroups();\n }\n }\n\n toggleGroup = (ids: string[]) => {\n if (this.props.readOnly) {\n return;\n }\n this.props.onToggle(this.props.role.name!, ids);\n };\n\n render = () => {\n return (\n <div className='permissions-tree'>\n <div className='permissions-tree--header'>\n <div className='permission-name'>\n <FormattedMessage\n id='admin.permissions.permissionsTree.permission'\n defaultMessage='Permission'\n />\n </div>\n <div className='permission-description'>\n <FormattedMessage\n id='admin.permissions.permissionsTree.description'\n defaultMessage='Description'\n />\n </div>\n </div>\n <div className='permissions-tree--body'>\n <PermissionGroup\n key='all'\n id='all'\n uniqId={this.props.role.name}\n selected={this.props.selected}\n selectRow={this.props.selectRow}\n readOnly={this.props.readOnly}\n permissions={this.groups}\n additionalValues={this.ADDITIONAL_VALUES}\n role={this.props.role}\n parentRole={this.props.parentRole}\n scope={this.props.scope}\n combined={false}\n onChange={this.toggleGroup}\n root={true}\n />\n </div>\n <EditPostTimeLimitModal\n onClose={this.closePostTimeLimitModal}\n show={this.state.editTimeLimitModalIsVisible}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport type {GlobalState} from 'types/store';\n\nimport PermissionsTree from './permissions_tree';\n\nexport const EXCLUDED_PERMISSIONS = [\n Permissions.VIEW_MEMBERS,\n Permissions.JOIN_PUBLIC_TEAMS,\n Permissions.LIST_PUBLIC_TEAMS,\n Permissions.JOIN_PRIVATE_TEAMS,\n Permissions.LIST_PRIVATE_TEAMS,\n Permissions.PLAYBOOK_PUBLIC_VIEW,\n Permissions.PLAYBOOK_PRIVATE_VIEW,\n];\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const license = getLicense(state);\n const customGroupsEnabled = isCustomGroupsEnabled(state);\n\n return {\n config,\n license,\n customGroupsEnabled,\n };\n}\n\nexport default connect(mapStateToProps)(PermissionsTree);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientLicense} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {isEnterpriseLicense, isNonEnterpriseLicense} from 'utils/license_utils';\n\nimport PermissionGroup from './permission_group';\n\ninterface Props {\n role?: Partial<Role>;\n parentRole: any;\n scope: string;\n selectRow: any;\n readOnly: boolean;\n onToggle: (a: string, b: string[]) => void;\n license: ClientLicense;\n}\n\nconst groups = [\n {\n id: 'playbook_public',\n permissions: [\n Permissions.PLAYBOOK_PUBLIC_MANAGE_PROPERTIES,\n Permissions.PLAYBOOK_PUBLIC_MANAGE_MEMBERS,\n ],\n isVisible: isNonEnterpriseLicense,\n },\n {\n id: 'playbook_public',\n permissions: [\n Permissions.PLAYBOOK_PUBLIC_MANAGE_PROPERTIES,\n Permissions.PLAYBOOK_PUBLIC_MANAGE_MEMBERS,\n Permissions.PLAYBOOK_PUBLIC_MAKE_PRIVATE,\n ],\n isVisible: isEnterpriseLicense,\n },\n {\n id: 'playbook_private',\n permissions: [\n Permissions.PLAYBOOK_PRIVATE_MANAGE_PROPERTIES,\n Permissions.PLAYBOOK_PRIVATE_MANAGE_MEMBERS,\n Permissions.PLAYBOOK_PRIVATE_MAKE_PUBLIC,\n ],\n isVisible: isEnterpriseLicense,\n },\n {\n id: 'runs',\n permissions: [\n Permissions.RUN_CREATE,\n ],\n },\n];\n\nconst PermissionsTreePlaybooks = (props: Props) => {\n const toggleGroup = (ids: string[]) => {\n if (props.readOnly) {\n return;\n }\n props.onToggle(props.role?.name || '', ids);\n };\n\n const filteredGroups = groups.filter((group) => {\n if (group.isVisible) {\n return group.isVisible(props.license);\n }\n\n return true;\n });\n\n return (\n <div className='permissions-tree'>\n <div className='permissions-tree--header'>\n <div className='permission-name'>\n <FormattedMessage\n id='admin.permissions.permissionsTree.permission'\n defaultMessage='Permission'\n />\n </div>\n <div className='permission-description'>\n <FormattedMessage\n id='admin.permissions.permissionsTree.description'\n defaultMessage='Description'\n />\n </div>\n </div>\n <div className='permissions-tree--body'>\n <PermissionGroup\n key='all'\n id='all'\n parentRole={props.parentRole}\n uniqId={props.role?.name}\n selectRow={props.selectRow}\n readOnly={props.readOnly}\n permissions={filteredGroups}\n role={props.role}\n scope={props.scope}\n combined={false}\n onChange={toggleGroup}\n root={true}\n />\n </div>\n </div>\n );\n};\n\nexport default PermissionsTreePlaybooks;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessage, injectIntl} from 'react-intl';\n\nimport type {ClientConfig, ClientLicense} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\n\nimport GeneralConstants from 'mattermost-redux/constants/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport ConfirmModal from 'components/confirm_modal';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport LoadingScreen from 'components/loading_screen';\nimport SaveButton from 'components/save_button';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanelTogglable from 'components/widgets/admin_console/admin_panel_togglable';\n\nimport {PermissionsScope, DefaultRolePermissions, DocLinks, ModeratedPermissions} from 'utils/constants';\n\nimport GuestPermissionsTree, {GUEST_INCLUDED_PERMISSIONS} from '../guest_permissions_tree';\nimport PermissionsTree, {EXCLUDED_PERMISSIONS} from '../permissions_tree';\nimport PermissionsTreePlaybooks from '../permissions_tree_playbooks';\n\ntype Props = {\n config: Partial<ClientConfig>;\n roles: Record<string, Role>;\n license: ClientLicense;\n isDisabled?: boolean;\n actions: {\n loadRolesIfNeeded: (roles: string[]) => void;\n editRole: (role: Partial<Role> & {id: string}) => Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => void;\n };\n location: Location;\n} & WrappedComponentProps;\n\ntype State = {\n showResetDefaultModal: boolean;\n loaded: boolean;\n saving: boolean;\n saveNeeded: boolean;\n serverError: null;\n roles: RolesState;\n selectedPermission?: string;\n openRoles: Record<string, boolean>;\n urlParams: URLSearchParams;\n}\n\ntype RolesState = {\n system_admin: Role;\n team_admin: Role;\n channel_admin: Role;\n playbook_admin: Role;\n playbook_member: Role;\n run_admin: Role;\n run_member: Role;\n all_users: {name: string; display_name: string; permissions: Role['permissions']};\n guests: {name: string; display_name: string; permissions: Role['permissions']};\n}\nclass PermissionSystemSchemeSettings extends React.PureComponent<Props, State> {\n private rolesNeeded: string[];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n showResetDefaultModal: false,\n loaded: false,\n saving: false,\n saveNeeded: false,\n serverError: null,\n roles: {} as RolesState,\n openRoles: {\n guests: true,\n all_users: true,\n system_admin: true,\n team_admin: true,\n channel_admin: true,\n playbook_member: true,\n playbook_admin: true,\n run_member: true,\n run_admin: true,\n },\n urlParams: new URLSearchParams(props.location.search),\n };\n this.rolesNeeded = [\n GeneralConstants.SYSTEM_ADMIN_ROLE,\n GeneralConstants.SYSTEM_USER_ROLE,\n GeneralConstants.TEAM_ADMIN_ROLE,\n GeneralConstants.TEAM_USER_ROLE,\n GeneralConstants.CHANNEL_ADMIN_ROLE,\n GeneralConstants.CHANNEL_USER_ROLE,\n GeneralConstants.PLAYBOOK_ADMIN_ROLE,\n GeneralConstants.PLAYBOOK_MEMBER_ROLE,\n GeneralConstants.RUN_ADMIN_ROLE,\n GeneralConstants.RUN_MEMBER_ROLE,\n GeneralConstants.SYSTEM_GUEST_ROLE,\n GeneralConstants.TEAM_GUEST_ROLE,\n GeneralConstants.CHANNEL_GUEST_ROLE,\n ];\n }\n\n componentDidMount() {\n this.props.actions.loadRolesIfNeeded(this.rolesNeeded);\n if (this.rolesNeeded.every((roleName) => this.props.roles[roleName])) {\n this.loadRolesIntoState(this.props);\n }\n\n if (this.state.urlParams.get('rowIdFromQuery')) {\n setTimeout(() => {\n this.selectRow(this.state.urlParams.get('rowIdFromQuery')!);\n }, 1000);\n }\n }\n\n UNSAFE_componentWillReceiveProps(nextProps: Props) {\n if (!this.state.loaded && this.rolesNeeded.every((roleName) => nextProps.roles[roleName])) {\n this.loadRolesIntoState(nextProps);\n }\n }\n\n goToSelectedRow = () => {\n const selected = document.querySelector('.permission-row.selected,.permission-group-row.selected');\n if (selected) {\n if (this.state.openRoles.all_users) {\n selected.scrollIntoView({behavior: 'smooth', block: 'center'});\n } else {\n this.toggleRole('all_users');\n\n // Give it time to open and show everything\n setTimeout(() => {\n selected.scrollIntoView({behavior: 'smooth', block: 'center'});\n }, 300);\n }\n return true;\n }\n return false;\n };\n\n selectRow = (permission: string) => {\n this.setState({selectedPermission: permission});\n\n // Wait until next render\n setTimeout(this.goToSelectedRow);\n\n // Remove selection after animation\n setTimeout(() => {\n this.setState({selectedPermission: undefined});\n }, 3000);\n };\n\n loadRolesIntoState(props: Props) {\n this.setState({\n loaded: true,\n roles: {\n system_admin: props.roles.system_admin,\n team_admin: props.roles.team_admin,\n channel_admin: props.roles.channel_admin,\n playbook_admin: props.roles.playbook_admin,\n playbook_member: props.roles.playbook_member,\n run_admin: props.roles.run_admin,\n run_member: props.roles.run_member,\n all_users: {\n name: 'all_users',\n display_name: 'All members',\n permissions: props.roles.system_user.permissions?.\n concat(props.roles.team_user.permissions).\n concat(props.roles.channel_user.permissions).\n concat(props.roles.playbook_member.permissions).\n concat(props.roles.run_member.permissions),\n },\n guests: {\n name: 'guests',\n display_name: 'Guests',\n permissions: props.roles.system_guest.permissions?.\n concat(props.roles.team_guest.permissions).\n concat(props.roles.channel_guest.permissions),\n },\n },\n });\n }\n\n deriveRolesFromAllUsers = (role: RolesState['all_users']): Record<string, Role> => {\n return {\n system_user: {\n ...this.props.roles.system_user,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'system_scope'),\n },\n team_user: {\n ...this.props.roles.team_user,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'team_scope'),\n },\n channel_user: {\n ...this.props.roles.channel_user,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'channel_scope'),\n },\n playbook_member: {\n ...this.props.roles.playbook_member,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'playbook_scope'),\n },\n run_member: {\n ...this.props.roles.run_member,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'run_scope'),\n },\n };\n };\n\n deriveRolesFromGuests = (role: RolesState['guests']): Record<string, Role> => {\n return {\n system_guest: {\n ...this.props.roles.system_guest,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'system_scope'),\n },\n team_guest: {\n ...this.props.roles.team_guest,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'team_scope'),\n },\n channel_guest: {\n ...this.props.roles.channel_guest,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'channel_scope'),\n },\n };\n };\n\n restoreExcludedPermissions = (roles: Record<string, Role>) => {\n for (const permission of this.props.roles.system_user.permissions) {\n if (EXCLUDED_PERMISSIONS.includes(permission)) {\n roles.system_user.permissions?.push(permission);\n }\n }\n for (const permission of this.props.roles.team_user.permissions) {\n if (EXCLUDED_PERMISSIONS.includes(permission)) {\n roles.team_user.permissions?.push(permission);\n }\n }\n for (const permission of this.props.roles.channel_user.permissions) {\n if (EXCLUDED_PERMISSIONS.includes(permission)) {\n roles.channel_user.permissions?.push(permission);\n }\n }\n for (const permission of this.props.roles.playbook_member.permissions) {\n if (EXCLUDED_PERMISSIONS.includes(permission)) {\n roles.playbook_member.permissions?.push(permission);\n }\n }\n return roles;\n };\n\n restoreGuestPermissions = (roles: Record<string, Role>) => {\n for (const permission of this.props.roles.system_guest.permissions) {\n if (!GUEST_INCLUDED_PERMISSIONS.includes(permission)) {\n roles.system_guest.permissions?.push(permission);\n }\n }\n for (const permission of this.props.roles.team_guest.permissions) {\n if (!GUEST_INCLUDED_PERMISSIONS.includes(permission)) {\n roles.team_guest.permissions?.push(permission);\n }\n }\n for (const permission of this.props.roles.channel_guest.permissions) {\n if (!GUEST_INCLUDED_PERMISSIONS.includes(permission)) {\n roles.channel_guest.permissions?.push(permission);\n }\n }\n return roles;\n };\n\n handleSubmit = async () => {\n const teamAdminPromise = this.props.actions.editRole(this.state.roles.team_admin);\n const channelAdminPromise = this.props.actions.editRole(this.state.roles.channel_admin);\n const playbookAdminPromise = this.props.actions.editRole(this.state.roles.playbook_admin);\n\n const derivedRoles = this.restoreExcludedPermissions(this.deriveRolesFromAllUsers(this.state.roles.all_users));\n const systemUserPromise = this.props.actions.editRole(derivedRoles.system_user);\n const teamUserPromise = this.props.actions.editRole(derivedRoles.team_user);\n const channelUserPromise = this.props.actions.editRole(derivedRoles.channel_user);\n const playbookMemberPromise = this.props.actions.editRole(derivedRoles.playbook_member);\n const runMemberPromise = this.props.actions.editRole(derivedRoles.run_member);\n\n const promises = [\n teamAdminPromise,\n channelAdminPromise,\n systemUserPromise,\n teamUserPromise,\n channelUserPromise,\n playbookAdminPromise,\n playbookMemberPromise,\n runMemberPromise,\n ];\n\n if (this.haveGuestAccountsPermissions()) {\n const guestRoles = this.restoreGuestPermissions(this.deriveRolesFromGuests(this.state.roles.guests));\n const systemGuestPromise = this.props.actions.editRole(guestRoles.system_guest);\n const teamGuestPromise = this.props.actions.editRole(guestRoles.team_guest);\n const channelGuestPromise = this.props.actions.editRole(guestRoles.channel_guest);\n promises.push(systemGuestPromise, teamGuestPromise, channelGuestPromise);\n }\n\n this.setState({saving: true});\n\n const results = await Promise.all(promises);\n let serverError = null;\n let saveNeeded = false;\n for (const result of results) {\n if (result.error) {\n serverError = result.error.message;\n saveNeeded = true;\n break;\n }\n }\n\n this.setState({serverError, saving: false, saveNeeded});\n this.props.actions.setNavigationBlocked(saveNeeded);\n };\n\n toggleRole = (roleId: string) => {\n const newOpenRoles = {...this.state.openRoles};\n newOpenRoles[roleId] = !newOpenRoles[roleId];\n this.setState({openRoles: newOpenRoles});\n };\n\n togglePermission = (roleId: string, permissions: Iterable<string>) => {\n const roles = {...this.state.roles};\n const role = {...roles[roleId as keyof RolesState]} as Role;\n const newPermissions = [...role.permissions!];\n for (const permission of permissions) {\n if (newPermissions.indexOf(permission) === -1) {\n newPermissions.push(permission);\n } else {\n newPermissions.splice(newPermissions.indexOf(permission), 1);\n }\n }\n role.permissions = newPermissions;\n roles[roleId as keyof RolesState] = role;\n\n if (roleId === 'all_users') {\n const channelAdminRole = {...roles.channel_admin} as Role;\n const channelAdminPermissions = [...channelAdminRole.permissions!];\n const teamAdminRole = {...roles.team_admin} as Role;\n const teamAdminPermissions = [...teamAdminRole.permissions!];\n for (const permission of permissions) {\n if (ModeratedPermissions.indexOf(permission) !== -1 && role.permissions.indexOf(permission) !== -1) {\n if (channelAdminPermissions.indexOf(permission) === -1) {\n channelAdminPermissions.push(permission);\n }\n if (teamAdminPermissions.indexOf(permission) === -1) {\n teamAdminPermissions.push(permission);\n }\n }\n }\n channelAdminRole.permissions = channelAdminPermissions;\n roles.channel_admin = channelAdminRole;\n teamAdminRole.permissions = teamAdminPermissions;\n roles.team_admin = teamAdminRole;\n }\n\n this.setState({roles, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n resetDefaults = () => {\n const newRolesState = JSON.parse(JSON.stringify({...this.state.roles}));\n\n Object.entries(DefaultRolePermissions).forEach(([roleName, permissions]) => {\n newRolesState[roleName].permissions = permissions;\n });\n\n this.setState({roles: newRolesState, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n haveGuestAccountsPermissions = () => {\n return this.props.license.GuestAccountsPermissions === 'true';\n };\n\n render = () => {\n if (!this.state.loaded) {\n return <LoadingScreen/>;\n }\n const isLicensed = this.props.license?.IsLicensed === 'true';\n return (\n <div className='wrapper--fixed'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/permissions'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.permissions.systemScheme'\n defaultMessage='System Scheme'\n />\n </div>\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className={'banner info'}>\n <div className='banner__content'>\n <span>\n <FormattedMessage\n id='admin.permissions.systemScheme.introBanner'\n defaultMessage='Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a <link>Team Override Scheme</link>is applied in specific teams.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='permission_system_scheme_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </span>\n </div>\n </div>\n\n {isLicensed && this.props.config.EnableGuestAccounts === 'true' &&\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.guests}\n id='all_users'\n onToggle={() => this.toggleRole('guests')}\n title={defineMessage({id: 'admin.permissions.systemScheme.GuestsTitle', defaultMessage: 'Guests'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.GuestsDescription', defaultMessage: 'Permissions granted to guest users.'})}\n >\n <GuestPermissionsTree\n selected={this.state.selectedPermission}\n role={this.state.roles.guests}\n scope={'system_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled || !this.haveGuestAccountsPermissions()}\n />\n </AdminPanelTogglable>}\n\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.all_users}\n id='all_users'\n onToggle={() => this.toggleRole('all_users')}\n title={defineMessage({id: 'admin.permissions.systemScheme.allMembersTitle', defaultMessage: 'All Members'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.allMembersDescription', defaultMessage: 'Permissions granted to all members, including administrators and newly created users.'})}\n >\n <PermissionsTree\n selected={this.state.selectedPermission}\n role={this.state.roles.all_users}\n scope={'system_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.channel_admin}\n onToggle={() => this.toggleRole('channel_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.channelAdminsTitle', defaultMessage: 'Channel Administrators'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.channelAdminsDescription', defaultMessage: 'Permissions granted to channel creators and any users promoted to Channel Administrator.'})}\n >\n <PermissionsTree\n parentRole={this.state.roles.all_users}\n role={this.state.roles.channel_admin}\n scope={'channel_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.playbook_admin}\n onToggle={() => this.toggleRole('playbook_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.playbookAdmin', defaultMessage: 'Playbook Administrator'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.playbookAdminSubtitle', defaultMessage: 'Permissions granted to administrators of a playbook.'})}\n >\n <PermissionsTreePlaybooks\n role={this.state.roles.playbook_admin}\n parentRole={this.state.roles.all_users}\n scope={'playbook_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled || false}\n license={this.props.license}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.team_admin}\n onToggle={() => this.toggleRole('team_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.teamAdminsTitle', defaultMessage: 'Team Administrators'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.teamAdminsDescription', defaultMessage: 'Permissions granted to team creators and any users promoted to Team Administrator.'})}\n >\n <PermissionsTree\n parentRole={this.state.roles.all_users}\n role={this.state.roles.team_admin}\n scope={'team_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.system_admin}\n onToggle={() => this.toggleRole('system_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.systemAdminsTitle', defaultMessage: 'System Administrators'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.systemAdminsDescription', defaultMessage: 'Full permissions granted to System Administrators.'})}\n >\n <PermissionsTree\n readOnly={true}\n role={this.state.roles.system_admin}\n scope={'system_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n />\n </AdminPanelTogglable>\n </div>\n </div>\n\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.saving}\n disabled={this.props.isDisabled || !this.state.saveNeeded}\n onClick={this.handleSubmit}\n savingMessage={this.props.intl.formatMessage({id: 'admin.saving', defaultMessage: 'Saving Config...'})}\n />\n <BlockableLink\n className='btn btn-tertiary'\n to='/admin_console/user_management/permissions'\n >\n <FormattedMessage\n id='admin.permissions.permissionSchemes.cancel'\n defaultMessage='Cancel'\n />\n </BlockableLink>\n <a\n data-testid='resetPermissionsToDefault'\n onClick={() => this.setState({showResetDefaultModal: true})}\n className='btn btn-quaternary'\n >\n <FormattedMessage\n id='admin.permissions.systemScheme.resetDefaultsButton'\n defaultMessage='Reset to Defaults'\n />\n </a>\n <div className='error-message'>\n <FormError error={this.state.serverError}/>\n </div>\n </div>\n\n <ConfirmModal\n show={this.state.showResetDefaultModal}\n title={\n <FormattedMessage\n id='admin.permissions.systemScheme.resetDefaultsButtonModalTitle'\n defaultMessage='Reset to Default?'\n />\n }\n message={\n <FormattedMessage\n id='admin.permissions.systemScheme.resetDefaultsButtonModalBody'\n defaultMessage='This will reset all selections on this page to their default settings. Are you sure you want to reset?'\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='admin.permissions.systemScheme.resetDefaultsConfirmationButton'\n defaultMessage='Yes, Reset'\n />\n }\n onConfirm={() => {\n this.resetDefaults();\n this.setState({showResetDefaultModal: false});\n }}\n onCancel={() => this.setState({showResetDefaultModal: false})}\n />\n </div>\n );\n };\n}\n\nexport default injectIntl(PermissionSystemSchemeSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {loadRolesIfNeeded, editRole} from 'mattermost-redux/actions/roles';\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles';\n\nimport {setNavigationBlocked} from 'actions/admin_actions.jsx';\n\nimport PermissionSystemSchemeSettings from './permission_system_scheme_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n config: getConfig(state),\n license: getLicense(state),\n roles: getRoles(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadRolesIfNeeded,\n editRole,\n setNavigationBlocked,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PermissionSystemSchemeSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport AdminPanel from './admin_panel';\n\ntype Props = {\n children?: React.ReactNode;\n className: string;\n id?: string;\n title: MessageDescriptor;\n subtitle: MessageDescriptor;\n onButtonClick?: React.EventHandler<React.MouseEvent>;\n disabled?: boolean;\n buttonText?: MessageDescriptor;\n}\n\nconst AdminPanelWithButton = ({\n className,\n subtitle,\n title,\n buttonText,\n children,\n disabled,\n id,\n onButtonClick,\n}: Props) => {\n let button;\n if (onButtonClick && buttonText) {\n const buttonId = (buttonText.defaultMessage as string || '').split(' ').join('-').toLowerCase();\n button = (\n <a\n className={classNames('btn', 'btn-primary', {disabled})}\n onClick={disabled ? (e) => e.preventDefault() : onButtonClick}\n data-testid={buttonId}\n >\n <FormattedMessage\n {...buttonText}\n />\n </a>\n );\n }\n\n return (\n <AdminPanel\n className={'AdminPanelWithButton ' + className}\n id={id}\n title={title}\n subtitle={subtitle}\n button={button}\n >\n {children}\n </AdminPanel>\n );\n};\n\nAdminPanelWithButton.defaultProps = {\n className: '',\n};\n\nexport default AdminPanelWithButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport TeamIcon from 'components/widgets/team_icon/team_icon';\n\nimport {imageURLForTeam} from 'utils/utils';\n\ntype Props = {\n team: Team;\n onRemoveTeam: (teamId: string) => void;\n isDisabled: boolean;\n}\n\nconst TeamInList = ({\n team,\n isDisabled,\n onRemoveTeam,\n}: Props) => {\n const handleRemoveTeam = useCallback(() => {\n if (isDisabled) {\n return;\n }\n onRemoveTeam(team.id);\n }, [isDisabled, team.id, onRemoveTeam]);\n\n return (\n <div\n className='team'\n key={team.id}\n >\n <div className='team-info-block'>\n <TeamIcon\n content={team.display_name}\n url={imageURLForTeam(team)}\n />\n <div className='team-data'>\n <div className='title'>{team.display_name}</div>\n </div>\n </div>\n <a\n className={classNames('remove', {disabled: isDisabled})}\n onClick={handleRemoveTeam}\n >\n <FormattedMessage\n id='admin.permissions.teamScheme.removeTeam'\n defaultMessage='Remove'\n />\n </a>\n </div>\n );\n};\n\nexport default memo(TeamInList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getTeamStats as loadTeamStats} from 'mattermost-redux/actions/teams';\nimport {getTeamStats} from 'mattermost-redux/selectors/entities/teams';\n\nimport TeamInList from './team_in_list';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n stats: getTeamStats(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadTeamStats,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamInList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport type {ClientConfig, ClientLicense} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\nimport type {Scheme, SchemePatch} from '@mattermost/types/schemes';\nimport type {Team} from '@mattermost/types/teams';\n\nimport GeneralConstants from 'mattermost-redux/constants/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport LoadingScreen from 'components/loading_screen';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport LocalizedPlaceholderTextarea from 'components/localized_placeholder_textarea';\nimport SaveButton from 'components/save_button';\nimport TeamSelectorModal from 'components/team_selector_modal';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\nimport AdminPanelTogglable from 'components/widgets/admin_console/admin_panel_togglable';\nimport AdminPanelWithButton from 'components/widgets/admin_console/admin_panel_with_button';\n\nimport {PermissionsScope, ModalIdentifiers, DocLinks, ModeratedPermissions} from 'utils/constants';\n\nimport TeamInList from './team_in_list';\n\nimport GuestPermissionsTree, {GUEST_INCLUDED_PERMISSIONS} from '../guest_permissions_tree';\nimport PermissionsTree, {EXCLUDED_PERMISSIONS} from '../permissions_tree';\nimport PermissionsTreePlaybooks from '../permissions_tree_playbooks';\n\ntype RolesMap = {\n [x: string]: Role;\n};\n\nexport type Props = {\n schemeId: string;\n scheme: Scheme | null;\n roles: RolesMap;\n license: ClientLicense;\n teams: Team[] | null;\n isDisabled: boolean;\n config: Partial<ClientConfig>;\n actions: {\n loadRolesIfNeeded: (roles: Iterable<string>) => Promise<ActionResult>;\n loadScheme: (schemeId: string) => Promise<ActionResult>;\n loadSchemeTeams: (schemeId: string, page?: number, perPage?: number) => Promise<ActionResult>;\n editRole: (role: Role) => Promise<ActionResult>;\n patchScheme: (schemeId: string, scheme: SchemePatch) => Promise<ActionResult>;\n updateTeamScheme: (teamId: string, schemeId: string) => Promise<ActionResult>;\n createScheme: (scheme: Scheme) => Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => void;\n };\n} & WrappedComponentProps;\n\ntype State = {\n saving: boolean;\n saveNeeded: boolean;\n serverError: string | null;\n roles: {\n [x: string]: Role;\n } | null;\n teams: Team[] | null;\n addTeamOpen: boolean;\n selectedPermission: string | undefined;\n openRoles: {\n all_users: boolean;\n team_admin: boolean;\n channel_admin: boolean;\n playbook_admin: boolean;\n guests: boolean;\n };\n urlParams: URLSearchParams;\n schemeName: string | undefined;\n schemeDescription: string | undefined;\n};\n\nexport default class PermissionTeamSchemeSettings extends React.PureComponent<Props & RouteComponentProps, State> {\n constructor(props: Props & RouteComponentProps) {\n super(props);\n this.state = {\n saving: false,\n saveNeeded: false,\n serverError: null,\n roles: null,\n teams: null,\n addTeamOpen: false,\n selectedPermission: undefined,\n openRoles: {\n all_users: true,\n team_admin: true,\n channel_admin: true,\n playbook_admin: true,\n guests: true,\n },\n urlParams: new URLSearchParams(props.location.search),\n schemeName: undefined,\n schemeDescription: undefined,\n };\n }\n\n static defaultProps = {\n scheme: null,\n };\n\n componentDidMount() {\n const rolesNeeded = [\n GeneralConstants.TEAM_GUEST_ROLE,\n GeneralConstants.TEAM_USER_ROLE,\n GeneralConstants.TEAM_ADMIN_ROLE,\n GeneralConstants.CHANNEL_GUEST_ROLE,\n GeneralConstants.CHANNEL_USER_ROLE,\n GeneralConstants.CHANNEL_ADMIN_ROLE,\n GeneralConstants.PLAYBOOK_ADMIN_ROLE,\n GeneralConstants.PLAYBOOK_MEMBER_ROLE,\n GeneralConstants.RUN_MEMBER_ROLE,\n ];\n this.props.actions.loadRolesIfNeeded(rolesNeeded);\n if (this.props.schemeId) {\n this.props.actions.loadScheme(this.props.schemeId).then((result) => {\n this.props.actions.loadRolesIfNeeded([\n result.data.default_team_guest_role,\n result.data.default_team_user_role,\n result.data.default_team_admin_role,\n result.data.default_channel_guest_role,\n result.data.default_channel_user_role,\n result.data.default_channel_admin_role,\n result.data.default_playbook_admin_role,\n result.data.default_playbook_member_role,\n result.data.default_run_member_role,\n ]);\n });\n this.props.actions.loadSchemeTeams(this.props.schemeId);\n }\n\n const rowIdFromQuery = this.state.urlParams.get('rowIdFromQuery');\n if (rowIdFromQuery) {\n setTimeout(() => {\n this.selectRow(rowIdFromQuery);\n }, 1000);\n }\n }\n\n isLoaded = (props: Props) => {\n if (props.schemeId) {\n if (props.scheme !== null &&\n props.teams !== null &&\n props.roles[props.scheme.default_team_guest_role] &&\n props.roles[props.scheme.default_team_user_role] &&\n props.roles[props.scheme.default_team_admin_role] &&\n props.roles[props.scheme.default_channel_guest_role] &&\n props.roles[props.scheme.default_channel_user_role] &&\n props.roles[props.scheme.default_channel_admin_role] &&\n props.roles[props.scheme.default_playbook_admin_role] &&\n props.roles[props.scheme.default_playbook_member_role] &&\n props.roles[props.scheme.default_run_member_role]) {\n return true;\n }\n return false;\n } else if (props.roles.team_guest &&\n props.roles.team_user &&\n props.roles.team_admin &&\n props.roles.channel_guest &&\n props.roles.channel_user &&\n props.roles.channel_admin &&\n props.roles.playbook_admin &&\n props.roles.playbook_member &&\n props.roles.run_member) {\n return true;\n }\n return false;\n };\n\n goToSelectedRow = () => {\n const selected = document.querySelector('.permission-row.selected,.permission-group-row.selected');\n if (selected) {\n if (this.state.openRoles.all_users) {\n selected.scrollIntoView({behavior: 'smooth', block: 'center'});\n } else {\n this.toggleRole('all_users');\n\n // Give it time to open and show everything\n setTimeout(() => {\n selected.scrollIntoView({behavior: 'smooth', block: 'center'});\n }, 300);\n }\n return true;\n }\n return false;\n };\n\n selectRow = (permission: string) => {\n this.setState({selectedPermission: permission});\n\n // Wait until next render\n setTimeout(this.goToSelectedRow);\n\n // Remove selection after animation\n setTimeout(() => {\n this.setState({selectedPermission: undefined});\n }, 3000);\n };\n\n getStateRoles = () => {\n if (this.state.roles !== null) {\n return this.state.roles;\n }\n\n let teamGuest;\n let teamUser;\n let teamAdmin;\n let channelGuest;\n let channelUser;\n let channelAdmin;\n let playbookAdmin;\n let playbookMember;\n let runMember;\n\n if (this.props.schemeId && this.props.scheme) {\n if (this.isLoaded(this.props)) {\n teamGuest = this.props.roles[this.props.scheme.default_team_guest_role];\n teamUser = this.props.roles[this.props.scheme.default_team_user_role];\n teamAdmin = this.props.roles[this.props.scheme.default_team_admin_role];\n channelGuest = this.props.roles[this.props.scheme.default_channel_guest_role];\n channelUser = this.props.roles[this.props.scheme.default_channel_user_role];\n channelAdmin = this.props.roles[this.props.scheme.default_channel_admin_role];\n playbookAdmin = this.props.roles[this.props.scheme.default_playbook_admin_role];\n playbookMember = this.props.roles[this.props.scheme.default_playbook_member_role];\n runMember = this.props.roles[this.props.scheme.default_run_member_role];\n }\n } else if (this.isLoaded(this.props)) {\n teamGuest = this.props.roles.team_guest;\n teamUser = this.props.roles.team_user;\n teamAdmin = this.props.roles.team_admin;\n channelGuest = this.props.roles.channel_guest;\n channelUser = this.props.roles.channel_user;\n channelAdmin = this.props.roles.channel_admin;\n playbookAdmin = this.props.roles.playbook_admin;\n playbookMember = this.props.roles.playbook_member;\n runMember = this.props.roles.run_member;\n } else {\n return null;\n }\n return {\n team_admin: teamAdmin,\n channel_admin: channelAdmin,\n playbook_admin: playbookAdmin,\n playbook_member: playbookMember,\n run_member: runMember,\n team_guest: teamGuest,\n team_user: teamUser,\n channel_guest: channelGuest,\n channel_user: channelUser,\n all_users: {\n name: 'all_users',\n displayName: 'All members',\n permissions: [\n ...(teamUser?.permissions || []),\n ...(channelUser?.permissions || []),\n ...(playbookMember?.permissions || []),\n ...(runMember?.permissions || []),\n ],\n },\n guests: {\n name: 'guests',\n displayName: 'Guests',\n permissions: teamGuest?.permissions.concat(channelGuest?.permissions || []),\n },\n };\n };\n\n deriveRolesFromGuests = (teamGuest: Role, channelGuest: Role, role: Role): RolesMap => {\n return {\n team_guest: {\n ...teamGuest,\n permissions: role.permissions.filter((p) => PermissionsScope[p] === 'team_scope'),\n },\n channel_guest: {\n ...channelGuest,\n permissions: role.permissions.filter((p) => PermissionsScope[p] === 'channel_scope'),\n },\n };\n };\n\n restoreGuestPermissions = (teamGuest: Role, channelGuest: Role, roles: RolesMap) => {\n for (const permission of teamGuest.permissions) {\n if (!GUEST_INCLUDED_PERMISSIONS.includes(permission)) {\n roles.team_guest.permissions.push(permission);\n }\n }\n for (const permission of channelGuest.permissions) {\n if (!GUEST_INCLUDED_PERMISSIONS.includes(permission)) {\n roles.channel_guest.permissions.push(permission);\n }\n }\n return roles;\n };\n\n deriveRolesFromAllUsers = (baseTeam: Role, baseChannel: Role, basePlaybookMember: Role, baseRunMember: Role, role: Role): RolesMap => {\n return {\n team_user: {\n ...baseTeam,\n permissions: role.permissions.filter((p) => PermissionsScope[p] === 'team_scope'),\n },\n channel_user: {\n ...baseChannel,\n permissions: role.permissions.filter((p) => PermissionsScope[p] === 'channel_scope'),\n },\n playbook_member: {\n ...basePlaybookMember,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'playbook_scope'),\n },\n run_member: {\n ...baseRunMember,\n permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'run_scope'),\n },\n };\n };\n\n restoreExcludedPermissions = (baseTeam: Role, baseChannel: Role, roles: RolesMap) => {\n for (const permission of baseTeam.permissions) {\n if (EXCLUDED_PERMISSIONS.includes(permission)) {\n roles.team_user.permissions.push(permission);\n }\n }\n for (const permission of baseChannel.permissions) {\n if (EXCLUDED_PERMISSIONS.includes(permission)) {\n roles.channel_user.permissions.push(permission);\n }\n }\n return roles;\n };\n\n handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({schemeName: e.target.value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n handleDescriptionChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n this.setState({schemeDescription: e.target.value, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n handleSubmit = async () => {\n const roles = this.getStateRoles();\n let teamAdmin = roles?.team_admin;\n let channelAdmin = roles?.channel_admin;\n let playbookAdmin = roles?.playbook_admin;\n let playbookMember = roles?.playbook_member;\n let runMember = roles?.run_member;\n const allUsers = roles?.all_users;\n const guests = roles?.guests;\n\n const schemeName = this.state.schemeName || (this.props.scheme && this.props.scheme.display_name) || '';\n const schemeDescription = this.state.schemeDescription || (this.props.scheme && this.props.scheme.description) || '';\n let teamUser = null;\n let channelUser = null;\n let teamGuest = null;\n let channelGuest = null;\n let schemeId = null;\n\n this.setState({saving: true});\n\n if (roles && roles.team_user && roles.channel_user && roles.playbook_member && roles.run_member && allUsers) {\n let derived = this.deriveRolesFromAllUsers(\n roles.team_user,\n roles.channel_user,\n roles.playbook_member,\n roles.run_member,\n allUsers as Role,\n ) as any;\n derived = this.restoreExcludedPermissions(\n roles.team_user,\n roles.channel_user,\n derived,\n );\n teamUser = derived.team_user;\n channelUser = derived.channel_user;\n playbookMember = derived.playbook_member;\n runMember = derived.run_member;\n }\n\n if (roles && roles.team_guest && roles.channel_guest && guests) {\n let derivedGuests = this.deriveRolesFromGuests(\n roles.team_guest,\n roles.channel_guest,\n guests as Role,\n );\n derivedGuests = this.restoreGuestPermissions(\n roles.team_guest,\n roles.channel_guest,\n derivedGuests,\n );\n teamGuest = derivedGuests.team_guest;\n channelGuest = derivedGuests.channel_guest;\n }\n\n if (this.props.schemeId) {\n await this.props.actions.patchScheme(this.props.schemeId, {\n display_name: schemeName,\n description: schemeDescription,\n } as SchemePatch);\n schemeId = this.props.schemeId;\n } else {\n const result = await this.props.actions.createScheme({\n display_name: schemeName,\n description: schemeDescription,\n scope: 'team',\n } as Scheme);\n if (result.error) {\n this.setState({serverError: result.error.message, saving: false, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n return;\n }\n const newScheme = result.data;\n schemeId = newScheme.id;\n await this.props.actions.loadRolesIfNeeded([\n newScheme.default_team_guest_role,\n newScheme.default_team_user_role,\n newScheme.default_team_admin_role,\n newScheme.default_channel_guest_role,\n newScheme.default_channel_user_role,\n newScheme.default_channel_admin_role,\n newScheme.default_playbook_admin_role,\n newScheme.default_playbook_member_role,\n newScheme.default_run_member_role,\n ]);\n teamGuest = {...teamGuest, id: this.props.roles[newScheme.default_team_guest_role].id};\n teamUser = {...teamUser, id: this.props.roles[newScheme.default_team_user_role].id};\n teamAdmin = {...teamAdmin, id: this.props.roles[newScheme.default_team_admin_role].id} as Role;\n channelGuest = {...channelGuest, id: this.props.roles[newScheme.default_channel_guest_role].id};\n channelUser = {...channelUser, id: this.props.roles[newScheme.default_channel_user_role].id};\n channelAdmin = {...channelAdmin, id: this.props.roles[newScheme.default_channel_admin_role].id} as Role;\n playbookAdmin = {...playbookAdmin, id: this.props.roles[newScheme.default_playbook_admin_role].id} as Role;\n playbookMember = {...playbookMember, id: this.props.roles[newScheme.default_playbook_member_role].id} as Role;\n runMember = {...runMember, id: this.props.roles[newScheme.default_run_member_role].id} as Role;\n }\n\n const teamAdminPromise = this.props.actions.editRole(teamAdmin as Role);\n const channelAdminPromise = this.props.actions.editRole(channelAdmin as Role);\n const playbookAdminPromise = this.props.actions.editRole(playbookAdmin as Role);\n const playbookMemberPromise = this.props.actions.editRole(playbookMember as Role);\n const runMemberPromise = this.props.actions.editRole(runMember as Role);\n const promises = [teamAdminPromise, channelAdminPromise, playbookAdminPromise, playbookMemberPromise, runMemberPromise];\n\n const teamUserPromise = this.props.actions.editRole(teamUser);\n const channelUserPromise = this.props.actions.editRole(channelUser);\n promises.push(teamUserPromise);\n promises.push(channelUserPromise);\n\n if (this.haveGuestAccountsPermissions()) {\n const teamGuestPromise = this.props.actions.editRole(teamGuest as Role);\n const channelGuestPromise = this.props.actions.editRole(channelGuest as Role);\n promises.push(teamGuestPromise, channelGuestPromise);\n }\n\n const currentTeams = new Set((this.state.teams || this.props.teams || []).map((team) => team.id));\n const serverTeams = new Set((this.props.teams || []).map((team) => team.id));\n\n // Difference of sets (currentTeams - serverTeams)\n const addedTeams = new Set([...currentTeams].filter((team) => !serverTeams.has(team)));\n\n // Difference of sets (serverTeams - currentTeams)\n const removedTeams = new Set([...serverTeams].filter((team) => !currentTeams.has(team)));\n\n for (const teamId of addedTeams) {\n promises.push(this.props.actions.updateTeamScheme(teamId, schemeId));\n }\n\n for (const teamId of removedTeams) {\n promises.push(this.props.actions.updateTeamScheme(teamId, ''));\n }\n\n const results = await Promise.all(promises);\n\n let serverError = null;\n let saveNeeded = false;\n for (const result of results) {\n if (result.error) {\n serverError = result.error.message;\n saveNeeded = true;\n break;\n }\n }\n\n this.setState({serverError, saving: false, saveNeeded});\n this.props.actions.setNavigationBlocked(saveNeeded);\n this.props.history.push('/admin_console/user_management/permissions');\n };\n\n toggleRole = (roleId: 'all_users' | 'team_admin' | 'channel_admin' | 'guests' | 'playbook_admin') => {\n const newOpenRoles = {...this.state.openRoles};\n newOpenRoles[roleId] = !newOpenRoles[roleId];\n this.setState({openRoles: newOpenRoles});\n };\n\n togglePermission = (roleId: string, permissions: string[]) => {\n const roles = {...this.getStateRoles()} as RolesMap;\n const role = {...roles[roleId]} as Role;\n const newPermissions = [...role.permissions];\n for (const permission of permissions) {\n if (newPermissions.indexOf(permission) === -1) {\n newPermissions.push(permission);\n } else {\n newPermissions.splice(newPermissions.indexOf(permission), 1);\n }\n }\n role.permissions = newPermissions;\n roles[roleId] = role;\n\n if (roleId === 'all_users') {\n const channelAdminRole = {...roles.channel_admin} as Role;\n const channelAdminPermissions = [...channelAdminRole.permissions!];\n const teamAdminRole = {...roles.team_admin} as Role;\n const teamAdminPermissions = [...teamAdminRole.permissions!];\n for (const permission of permissions) {\n if (ModeratedPermissions.indexOf(permission) !== -1 && role.permissions.indexOf(permission) !== -1) {\n if (channelAdminPermissions.indexOf(permission) === -1) {\n channelAdminPermissions.push(permission);\n }\n if (teamAdminPermissions.indexOf(permission) === -1) {\n teamAdminPermissions.push(permission);\n }\n }\n }\n channelAdminRole.permissions = channelAdminPermissions;\n roles.channel_admin = channelAdminRole;\n teamAdminRole.permissions = teamAdminPermissions;\n roles.team_admin = teamAdminRole;\n }\n\n this.setState({roles, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n openAddTeam = () => {\n this.setState({addTeamOpen: true});\n };\n\n removeTeam = (teamId: string) => {\n const teams = (this.state.teams || this.props.teams)?.filter((team) => team.id !== teamId) ?? null;\n this.setState({teams, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n addTeams = (teams: Team[]) => {\n const currentTeams = this.state.teams || this.props.teams || [];\n this.setState({\n teams: [...currentTeams, ...teams],\n saveNeeded: true,\n });\n this.props.actions.setNavigationBlocked(true);\n };\n\n closeAddTeam = () => {\n this.setState({addTeamOpen: false});\n };\n\n haveGuestAccountsPermissions = () => {\n return this.props.license.GuestAccountsPermissions === 'true';\n };\n\n render = () => {\n if (!this.isLoaded(this.props)) {\n return <LoadingScreen/>;\n }\n const roles = this.getStateRoles();\n const teams = this.state.teams || this.props.teams || [];\n const schemeName = this.state.schemeName || (this.props.scheme && this.props.scheme.display_name) || '';\n const schemeDescription = this.state.schemeDescription || (this.props.scheme && this.props.scheme.description) || '';\n return (\n <div className='wrapper--fixed'>\n {this.state.addTeamOpen &&\n <TeamSelectorModal\n modalID={ModalIdentifiers.ADD_TEAMS_TO_SCHEME}\n onModalDismissed={this.closeAddTeam}\n onTeamsSelected={this.addTeams}\n currentSchemeId={this.props.schemeId}\n alreadySelected={teams.map((team) => team.id)}\n />\n }\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/permissions'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.permissions.teamScheme'\n defaultMessage='Team Scheme'\n />\n </div>\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className={'banner info'}>\n <div className='banner__content'>\n <span>\n <FormattedMessage\n id='admin.permissions.teamScheme.introBanner'\n defaultMessage='<linkOverrideTeam>Team Override Schemes</linkOverrideTeam> set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the <linkSystemScheme>System Scheme</linkSystemScheme>.'\n values={{\n linkOverrideTeam: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='permission_team_scheme_settings'\n >\n {msg}\n </ExternalLink>\n ),\n linkSystemScheme: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='permission_team_scheme_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </span>\n </div>\n </div>\n\n <AdminPanel\n title={defineMessage({id: 'admin.permissions.teamScheme.schemeDetailsTitle', defaultMessage: 'Scheme Details'})}\n subtitle={defineMessage({id: 'admin.permissions.teamScheme.schemeDetailsDescription', defaultMessage: 'Set the name and description for this scheme.'})}\n >\n <div className='team-scheme-details'>\n <div className='form-group'>\n <label\n className='control-label'\n htmlFor='scheme-name'\n >\n <FormattedMessage\n id='admin.permissions.teamScheme.schemeNameLabel'\n defaultMessage='Scheme Name:'\n />\n </label>\n <LocalizedPlaceholderInput\n className='form-control'\n disabled={this.props.isDisabled}\n id='scheme-name'\n placeholder={defineMessage({id: 'admin.permissions.teamScheme.schemeNamePlaceholder', defaultMessage: 'Scheme Name'})}\n type='text'\n value={schemeName}\n onChange={this.handleNameChange}\n />\n </div>\n <div className='form-group'>\n <label\n className='control-label'\n htmlFor='scheme-description'\n >\n <FormattedMessage\n id='admin.permissions.teamScheme.schemeDescriptionLabel'\n defaultMessage='Scheme Description:'\n />\n </label>\n <LocalizedPlaceholderTextarea\n id='scheme-description'\n className='form-control'\n rows={5}\n value={schemeDescription}\n placeholder={defineMessage({id: 'admin.permissions.teamScheme.schemeDescriptionPlaceholder', defaultMessage: 'Scheme Description'})}\n onChange={this.handleDescriptionChange}\n disabled={this.props.isDisabled}\n />\n </div>\n </div>\n </AdminPanel>\n\n <AdminPanelWithButton\n className='permissions-block'\n title={defineMessage({id: 'admin.permissions.teamScheme.selectTeamsTitle', defaultMessage: 'Select teams to override permissions'})}\n subtitle={defineMessage({id: 'admin.permissions.teamScheme.selectTeamsDescription', defaultMessage: 'Select teams where permission exceptions are required.'})}\n onButtonClick={this.openAddTeam}\n buttonText={defineMessage({id: 'admin.permissions.teamScheme.addTeams', defaultMessage: 'Add Teams'})}\n disabled={this.props.isDisabled}\n >\n <div className='teams-list'>\n {teams.length === 0 &&\n <div className='no-team-schemes'>\n <FormattedMessage\n id='admin.permissions.teamScheme.noTeams'\n defaultMessage='No team selected. Please add teams to this list.'\n />\n </div>}\n {teams.map((team) => (\n <TeamInList\n key={team.id}\n team={team}\n onRemoveTeam={this.removeTeam}\n isDisabled={this.props.isDisabled}\n />\n ))}\n </div>\n </AdminPanelWithButton>\n\n {this.props.license && this.props.config.EnableGuestAccounts === 'true' &&\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.guests}\n id='guests'\n onToggle={() => this.toggleRole('guests')}\n title={defineMessage({id: 'admin.permissions.systemScheme.GuestsTitle', defaultMessage: 'Guests'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.GuestsDescription', defaultMessage: 'Permissions granted to guest users.'})}\n >\n <GuestPermissionsTree\n selected={this.state.selectedPermission}\n role={roles?.guests}\n scope={'team_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled || !this.haveGuestAccountsPermissions()}\n />\n </AdminPanelTogglable>\n }\n\n <AdminPanelTogglable\n className='permissions-block all_users'\n open={this.state.openRoles.all_users}\n id='all_users'\n onToggle={() => this.toggleRole('all_users')}\n title={defineMessage({id: 'admin.permissions.systemScheme.allMembersTitle', defaultMessage: 'All Members'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.allMembersDescription', defaultMessage: 'Permissions granted to all members, including administrators and newly created users.'})}\n >\n <PermissionsTree\n selected={this.state.selectedPermission}\n role={roles?.all_users}\n scope={'team_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block channel_admin'\n open={this.state.openRoles.channel_admin}\n onToggle={() => this.toggleRole('channel_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.channelAdminsTitle', defaultMessage: 'Channel Administrators'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.channelAdminsDescription', defaultMessage: 'Permissions granted to channel creators and any users promoted to Channel Administrator.'})}\n >\n <PermissionsTree\n parentRole={roles?.all_users}\n role={roles?.channel_admin}\n scope={'channel_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block'\n open={this.state.openRoles.playbook_admin}\n onToggle={() => this.toggleRole('playbook_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.playbookAdmin', defaultMessage: 'Playbook Administrator'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.playbookAdminSubtitle', defaultMessage: 'Permissions granted to administrators of a playbook.'})}\n >\n <PermissionsTreePlaybooks\n parentRole={roles?.all_users}\n role={roles?.playbook_admin}\n scope={'playbook_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n license={this.props.license}\n />\n </AdminPanelTogglable>\n\n <AdminPanelTogglable\n className='permissions-block team_admin'\n open={this.state.openRoles.team_admin}\n onToggle={() => this.toggleRole('team_admin')}\n title={defineMessage({id: 'admin.permissions.systemScheme.teamAdminsTitle', defaultMessage: 'Team Administrators'})}\n subtitle={defineMessage({id: 'admin.permissions.systemScheme.teamAdminsDescription', defaultMessage: 'Permissions granted to team creators and any users promoted to Team Administrator.'})}\n >\n <PermissionsTree\n parentRole={roles?.all_users}\n role={roles?.team_admin}\n scope={'team_scope'}\n onToggle={this.togglePermission}\n selectRow={this.selectRow}\n readOnly={this.props.isDisabled}\n />\n </AdminPanelTogglable>\n </div>\n </div>\n\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.saving}\n disabled={this.props.isDisabled || !this.state.saveNeeded}\n onClick={this.handleSubmit}\n savingMessage={\n <FormattedMessage\n id='admin.saving'\n defaultMessage='Saving Config...'\n />\n }\n />\n <BlockableLink\n className='cancel-button'\n to='/admin_console/user_management/permissions'\n >\n <FormattedMessage\n id='admin.permissions.permissionSchemes.cancel'\n defaultMessage='Cancel'\n />\n </BlockableLink>\n <div className='error-message'>\n <FormError error={this.state.serverError}/>\n </div>\n </div>\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {loadRolesIfNeeded, editRole} from 'mattermost-redux/actions/roles';\nimport {getScheme as loadScheme, patchScheme, createScheme, getSchemeTeams as loadSchemeTeams} from 'mattermost-redux/actions/schemes';\nimport {updateTeamScheme} from 'mattermost-redux/actions/teams';\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles';\nimport {getScheme, makeGetSchemeTeams} from 'mattermost-redux/selectors/entities/schemes';\n\nimport {setNavigationBlocked} from 'actions/admin_actions';\n\nimport PermissionTeamSchemeSettings from './permission_team_scheme_settings';\n\ntype OwnProps = {\n match: {\n params: {\n scheme_id: string;\n };\n };\n};\n\nfunction makeMapStateToProps() {\n const getSchemeTeams = makeGetSchemeTeams();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const schemeId = ownProps.match.params.scheme_id;\n return {\n config: getConfig(state),\n license: getLicense(state),\n schemeId,\n scheme: schemeId ? getScheme(state, schemeId) : null,\n teams: schemeId ? getSchemeTeams(state, {schemeId}) : null,\n roles: getRoles(state),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadRolesIfNeeded,\n loadScheme,\n loadSchemeTeams,\n editRole,\n patchScheme,\n updateTeamScheme,\n createScheme,\n setNavigationBlocked,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PermissionTeamSchemeSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages, injectIntl} from 'react-intl';\n\nimport type {AdminConfig, ClientLicense, EmailSettings} from '@mattermost/types/config';\n\nimport ExternalLink from 'components/external_link';\n\nimport {Constants, DocLinks} from 'utils/constants';\n\nimport DropdownSetting from './dropdown_setting';\nimport OLDAdminSettings from './old_admin_settings';\nimport type {BaseProps, BaseState} from './old_admin_settings';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ntype Props = BaseProps & {\n config: AdminConfig;\n license: ClientLicense;\n} & WrappedComponentProps;\n\ntype State = BaseState & {\n pushNotificationServer: string;\n pushNotificationServerType: EmailSettings['PushNotificationServerType'];\n pushNotificationServerLocation: EmailSettings['PushNotificationServerLocation'];\n agree: boolean;\n maxNotificationsPerChannel: number;\n};\n\nconst PUSH_NOTIFICATIONS_OFF = 'off';\nconst PUSH_NOTIFICATIONS_MHPNS = 'mhpns';\nconst PUSH_NOTIFICATIONS_MTPNS = 'mtpns';\nconst PUSH_NOTIFICATIONS_CUSTOM = 'custom';\nconst PUSH_NOTIFICATIONS_LOCATION_US = 'us';\nconst PUSH_NOTIFICATIONS_LOCATION_DE = 'de';\n\nconst PUSH_NOTIFICATIONS_SERVER_DIC = {\n [PUSH_NOTIFICATIONS_LOCATION_US]: Constants.MHPNS_US,\n [PUSH_NOTIFICATIONS_LOCATION_DE]: Constants.MHPNS_DE,\n};\n\nconst DROPDOWN_ID_SERVER_TYPE = 'pushNotificationServerType';\nconst DROPDOWN_ID_SERVER_LOCATION = 'pushNotificationServerLocation';\n\nconst messages = defineMessages({\n pushNotificationServer: {id: 'admin.environment.pushNotificationServer', defaultMessage: 'Push Notification Server'},\n pushTitle: {id: 'admin.email.pushTitle', defaultMessage: 'Enable Push Notifications: '},\n pushServerTitle: {id: 'admin.email.pushServerTitle', defaultMessage: 'Push Notification Server:'},\n});\n\nexport const searchableStrings = [\n messages.pushNotificationServer,\n messages.pushTitle,\n messages.pushServerTitle,\n];\n\nclass PushSettings extends OLDAdminSettings<Props, State> {\n canSave = () => {\n return this.state.pushNotificationServerType !== PUSH_NOTIFICATIONS_MHPNS || this.state.agree;\n };\n\n handleAgreeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n agree: e.target.checked,\n });\n };\n\n handleDropdownChange = (id: string, value: string) => {\n if (id === DROPDOWN_ID_SERVER_TYPE) {\n this.setState({\n agree: false,\n });\n\n if (value === PUSH_NOTIFICATIONS_MHPNS) {\n this.setState({\n pushNotificationServer: PUSH_NOTIFICATIONS_SERVER_DIC[this.state.pushNotificationServerLocation],\n });\n } else if (value === PUSH_NOTIFICATIONS_MTPNS) {\n this.setState({\n pushNotificationServer: Constants.MTPNS,\n });\n } else if (value === PUSH_NOTIFICATIONS_CUSTOM &&\n (this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_MTPNS ||\n this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_MHPNS)) {\n this.setState({\n pushNotificationServer: '',\n });\n }\n }\n\n if (id === DROPDOWN_ID_SERVER_LOCATION) {\n this.setState({\n pushNotificationServer: PUSH_NOTIFICATIONS_SERVER_DIC[value as EmailSettings['PushNotificationServerLocation']],\n pushNotificationServerLocation: value as EmailSettings['PushNotificationServerLocation'],\n });\n }\n\n this.handleChange(id, value);\n };\n\n getConfigFromState = (config: Props['config']) => {\n config.EmailSettings.SendPushNotifications = this.state.pushNotificationServerType !== PUSH_NOTIFICATIONS_OFF;\n config.EmailSettings.PushNotificationServer = this.state.pushNotificationServer.trim();\n config.TeamSettings.MaxNotificationsPerChannel = this.state.maxNotificationsPerChannel;\n\n return config;\n };\n\n getStateFromConfig(config: Props['config']) {\n let pushNotificationServerType: EmailSettings['PushNotificationServerType'] = PUSH_NOTIFICATIONS_CUSTOM;\n let agree = false;\n let pushNotificationServerLocation: EmailSettings['PushNotificationServerLocation'] = PUSH_NOTIFICATIONS_LOCATION_US;\n if (!config.EmailSettings.SendPushNotifications) {\n pushNotificationServerType = PUSH_NOTIFICATIONS_OFF;\n } else if (config.EmailSettings.PushNotificationServer === Constants.MHPNS_US &&\n this.props.license.IsLicensed === 'true' && this.props.license.MHPNS === 'true') {\n pushNotificationServerType = PUSH_NOTIFICATIONS_MHPNS;\n pushNotificationServerLocation = PUSH_NOTIFICATIONS_LOCATION_US;\n agree = true;\n } else if (config.EmailSettings.PushNotificationServer === Constants.MHPNS_DE &&\n this.props.license.IsLicensed === 'true' && this.props.license.MHPNS === 'true') {\n pushNotificationServerType = PUSH_NOTIFICATIONS_MHPNS;\n pushNotificationServerLocation = PUSH_NOTIFICATIONS_LOCATION_DE;\n agree = true;\n } else if (config.EmailSettings.PushNotificationServer === Constants.MTPNS) {\n pushNotificationServerType = PUSH_NOTIFICATIONS_MTPNS;\n }\n\n let pushNotificationServer = config.EmailSettings.PushNotificationServer;\n if (pushNotificationServerType === PUSH_NOTIFICATIONS_MTPNS) {\n pushNotificationServer = Constants.MTPNS;\n } else if (pushNotificationServerType === PUSH_NOTIFICATIONS_MHPNS) {\n pushNotificationServer = PUSH_NOTIFICATIONS_SERVER_DIC[pushNotificationServerLocation];\n }\n\n const maxNotificationsPerChannel = config.TeamSettings.MaxNotificationsPerChannel;\n\n return {\n pushNotificationServerType,\n pushNotificationServerLocation,\n pushNotificationServer,\n maxNotificationsPerChannel,\n agree,\n };\n }\n\n isPushNotificationServerSetByEnv = () => {\n // Assume that if one of these has been set using an environment variable,\n // all of them have been set that way\n return this.isSetByEnv('EmailSettings.SendPushNotifications') ||\n this.isSetByEnv('EmailSettings.PushNotificationServer');\n };\n\n renderTitle() {\n return (<FormattedMessage {...messages.pushNotificationServer}/>);\n }\n\n renderSettings = () => {\n const pushNotificationServerTypes = [];\n pushNotificationServerTypes.push({value: PUSH_NOTIFICATIONS_OFF, text: this.props.intl.formatMessage({id: 'admin.email.pushOff', defaultMessage: 'Do not send push notifications'})});\n if (this.props.license.IsLicensed === 'true' && this.props.license.MHPNS === 'true') {\n pushNotificationServerTypes.push({value: PUSH_NOTIFICATIONS_MHPNS, text: this.props.intl.formatMessage({id: 'admin.email.mhpns', defaultMessage: 'Use HPNS connection with uptime SLA to send notifications to iOS and Android apps'})});\n }\n pushNotificationServerTypes.push({value: PUSH_NOTIFICATIONS_MTPNS, text: this.props.intl.formatMessage({id: 'admin.email.mtpns', defaultMessage: 'Use TPNS connection to send notifications to iOS and Android apps'})});\n pushNotificationServerTypes.push({value: PUSH_NOTIFICATIONS_CUSTOM, text: this.props.intl.formatMessage({id: 'admin.email.selfPush', defaultMessage: 'Manually enter Push Notification Service location'})});\n\n let sendHelpText = null;\n let pushServerHelpText = null;\n if (this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_OFF) {\n sendHelpText = (\n <FormattedMessage\n id='admin.email.pushOffHelp'\n defaultMessage='Please see <link>documentation on push notifications</link> to learn more about setup options.'\n values={{\n link: (msg) => (\n <ExternalLink\n href={DocLinks.SETUP_PUSH_NOTIFICATIONS}\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n } else if (this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_MHPNS) {\n pushServerHelpText = (\n <FormattedMessage\n id='admin.email.mhpnsHelp'\n defaultMessage='Download <linkIOS>Mattermost iOS app</linkIOS> from iTunes. Download <linkAndroid>Mattermost Android app</linkAndroid> from Google Play. Learn more about the <linkHPNS>Mattermost Hosted Push Notification Service</linkHPNS>.'\n values={{\n linkIOS: (msg) => (\n <ExternalLink\n href='https://mattermost.com/pl/ios-app/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n linkAndroid: (msg) => (\n <ExternalLink\n href='https://mattermost.com/pl/android-app/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n linkHPNS: (msg) => (\n <ExternalLink\n href={DocLinks.SETUP_PUSH_NOTIFICATIONS}\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n } else if (this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_MTPNS) {\n pushServerHelpText = (\n <FormattedMessage\n id='admin.email.mtpnsHelp'\n defaultMessage='Download <linkIOS>Mattermost iOS app</linkIOS> from iTunes. Download <linkAndroid>Mattermost Android app</linkAndroid> from Google Play. Learn more about the <linkHPNS>Mattermost Hosted Push Notification Service</linkHPNS>.'\n values={{\n linkIOS: (msg) => (\n <ExternalLink\n href='https://mattermost.com/pl/ios-app/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n linkAndroid: (msg) => (\n <ExternalLink\n href='https://mattermost.com/pl/android-app/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n linkHPNS: (msg) => (\n <ExternalLink\n href={DocLinks.SETUP_PUSH_NOTIFICATIONS}\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n } else {\n pushServerHelpText = (\n <FormattedMessage\n id='admin.email.easHelp'\n defaultMessage='Learn more about compiling and deploying your own mobile apps from an <link>Enterprise App Store</link>.'\n values={{\n link: (msg) => (\n <ExternalLink\n href='https://docs.mattermost.com/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n );\n }\n\n let tosCheckbox;\n if (this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_MHPNS) {\n tosCheckbox = (\n <div className='form-group'>\n <div className='col-sm-4'/>\n <div className='col-sm-8'>\n <input\n type='checkbox'\n checked={this.state.agree}\n onChange={this.handleAgreeChange}\n disabled={this.props.isDisabled}\n />\n <FormattedMessage\n id='admin.email.agreeHPNS'\n defaultMessage=' I understand and accept the Mattermost Hosted Push Notification Service <linkTerms>Terms of Service</linkTerms> and <linkPrivacy>Privacy Policy</linkPrivacy>.'\n values={{\n linkTerms: (msg) => (\n <ExternalLink\n href='https://mattermost.com/hpns-terms/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n linkPrivacy: (msg) => (\n <ExternalLink\n href='https://mattermost.com/data-processing-addendum/'\n location='push_settings'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n );\n }\n\n let locationDropdown;\n if (this.state.pushNotificationServerType === PUSH_NOTIFICATIONS_MHPNS) {\n const pushNotificationServerLocations = [\n {value: PUSH_NOTIFICATIONS_LOCATION_US, text: this.props.intl.formatMessage({id: 'admin.email.pushServerLocationUS', defaultMessage: 'US'})},\n {value: PUSH_NOTIFICATIONS_LOCATION_DE, text: this.props.intl.formatMessage({id: 'admin.email.pushServerLocationDE', defaultMessage: 'Germany'})},\n ];\n\n locationDropdown = (\n <DropdownSetting\n id={DROPDOWN_ID_SERVER_LOCATION}\n values={pushNotificationServerLocations}\n label={\n <FormattedMessage\n id='admin.email.pushServerLocationTitle'\n defaultMessage='Push Notification Server location:'\n />\n }\n value={this.state.pushNotificationServerLocation}\n onChange={this.handleDropdownChange}\n setByEnv={this.isPushNotificationServerSetByEnv()}\n disabled={this.props.isDisabled}\n />\n );\n }\n\n return (\n <SettingsGroup>\n <DropdownSetting\n id={DROPDOWN_ID_SERVER_TYPE}\n values={pushNotificationServerTypes}\n label={<FormattedMessage {...messages.pushTitle}/>}\n value={this.state.pushNotificationServerType}\n onChange={this.handleDropdownChange}\n helpText={sendHelpText}\n setByEnv={this.isPushNotificationServerSetByEnv()}\n disabled={this.props.isDisabled}\n />\n {locationDropdown}\n {tosCheckbox}\n <TextSetting\n id='pushNotificationServer'\n label={<FormattedMessage {...messages.pushServerTitle}/>}\n placeholder={defineMessage({id: 'admin.email.pushServerEx', defaultMessage: 'E.g.: \"https://push-test.mattermost.com\"'})}\n helpText={pushServerHelpText}\n value={this.state.pushNotificationServer}\n onChange={this.handleChange}\n disabled={this.props.isDisabled || this.state.pushNotificationServerType !== PUSH_NOTIFICATIONS_CUSTOM}\n setByEnv={this.isSetByEnv('EmailSettings.PushNotificationServer')}\n />\n <TextSetting\n id='maxNotificationsPerChannel'\n type='number'\n label={\n <FormattedMessage\n id='admin.team.maxNotificationsPerChannelTitle'\n defaultMessage='Max Notifications Per Channel:'\n />\n }\n placeholder={defineMessage({id: 'admin.team.maxNotificationsPerChannelExample', defaultMessage: 'E.g.: \"1000\"'})}\n helpText={\n <FormattedMessage\n id='admin.team.maxNotificationsPerChannelDescription'\n defaultMessage='Maximum total number of users in a channel before users typing messages, @all, @here, and @channel no longer send notifications because of performance.'\n />\n }\n value={this.state.maxNotificationsPerChannel}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('TeamSettings.MaxNotificationsPerChannel')}\n disabled={this.props.isDisabled}\n />\n </SettingsGroup>\n );\n };\n}\n\nexport default injectIntl(PushSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nfunction BuildingSvg() {\n return (\n <svg\n width='133'\n height='106'\n viewBox='0 0 133 106'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x='32.5'\n y='0.5'\n width='68.5'\n height='105'\n rx='4'\n fill='#FFBC1F'\n />\n <rect\n x='0.5'\n y='37'\n width='132.5'\n height='68.5'\n rx='4'\n fill='#CC8F00'\n />\n <path\n d='M101 3.32155V103.178C100.83 104.887 100.246 105.827 99.2368 106H34.5181C33.3391 105.827 32.6699 104.887 32.5 103.178V3.32155C32.6699 1.61349 33.3391 0.672969 34.5181 0.5H99.2368C100.246 0.672969 100.83 1.61349 101 3.32155Z'\n fill='#FFBC1F'\n />\n <path\n d='M80.0115 79.0244H53.7559V105.989H80.0115V79.0244Z'\n fill='#E8E9ED'\n />\n <rect\n x='30.5'\n y='0.5'\n width='72.5'\n height='7'\n rx='1.5'\n fill='#1E325C'\n />\n <rect\n x='51'\n y='75.5'\n width='31.5'\n height='7'\n rx='1.5'\n fill='#1E325C'\n />\n <rect\n x='66'\n y='82'\n width='2'\n height='24'\n fill='#1E325C'\n />\n <rect\n x='6.5'\n y='49'\n width='8'\n height='15.5'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='38'\n y='14'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='73'\n y='14'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='38'\n y='38'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='38'\n y='62'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='38'\n y='75.5'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='38'\n y='89'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='73'\n y='38'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='73'\n y='62'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='51'\n y='14'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='86'\n y='14'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='51'\n y='38'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='51'\n y='62'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='86'\n y='38'\n width='9'\n height='19'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='86'\n y='62'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='86'\n y='75.5'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='86'\n y='89'\n width='9'\n height='9'\n rx='1.5'\n fill='#CC8F00'\n />\n <rect\n x='107'\n y='49'\n width='8'\n height='15.5'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='6.5'\n y='70.5'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='107'\n y='70.5'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='6.5'\n y='85'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='107'\n y='85'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='18.5'\n y='49'\n width='8'\n height='15.5'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='119'\n y='49'\n width='8'\n height='15.5'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='18.5'\n y='70.5'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='119'\n y='70.5'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='18.5'\n y='85'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n <rect\n x='119'\n y='85'\n width='8'\n height='8'\n rx='1.5'\n fill='#7A5600'\n />\n </svg>\n\n );\n}\n\nexport default BuildingSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {LocationDescriptor} from 'history';\nimport {DateTime, Interval} from 'luxon';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {ClientError} from '@mattermost/client';\nimport type {Channel} from '@mattermost/types/channels';\nimport {isRemoteClusterPatch, type RemoteCluster, type RemoteClusterPatch} from '@mattermost/types/remote_clusters';\nimport type {SharedChannelRemote} from '@mattermost/types/shared_channels';\nimport type {Team} from '@mattermost/types/teams';\nimport type {IDMappedObjects, RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {ChannelTypes} from 'mattermost-redux/action_types';\nimport {getChannel as fetchChannel} from 'mattermost-redux/actions/channels';\nimport {Client4} from 'mattermost-redux/client';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getActiveTeamsList, getTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nexport const useRemoteClusters = () => {\n const [remoteClusters, setRemoteClusters] = useState<RemoteCluster[]>();\n const [loadingState, setLoadingState] = useState<boolean | ClientError>(true);\n const {loading, error} = loadingStatus(loadingState);\n\n const fetch = async () => {\n setLoadingState(true);\n try {\n const data = await Client4.getRemoteClusters({excludePlugins: true});\n setRemoteClusters(data?.length ? data : undefined);\n setLoadingState(false);\n } catch (err) {\n setLoadingState(err);\n }\n };\n\n useEffect(() => {\n fetch();\n }, []);\n\n return [remoteClusters, {loading, fetch, error}] as const;\n};\n\nexport const useRemoteClusterEdit = (remoteId: string | 'create', initRemoteCluster: RemoteCluster | undefined) => {\n const editing = remoteId !== 'create';\n\n const [currentRemoteCluster, setCurrentRemoteCluster] = useState<RemoteCluster | undefined>(initRemoteCluster);\n const [patch, setPatch] = useState<Partial<RemoteClusterPatch>>({});\n const [loading, setLoading] = useState<TLoadingState>(editing && !currentRemoteCluster);\n const [saving, setSaving] = useState<TLoadingState>(false);\n\n const hasChanges = Object.keys(patch).length > 0;\n\n useEffect(() => {\n if (!editing) {\n return;\n }\n (async () => {\n try {\n const data = await Client4.getRemoteCluster(remoteId);\n setCurrentRemoteCluster(data);\n setLoading(false);\n setPatch({});\n } catch (err) {\n setSaving(err);\n }\n })();\n }, [remoteId]);\n\n const applyPatch = (patch: Partial<RemoteClusterPatch>) => {\n setPatch((current) => ({...current, ...patch}));\n };\n\n const save = async () => {\n if (currentRemoteCluster && isRemoteClusterPatch(patch)) {\n setSaving(true);\n try {\n const data = await Client4.patchRemoteCluster(remoteId, patch);\n setCurrentRemoteCluster(data);\n setSaving(false);\n setPatch({});\n } catch (err) {\n setSaving(err);\n }\n setSaving(false);\n }\n };\n\n return [\n {...currentRemoteCluster, ...patch},\n {\n applyPatch,\n save,\n hasChanges,\n loading,\n saving,\n currentRemoteCluster,\n patch,\n },\n ] as const;\n};\n\nexport const useSharedChannelRemotes = (remoteId: string) => {\n const [remotes, setRemotes] = useState<RelationOneToOne<Channel, SharedChannelRemote>>();\n const [loadingState, setLoadingState] = useState<TLoadingState>(true);\n\n const loading = isPendingState(loadingState);\n const error = !loading && loadingState;\n\n const fetch = async () => {\n setLoadingState(true);\n try {\n const data = await Client4.getSharedChannelRemotes(remoteId, {include_deleted: true, include_unconfirmed: true});\n\n setRemotes(data?.reduce<typeof remotes>((state, remote) => {\n state![remote.channel_id] = remote;\n\n return state;\n }, {}));\n setLoadingState(false);\n } catch (error) {\n setLoadingState(error);\n }\n };\n\n useEffect(() => {\n fetch();\n }, [remoteId]);\n\n return [remotes, {loading, error, fetch}] as const;\n};\n\nconst remoteRow = (remote: SharedChannelRemote, channel: Channel, team?: Team) => {\n return {...remote, display_name: channel.display_name, team_display_name: team?.display_name ?? ''};\n};\n\nexport type SharedChannelRemoteRow = SharedChannelRemote & Pick<Channel, 'display_name'> & {team_display_name: string};\nexport const useSharedChannelRemoteRows = (remoteId: string, opts: {filter: 'home' | 'remote' | undefined}) => {\n const [sharedChannelRemotes, setSharedChannelRemotes] = useState<SharedChannelRemoteRow[]>();\n const [loadingState, setLoadingState] = useState<TLoadingState>(true);\n const dispatch = useDispatch();\n\n const loading = isPendingState(loadingState);\n const error = !loading && loadingState;\n\n const fetch = useCallback(async () => {\n if (opts.filter === undefined) {\n // wait for a filter\n return;\n }\n\n setLoadingState(true);\n dispatch<ActionFuncAsync<IDMappedObjects<SharedChannelRemoteRow>>>(async (dispatch, getState) => {\n const collected: IDMappedObjects<SharedChannelRemoteRow> = {};\n const missing: SharedChannelRemote[] = [];\n\n try {\n const data = await Client4.getSharedChannelRemotes(remoteId, {include_unconfirmed: true, exclude_remote: opts.filter === 'home', exclude_home: opts.filter === 'remote'});\n let state = getState();\n let getMyChannelsOnce: undefined | ((remote: SharedChannelRemote) => Promise<Channel | undefined>) = async (firstNotFound: SharedChannelRemote) => {\n const channels = await Client4.getAllTeamsChannels();\n dispatch({\n type: ChannelTypes.RECEIVED_ALL_CHANNELS,\n data: channels,\n });\n state = getState();\n\n getMyChannelsOnce = undefined; // once-only\n\n // return triggering not-found remote\n return getChannel(state, firstNotFound.channel_id);\n };\n\n // first-past, get known channels or do initial load on first not-found channel\n for (const remote of data) {\n // eslint-disable-next-line no-await-in-loop\n const channel = getChannel(state, remote.channel_id) ?? await getMyChannelsOnce?.(remote);\n\n if (!channel) {\n // collect all remotes with missing channels\n missing?.push(remote);\n continue;\n }\n\n const team = getTeam(state, channel.team_id);\n collected[remote.id] = remoteRow(remote, channel, team);\n }\n\n // fetch missing channels individually\n if (missing.length) {\n // TODO: performance; consider adding sharedchannelremotes search param to api/v4/channels\n await Promise.allSettled(missing.map((remote) => dispatch(fetchChannel(remote.channel_id))));\n state = getState();\n\n for (const remote of missing) {\n const channel = getChannel(state, remote.channel_id);\n\n if (!channel) {\n continue;\n }\n\n const team = getTeam(state, channel.team_id);\n collected[remote.id] = remoteRow(remote, channel, team);\n }\n }\n\n const rows = Object.values(collected);\n\n setSharedChannelRemotes(rows.length ? rows : undefined);\n setLoadingState(false);\n } catch (error) {\n setLoadingState(error);\n return {error};\n }\n\n return {data: collected};\n });\n }, [remoteId, opts.filter]);\n\n useEffect(() => {\n fetch();\n }, [remoteId, opts.filter]);\n\n return [sharedChannelRemotes, {loading, error, fetch}] as const;\n};\n\nexport const useTeamOptions = () => {\n const teams = useSelector(getActiveTeamsList);\n const teamsById = useMemo(() => teams.reduce<IDMappedObjects<Team>>((teams, team) => ({...teams, [team.id]: team}), {}), [teams]);\n return teamsById;\n};\n\nexport const getEditLocation = (rc: RemoteCluster): LocationDescriptor<RemoteCluster> => {\n return {pathname: `/admin_console/site_config/secure_connections/${rc.remote_id}`, state: rc};\n};\n\nexport const getCreateLocation = (): LocationDescriptor<RemoteCluster> => {\n return {pathname: '/admin_console/site_config/secure_connections/create'};\n};\n\nconst SiteURLPendingPrefix = 'pending_';\nexport const isConfirmed = (rc: RemoteCluster) => Boolean(rc.site_url && !rc.site_url.startsWith(SiteURLPendingPrefix));\nexport const isConnected = (rc: RemoteCluster) => Interval.before(DateTime.now(), {minutes: 5}).contains(DateTime.fromMillis(rc.last_ping_at));\n\nexport type TLoadingState<TError extends Error = ClientError> = boolean | TError;\nexport const isPendingState = <T extends Error>(loadingState: TLoadingState<T>) => loadingState === true;\nexport const isErrorState = <T extends Error>(loadingState: TLoadingState<T>): loadingState is T => loadingState instanceof Error;\n\nconst loadingStatus = <T extends Error>(loadingState: TLoadingState<T>) => {\n const loading = isPendingState(loadingState);\n const error = isErrorState(loadingState) ? loadingState : undefined;\n\n return {error, loading};\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactNode} from 'react';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled, {css} from 'styled-components';\n\nimport type {RemoteCluster} from '@mattermost/types/remote_clusters';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {isConfirmed, isConnected} from './utils';\n\nexport const SectionHeading = styled.h3`\n &&& {\n margin-bottom: 8px;\n }\n`;\n\nconst FormFieldLabel = styled.label`\n width: 100%;\n\n .DropdownInput.Input_container {\n margin-top: 0;\n }\n\n & + & {\n margin-top: 30px;\n }\n`;\n\nexport const SectionHeader = styled.header.attrs({className: 'header'})<{$borderless?: boolean}>`\n &&& {\n padding: 24px 32px;\n ${({$borderless}) => !$borderless && css`\n border-bottom: 1px solid var(--center-channel-color-12, rgba(63, 67, 80, 0.12));\n `}\n }\n`;\n\nexport const SectionContent = styled.div.attrs({className: 'content'})<{$compact?: boolean}>`\n &&& {\n padding: ${({$compact}) => ($compact ? '24px 32px' : '48px 32px')};\n border-bottom: 1px solid var(--center-channel-color-12, rgba(63, 67, 80, 0.12));\n }\n`;\n\nexport const ModalBody = styled.div`\n padding: 0 32px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n`;\n\nexport const AdminSection = styled.section.attrs({className: 'AdminPanel'})`\n && {\n overflow: visible;\n }\n`;\n\nexport const PlaceholderHeading = styled.h4`\n && {\n font-size: 20px;\n font-weight: 600;\n line-height: 28px;\n margin-bottom: 4px;\n }\n`;\n\nexport const PlaceholderParagraph = styled.p`\n && {\n font-size: 14px;\n }\n`;\n\nexport const ModalParagraph = styled.p`\n && {\n font-size: 12px;\n line-height: 16px;\n font-weight: 400;\n color: rgba(var(--center-channel-color-rgb), 0.72);\n }\n`;\n\nexport const PlaceholderContainer = styled.div`\n display: flex;\n place-items: center;\n flex-direction: column;\n gap: 5px;\n\n svg {\n margin: 30px 30px 20px;\n }\n\n hgroup {\n text-align: center;\n }\n`;\n\nexport const AdminWrapper = (props: {children: ReactNode}) => {\n return (\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {props.children}\n </div>\n </div>\n );\n};\n\nconst InnerLabel = styled.strong`\n font-size: 14px;\n line-height: 18px;\n display: inline-block;\n margin-bottom: 10px;\n`;\n\nconst HelpText = styled.small`\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: rgba(var(--center-channel-color-rgb), 0.72);\n display: block;\n margin-top: 10px;\n`;\n\nexport const Input = styled.input.attrs({className: 'form-control secure-connections-input'})`\n font-weight: normal;\n`;\n\ntype FormFieldProps = {\n label?: string;\n children: ReactNode | ReactNode[];\n helpText?: string;\n}\n\nexport const FormField = ({label, children, helpText}: FormFieldProps) => {\n return (\n <FormFieldLabel>\n {label && <InnerLabel>{label}</InnerLabel>}\n {children}\n {helpText && <HelpText>{helpText}</HelpText>}\n </FormFieldLabel>\n );\n};\n\nexport const ModalFieldsetWrapper = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n .secure-connections-modal-input .form-control {\n border: none !important;\n background: none !important;\n height: 34px !important;\n }\n\n .Input_container {\n margin-bottom: 10px;\n }\n\n .DropdownInput.Input_container {\n margin-top: 0;\n }\n`;\n\nconst ModalLegend = styled.legend`\n font-size: 16px;\n font-weight: 600;\n line-height: 18px;\n border-bottom: none;\n`;\n\nexport const ModalFieldset = (props: {legend?: string; children: ReactNode | ReactNode[]}) => {\n return (\n <ModalFieldsetWrapper>\n {props.legend && <ModalLegend>{props.legend}</ModalLegend>}\n {props.children}\n </ModalFieldsetWrapper>\n );\n};\n\nexport const ModalNoticeWrapper = styled.div`\n margin: 15px 0 25px 0;\n`;\n\nexport const Button = styled.button.attrs({className: 'btn btn-secondary'})`\n margin: -1px -2px;\n`;\n\nexport const LinkButton = styled.button.attrs({className: 'btn btn-link'})<{$destructive?: boolean}>`\n font-weight: normal;\n ${({$destructive}) => $destructive && css`\n && {\n color: #D24B4E;\n }\n `};\n`;\n\nexport const ConnectionStatusLabel = ({rc}: {rc: RemoteCluster}) => {\n if (!isConfirmed(rc)) {\n return (\n <FormattedMessage\n tagName={PendingConnectionLabel}\n id='admin.secure_connections.status_pending'\n defaultMessage='Connection Pending'\n />\n );\n }\n\n const status = isConnected(rc) ? (\n <FormattedMessage\n tagName={ConnectedLabel}\n id='admin.secure_connections.status_connected'\n defaultMessage='Connected'\n />\n ) : (\n <FormattedMessage\n tagName={OfflineConnectionLabel}\n id='admin.secure_connections.status_offline'\n defaultMessage='Offline'\n />\n );\n\n if (!rc.last_ping_at) {\n return status;\n }\n\n return (\n <WithTooltip\n title={(\n <>\n <FormattedMessage\n id='admin.secure_connections.status_tooltip'\n defaultMessage='Last ping: {timestamp}'\n values={{\n timestamp: (\n <Timestamp\n value={rc.last_ping_at}\n ranges={LASTSYNC_TOOLTIP_RANGES}\n />\n ),\n }}\n />\n <br/>\n <UrlWrapper>\n {rc.site_url}\n </UrlWrapper>\n </>\n )}\n >\n <div>\n {status}\n </div>\n </WithTooltip>\n );\n};\n\nconst UrlWrapper = styled.div`\n white-space: break-spaces;\n word-wrap: none;\n`;\n\nconst LASTSYNC_TOOLTIP_RANGES = [\n RelativeRanges.STANDARD_UNITS.second,\n RelativeRanges.STANDARD_UNITS.minute,\n RelativeRanges.STANDARD_UNITS.hour,\n];\n\nconst labelStyle = css`\n font-size: 12px;\n color: white;\n border-radius: 4px;\n padding: 2px 4px;\n`;\n\nconst ConnectedLabel = styled.strong`\n ${labelStyle};\n background-color: #3DB887;\n`;\n\nconst PendingConnectionLabel = styled.strong`\n ${labelStyle};\n background-color: #F5AB00;\n`;\n\nconst OfflineConnectionLabel = styled.strong`\n ${labelStyle};\n background-color: #C43133;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport DropdownInput from 'components/dropdown_input';\n\nexport type Props = {\n value: string;\n teamsById: IDMappedObjects<Team>;\n onChange: (teamId: string) => void;\n testId: string;\n legend?: string;\n}\n\nconst TeamSelector = (props: Props): JSX.Element => {\n const value = props.teamsById[props.value];\n\n const {locale} = useIntl();\n\n const handleTeamChange: ComponentProps<typeof DropdownInput>['onChange'] = useCallback((e) => {\n const teamId = e.value;\n props.onChange(teamId);\n }, []);\n\n const teamValues = Object.values(props.teamsById).\n map((team) => ({value: team.id, label: team.display_name})).\n sort((teamA, teamB) => teamA.label.localeCompare(teamB.label, locale));\n\n return (\n <DropdownInput\n className='team_selector'\n testId={props.testId}\n required={true}\n onChange={handleTeamChange}\n value={value ? {label: value.display_name, value: value.id} : undefined}\n options={teamValues}\n name='team_selector'\n legend={props.legend}\n />\n );\n};\n\nexport default TeamSelector;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {ClientError} from '@mattermost/client';\nimport {GenericModal} from '@mattermost/components';\nimport type {RemoteCluster, RemoteClusterAcceptInvite} from '@mattermost/types/remote_clusters';\nimport type {PartialExcept} from '@mattermost/types/utilities';\n\nimport LoadingScreen from 'components/loading_screen';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport {ModalFieldset, ModalParagraph} from '../controls';\nimport TeamSelector from '../team_selector';\nimport {isErrorState, isPendingState, useTeamOptions} from '../utils';\n\ntype Props = {\n creating?: boolean;\n password?: string;\n onConfirm: (accept: PartialExcept<RemoteClusterAcceptInvite, 'display_name' | 'default_team_id' | 'invite' | 'password'>) => Promise<RemoteCluster>;\n onCancel?: () => void;\n onExited: () => void;\n onHide: () => void;\n}\n\nconst noop = () => {};\n\nfunction SecureConnectionAcceptInviteModal({\n onExited,\n onCancel,\n onConfirm,\n onHide,\n}: Props) {\n const {formatMessage} = useIntl();\n const [displayName, setDisplayName] = useState('');\n const [defaultTeamId, setDefaultTeamId] = useState('');\n const [inviteCode, setInviteCode] = useState('');\n const [password, setPassword] = useState('');\n const [saving, setSaving] = useState<boolean | ClientError>(false);\n\n const teamsById = useTeamOptions();\n\n const need = {\n displayName: !displayName,\n defaultTeamId: !defaultTeamId,\n inviteCode: !inviteCode,\n password: !password,\n };\n\n const formFilled = Object.values(need).every((x) => !x);\n\n const handleConfirm = async () => {\n setSaving(true);\n\n try {\n await onConfirm({\n display_name: displayName,\n default_team_id: defaultTeamId,\n invite: inviteCode,\n password,\n });\n setSaving(false);\n onHide();\n } catch (err) {\n setSaving(err);\n }\n };\n\n const handleDisplayNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setDisplayName(e.target.value);\n };\n\n const handleInviteCodeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInviteCode(e.target.value);\n };\n\n const handlePasswordChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setPassword(e.target.value);\n };\n\n const title = formatMessage({\n id: 'admin.secure_connections.accept_invite.share_title',\n defaultMessage: 'Accept a connection invite',\n });\n\n const confirmButtonText = formatMessage({\n id: 'admin.secure_connections.accept_invite.confirm.done.button',\n defaultMessage: 'Accept',\n });\n\n return (\n <GenericModal\n confirmButtonText={confirmButtonText}\n isConfirmDisabled={!formFilled || isPendingState(saving)}\n handleCancel={onCancel ?? noop}\n handleConfirm={handleConfirm}\n handleEnterKeyPress={handleConfirm}\n modalHeaderText={title}\n onExited={onExited}\n compassDesign={true}\n bodyOverflowVisible={true}\n autoCloseOnConfirmButton={false}\n errorText={isErrorState(saving) && (\n <FormattedMessage\n id='admin.secure_connections.accept_invite.saving_changes_error'\n defaultMessage='There was an error while accepting the invite.'\n />\n )}\n >\n {isPendingState(saving) ? (\n <LoadingScreen/>\n ) : (\n <>\n <FormattedMessage\n id={'admin.secure_connections.accept_invite.prompt'}\n defaultMessage={'Accept a secure connection from another server'}\n tagName={ModalParagraph}\n />\n <ModalFieldset>\n <Input\n type='text'\n name='display-name'\n containerClassName='secure-connections-modal-input'\n placeholder={formatMessage({\n id: 'admin.secure_connections.accept_invite.organization_name',\n defaultMessage: 'Organization name',\n })}\n value={displayName}\n onChange={handleDisplayNameChange}\n data-testid='display-name'\n />\n\n <FormattedMessage\n id={'admin.secure_connections.accept_invite.select_team'}\n defaultMessage={'Please select the destination team where channels will be placed.'}\n tagName={ModalParagraph}\n />\n <TeamSelector\n testId='destination-team-input'\n value={defaultTeamId}\n teamsById={teamsById}\n onChange={setDefaultTeamId}\n legend={formatMessage({\n id: 'admin.secure_connections.accept_invite.select_team.legend',\n defaultMessage: 'Select a team',\n })}\n />\n\n <FormattedMessage\n id={'admin.secure_connections.accept_invite.prompt_invite_password'}\n defaultMessage={'Enter the encrypted invitation code shared to you by the admin of the server you are connecting with.'}\n tagName={ModalParagraph}\n />\n <Input\n type='text'\n name='invite-code'\n containerClassName='secure-connections-modal-input'\n placeholder={formatMessage({\n id: 'admin.secure_connections.accept_invite.invite_code',\n defaultMessage: 'Encrypted invitation code',\n })}\n value={inviteCode}\n onChange={handleInviteCodeChange}\n data-testid='invite-code'\n />\n <Input\n type='text'\n name='password'\n containerClassName='secure-connections-modal-input'\n placeholder={formatMessage({\n id: 'admin.secure_connections.accept_invite.password',\n defaultMessage: 'Password',\n })}\n value={password}\n onChange={handlePasswordChange}\n data-testid='password'\n />\n </ModalFieldset>\n </>\n )}\n </GenericModal>\n );\n}\n\nexport default SecureConnectionAcceptInviteModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {CheckIcon, ContentCopyIcon} from '@mattermost/compass-icons/components';\nimport {GenericModal} from '@mattermost/components';\nimport type {RemoteCluster} from '@mattermost/types/remote_clusters';\n\nimport useCopyText, {messages as copymsg} from 'components/common/hooks/useCopyText';\nimport LoadingScreen from 'components/loading_screen';\nimport SectionNotice from 'components/section_notice';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport {Button, ModalFieldset, ModalNoticeWrapper, ModalParagraph} from '../controls';\n\ntype Props = {\n creating?: boolean;\n onConfirm: () => Promise<{remoteCluster: RemoteCluster; share: {invite: string; password: string}} | undefined>;\n onCancel?: () => void;\n onExited: () => void;\n}\n\nconst noop = () => {};\n\nfunction SecureConnectionCreateInviteModal({\n creating,\n onExited,\n onCancel,\n onConfirm,\n}: Props) {\n const {formatMessage} = useIntl();\n const [inviteCode, setInviteCode] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n\n const {copiedRecently: inviteCopied, onClick: copyInvite} = useCopyText({text: inviteCode});\n const {copiedRecently: passwordCopied, onClick: copyPassword} = useCopyText({text: password});\n\n useEffect(() => {\n handleConfirm();\n }, []);\n\n const done = Boolean(inviteCode && password);\n\n const handleConfirm = async () => {\n if (done) {\n return;\n }\n\n setLoading(true);\n\n const result = await onConfirm();\n setLoading(false);\n\n if (result) {\n const {share} = result;\n setInviteCode(share.invite);\n setPassword(share.password);\n }\n };\n\n const handlePasswordChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setPassword(e.target.value);\n };\n\n let title = formatMessage({\n id: 'admin.secure_connections.create_invite.share_title',\n defaultMessage: 'Invitation code',\n });\n\n if (creating) {\n title = done ? formatMessage({\n id: 'admin.secure_connections.create_invite.create_title_done',\n defaultMessage: 'Connection created',\n }) : formatMessage({\n id: 'admin.secure_connections.create_invite.create_title',\n defaultMessage: 'Create connection',\n });\n }\n\n const message = (\n <FormattedMessage\n id={'admin.secure_connections.create_invite.share.message'}\n defaultMessage={'Please share the invitation code and password with the administrator of the server you want to connect with.'}\n tagName={ModalParagraph}\n />\n );\n\n const confirmButtonText = done ? formatMessage({\n id: 'admin.secure_connections.create_invite.confirm.done.button',\n defaultMessage: 'Done',\n }) : formatMessage({\n id: 'admin.secure_connections.create_invite.confirm.save.button',\n defaultMessage: 'Save',\n });\n\n const notice = done ? (\n <ModalNoticeWrapper>\n <SectionNotice\n title={formatMessage({\n id: 'admin.secure_connections.create_invite.create_invite.notice.title',\n defaultMessage: 'Share these two separately to avoid a security compromise',\n })}\n type='warning'\n />\n </ModalNoticeWrapper>\n ) : undefined;\n\n return (\n <GenericModal\n confirmButtonText={confirmButtonText}\n isConfirmDisabled={!done}\n handleCancel={onCancel ?? noop}\n handleConfirm={handleConfirm}\n handleEnterKeyPress={handleConfirm}\n modalHeaderText={title}\n onExited={onExited}\n compassDesign={true}\n autoCloseOnConfirmButton={done}\n backdrop='static'\n >\n {loading ? (\n <LoadingScreen/>\n ) : (\n <>\n {message}\n {notice}\n <ModalFieldset\n legend={done ? formatMessage({\n id: 'admin.secure_connections.create_invite.share.label',\n defaultMessage: 'Share this code and password',\n }) : undefined}\n >\n {inviteCode && (\n <Input\n type='text'\n name='invite-code'\n containerClassName='secure-connections-modal-input'\n placeholder={formatMessage({\n id: 'admin.secure_connections.create_invite.share.invite_code',\n defaultMessage: 'Encrypted invitation code',\n })}\n value={inviteCode}\n data-testid='invite-code'\n readOnly={true}\n addon={(\n <Button onClick={copyInvite}>\n {inviteCopied ? copied : copy}\n </Button>\n )}\n />\n )}\n <Input\n type='text'\n name='password'\n containerClassName='secure-connections-modal-input'\n placeholder={formatMessage({\n id: 'admin.secure_connections.create_invite.share.password',\n defaultMessage: 'Password',\n })}\n value={password}\n onChange={handlePasswordChange}\n data-testid='password'\n readOnly={done}\n addon={done ? (\n <Button onClick={copyPassword}>\n {passwordCopied ? copied : copy}\n </Button>\n ) : undefined}\n\n />\n </ModalFieldset>\n </>\n )}\n </GenericModal>\n );\n}\n\nconst copy = (\n <>\n <ContentCopyIcon size={18}/>\n <FormattedMessage {...copymsg.copy}/>\n </>\n);\n\nconst copied = (\n <>\n <CheckIcon size={18}/>\n <FormattedMessage {...copymsg.copied}/>\n </>\n);\n\nexport default SecureConnectionCreateInviteModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\n\ntype Props = {\n displayName: string;\n onConfirm: () => void;\n onCancel?: () => void;\n onExited: () => void;\n}\n\nconst noop = () => {};\n\nfunction SecureConnectionDeleteModal({\n displayName,\n onExited,\n onCancel,\n onConfirm,\n}: Props) {\n const {formatMessage} = useIntl();\n\n const title = formatMessage({\n id: 'admin.secure_connections.confirm.delete.title',\n defaultMessage: 'Delete secure connection',\n });\n\n const confirmButtonText = formatMessage({\n id: 'admin.secure_connections.confirm.delete.button',\n defaultMessage: 'Yes, delete',\n });\n\n const message = (\n <FormattedMessage\n id={'admin.secure_connections.confirm.delete.text'}\n defaultMessage={'Are you sure you want to delete the secure connection <strong>{displayName}</strong>?'}\n values={{\n strong: (chunk: string) => <strong>{chunk}</strong>,\n displayName,\n }}\n />\n );\n\n return (\n <GenericModal\n confirmButtonText={confirmButtonText}\n handleCancel={onCancel ?? noop}\n handleConfirm={onConfirm}\n modalHeaderText={title}\n onExited={onExited}\n compassDesign={true}\n isDeleteModal={true}\n >\n {message}\n </GenericModal>\n );\n}\n\nexport default SecureConnectionDeleteModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps, DependencyList} from 'react';\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {ArchiveOutlineIcon, GlobeIcon, LockIcon} from '@mattermost/compass-icons/components';\nimport type IconProps from '@mattermost/compass-icons/components/props';\nimport {GenericModal} from '@mattermost/components';\nimport type {Channel, ChannelWithTeamData} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {searchAllChannels} from 'mattermost-redux/actions/channels';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport SectionNotice from 'components/section_notice';\nimport ChannelsInput from 'components/widgets/inputs/channels_input';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport type {SharedChannelsAddResult} from './modal_utils';\n\nimport {ModalBody, ModalParagraph} from '../controls';\nimport {useSharedChannelRemotes} from '../utils';\n\ntype Props = {\n onConfirm: (channels: Channel[]) => Promise<SharedChannelsAddResult>;\n onCancel?: () => void;\n onExited: () => void;\n remoteId: string;\n onHide: () => void;\n}\n\nconst noop = () => {};\n\nfunction SharedChannelsAddModal({\n onExited,\n onCancel,\n onConfirm,\n onHide: close,\n remoteId,\n}: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const [remotesByChannelId] = useSharedChannelRemotes(remoteId);\n\n const [query, setQuery] = useState('');\n const [channels, setChannelsInner] = useState<ChannelWithTeamData[]>([]);\n const [errors, setErrors] = useState<{[channel_id: string]: ServerError}>();\n const [done, setDone] = useState(false);\n\n const setChannels = useCallback((nextChannels: ChannelWithTeamData[] | undefined) => {\n setErrors((errs) => {\n if (!errs || !nextChannels?.length) {\n return undefined;\n }\n\n // keep any errors for selected channels; discard errors of deselected channels\n return nextChannels.reduce<typeof errors>((nextErrs, {id}) => {\n if (!errs[id]) {\n return nextErrs;\n }\n return {...nextErrs, [id]: errs[id]};\n }, {});\n });\n\n setChannelsInner(nextChannels ?? []);\n setDone(false);\n }, []);\n\n const loadChannels = useLatest(async (signal, query: string) => {\n if (!query) {\n return [];\n }\n\n const {data} = await dispatch(searchAllChannels(query, {page: 0, per_page: 20, exclude_remote: true, signal}));\n if (data) {\n return data.channels.filter(({id}) => {\n const remote = remotesByChannelId?.[id];\n\n if (remote && remote.delete_at === 0) {\n // exclude channels already shared with this remote\n return false;\n }\n\n if (remote && remote.delete_at !== 0) {\n // include channels previously shared with this remote\n return true;\n }\n\n // include channels never associated with this remote\n return true;\n });\n }\n\n return [];\n }, [searchAllChannels, remotesByChannelId], {delay: TYPING_DELAY_MS});\n\n const formatLabel: ComponentProps<typeof ChannelsInput<ChannelWithTeamData>>['formatOptionLabel'] = (channel) => {\n return (\n <>\n <ChannelLabel channel={channel}/>\n <SecondaryTextRight className='selected-hidden'>{'~'}{channel.name}</SecondaryTextRight>\n <SecondaryTextRight className='selected-hidden'>{channel.team_display_name}</SecondaryTextRight>\n </>\n );\n };\n\n const handleConfirm = async () => {\n if (done) {\n close();\n return;\n }\n\n const {errors: errs} = await onConfirm(channels);\n\n if (Object.keys(errs).length) {\n setErrors(errs);\n setDone(true);\n } else {\n close();\n }\n };\n\n return (\n <GenericModal\n modalHeaderText={(\n <FormattedMessage\n id='admin.secure_connections.shared_channels.add.title'\n defaultMessage='Select channels'\n />\n )}\n confirmButtonText={done ? (\n <FormattedMessage\n id='admin.secure_connections.shared_channels.add.close.button'\n defaultMessage='Close'\n />\n ) : (\n <FormattedMessage\n id='admin.secure_connections.shared_channels.add.confirm.button'\n defaultMessage='Share'\n />\n )}\n handleCancel={onCancel ?? noop}\n handleConfirm={handleConfirm}\n autoCloseOnConfirmButton={false}\n onExited={onExited}\n compassDesign={true}\n bodyPadding={false}\n bodyOverflowVisible={true}\n isConfirmDisabled={!channels.length}\n >\n <ModalBody>\n <FormattedMessage\n tagName={ModalParagraph}\n id={'admin.secure_connections.shared_channels.add.message'}\n defaultMessage={'Please select a team and channels to share'}\n />\n\n <ChannelsInput\n placeholder={\n <FormattedMessage\n id='admin.secure_connections.shared_channels.add.input_placeholder'\n defaultMessage='e.g. {channel_name}'\n values={{channel_name: Constants.DEFAULT_CHANNEL_UI_NAME}}\n />\n }\n ariaLabel={formatMessage({\n id: 'admin.secure_connections.shared_channels.add.input_label',\n defaultMessage: 'Search and add channels',\n })}\n channelsLoader={loadChannels}\n inputValue={query}\n onInputChange={setQuery}\n value={channels}\n onChange={setChannels}\n autoFocus={true}\n formatOptionLabel={formatLabel}\n />\n {errors && Object.entries(errors).map(([id, err]) => {\n return (\n <ChannelError\n key={id}\n id={id}\n err={err}\n />\n );\n })}\n </ModalBody>\n </GenericModal>\n );\n}\n\nconst ChannelError = (props: {id: string; err: ServerError}) => {\n const channel = useSelector((state: GlobalState) => getChannel(state, props.id));\n\n const channelLabel = channel ? (\n <ChannelLabel\n bold={true}\n channel={channel}\n />\n ) : props.id;\n\n let message = (\n <FormattedMessage\n id='admin.secure_connections.shared_channels.add.error.inviting_remote_to_channel'\n defaultMessage='{channel} could not be added to this connection.'\n values={{channel: channelLabel}}\n />\n );\n\n if (props.err.server_error_id === 'api.command_share.channel_invite_not_home.error') {\n message = (\n <FormattedMessage\n id='admin.secure_connections.shared_channels.add.error.channel_invite_not_home'\n defaultMessage='{channel} could not be added to this connection because it originates from another connection.'\n values={{channel: channelLabel}}\n />\n );\n }\n\n return (\n <SectionNotice\n title={message}\n type='danger'\n />\n );\n};\n\nconst ChannelLabelWrapper = styled.span`\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n svg {\n vertical-align: middle;\n margin-left: 6px;\n margin-right: 10px;\n }\n\n .channels-input__multi-value__label & {\n font-weight: 600;\n }\n`;\n\nconst ChannelLabel = ({channel, bold}: {channel: Channel; bold?: boolean}) => {\n const ChannelDisplayName = bold ? 'strong' : 'span';\n\n return (\n <ChannelLabelWrapper>\n <ChannelIcon\n channel={channel}\n size={20}\n color='rgba(var(--center-channel-color-rgb), 0.64)'\n />\n <ChannelDisplayName>{channel?.display_name}</ChannelDisplayName>\n </ChannelLabelWrapper>\n );\n};\n\nconst ChannelIcon = ({channel, size = 16, ...otherProps}: {channel: Channel} & IconProps) => {\n let Icon = GlobeIcon;\n\n if (channel?.type === Constants.PRIVATE_CHANNEL) {\n Icon = LockIcon;\n }\n\n if (isArchivedChannel(channel)) {\n Icon = ArchiveOutlineIcon;\n }\n\n return (\n <Icon\n size={size}\n {...otherProps}\n />\n );\n};\n\nconst SecondaryTextRight = styled.span`\n color: rgba(var(--center-channel-color-rgb), 0.64);\n padding-left: 5px;\n\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n &:last-child {\n margin-left: auto;\n }\n`;\n\nexport default SharedChannelsAddModal;\n\nconst TYPING_DELAY_MS = 250;\n\n/**\n * Auto-cancels any prior func calls that are still pending\n * @param func cancelable func; the provided signal will be aborted if any subsequent func calls are made\n */\nexport const useLatest = <TArgs extends unknown[], TResult>(func: (signal: AbortSignal, ...args: TArgs) => Promise<TResult>, deps: DependencyList, opts?: {delay: number}) => {\n const r = useRef<{controller: AbortController; handler?: NodeJS.Timeout}>();\n\n const start = useCallback(() => {\n r.current = {controller: new AbortController()};\n return r.current;\n }, []);\n\n const cancel = useCallback(() => {\n if (!r.current) {\n return;\n }\n const {controller: abort, handler} = r.current;\n abort.abort(new DOMException('stale request'));\n if (handler) {\n clearTimeout(handler);\n }\n\n r.current = undefined;\n }, []);\n\n useEffect(() => cancel, [cancel]);\n\n return useCallback(async (...args: TArgs) => {\n cancel();\n const currentRequest = start();\n\n return new Promise<TResult>((resolve, reject) => {\n currentRequest.handler = setTimeout(async () => {\n func(currentRequest.controller.signal, ...args).then(resolve, reject);\n }, opts?.delay || TYPING_DELAY_MS);\n });\n }, [start, cancel, ...deps]);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {ModalBody, ModalParagraph} from '../controls';\n\ntype Props = {\n onConfirm: () => void;\n onCancel?: () => void;\n onExited: () => void;\n}\n\nconst noop = () => {};\n\nfunction SharedChannelsRemoveModal({\n onExited,\n onCancel,\n onConfirm,\n}: Props) {\n const handleConfirm = () => {\n onConfirm();\n };\n\n return (\n <GenericModal\n modalHeaderText={(\n <FormattedMessage\n id='admin.secure_connections.shared_channels.confirm.remove.title'\n defaultMessage='Remove channel'\n />\n )}\n handleCancel={onCancel ?? noop}\n handleConfirm={handleConfirm}\n confirmButtonText={(\n <FormattedMessage\n id='admin.secure_connections.shared_channels.confirm.remove.button'\n defaultMessage='Remove'\n />\n )}\n onExited={onExited}\n compassDesign={true}\n isDeleteModal={true}\n bodyPadding={false}\n >\n <ModalBody>\n <FormattedMessage\n tagName={ModalParagraph}\n id={'admin.secure_connections.shared_channels.confirm.remove.message'}\n defaultMessage={'The channel will be removed from this connection and will no longer be shared with it.'}\n />\n </ModalBody>\n </GenericModal>\n );\n}\n\nexport default SharedChannelsRemoveModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Link, useHistory} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport {DotsHorizontalIcon, CodeTagsIcon, PencilOutlineIcon, TrashCanOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {RemoteCluster} from '@mattermost/types/remote_clusters';\n\nimport * as Menu from 'components/menu';\n\nimport {ConnectionStatusLabel} from './controls';\nimport {useRemoteClusterCreateInvite, useRemoteClusterDelete} from './modals/modal_utils';\nimport {getEditLocation, isConfirmed} from './utils';\n\ntype Props = {\n remoteCluster: RemoteCluster;\n onDeleteSuccess: () => void;\n disabled: boolean;\n};\n\nexport default function SecureConnectionRow(props: Props) {\n const {remoteCluster: rc} = props;\n\n const titleId = `${rc.remote_id}-title`;\n\n return (\n <RowLink\n to={getEditLocation(rc)}\n aria-labelledby={titleId}\n >\n <Title id={titleId}>{rc.display_name}</Title>\n <Detail>\n <ConnectionStatusLabel rc={rc}/>\n <RowMenu {...props}/>\n </Detail>\n </RowLink>\n );\n}\n\nconst menuId = 'secure_connection_row_menu';\n\nconst RowMenu = ({remoteCluster: rc, onDeleteSuccess, disabled}: Props) => {\n const {formatMessage} = useIntl();\n const history = useHistory<RemoteCluster>();\n const {promptDelete} = useRemoteClusterDelete(rc);\n const {promptCreateInvite} = useRemoteClusterCreateInvite(rc);\n\n const handleCreateInvite = () => {\n promptCreateInvite();\n };\n\n const handleEdit = () => {\n history.push(getEditLocation(rc));\n };\n\n const handleDelete = () => {\n promptDelete().then(onDeleteSuccess);\n };\n\n return (\n <Menu.Container\n menuButton={{\n id: `${menuId}-button-${rc.remote_id}`,\n class: classNames('btn btn-tertiary btn-sm connection-row-menu-button', {disabled}),\n disabled,\n children: !disabled && <DotsHorizontalIcon size={16}/>,\n 'aria-label': formatMessage({id: 'admin.secure_connection_row.menu-button.aria_label', defaultMessage: 'Connection options for {connection}'}, {connection: rc.display_name}),\n }}\n menu={{\n id: menuId,\n 'aria-label': formatMessage({id: 'admin.secure_connection_row.menu.aria_label', defaultMessage: 'secure connection row menu'}),\n }}\n >\n {!isConfirmed(rc) && (\n <Menu.Item\n id={`${menuId}-generate_invite`}\n leadingElement={<CodeTagsIcon size={18}/>}\n labels={(\n <FormattedMessage\n id='admin.secure_connection_row.menu.share'\n defaultMessage='Generate invitation code'\n />\n )}\n onClick={handleCreateInvite}\n />\n )}\n <Menu.Item\n id={`${menuId}-edit`}\n leadingElement={<PencilOutlineIcon size={18}/>}\n labels={(\n <FormattedMessage\n id='admin.secure_connection_row.menu.edit'\n defaultMessage='Edit'\n />\n )}\n onClick={handleEdit}\n />\n <Menu.Item\n id={`${menuId}-delete`}\n isDestructive={true}\n leadingElement={<TrashCanOutlineIcon size={18}/>}\n labels={(\n <FormattedMessage\n id='admin.secure_connection_row.menu.delete'\n defaultMessage='Delete'\n />\n )}\n onClick={handleDelete}\n />\n </Menu.Container>\n );\n};\n\nconst RowLink = styled(Link<RemoteCluster>).attrs({className: 'secure-connection'})`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 35px;\n border-bottom: 1px solid var(--center-channel-color-12, rgba(63, 67, 80, 0.12));\n color: var(--center-channel-color);\n\n &:hover {\n text-decoration: none;\n color: var(--center-channel-color);\n }\n\n &:last-child {\n border-bottom: 0;\n }\n\n .connection-row-menu-button {\n padding: 0px 8px;\n }\n`;\n\nconst Title = styled.strong`\n font-size: 14px;\n`;\n\nconst Detail = styled.div`\n display: flex;\n gap: 20px;\n align-items: center;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useState} from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {StatusOK} from '@mattermost/types/client4';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {RemoteClusterPatch, RemoteCluster, RemoteClusterAcceptInvite} from '@mattermost/types/remote_clusters';\nimport type {PartialExcept} from '@mattermost/types/utilities';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {cleanUpUrlable} from 'utils/url';\n\nimport SecureConnectionAcceptInviteModal from './secure_connection_accept_invite_modal';\nimport SecureConnectionCreateInviteModal from './secure_connection_create_invite_modal';\nimport SecureConnectionDeleteModal from './secure_connection_delete_modal';\nimport SharedChannelsAddModal from './shared_channels_add_modal';\nimport SharedChannelsRemoveModal from './shared_channels_remove_modal';\n\nimport type {TLoadingState} from '../utils';\n\nconst chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~_!@-#$^';\nconst makePassword = () => {\n return Array.from(window.crypto.getRandomValues(new Uint32Array(16))).\n map((n) => chars[n % chars.length]).\n join('');\n};\n\nexport const useRemoteClusterCreate = () => {\n const dispatch = useDispatch();\n const [saving, setSaving] = useState<TLoadingState>(false);\n\n const promptCreate = (patch: RemoteClusterPatch) => {\n return new Promise<RemoteCluster | undefined>((resolve, reject) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SECURE_CONNECTION_CREATE_INVITE,\n dialogType: SecureConnectionCreateInviteModal,\n dialogProps: {\n creating: true,\n onConfirm: async () => {\n try {\n setSaving(true);\n const response = await Client4.createRemoteCluster({\n ...patch,\n name: cleanUpUrlable(patch.display_name),\n });\n setSaving(false);\n\n if (response) {\n const {invite, password, remote_cluster: remoteCluster} = response;\n\n resolve(remoteCluster);\n return {remoteCluster, share: {invite, password}};\n }\n } catch (err) {\n // handle create error\n reject(err);\n }\n setSaving(false);\n return undefined;\n },\n },\n }));\n });\n };\n\n return {promptCreate, saving};\n};\n\nexport const useRemoteClusterCreateInvite = (remoteCluster: RemoteCluster) => {\n const dispatch = useDispatch();\n const [saving, setSaving] = useState<TLoadingState>(false);\n\n const promptCreateInvite = () => {\n return new Promise<RemoteCluster>((resolve, reject) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SECURE_CONNECTION_CREATE_INVITE,\n dialogType: SecureConnectionCreateInviteModal,\n dialogProps: {\n onConfirm: async () => {\n try {\n const password = makePassword();\n setSaving(true);\n const invite = await Client4.generateInviteRemoteCluster(remoteCluster.remote_id, {password});\n setSaving(false);\n resolve(remoteCluster);\n return {remoteCluster, share: {invite, password}};\n } catch (err) {\n // handle create error\n reject(err);\n }\n setSaving(false);\n return undefined;\n },\n },\n }));\n });\n };\n\n return {promptCreateInvite, saving} as const;\n};\n\nexport const useRemoteClusterAcceptInvite = () => {\n const dispatch = useDispatch();\n const [saving, setSaving] = useState<TLoadingState>(false);\n\n const promptAcceptInvite = () => {\n return new Promise<RemoteCluster>((resolve, reject) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SECURE_CONNECTION_ACCEPT_INVITE,\n dialogType: SecureConnectionAcceptInviteModal,\n dialogProps: {\n onConfirm: async (acceptInvite: PartialExcept<RemoteClusterAcceptInvite, 'display_name' | 'default_team_id' | 'invite' | 'password'>) => {\n try {\n setSaving(true);\n const rc = await Client4.acceptInviteRemoteCluster({\n ...acceptInvite,\n name: cleanUpUrlable(acceptInvite.display_name),\n });\n setSaving(false);\n resolve(rc);\n return rc;\n } catch (err) {\n // handle create error\n reject(err);\n setSaving(err);\n throw (err);\n }\n },\n },\n }));\n });\n };\n\n return {promptAcceptInvite, saving} as const;\n};\n\nexport const useRemoteClusterDelete = (rc: RemoteCluster) => {\n const dispatch = useDispatch();\n const promptDelete = () => {\n return new Promise((resolve, reject) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SECURE_CONNECTION_DELETE,\n dialogType: SecureConnectionDeleteModal,\n dialogProps: {\n displayName: rc.display_name,\n onConfirm: () => Client4.deleteRemoteCluster(rc.remote_id).then(resolve, reject),\n },\n }));\n });\n };\n\n return {promptDelete} as const;\n};\n\nexport const useSharedChannelsRemove = (remoteId: string) => {\n const dispatch = useDispatch();\n const promptRemove = (channelId: string) => {\n return new Promise((resolve, reject) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SHARED_CHANNEL_REMOTE_UNINVITE,\n dialogType: SharedChannelsRemoveModal,\n dialogProps: {\n onConfirm: () => Client4.sharedChannelRemoteUninvite(remoteId, channelId).then(resolve, reject),\n },\n }));\n });\n };\n\n return {promptRemove};\n};\n\nexport type SharedChannelsAddResult = {\n data: {[channel_id: string]: PromiseSettledResult<StatusOK>};\n errors: {[channel_id: string]: ServerError};\n}\nexport const useSharedChannelsAdd = (remoteId: string) => {\n const dispatch = useDispatch();\n const promptAdd = () => {\n return new Promise((resolve) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SHARED_CHANNEL_REMOTE_INVITE,\n dialogType: SharedChannelsAddModal,\n dialogProps: {\n remoteId,\n onConfirm: async (channels: Channel[]) => {\n const result: SharedChannelsAddResult = {data: {}, errors: {}};\n const {data, errors} = result;\n\n const requests = channels.map(({id}) => Client4.sharedChannelRemoteInvite(remoteId, id));\n (await Promise.allSettled(requests)).forEach((r, i) => {\n if (r.status === 'rejected' && r.reason.server_error_id) {\n errors[channels[i].id] = r.reason;\n } else if (r.status === 'fulfilled') {\n data[channels[i].id] = r;\n }\n });\n\n resolve(result);\n return result;\n },\n },\n }));\n });\n };\n\n return {promptAdd};\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {ReactNode} from 'react';\nimport React from 'react';\nimport {useIntl, FormattedMessage, defineMessages} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport LoadingScreen from 'components/loading_screen';\nimport * as Menu from 'components/menu';\nimport SectionNotice from 'components/section_notice';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport BuildingSvg from './building.svg';\nimport {AdminSection, SectionHeader, SectionHeading, SectionContent, PlaceholderContainer, PlaceholderHeading} from './controls';\nimport {useRemoteClusterAcceptInvite} from './modals/modal_utils';\nimport SecureConnectionRow from './secure_connection_row';\nimport {getCreateLocation, getEditLocation, useRemoteClusters} from './utils';\n\nimport type {SearchableStrings} from '../types';\n\nexport default function SecureConnections() {\n const [remoteClusters, {loading, error, fetch}] = useRemoteClusters();\n\n const serviceNotRunning = error?.server_error_id === 'api.remote_cluster.service_not_enabled.app_error';\n const disabled = loading || serviceNotRunning;\n\n const placeholder = loading ? <LoadingScreen/> : (\n <Placeholder\n disabled={disabled}\n serviceNotRunning={serviceNotRunning}\n />\n );\n\n return (\n <div\n className='wrapper--fixed'\n data-testid='secureConnectionsSection'\n >\n <AdminHeader>\n <FormattedMessage {...msg.pageTitle}/>\n </AdminHeader>\n <AdminWrapper>\n <AdminSection>\n <SectionHeader>\n <hgroup>\n <FormattedMessage\n tagName={SectionHeading}\n {...msg.title}\n />\n <FormattedMessage {...msg.subtitle}/>\n </hgroup>\n <AddMenu disabled={disabled}/>\n </SectionHeader>\n {remoteClusters?.map((rc) => {\n return (\n <SecureConnectionRow\n key={rc.remote_id}\n remoteCluster={rc}\n onDeleteSuccess={fetch}\n disabled={disabled}\n />\n );\n }) ?? placeholder}\n </AdminSection>\n </AdminWrapper>\n </div>\n );\n}\n\nconst AdminWrapper = (props: {children: ReactNode}) => {\n return (\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {props.children}\n </div>\n </div>\n );\n};\n\nconst Placeholder = ({disabled, serviceNotRunning}: {disabled: boolean; serviceNotRunning: boolean}) => {\n return (\n <SectionContent>\n {serviceNotRunning && (\n <SectionNotice\n type='danger'\n title={(\n <FormattedMessage {...msg.serviceNotRunning}/>\n )}\n />\n )}\n <PlaceholderContainer>\n <BuildingSvg/>\n <hgroup>\n <FormattedMessage\n tagName={PlaceholderHeading}\n {...msg.placeholderTitle}\n />\n <FormattedMessage\n tagName={'p'}\n {...msg.placeholderSubtitle}\n />\n </hgroup>\n <AddMenu\n buttonClassNames='btn-tertiary'\n disabled={disabled}\n />\n </PlaceholderContainer>\n </SectionContent>\n );\n};\n\nconst menuId = 'secure_connections_add_menu';\n\nconst AddMenu = ({buttonClassNames, disabled}: {buttonClassNames?: string; disabled: boolean}) => {\n const {formatMessage} = useIntl();\n const history = useHistory();\n const {promptAcceptInvite} = useRemoteClusterAcceptInvite();\n\n const handleCreate = () => {\n history.push(getCreateLocation());\n };\n\n const handleAccept = async () => {\n const rc = await promptAcceptInvite();\n if (rc) {\n history.push(getEditLocation(rc));\n }\n };\n\n return (\n <Menu.Container\n menuButton={{\n id: `${menuId}-button`,\n class: classNames('btn', buttonClassNames ?? 'btn-primary btn-sm', {disabled}),\n disabled,\n children: (\n <>\n <FormattedMessage {...msg.addConnection}/>\n {!disabled && (\n <i\n aria-hidden='true'\n className='icon icon-chevron-down'\n />\n )}\n </>\n ),\n }}\n menu={{\n id: menuId,\n 'aria-label': formatMessage(msg.menuAriaLabel),\n }}\n >\n <Menu.Item\n id={`${menuId}-add_connection`}\n labels={<FormattedMessage {...msg.createConnection}/>}\n onClick={handleCreate}\n />\n <Menu.Item\n id={`${menuId}-accept_invitation`}\n labels={<FormattedMessage {...msg.acceptInvitation}/>}\n onClick={handleAccept}\n />\n </Menu.Container>\n );\n};\n\nconst msg = defineMessages({\n pageTitle: {id: 'admin.sidebar.secureConnections', defaultMessage: 'Connected Workspaces (Beta)'},\n title: {id: 'admin.secure_connections.title', defaultMessage: 'Connected Workspaces'},\n subtitle: {id: 'admin.secure_connections.subtitle', defaultMessage: 'Connected workspaces with this server'},\n placeholderTitle: {id: 'admin.secure_connections.placeholder.title', defaultMessage: 'Share channels'},\n placeholderSubtitle: {id: 'admin.secure_connections.placeholder.subtitle', defaultMessage: 'Connecting with an external workspace allows you to share channels with them'},\n addConnection: {id: 'admin.secure_connections.menu.add_connection', defaultMessage: 'Add a connection'},\n menuAriaLabel: {id: 'admin.secure_connections.menu.dropdownAriaLabel', defaultMessage: 'Connected workspaces actions menu'},\n createConnection: {id: 'admin.secure_connections.menu.create_connection', defaultMessage: 'Create a connection'},\n acceptInvitation: {id: 'admin.secure_connections.menu.accept_invitation', defaultMessage: 'Accept an invitation'},\n serviceNotRunning: {id: 'admin.secure_connections.serviceNotRunning', defaultMessage: 'Service not running, please restart server.'},\n});\n\nexport const searchableStrings: SearchableStrings = Object.values(msg);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nfunction ChatSvg() {\n return (\n <svg\n width='106'\n height='96'\n viewBox='0 0 106 96'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_2795_18729)'>\n <path\n d='M53.3987 14.3074H96.044C97.3213 14.2983 98.5878 14.5437 99.7708 15.0297C100.954 15.5156 102.03 16.2324 102.938 17.139C103.846 18.0455 104.567 19.124 105.06 20.3125C105.554 21.501 105.81 22.7762 105.814 24.0648V68.6825C105.809 69.9703 105.552 71.2443 105.058 72.4317C104.564 73.6191 103.842 74.6964 102.934 75.6019C102.027 76.5074 100.951 77.2234 99.7686 77.7087C98.5862 78.194 97.3205 78.4391 96.044 78.43H85.7857V95.1851L70.3787 78.43H53.3987C52.1223 78.4391 50.8565 78.194 49.6742 77.7087C48.4918 77.2234 47.4159 76.5074 46.5083 75.6019C45.6007 74.6964 44.8792 73.6191 44.3851 72.4317C43.891 71.2443 43.634 69.9703 43.6289 68.6825V24.0648C43.6327 22.7762 43.8888 21.501 44.3823 20.3125C44.8758 19.124 45.5972 18.0455 46.5049 17.139C47.4126 16.2324 48.4889 15.5156 49.6719 15.0297C50.8549 14.5437 52.1214 14.2983 53.3987 14.3074Z'\n fill='#1E325C'\n />\n <path\n d='M79.4755 0.893798H9.91436C8.63706 0.884709 7.37058 1.13017 6.18755 1.61609C5.00453 2.10201 3.92826 2.81882 3.02053 3.72539C2.1128 4.63196 1.39147 5.71046 0.89793 6.89897C0.404391 8.08747 0.148358 9.36258 0.144531 10.6512V55.2295C0.149641 56.5173 0.40662 57.7913 0.900733 58.9787C1.39485 60.1661 2.11639 61.2434 3.02399 62.1489C3.93159 63.0544 5.0074 63.7704 6.18979 64.2557C7.37218 64.741 8.63788 64.9861 9.91436 64.977H20.1825V81.7321L35.5895 64.977H79.4755C80.752 64.9861 82.0177 64.741 83.2001 64.2557C84.3824 63.7704 85.4583 63.0544 86.3659 62.1489C87.2735 61.2434 87.995 60.1661 88.4891 58.9787C88.9833 57.7913 89.2402 56.5173 89.2453 55.2295V10.6512C89.2415 9.36258 88.9855 8.08747 88.4919 6.89897C87.9984 5.71046 87.2771 4.63196 86.3693 3.72539C85.4616 2.81882 84.3853 2.10201 83.2023 1.61609C82.0193 1.13017 80.7528 0.884709 79.4755 0.893798Z'\n fill='#FFBC1F'\n />\n <path\n d='M20.9636 26.5684C22.2031 26.5664 23.4152 26.9355 24.4465 27.629C25.4779 28.3224 26.2821 29.309 26.7573 30.4638C27.2325 31.6186 27.3573 32.8897 27.116 34.1161C26.8746 35.3425 26.278 36.4691 25.4016 37.3533C24.5252 38.2374 23.4085 38.8393 22.1928 39.0828C20.977 39.3262 19.717 39.2003 18.5723 38.7209C17.4276 38.2415 16.4497 37.4302 15.7623 36.3898C15.0749 35.3493 14.709 34.1265 14.7109 32.8762C14.7135 31.2041 15.3731 29.6011 16.5452 28.4188C17.7172 27.2364 19.3061 26.571 20.9636 26.5684Z'\n fill='white'\n />\n <path\n d='M44.7136 26.5684C45.9531 26.5664 47.1652 26.9355 48.1965 27.629C49.2279 28.3224 50.0321 29.309 50.5073 30.4638C50.9825 31.6186 51.1073 32.8897 50.866 34.1161C50.6247 35.3425 50.028 36.4691 49.1516 37.3533C48.2752 38.2374 47.1585 38.8393 45.9428 39.0828C44.727 39.3262 43.467 39.2003 42.3223 38.7209C41.1776 38.2415 40.1997 37.4302 39.5123 36.3898C38.8249 35.3493 38.459 34.1265 38.4609 32.8762C38.4635 31.2041 39.1231 29.6011 40.2952 28.4188C41.4672 27.2364 43.0561 26.571 44.7136 26.5684Z'\n fill='white'\n />\n <path\n d='M68.4636 26.5684C69.703 26.5664 70.9152 26.9355 71.9465 27.629C72.9779 28.3224 73.7821 29.309 74.2573 30.4638C74.7325 31.6186 74.8573 32.8897 74.616 34.1161C74.3747 35.3425 73.778 36.4691 72.9016 37.3533C72.0252 38.2374 70.9085 38.8393 69.6928 39.0828C68.477 39.3262 67.2171 39.2003 66.0724 38.7209C64.9276 38.2415 63.9497 37.4302 63.2623 36.3898C62.5749 35.3493 62.209 34.1265 62.2109 32.8762C62.2135 31.2041 62.8731 29.6011 64.0452 28.4188C65.2172 27.2364 66.8061 26.571 68.4636 26.5684Z'\n fill='white'\n />\n </g>\n <defs>\n <clipPath id='clip0_2795_18729'>\n <rect\n width='105.553'\n height='94.2128'\n fill='white'\n transform='translate(0.222656 0.893555)'\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n\nexport default ChatSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {TableMeta} from './list_table';\n\ninterface Props\n extends Pick<TableMeta,\n | 'onPreviousPageClick'\n | 'onNextPageClick'\n | 'disablePrevPage'\n | 'disableNextPage'\n > {\n isLoading?: boolean;\n}\n\nexport function Pagination(props: Props) {\n const {formatMessage} = useIntl();\n\n return (\n <div className='paginationButtons'>\n {props.onPreviousPageClick && (\n <button\n className='btn btn-icon btn-sm'\n disabled={props.disablePrevPage || props.isLoading}\n onClick={props.onPreviousPageClick}\n aria-label={formatMessage({id: 'adminConsole.list.table.pagination.previous', defaultMessage: 'Go to previous page'})}\n >\n <i\n className='icon icon-chevron-left'\n aria-hidden='true'\n />\n </button>\n )}\n {props.onNextPageClick && (\n <button\n className='btn btn-icon btn-sm'\n disabled={props.disableNextPage || props.isLoading}\n onClick={props.onNextPageClick}\n aria-label={formatMessage({id: 'adminConsole.list.table.pagination.next', defaultMessage: 'Go to next page'})}\n >\n <i\n className='icon icon-chevron-right'\n aria-hidden='true'\n />\n </button>\n )}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {SortDirection, Table} from '@tanstack/react-table';\nimport {flexRender} from '@tanstack/react-table';\nimport classNames from 'classnames';\nimport React, {useMemo} from 'react';\nimport type {AriaAttributes, MouseEvent, ReactNode} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\nimport ReactSelect, {components} from 'react-select';\nimport type {IndicatorContainerProps, ValueType} from 'react-select';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {Pagination} from './pagination';\n\nimport './list_table.scss';\n\nconst SORTABLE_CLASS = 'sortable';\nconst PINNED_CLASS = 'pinned';\n\nexport const PAGE_SIZES = [10, 20, 50, 100];\nconst PageSizes = defineMessages<number>({\n 10: {\n id: 'adminConsole.list.table.rowsCount.10',\n defaultMessage: '10',\n },\n 20: {\n id: 'adminConsole.list.table.rowsCount.20',\n defaultMessage: '20',\n },\n 50: {\n id: 'adminConsole.list.table.rowsCount.50',\n defaultMessage: '50',\n },\n 100: {\n id: 'adminConsole.list.table.rowsCount.100',\n defaultMessage: '100',\n },\n});\n\nexport type PageSizeOption = {\n label: string;\n value: number;\n};\n\nexport enum LoadingStates {\n Loading = 'loading',\n Loaded = 'loaded',\n Failed = 'failed',\n}\n\nexport type TableMeta = {\n tableId: string;\n tableCaption?: string;\n loadingState?: LoadingStates;\n emptyDataMessage?: ReactNode;\n onRowClick?: (row: string) => void;\n disablePrevPage?: boolean;\n disableNextPage?: boolean;\n disablePaginationControls?: boolean;\n onPreviousPageClick?: () => void;\n onNextPageClick?: () => void;\n paginationInfo?: ReactNode;\n hasDualSidedPagination?: boolean;\n};\n\ninterface TableMandatoryTypes {\n id: string;\n}\n\ntype Props<TableType extends TableMandatoryTypes> = {\n table: Table<TableType>;\n};\n\n/**\n * A wrapper around the react-table component that provides a consistent look and feel for the admin console list tables.\n * It also provides a default pagination component. This table is not meant to be used outside of the admin console since it relies on the admin console styles.\n *\n * @param {Table} table - See https://tanstack.com/table/v8/docs/api/core/table/ for more details\n */\nexport function ListTable<TableType extends TableMandatoryTypes>(\n props: Props<TableType>,\n) {\n const {formatMessage} = useIntl();\n\n const tableMeta = props.table.options.meta as TableMeta;\n const headerIdPrefix = `${tableMeta.tableId}-header-`;\n const rowIdPrefix = `${tableMeta.tableId}-row-`;\n const cellIdPrefix = `${tableMeta.tableId}-cell-`;\n\n const hasPagination = !tableMeta.disablePaginationControls;\n\n const pageSizeOptions = useMemo(() => {\n return PAGE_SIZES.map((size) => {\n return {\n label: formatMessage(PageSizes[size]),\n value: size,\n };\n });\n }, []);\n\n const selectedPageSize = pageSizeOptions.find((option) => option.value === props.table.getState().pagination.pageSize) || pageSizeOptions[0];\n\n function handlePageSizeChange(selectedOption: ValueType<PageSizeOption>) {\n const {value} = selectedOption as PageSizeOption;\n props.table.setPageSize(Number(value));\n }\n\n function handleRowClick(event: MouseEvent<HTMLTableRowElement>) {\n const {currentTarget: {id = ''}} = event;\n const rowOriginalId = id.replace(rowIdPrefix, '');\n\n if (tableMeta.onRowClick && rowOriginalId.length > 0) {\n event.preventDefault();\n tableMeta.onRowClick(rowOriginalId);\n }\n }\n\n const colCount = props.table.getAllColumns().length;\n const rowCount = props.table.getRowModel().rows.length;\n\n return (\n <div className='adminConsoleListTableContainer'>\n {hasPagination && (\n <div className='adminConsoleListTabletOptionalHead'>\n {tableMeta.hasDualSidedPagination && (\n <>\n {tableMeta.paginationInfo}\n <Pagination\n disablePrevPage={tableMeta.disablePrevPage}\n disableNextPage={tableMeta.disableNextPage}\n isLoading={tableMeta.loadingState === LoadingStates.Loading}\n onPreviousPageClick={tableMeta.onPreviousPageClick}\n onNextPageClick={tableMeta.onNextPageClick}\n />\n </>\n )}\n </div>\n )}\n <table\n id={tableMeta.tableId}\n aria-colcount={colCount}\n aria-describedby={`${tableMeta.tableId}-headerId`} // Set this id to the table header so that the title describes the table\n className={classNames(\n 'adminConsoleListTable',\n tableMeta.tableId,\n )}\n >\n <caption className='sr-only'>{tableMeta.tableCaption}</caption>\n <thead>\n {props.table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n id={`${headerIdPrefix}${header.id}`}\n colSpan={header.colSpan}\n scope='col'\n aria-sort={getAriaSortForTableHeader(header.column.getCanSort(), header.column.getIsSorted())}\n className={classNames(`${header.id}`, {\n [SORTABLE_CLASS]: header.column.getCanSort(),\n [PINNED_CLASS]: header.column.getCanPin(),\n })}\n disabled={header.column.getCanSort() && tableMeta.loadingState === LoadingStates.Loading}\n onClick={header.column.getToggleSortingHandler()}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n\n {/* Sort Icons */}\n {header.column.getIsSorted() === 'asc' && (\n <span\n aria-hidden='true'\n className='icon icon-arrow-up'\n />\n )}\n {header.column.getIsSorted() === 'desc' && (\n <span\n aria-hidden='true'\n className='icon icon-arrow-down'\n />\n )}\n {header.column.getCanSort() &&\n header.column.getIsSorted() !== 'asc' &&\n header.column.getIsSorted() !== 'desc' && (\n <span\n aria-hidden='true'\n className='icon icon-arrow-up hoverSortingIcon'\n />\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {props.table.getRowModel().rows.map((row) => (\n <tr\n id={`${rowIdPrefix}${row.original.id}`}\n key={row.id}\n onClick={handleRowClick}\n >\n {row.getVisibleCells().map((cell) => (\n <td\n key={cell.id}\n id={`${cellIdPrefix}${cell.id}`}\n headers={`${headerIdPrefix}${cell.column.id}`}\n className={classNames(`${cell.column.id}`, {\n [PINNED_CLASS]: cell.column.getCanPin(),\n })}\n >\n {cell.getIsPlaceholder() ? null : flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n\n {/* State where it is initially loading the data */}\n {(tableMeta.loadingState === LoadingStates.Loading && rowCount === 0) && (\n <tr>\n <td\n colSpan={colCount}\n className='noRows'\n disabled={true}\n >\n <LoadingSpinner\n text={formatMessage({id: 'adminConsole.list.table.genericLoading', defaultMessage: 'Loading'})}\n />\n </td>\n </tr>\n )}\n\n {/* State where there is no data */}\n {(tableMeta.loadingState === LoadingStates.Loaded && rowCount === 0) && (\n <tr>\n <td\n colSpan={colCount}\n className='noRows'\n disabled={true}\n >\n {tableMeta.emptyDataMessage || formatMessage({id: 'adminConsole.list.table.genericNoData', defaultMessage: 'No data'})}\n </td>\n </tr>\n )}\n\n {/* State where there is an error loading the data */}\n {tableMeta.loadingState === LoadingStates.Failed && (\n <tr>\n <td\n colSpan={colCount}\n className='noRows'\n disabled={true}\n >\n {formatMessage({id: 'adminConsole.list.table.genericError', defaultMessage: 'There was an error loading the data, please try again'})}\n </td>\n </tr>\n )}\n </tbody>\n <tfoot>\n {props.table.getFooterGroups().map((footerGroup) => (\n <tr key={footerGroup.id}>\n {footerGroup.headers.map((footer) => (\n <th\n key={footer.id}\n colSpan={footer.colSpan}\n className={classNames({\n [PINNED_CLASS]: footer.column.getCanPin(),\n })}\n >\n {footer.isPlaceholder ? null : flexRender(footer.column.columnDef.footer, footer.getContext())}\n </th>\n ))}\n </tr>\n ))}\n </tfoot>\n </table>\n {hasPagination && (\n <div className='adminConsoleListTabletOptionalFoot'>\n {tableMeta.paginationInfo}\n <div\n className='adminConsoleListTablePageSize'\n aria-label={formatMessage({id: 'adminConsole.list.table.rowCount.label', defaultMessage: 'Show {count} rows per page'}, {count: selectedPageSize.label})}\n >\n <FormattedMessage\n id='adminConsole.list.table.rowsCount.(show)rowsPerPage'\n defaultMessage='Show'\n />\n <ReactSelect\n className='react-select'\n classNamePrefix='react-select'\n autoFocus={false}\n isClearable={false}\n isMulti={false}\n isSearchable={false}\n menuPlacement='top'\n options={pageSizeOptions}\n value={selectedPageSize}\n onChange={handlePageSizeChange}\n isDisabled={tableMeta.loadingState === LoadingStates.Loading}\n components={{\n IndicatorSeparator: null,\n IndicatorsContainer,\n }}\n />\n <FormattedMessage\n id='adminConsole.list.table.rowsCount.show(rowsPerPage)'\n defaultMessage='rows per page'\n />\n </div>\n <Pagination\n disablePrevPage={tableMeta.disablePrevPage}\n disableNextPage={tableMeta.disableNextPage}\n isLoading={tableMeta.loadingState === LoadingStates.Loading}\n onPreviousPageClick={tableMeta.onPreviousPageClick}\n onNextPageClick={tableMeta.onNextPageClick}\n />\n\n </div>\n )}\n </div>\n );\n}\n\nfunction IndicatorsContainer(props: IndicatorContainerProps<PageSizeOption>) {\n return (\n <components.IndicatorsContainer {...props}>\n <i className='icon icon-chevron-down'/>\n </components.IndicatorsContainer>\n );\n}\n\nfunction getAriaSortForTableHeader(\n canSort: boolean,\n sortDirection: boolean | SortDirection,\n): AriaAttributes['aria-sort'] {\n if (!canSort) {\n return undefined;\n }\n\n if (sortDirection === 'asc') {\n return 'ascending';\n }\n\n if (sortDirection === 'desc') {\n return 'descending';\n }\n\n return 'none';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React, {useMemo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\ninterface Props {\n date?: number;\n}\n\nexport function ElapsedDurationCell(props: Props) {\n const {formatMessage} = useIntl();\n\n const todaysDate = moment().startOf('day').valueOf();\n\n const {elapsedDays, exactPassedInDate} = useMemo(() => {\n const startOfTodayMoment = moment().startOf('day');\n const passedInDateMoment = moment(props.date);\n const exactPassedInDate = passedInDateMoment.format(\n `MMMM DD, Y [${formatMessage({id: 'adminConsole.list.table.exactTime.at', defaultMessage: 'at'})}] hh:mm:ss A`,\n );\n\n const startOfPassedInDateMoment = passedInDateMoment.startOf('day');\n\n // TODO: Use Timestamp component here\n const elapsedDays = startOfTodayMoment.diff(startOfPassedInDateMoment, 'days');\n\n return {\n elapsedDays,\n exactPassedInDate,\n };\n }, [props.date, todaysDate]);\n\n if (!props.date) {\n return null;\n }\n\n let elapsedDaysText = null;\n if (elapsedDays < 1) {\n elapsedDaysText = (\n <FormattedMessage\n id='admin.system_users.list.memberSince.today'\n defaultMessage='Today'\n />\n );\n } else if (elapsedDays === 1) {\n elapsedDaysText = (\n <FormattedMessage\n id='admin.system_users.list.memberSince.yesterday'\n defaultMessage='Yesterday'\n />\n );\n } else {\n elapsedDaysText = (\n <FormattedMessage\n id='admin.system_users.list.memberSince.days'\n defaultMessage='{days} days'\n values={{days: elapsedDays}}\n />\n );\n }\n\n return (\n <WithTooltip\n title={exactPassedInDate}\n >\n <span>{elapsedDaysText}</span>\n </WithTooltip>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createColumnHelper, getCoreRowModel, getSortedRowModel, useReactTable, type ColumnDef} from '@tanstack/react-table';\nimport React, {useCallback, useEffect, useMemo, useState} from 'react';\nimport type {SelectCallback} from 'react-bootstrap';\nimport {Tabs, Tab} from 'react-bootstrap';\nimport {useIntl, FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useHistory, useParams, useLocation} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport {GlobeIcon, LockIcon, PlusIcon, ArchiveOutlineIcon} from '@mattermost/compass-icons/components';\nimport {isRemoteClusterPatch, type RemoteCluster} from '@mattermost/types/remote_clusters';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {setNavigationBlocked} from 'actions/admin_actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport LoadingScreen from 'components/loading_screen';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChatSvg from './chat.svg';\nimport {\n AdminSection,\n SectionHeader,\n SectionHeading,\n SectionContent,\n PlaceholderContainer,\n PlaceholderHeading,\n AdminWrapper,\n PlaceholderParagraph,\n Input,\n FormField,\n ConnectionStatusLabel,\n LinkButton,\n} from './controls';\nimport {useRemoteClusterCreate, useSharedChannelsAdd, useSharedChannelsRemove} from './modals/modal_utils';\nimport TeamSelector from './team_selector';\nimport type {SharedChannelRemoteRow} from './utils';\nimport {getEditLocation, isConfirmed, isErrorState, isPendingState, useRemoteClusterEdit, useSharedChannelRemoteRows, useTeamOptions} from './utils';\n\nimport {AdminConsoleListTable} from '../list_table';\nimport SaveChangesPanel from '../save_changes_panel';\n\ntype Params = {\n connection_id: 'create' | RemoteCluster['remote_id'];\n};\n\ntype Props = Params & {\n disabled: boolean;\n}\n\nexport default function SecureConnectionDetail(props: Props) {\n const {formatMessage} = useIntl();\n const {connection_id: remoteId} = useParams<Params>();\n const isCreating = remoteId === 'create';\n const {state: initRemoteCluster, ...location} = useLocation<RemoteCluster | undefined>();\n const history = useHistory();\n const dispatch = useDispatch();\n\n const [remoteCluster, {applyPatch, save, currentRemoteCluster, hasChanges, loading, saving, patch}] = useRemoteClusterEdit(remoteId, initRemoteCluster);\n const isFormValid = isRemoteClusterPatch(patch) && (!isCreating || Boolean(patch.display_name && patch.default_team_id));\n\n const {promptCreate, saving: creating} = useRemoteClusterCreate();\n\n const teamsById = useTeamOptions();\n\n useEffect(() => {\n // keep history cache up to date\n history.replace({...location, state: currentRemoteCluster});\n }, [currentRemoteCluster]);\n\n useEffect(() => {\n // block nav when changes are pending\n dispatch(setNavigationBlocked(hasChanges));\n }, [hasChanges]);\n\n const handleNameChange = ({currentTarget: {value}}: React.FormEvent<HTMLInputElement>) => {\n applyPatch({display_name: value});\n };\n\n const handleTeamChange = (teamId: string) => {\n applyPatch({default_team_id: teamId});\n };\n\n const handleCreate = async () => {\n if (!isFormValid) {\n return;\n }\n const rc = await promptCreate(patch);\n if (rc) {\n history.replace(getEditLocation(rc));\n }\n };\n\n return (\n <div\n className='wrapper--fixed'\n data-testid='connectedOrganizationDetailsSection'\n >\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/site_config/secure_connections'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.secure_connection_detail.page_title'\n defaultMessage='Connection Configuration'\n />\n </div>\n </AdminHeader>\n\n <AdminWrapper>\n <AdminSection data-testid='connection_detail_section'>\n <SectionHeader>\n <hgroup>\n <FormattedMessage\n tagName={SectionHeading}\n id='admin.secure_connections.details.title'\n defaultMessage='Connection Details'\n />\n <FormattedMessage\n id='admin.secure_connections.details.subtitle'\n defaultMessage='Connection name and other permissions'\n />\n </hgroup>\n {currentRemoteCluster && <ConnectionStatusLabel rc={currentRemoteCluster}/>}\n </SectionHeader>\n <SectionContent $compact={true}>\n {isPendingState(loading) ? (\n <LoadingScreen/>\n ) : (\n <>\n <FormField\n label={formatMessage({\n id: 'admin.secure_connections.details.org_name.label',\n defaultMessage: 'Organization Name',\n })}\n helpText={formatMessage({\n id: 'admin.secure_connections.details.org_name.help',\n defaultMessage: 'Giving the connection a recognizable name will help you remember its purpose.',\n })}\n >\n <Input\n type='text'\n data-testid='organization-name-input'\n value={remoteCluster?.display_name ?? ''}\n onChange={handleNameChange}\n autoFocus={isCreating}\n />\n </FormField>\n <FormField\n label={formatMessage({\n id: 'admin.secure_connections.details.team.label',\n defaultMessage: 'Destination Team',\n })}\n helpText={formatMessage({\n id: 'admin.secure_connections.details.team.help',\n defaultMessage: 'Select the default team in which any shared channels will be placed. This can be updated later for specific shared channels.',\n })}\n >\n <TeamSelector\n testId='destination-team-input'\n value={remoteCluster.default_team_id ?? ''}\n teamsById={teamsById}\n onChange={handleTeamChange}\n />\n </FormField>\n </>\n )}\n </SectionContent>\n </AdminSection>\n {!isCreating && (\n <AdminSection data-testid='shared_channels_section'>\n <SharedChannelRemotes\n remoteId={remoteId}\n rc={currentRemoteCluster}\n />\n </AdminSection>\n )}\n </AdminWrapper>\n\n <SaveChangesPanel\n saving={isCreating ? isPendingState(creating) : isPendingState(saving)}\n cancelLink='/admin_console/site_config/secure_connections'\n saveNeeded={hasChanges && isFormValid}\n onClick={isCreating ? handleCreate : save}\n serverError={(isErrorState(saving) || isErrorState(creating)) ? (\n <FormattedMessage\n id='admin.secure_connections.details.saving_changes_error'\n defaultMessage='There was an error while saving secure connection'\n />\n ) : undefined}\n savingMessage={formatMessage({id: 'admin.secure_connections.details.saving_changes', defaultMessage: 'Saving secure connection…'})}\n isDisabled={props.disabled}\n />\n </div>\n );\n}\n\nfunction SharedChannelRemotes(props: {remoteId: string; rc: RemoteCluster | undefined}) {\n const [filter, setFilter] = useState<'home' | 'remote'>();\n const [data, {loading, fetch}] = useSharedChannelRemoteRows(props.remoteId, {filter});\n const {promptAdd} = useSharedChannelsAdd(props.remoteId);\n const confirmed = props.rc ? isConfirmed(props.rc) : undefined;\n const showTabs = confirmed ? true : !(confirmed === false && filter === 'home' && !data);\n\n useEffect(() => {\n //once we know confirmation status, set default filter/tab\n if (confirmed) {\n setFilter('remote');\n } else if (confirmed === false) {\n setFilter('home');\n }\n }, [confirmed]);\n\n const handleChangeTab = useCallback<SelectCallback>((tabKey) => {\n setFilter(tabKey);\n }, []);\n\n const handleAdd = async () => {\n await promptAdd();\n\n // TODO server side async\n setTimeout(() => {\n if (filter === 'remote') {\n setFilter('home');\n } else {\n fetch();\n }\n }, 500);\n };\n\n let content;\n\n if (loading || !props.rc) {\n content = <LoadingScreen/>;\n } else if (data) {\n content = (\n <SharedChannelRemotesTable\n data={data}\n filter={filter ?? 'home'}\n fetch={fetch}\n />\n );\n } else {\n content = (\n <Placeholder\n filter={filter ?? 'home'}\n rc={props.rc}\n />\n );\n }\n\n return (\n <>\n <SectionHeader $borderless={true}>\n <hgroup>\n <FormattedMessage\n tagName={SectionHeading}\n id='admin.secure_connections.details.shared_channels.title'\n defaultMessage='Shared Channels'\n />\n <FormattedMessage\n id='admin.secure_connections.details.shared_channels.subtitle'\n defaultMessage=\"A list of all the channels shared with your organization and channels you're sharing externally.\"\n />\n </hgroup>\n <AddChannelsButton onClick={handleAdd}>\n <PlusIcon size={18}/>\n <FormattedMessage\n id='admin.secure_connections.details.shared_channels.add_channels.button'\n defaultMessage='Add channels'\n />\n </AddChannelsButton>\n </SectionHeader>\n <TabsWrapper>\n {showTabs && (\n <Tabs\n id='shared-channels'\n className='tabs'\n defaultActiveKey={'remote'}\n activeKey={filter}\n onSelect={handleChangeTab}\n unmountOnExit={true}\n >\n <Tab\n eventKey={'remote'}\n title={props.rc?.display_name}\n />\n <Tab\n eventKey={'home'}\n title={(\n <FormattedMessage\n id='admin.secure_connections.details.shared_channels.tabs.home'\n defaultMessage='Your channels'\n />\n )}\n />\n </Tabs>\n )}\n <SectionContent $compact={Boolean(data)}>\n {content}\n </SectionContent>\n </TabsWrapper>\n </>\n );\n}\n\nconst Placeholder = (props: {filter: 'home' | 'remote'; rc: RemoteCluster}) => {\n return (\n <PlaceholderContainer>\n <ChatSvg/>\n <hgroup>\n {props.filter === 'home' ? (\n <>\n <FormattedMessage\n tagName={PlaceholderHeading}\n id='admin.secure_connection_detail.shared_channels.placeholder.title_home'\n defaultMessage=\"You haven't shared any channels\"\n />\n <FormattedMessage\n tagName={PlaceholderParagraph}\n id='admin.secure_connection_detail.shared_channels.placeholder.subtitle'\n defaultMessage='Please add channels to start sharing'\n />\n </>\n ) : (\n <FormattedMessage\n tagName={PlaceholderHeading}\n id='admin.secure_connection_detail.shared_channels.placeholder.title_remote'\n defaultMessage=\"{remote} hasn't shared any channels\"\n values={{\n remote: props.rc.display_name,\n }}\n />\n )}\n\n </hgroup>\n </PlaceholderContainer>\n );\n};\n\nconst AddChannelsButton = styled.button.attrs({className: 'btn btn-primary'})`\n padding-left: 15px;\n`;\n\nconst TabsWrapper = styled.div`\n .tabs {\n display: flex;\n width: 100%;\n flex-direction: column;\n\n .nav-tabs {\n border-bottom: 1px solid var(--center-channel-color-12, rgba(63, 67, 80, 0.12));\n }\n }\n\n .nav-tabs {\n padding: 0 32px;\n margin: 0 0 8px;\n\n li {\n margin-right: 0;\n\n a {\n padding: 13px 12px;\n border: none;\n background: transparent;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n transition: all 0.15s ease;\n\n &:hover,\n &:active,\n &:focus,\n &:focus-within {\n border: none;\n border-radius: none;\n background: transparent;\n color: var(--center-channel-color);\n }\n }\n\n &.active {\n border-bottom: 2px solid var(--denim-button-bg);\n\n a {\n color: var(--denim-button-bg);\n }\n }\n\n &:not(:first-child) {\n margin-left: 8px;\n }\n }\n }\n`;\n\nconst ChannelIcon = ({channelId}: {channelId: string}) => {\n const channel = useSelector((state: GlobalState) => getChannel(state, channelId));\n let icon = <GlobeIcon size={16}/>;\n\n if (channel?.type === Constants.PRIVATE_CHANNEL) {\n icon = <LockIcon size={16}/>;\n }\n\n if (isArchivedChannel(channel)) {\n icon = <ArchiveOutlineIcon size={16}/>;\n }\n\n return (\n <ChannelIconWrapper>\n {icon}\n </ChannelIconWrapper>\n );\n};\n\nconst ChannelIconWrapper = styled.span`\n vertical-align: middle;\n margin-right: 5px;\n`;\n\nconst ChannelName = styled.span`\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n`;\n\nconst TeamName = styled.span`\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: rgba(var(--center-channel-color-rgb), 0.72);\n`;\n\nfunction SharedChannelRemotesTable(props: {data: SharedChannelRemoteRow[]; filter: 'home' | 'remote'; fetch: () => void}) {\n const col = createColumnHelper<SharedChannelRemoteRow>();\n\n const columns = useMemo<Array<ColumnDef<SharedChannelRemoteRow, any>>>(() => {\n return [\n col.accessor('display_name', {\n header: () => (\n <FormattedMessage\n id='admin.secure_connection_detail.shared_channels.table.name'\n defaultMessage='Name'\n />\n ),\n cell: ({row, getValue}) => (\n <>\n <ChannelIcon channelId={row.original.channel_id}/>\n <ChannelName>{getValue()}</ChannelName>\n </>\n ),\n enableHiding: false,\n enableSorting: true,\n }),\n col.accessor('team_display_name', {\n header: () => {\n if (props.filter === 'home') {\n return (\n <FormattedMessage\n id='admin.secure_connection_detail.shared_channels.table.team_home'\n defaultMessage='Current Team'\n />\n );\n }\n\n return (\n <FormattedMessage\n id='admin.secure_connection_detail.shared_channels.table.team_remote'\n defaultMessage='Destination Team'\n />\n );\n },\n cell: ({getValue}) => (\n <TeamName>\n {getValue()}\n </TeamName>\n ),\n enableHiding: false,\n enableSorting: true,\n }),\n col.display({\n id: 'actions',\n cell: ({row}) => (\n <RemoteActions\n remote={row.original}\n fetch={props.fetch}\n />\n ),\n enableHiding: false,\n enableSorting: false,\n }),\n ];\n }, [props.data, props.filter, props.fetch]);\n\n const table = useReactTable({\n data: props.data,\n columns,\n initialState: {\n sorting: [\n {\n id: 'display_name',\n desc: false,\n },\n ],\n },\n getCoreRowModel: getCoreRowModel<SharedChannelRemoteRow>(),\n getSortedRowModel: getSortedRowModel<SharedChannelRemoteRow>(),\n enableSortingRemoval: false,\n enableMultiSort: false,\n renderFallbackValue: '',\n meta: {\n tableId: 'sharedChannelRemotes',\n disablePaginationControls: true,\n },\n manualPagination: true,\n });\n\n // TODO consider refactoring ChannelList to support shared channel actions and reuse here\n return (\n <TableWrapper>\n <AdminConsoleListTable<SharedChannelRemoteRow> table={table}/>\n </TableWrapper>\n );\n}\n\nconst TableWrapper = styled.div`\n table.adminConsoleListTable {\n\n td, th {\n &:after, &:before {\n display: none;\n }\n }\n\n thead {\n border-top: none;\n border-bottom: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n }\n\n tbody {\n tr {\n border-top: none;\n td {\n padding-block-end: 0;\n padding-block-start: 0;\n\n }\n }\n }\n\n tfoot {\n border-top: none;\n }\n }\n .adminConsoleListTableContainer {\n padding: 2px 0px;\n }\n`;\n\nconst RemoteActions = ({remote, fetch}: {remote: SharedChannelRemoteRow; fetch: () => void}) => {\n const {promptRemove} = useSharedChannelsRemove(remote.remote_id);\n\n const handleRemove = () => {\n promptRemove(remote.channel_id).then(fetch);\n };\n\n return (\n <RemoteActionsRoot>\n <LinkButton\n onClick={handleRemove}\n $destructive={true}\n >\n <FormattedMessage\n id='admin.secure_connection_detail.shared_channels.table.remote_actions.remove'\n defaultMessage='Remove'\n />\n </LinkButton>\n </RemoteActionsRoot>\n );\n};\n\nconst RemoteActionsRoot = styled.div`\n text-align: right;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Button, Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {LogObject} from '@mattermost/types/admin';\n\ntype Props = {\n log: LogObject | null;\n onModalDismissed: (e?: React.MouseEvent<HTMLButtonElement>) => void;\n show: boolean;\n}\n\ntype State = {\n copySuccess: boolean;\n}\n\nexport default class FullLogEventModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n copySuccess: false,\n };\n }\n\n renderContents = () => {\n const {log} = this.props;\n\n if (log == null) {\n return <div/>;\n }\n\n return (\n <div>\n <pre>\n {JSON.stringify(this.props.log, undefined, 2)}\n </pre>\n </div>\n );\n };\n\n copyLog = () => {\n navigator.clipboard.writeText(JSON.stringify(this.props.log, undefined, 2));\n this.showCopySuccess();\n };\n\n showCopySuccess = () => {\n this.setState({\n copySuccess: true,\n });\n\n setTimeout(() => {\n this.setState({\n copySuccess: false,\n });\n }, 3000);\n };\n\n render() {\n return (\n <Modal\n show={this.props.show}\n onHide={this.props.onModalDismissed}\n dialogClassName='a11y__modal full-log-event'\n role='none'\n aria-labelledby='fullLogEventModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='fullLogEventModalLabel'\n >\n <FormattedMessage\n id='admin.server_logs.LogEvent'\n defaultMessage='Log Event'\n />\n </Modal.Title>\n {this.state.copySuccess ? (\n <FormattedMessage\n id='admin.server_logs.DataCopied'\n defaultMessage='Data copied'\n />\n ) : (\n <Button onClick={this.copyLog}>\n <FormattedMessage\n id='admin.server_logs.CopyLog'\n defaultMessage='Copy log'\n />\n </Button>\n )}\n </Modal.Header>\n <Modal.Body>\n {this.renderContents()}\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.props.onModalDismissed}\n >\n <FormattedMessage\n id='admin.manage_roles.cancel'\n defaultMessage='Cancel'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport FullLogEventModal from './full_log_event_modal';\n\nexport default FullLogEventModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {ArrowDownIcon, ArrowUpIcon} from '@mattermost/compass-icons/components';\nimport type {LogFilter, LogLevelEnum, LogObject} from '@mattermost/types/admin';\nimport type {ChannelSearchOpts} from '@mattermost/types/channels';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\n\nimport FullLogEventModal from '../full_log_event_modal';\n\nimport './log_list.scss';\n\ntype Props = {\n loading: boolean;\n logs: LogObject[];\n onFiltersChange: (filters: LogFilter) => void;\n onSearchChange: (term: string) => void;\n search: string;\n filters: LogFilter;\n};\n\ntype State = {\n modalLog: null | LogObject;\n modalOpen: boolean;\n page: number;\n dateAsc: boolean;\n}\n\nconst PAGE_SIZE = 50;\n\nexport default class LogList extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n modalLog: null,\n modalOpen: false,\n page: 0,\n dateAsc: true,\n };\n }\n\n isSearching = (term: string, filters: ChannelSearchOpts) => {\n return term.length > 0 || Object.keys(filters).length > 0;\n };\n\n onSearch = (term: string) => {\n this.props.onSearchChange(term);\n };\n\n nextPage = () => {\n const page = this.state.page + 1;\n this.setState({page});\n };\n\n previousPage = () => {\n const page = this.state.page - 1;\n this.setState({page});\n };\n\n getPaginationProps = (): {startCount: number; endCount: number; total: number} => {\n const {page} = this.state;\n const startCount = (page * PAGE_SIZE) + 1;\n const total = this.props.logs?.length ?? 0;\n\n let endCount = 0;\n\n endCount = (page + 1) * PAGE_SIZE;\n endCount = endCount > total ? total : endCount;\n\n return {startCount, endCount, total};\n };\n\n handleDateSort = () => {\n this.setState({dateAsc: !this.state.dateAsc});\n this.getColumns(this.state.dateAsc);\n };\n\n getColumns = (dateAsc: boolean): Column[] => {\n const timestamp: JSX.Element = (\n <div\n className='timestamp'\n onClick={this.handleDateSort}\n >\n <FormattedMessage\n id='admin.compliance_table.timestamp'\n defaultMessage='Timestamp'\n />\n {dateAsc ? (<ArrowUpIcon size={18}/>) : (<ArrowDownIcon size={18}/>)}\n </div>\n );\n const level: JSX.Element = (\n <FormattedMessage\n id='admin.log.Level'\n defaultMessage='Level'\n />\n );\n const msg: JSX.Element = (\n <FormattedMessage\n id='user.settings.notifications.autoResponderPlaceholder'\n defaultMessage='Message'\n />\n );\n const caller: JSX.Element = (\n <FormattedMessage\n id='admin.logs.caller'\n defaultMessage='Caller'\n />\n );\n const options: JSX.Element = (\n <FormattedMessage\n id='admin.logs.options'\n defaultMessage='Options'\n />\n );\n\n return [\n {\n field: 'timestamp',\n fixed: true,\n name: timestamp,\n textAlign: 'left',\n width: 1.5,\n },\n {\n field: 'level',\n fixed: true,\n name: level,\n textAlign: 'left',\n width: 0.5,\n },\n {\n field: 'msg',\n fixed: true,\n name: msg,\n textAlign: 'left',\n width: 2.5,\n },\n {\n field: 'caller',\n fixed: true,\n name: caller,\n textAlign: 'left',\n width: 1.5,\n },\n {\n field: 'options',\n fixed: true,\n name: options,\n textAlign: 'left',\n width: 1,\n },\n ];\n };\n\n getRows = (): Row[] => {\n const {startCount, endCount} = this.getPaginationProps();\n const sortedLogs = this.props.logs.sort((a, b) => {\n const timeA = new Date(a.timestamp).valueOf();\n const timeB = new Date(b.timestamp).valueOf();\n\n if (this.state.dateAsc) {\n return timeA - timeB;\n }\n return timeB - timeA;\n });\n\n const logsToDisplay = sortedLogs.slice(startCount - 1, endCount);\n\n return logsToDisplay.map((log: LogObject) => {\n return {\n cells: {\n timestamp: (\n <span\n className='group-name overflow--ellipsis row-content'\n data-testid='timestamp'\n >\n <span className='group-description row-content'>\n {log.timestamp}\n </span>\n </span>\n ),\n level: (\n <span className='group-description adjusted row-content'>\n {log.level}\n </span>\n ),\n msg: (\n <span\n className='group-description row-content'\n title={log.msg}\n >\n {log.msg}\n </span>\n ),\n caller: (\n <span\n className='group-description row-content'\n >\n {log.caller}\n </span>\n ),\n options: (\n <button\n type='submit'\n className='btn btn-secondary btn-sm'\n >\n <FormattedMessage\n id='admin.logs.fullEvent'\n defaultMessage='Full Log event'\n />\n </button>\n ),\n },\n onClick: () => this.showFullLogEvent(log),\n };\n });\n };\n\n showFullLogEvent = (log: LogObject) => {\n this.setState({\n modalLog: log,\n modalOpen: true,\n });\n };\n\n hideModal = () => {\n this.setState({\n modalLog: null,\n modalOpen: false,\n });\n };\n\n onFilter = (filterOptions: FilterOptions) => {\n const filters = {} as unknown as LogFilter;\n const levelValues = filterOptions.levels.values;\n if (levelValues.all.value) {\n filters.logLevels = [];\n } else {\n filters.logLevels = Object.keys(levelValues).reduce<LogFilter['logLevels']>((acc, key) => {\n if (levelValues[key].value) {\n acc.push(key as LogLevelEnum);\n }\n return acc;\n }, []);\n }\n this.props.onFiltersChange(filters);\n };\n\n showErrors = () => {\n this.props.onFiltersChange({logLevels: ['error']} as unknown as LogFilter);\n };\n\n getErrorCount = (): number => {\n let n = 0;\n this.props.logs.map((log) => log.level === 'error' && ++n);\n return n;\n };\n\n render = (): JSX.Element => {\n const {search} = this.props;\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns(this.state.dateAsc);\n const {startCount, endCount, total} = this.getPaginationProps();\n\n const placeholderEmpty: JSX.Element = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.no_logs_found'\n defaultMessage='No logs found'\n />\n );\n\n const rowsContainerStyles = {\n minHeight: `${rows.length * 40}px`,\n };\n\n const errorsButton: JSX.Element = (\n <button\n className='btn btn-tertiary btn-sm ml-2'\n onClick={this.showErrors}\n >\n <FormattedMessage\n id='admin.logs.showErrors'\n defaultMessage='Show last {n} errors'\n values={{n: this.getErrorCount()}}\n />\n </button>\n );\n\n const filterOptions: FilterOptions = {\n levels: {\n name: 'Levels',\n values: {\n all: {\n name: (\n <FormattedMessage\n id='admin.logs.Alllevels'\n defaultMessage='All levels'\n />\n ),\n value: true,\n },\n error: {\n name: (\n <FormattedMessage\n id='admin.logs.Error'\n defaultMessage='Error'\n />\n ),\n value: false,\n },\n warn: {\n name: (\n <FormattedMessage\n id='admin.logs.Warn'\n defaultMessage='Warn'\n />\n ),\n value: false,\n },\n info: {\n name: (\n <FormattedMessage\n id='admin.logs.Info'\n defaultMessage='Info'\n />\n ),\n value: false,\n },\n debug: {\n name: (\n <FormattedMessage\n id='admin.logs.Debug'\n defaultMessage='Debug'\n />\n ),\n value: false,\n },\n },\n keys: ['all', 'error', 'info', 'debug'],\n },\n };\n\n const filterProps = {\n options: filterOptions,\n keys: ['levels'],\n onFilter: this.onFilter,\n };\n\n return (\n <div className='LogTable'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.props.loading}\n startCount={startCount}\n endCount={endCount}\n total={total}\n onSearch={this.onSearch}\n term={search}\n placeholderEmpty={placeholderEmpty}\n rowsContainerStyles={rowsContainerStyles}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n filterProps={filterProps}\n extraComponent={errorsButton}\n />\n <FullLogEventModal\n log={this.state.modalLog}\n show={this.state.modalOpen}\n onModalDismissed={this.hideModal}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl, type WrappedComponentProps} from 'react-intl';\n\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\n\nconst NEXT_BUTTON_TIMEOUT = 500;\n\ninterface Props extends WrappedComponentProps {\n logs: string[];\n page: number;\n perPage: number;\n nextPage: () => void;\n previousPage: () => void;\n}\n\ntype State = {\n nextDisabled: boolean;\n};\n\nclass PlainLogList extends React.PureComponent<Props, State> {\n private logPanel: React.RefObject<HTMLDivElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.logPanel = React.createRef();\n\n this.state = {\n nextDisabled: false,\n };\n }\n\n componentDidMount() {\n // Scroll Down to get the latest logs\n const node = this.logPanel.current;\n if (node) {\n node.scrollTop = node.scrollHeight;\n }\n }\n\n componentDidUpdate() {\n // Scroll Down to get the latest logs\n const node = this.logPanel.current;\n if (node) {\n node.scrollTop = node.scrollHeight;\n }\n }\n\n nextPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n\n this.setState({nextDisabled: true});\n setTimeout(() => this.setState({nextDisabled: false}), NEXT_BUTTON_TIMEOUT);\n\n this.props.nextPage();\n };\n\n previousPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n\n this.props.previousPage();\n };\n\n render() {\n let content = null;\n let nextButton;\n let previousButton;\n\n if (this.props.logs.length >= this.props.perPage) {\n nextButton = (\n <button\n type='button'\n className='btn btn-tertiary filter-control filter-control__next pull-right'\n onClick={this.nextPage}\n disabled={this.state.nextDisabled}\n >\n <FormattedMessage\n id='admin.logs.next'\n defaultMessage='Next'\n />\n <NextIcon additionalClassName='ml-2'/>\n </button>\n );\n }\n\n if (this.props.page > 0) {\n previousButton = (\n <button\n type='button'\n className='btn btn-tertiary filter-control filter-control__prev'\n onClick={this.previousPage}\n >\n <i\n className='fa fa-angle-left'\n title={this.props.intl.formatMessage({id: 'generic_icons.previous', defaultMessage: 'Previous Icon'})}\n />\n <FormattedMessage\n id='admin.logs.prev'\n defaultMessage='Previous'\n />\n </button>\n );\n }\n\n content = [];\n\n for (let i = 0; i < this.props.logs.length; i++) {\n const style: React.CSSProperties = {\n whiteSpace: 'nowrap',\n fontFamily: 'monospace',\n color: '',\n };\n\n if (this.props.logs[i].indexOf('[EROR]') > 0) {\n style.color = 'red';\n }\n content.push(<br key={'br_' + i}/>);\n content.push(\n <span\n key={'log_' + i}\n style={style}\n >\n {this.props.logs[i]}\n </span>,\n );\n }\n return (\n <div>\n <div\n tabIndex={-1}\n ref={this.logPanel}\n className='log__panel'\n >\n {content}\n </div>\n <div className='pt-3 pb-3 filter-controls'>\n {previousButton}\n {nextButton}\n </div>\n </div>\n );\n }\n}\n\nexport default injectIntl(PlainLogList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {\n LogFilter,\n LogLevels,\n LogObject,\n LogServerNames,\n} from '@mattermost/types/admin';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport ExternalLink from 'components/external_link';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport LogList from './log_list';\nimport PlainLogList from './plain_log_list';\n\ntype Props = {\n logs: LogObject[];\n plainLogs: string[];\n isPlainLogs: boolean;\n actions: {\n getLogs: (logFilter: LogFilter) => Promise<unknown>;\n getPlainLogs: (\n page?: number | undefined,\n perPage?: number | undefined\n ) => Promise<unknown>;\n };\n};\n\ntype State = {\n dateFrom: string;\n dateTo: string;\n filteredLogs: LogObject[];\n loadingLogs: boolean;\n logLevels: LogLevels;\n search: string;\n serverNames: LogServerNames;\n page: number;\n perPage: number;\n loadingPlain: boolean;\n};\n\nconst messages = defineMessages({\n title: {id: 'admin.logs.title', defaultMessage: 'Server Logs'},\n bannerDesc: {id: 'admin.logs.bannerDesc', defaultMessage: 'To look up users by User ID or Token ID, go to User Management > Users and paste the ID into the search filter.'},\n});\n\nexport const searchableStrings = [\n messages.title,\n messages.bannerDesc,\n];\n\nexport default class Logs extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n dateFrom: '',\n dateTo: '',\n filteredLogs: [],\n loadingLogs: true,\n logLevels: [],\n search: '',\n serverNames: [],\n page: 0,\n perPage: 1000,\n loadingPlain: true,\n };\n }\n\n componentDidMount() {\n if (this.props.isPlainLogs) {\n this.reloadPlain();\n } else {\n this.reload();\n }\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (this.state.page !== prevState.page && this.props.isPlainLogs) {\n this.reloadPlain();\n }\n }\n\n nextPage = () => {\n this.setState({page: this.state.page + 1});\n };\n\n previousPage = () => {\n this.setState({page: this.state.page - 1});\n };\n\n reload = async () => {\n this.setState({loadingLogs: true});\n await this.props.actions.getLogs({\n serverNames: this.state.serverNames,\n logLevels: this.state.logLevels,\n dateFrom: this.state.dateFrom,\n dateTo: this.state.dateTo,\n });\n this.setState({loadingLogs: false});\n };\n\n reloadPlain = async () => {\n this.setState({loadingPlain: true});\n await this.props.actions.getPlainLogs(\n this.state.page,\n this.state.perPage,\n );\n this.setState({loadingPlain: false});\n };\n\n onSearchChange = (search: string) => {\n this.setState({search}, () => this.performSearch());\n };\n\n performSearch = debounce(() => {\n const {search} = this.state;\n const filteredLogs = this.props.logs.filter((log) => {\n // to be improved\n return `${log.caller}${log.msg}${log.worker}${log.worker}`.toLowerCase().includes(search.toLowerCase());\n });\n this.setState({filteredLogs});\n }, 200);\n\n onFiltersChange = ({\n dateFrom,\n dateTo,\n logLevels,\n serverNames,\n }: LogFilter) => {\n this.setState({dateFrom, dateTo, logLevels, serverNames}, () =>\n this.reload(),\n );\n };\n\n render() {\n const content = this.props.isPlainLogs ? (\n <>\n <div className='banner'>\n <div className='banner__content'>\n <FormattedMessage {...messages.bannerDesc}/>\n </div>\n </div>\n <div className='banner-buttons'>\n <button\n type='submit'\n className='btn btn-primary'\n onClick={this.reloadPlain}\n >\n <FormattedMessage\n id='admin.logs.ReloadLogs'\n defaultMessage='Reload Logs'\n />\n </button>\n <ExternalLink\n location='download_logs'\n className='btn btn-primary'\n href={Client4.getUrl() + '/api/v4/logs/download'}\n >\n <FormattedMessage\n id='admin.logs.DownloadLogs'\n defaultMessage='Download Logs'\n />\n </ExternalLink>\n </div>\n <PlainLogList\n logs={this.props.plainLogs}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n page={this.state.page}\n perPage={this.state.perPage}\n />\n </>\n ) : (\n <>\n <div className='logs-banner'>\n <div className='banner'>\n <div className='banner__content'>\n <FormattedMessage {...messages.bannerDesc}/>\n </div>\n </div>\n <div className='banner-buttons'>\n <button\n type='submit'\n className='btn btn-primary'\n onClick={this.reload}\n >\n <FormattedMessage\n id='admin.logs.ReloadLogs'\n defaultMessage='Reload Logs'\n />\n </button>\n <ExternalLink\n location='download_logs'\n className='btn btn-primary'\n href={Client4.getUrl() + '/api/v4/logs/download'}\n >\n <FormattedMessage\n id='admin.logs.DownloadLogs'\n defaultMessage='Download Logs'\n />\n </ExternalLink>\n </div>\n </div>\n <LogList\n loading={this.state.loadingLogs}\n logs={this.state.search ? this.state.filteredLogs : this.props.logs}\n onSearchChange={this.onSearchChange}\n search={this.state.search}\n onFiltersChange={this.onFiltersChange}\n filters={{\n dateFrom: this.state.dateFrom,\n dateTo: this.state.dateTo,\n logLevels: this.state.logLevels,\n serverNames: this.state.serverNames,\n }}\n />\n </>\n );\n return (\n <div className='wrapper--admin'>\n <AdminHeader>\n <FormattedMessage {...messages.title}/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-logs-content admin-console__content'>\n {content}\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getLogs, getPlainLogs} from 'mattermost-redux/actions/admin';\nimport * as Selectors from 'mattermost-redux/selectors/entities/admin';\n\nimport type {GlobalState} from 'types/store';\n\nimport Logs from './logs';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = Selectors.getConfig(state);\n\n return {\n logs: Selectors.getAllLogs(state),\n plainLogs: Selectors.getPlainLogs(state),\n isPlainLogs: config.LogSettings?.FileJson === false,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getLogs,\n getPlainLogs,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Logs);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\n\nimport type {AdminConfig, ClientLicense, ServiceSettings} from '@mattermost/types/config';\n\nimport BooleanSetting from './boolean_setting';\nimport OLDAdminSettings from './old_admin_settings';\nimport type {BaseState, BaseProps} from './old_admin_settings';\nimport SettingsGroup from './settings_group';\nimport TextSetting from './text_setting';\n\ninterface State extends BaseState {\n extendSessionLengthWithActivity: ServiceSettings['ExtendSessionLengthWithActivity'];\n terminateSessionsOnPasswordChange: ServiceSettings['TerminateSessionsOnPasswordChange'];\n sessionLengthWebInHours: ServiceSettings['SessionLengthWebInHours'];\n sessionLengthMobileInHours: ServiceSettings['SessionLengthMobileInHours'];\n sessionLengthSSOInHours: ServiceSettings['SessionLengthSSOInHours'];\n sessionCacheInMinutes: ServiceSettings['SessionCacheInMinutes'];\n sessionIdleTimeoutInMinutes: ServiceSettings['SessionIdleTimeoutInMinutes'];\n sessionIdleTimeoutMobileInMinutes: ClientLicense['SessionIdleTimeoutMobileInMinutes'];\n}\n\ntype Props = BaseProps & {\n license: ClientLicense;\n};\n\nconst messages = defineMessages({\n title: {id: 'admin.sessionLengths.title', defaultMessage: 'Session Lengths'},\n webSessionHoursDesc_extendLength: {id: 'admin.service.webSessionHoursDesc.extendLength', defaultMessage: \"Set the number of hours from the last activity in Mattermost to the expiry of the user's session when using email and AD/LDAP authentication. After changing this setting, the new session length will take effect after the next time the user enters their credentials.\"},\n mobileSessionHoursDesc_extendLength: {id: 'admin.service.mobileSessionHoursDesc.extendLength', defaultMessage: \"Set the number of hours from the last activity in Mattermost to the expiry of the user's session on mobile. After changing this setting, the new session length will take effect after the next time the user enters their credentials.\"},\n ssoSessionHoursDesc_extendLength: {id: 'admin.service.ssoSessionHoursDesc.extendLength', defaultMessage: \"Set the number of hours from the last activity in Mattermost to the expiry of the user's session for SSO authentication, such as SAML, GitLab and OAuth 2.0. If the authentication method is SAML or GitLab, the user may automatically be logged back in to Mattermost if they are already logged in to SAML or GitLab. After changing this setting, the setting will take effect after the next time the user enters their credentials.\"},\n webSessionHoursDesc: {id: 'admin.service.webSessionHoursDesc', defaultMessage: \"The number of hours from the last time a user entered their credentials to the expiry of the user's session. After changing this setting, the new session length will take effect after the next time the user enters their credentials.\"},\n mobileSessionHoursDesc: {id: 'admin.service.mobileSessionHoursDesc', defaultMessage: \"The number of hours from the last time a user entered their credentials to the expiry of the user's session. After changing this setting, the new session length will take effect after the next time the user enters their credentials.\"},\n ssoSessionHoursDesc: {id: 'admin.service.ssoSessionHoursDesc', defaultMessage: \"The number of hours from the last time a user entered their credentials to the expiry of the user's session. If the authentication method is SAML or GitLab, the user may automatically be logged back in to Mattermost if they are already logged in to SAML or GitLab. After changing this setting, the setting will take effect after the next time the user enters their credentials.\"},\n sessionIdleTimeout: {id: 'admin.service.sessionIdleTimeout', defaultMessage: 'Session Idle Timeout (minutes):'},\n extendSessionLengthActivity_label: {id: 'admin.service.extendSessionLengthActivity.label', defaultMessage: 'Extend session length with activity: '},\n extendSessionLengthActivity_helpText: {id: 'admin.service.extendSessionLengthActivity.helpText', defaultMessage: 'When true, sessions will be automatically extended when the user is active in their Mattermost client. Users sessions will only expire if they are not active in their Mattermost client for the entire duration of the session lengths defined in the fields below. When false, sessions will not extend with activity in Mattermost. User sessions will immediately expire at the end of the session length or idle timeouts defined below. '},\n terminateSessionsOnPasswordChange_label: {id: 'admin.service.terminateSessionsOnPasswordChange.label', defaultMessage: 'Terminate Sessions on Password Change: '},\n terminateSessionsOnPasswordChange_helpText: {id: 'admin.service.terminateSessionsOnPasswordChange.helpText', defaultMessage: 'When true, all sessions of a user will expire if their password is changed by themselves or an administrator.'},\n webSessionHours: {id: 'admin.service.webSessionHours', defaultMessage: 'Session Length AD/LDAP and Email (hours):'},\n mobileSessionHours: {id: 'admin.service.mobileSessionHours', defaultMessage: 'Session Length Mobile (hours):'},\n ssoSessionHours: {id: 'admin.service.ssoSessionHours', defaultMessage: 'Session Length SSO (hours):'},\n sessionCache: {id: 'admin.service.sessionCache', defaultMessage: 'Session Cache (minutes):'},\n sessionCacheDesc: {id: 'admin.service.sessionCacheDesc', defaultMessage: 'The number of minutes to cache a session in memory:'},\n sessionHoursEx: {id: 'admin.service.sessionHoursEx', defaultMessage: 'E.g.: \"720\"'},\n sessionIdleTimeoutDesc: {id: 'admin.service.sessionIdleTimeoutDesc', defaultMessage: \"The number of minutes from the last time a user was active on the system to the expiry of the user's session. Once expired, the user will need to log in to continue. Minimum is 5 minutes, and 0 is unlimited. Applies to the desktop app and browsers. For mobile apps, use an EMM provider to lock the app when not in use. In High Availability mode, enable IP hash load balancing for reliable timeout measurement.\"},\n});\n\nexport const searchableStrings = [\n messages.title,\n messages.webSessionHoursDesc_extendLength,\n messages.mobileSessionHoursDesc_extendLength,\n messages.ssoSessionHoursDesc_extendLength,\n messages.webSessionHoursDesc,\n messages.mobileSessionHoursDesc,\n messages.ssoSessionHoursDesc,\n messages.sessionIdleTimeout,\n messages.extendSessionLengthActivity_label,\n messages.extendSessionLengthActivity_helpText,\n messages.webSessionHours,\n messages.mobileSessionHours,\n messages.ssoSessionHours,\n messages.sessionCache,\n messages.sessionCacheDesc,\n messages.sessionHoursEx,\n messages.sessionIdleTimeoutDesc,\n];\n\nexport default class SessionLengthSettings extends OLDAdminSettings<Props, State> {\n getConfigFromState = (config: AdminConfig) => {\n const MINIMUM_IDLE_TIMEOUT = 5;\n\n config.ServiceSettings.ExtendSessionLengthWithActivity = this.state.extendSessionLengthWithActivity;\n config.ServiceSettings.TerminateSessionsOnPasswordChange = this.state.terminateSessionsOnPasswordChange;\n config.ServiceSettings.SessionLengthWebInHours = this.parseIntNonZero(this.state.sessionLengthWebInHours);\n config.ServiceSettings.SessionLengthMobileInHours = this.parseIntNonZero(this.state.sessionLengthMobileInHours);\n config.ServiceSettings.SessionLengthSSOInHours = this.parseIntNonZero(this.state.sessionLengthSSOInHours);\n config.ServiceSettings.SessionCacheInMinutes = this.parseIntNonZero(this.state.sessionCacheInMinutes);\n config.ServiceSettings.SessionIdleTimeoutInMinutes = this.parseIntZeroOrMin(this.state.sessionIdleTimeoutInMinutes, MINIMUM_IDLE_TIMEOUT);\n\n return config;\n };\n\n getStateFromConfig(config: AdminConfig) {\n return {\n extendSessionLengthWithActivity: config.ServiceSettings.ExtendSessionLengthWithActivity,\n terminateSessionsOnPasswordChange: config.ServiceSettings.TerminateSessionsOnPasswordChange,\n sessionLengthWebInHours: config.ServiceSettings.SessionLengthWebInHours,\n sessionLengthMobileInHours: config.ServiceSettings.SessionLengthMobileInHours,\n sessionLengthSSOInHours: config.ServiceSettings.SessionLengthSSOInHours,\n sessionCacheInMinutes: config.ServiceSettings.SessionCacheInMinutes,\n sessionIdleTimeoutInMinutes: config.ServiceSettings.SessionIdleTimeoutInMinutes,\n };\n }\n\n renderTitle() {\n return (\n <FormattedMessage {...messages.title}/>\n );\n }\n\n renderSettings = () => {\n let sessionLengthWebHelpText;\n let sessionLengthMobileHelpText;\n let sessionLengthSSOHelpText;\n let sessionTimeoutSetting;\n if (this.state.extendSessionLengthWithActivity) {\n sessionLengthWebHelpText = (<FormattedMessage {...messages.webSessionHoursDesc_extendLength}/>);\n sessionLengthMobileHelpText = (<FormattedMessage {...messages.mobileSessionHoursDesc_extendLength}/>);\n sessionLengthSSOHelpText = (<FormattedMessage {...messages.ssoSessionHoursDesc_extendLength}/>);\n } else {\n sessionLengthWebHelpText = (<FormattedMessage {...messages.webSessionHoursDesc}/>);\n sessionLengthMobileHelpText = (<FormattedMessage {...messages.mobileSessionHoursDesc}/>);\n sessionLengthSSOHelpText = (<FormattedMessage {...messages.ssoSessionHoursDesc}/>);\n }\n if (this.props.license.Compliance && !this.state.extendSessionLengthWithActivity) {\n sessionTimeoutSetting = (\n <TextSetting\n id='sessionIdleTimeoutInMinutes'\n type='number'\n label={<FormattedMessage {...messages.sessionIdleTimeout}/>}\n placeholder={defineMessage({id: 'admin.service.sessionIdleTimeoutEx', defaultMessage: 'E.g.: \"60\"'})}\n helpText={<FormattedMessage {...messages.sessionIdleTimeoutDesc}/>}\n value={this.state.sessionIdleTimeoutInMinutes}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.SessionIdleTimeoutInMinutes')}\n disabled={this.props.isDisabled}\n />\n );\n }\n\n return (\n <SettingsGroup>\n <BooleanSetting\n id='extendSessionLengthWithActivity'\n label={<FormattedMessage {...messages.extendSessionLengthActivity_label}/>}\n helpText={<FormattedMessage {...messages.extendSessionLengthActivity_helpText}/>}\n value={this.state.extendSessionLengthWithActivity}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.ExtendSessionLengthWithActivity')}\n disabled={this.props.isDisabled}\n />\n <BooleanSetting\n id='terminateSessionsOnPasswordChange'\n label={<FormattedMessage {...messages.terminateSessionsOnPasswordChange_label}/>}\n helpText={<FormattedMessage {...messages.terminateSessionsOnPasswordChange_helpText}/>}\n value={this.state.terminateSessionsOnPasswordChange}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.TerminateSessionsOnPasswordChange')}\n disabled={this.props.isDisabled}\n />\n <TextSetting\n id='sessionLengthWebInHours'\n label={<FormattedMessage {...messages.webSessionHours}/>}\n placeholder={defineMessage(messages.sessionHoursEx)}\n helpText={sessionLengthWebHelpText}\n value={this.state.sessionLengthWebInHours}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.SessionLengthWebInHours')}\n disabled={this.props.isDisabled}\n type='number'\n />\n <TextSetting\n id='sessionLengthMobileInHours'\n label={<FormattedMessage {...messages.mobileSessionHours}/>}\n placeholder={defineMessage(messages.sessionHoursEx)}\n helpText={sessionLengthMobileHelpText}\n value={this.state.sessionLengthMobileInHours}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.SessionLengthMobileInHours')}\n disabled={this.props.isDisabled}\n type='number'\n />\n <TextSetting\n id='sessionLengthSSOInHours'\n label={<FormattedMessage {...messages.ssoSessionHours}/>}\n placeholder={defineMessage(messages.sessionHoursEx)}\n helpText={sessionLengthSSOHelpText}\n value={this.state.sessionLengthSSOInHours}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.SessionLengthSSOInHours')}\n disabled={this.props.isDisabled}\n type='number'\n />\n <TextSetting\n id='sessionCacheInMinutes'\n label={<FormattedMessage {...messages.sessionCache}/>}\n placeholder={defineMessage({id: 'admin.service.sessionMinutesEx', defaultMessage: 'E.g.: \"10\"'})}\n helpText={<FormattedMessage {...messages.sessionCacheDesc}/>}\n value={this.state.sessionCacheInMinutes}\n onChange={this.handleChange}\n setByEnv={this.isSetByEnv('ServiceSettings.SessionCacheInMinutes')}\n disabled={this.props.isDisabled}\n type='number'\n />\n {sessionTimeoutSetting}\n </SettingsGroup>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactNode} from 'react';\nimport React from 'react';\nimport styled, {css} from 'styled-components';\n\nexport const SectionHeading = styled.h3`\n &&& {\n margin-bottom: 8px;\n }\n`;\n\nexport const SectionHeader = styled.header.attrs({className: 'header'})<{$borderless?: boolean}>`\n &&& {\n padding: 24px 32px;\n ${({$borderless}) => !$borderless && css`\n border-bottom: 1px solid var(--center-channel-color-12, rgba(63, 67, 80, 0.12));\n `}\n }\n`;\n\nexport const SectionContent = styled.div.attrs({className: 'content'})<{$compact?: boolean}>`\n &&& {\n padding: ${({$compact}) => ($compact ? '24px 32px' : '48px 32px')};\n border-bottom: 1px solid var(--center-channel-color-12, rgba(63, 67, 80, 0.12));\n }\n`;\n\nexport const AdminSection = styled.section.attrs({className: 'AdminPanel'})`\n && {\n overflow: visible;\n }\n`;\n\nexport const AdminWrapper = (props: {children: ReactNode}) => {\n return (\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n {props.children}\n </div>\n </div>\n );\n};\n\nexport const FieldInput = styled.input.attrs({className: 'form-control secure-connections-input'})<{$deleted?: boolean; $strong?: boolean; $borderless?: boolean}>`\n font-weight: normal;\n\n ${({$borderless}) => $borderless && css`\n && {\n border-color: transparent;\n box-shadow: none;\n }\n `};\n\n ${({$deleted}) => $deleted && css`\n && {\n color: #D24B4E;\n text-decoration: line-through;\n }\n `};\n\n ${({$strong}) => $strong && css`\n && {\n font-size: 14px;\n font-style: normal;\n font-weight: 600;\n }\n `};\n`;\n\nexport const DangerText = styled.span`\n color: #D24B4E;\n`;\n\nexport const FieldDeleteButton = styled.button.attrs({className: 'btn btn-sm btn-transparent'})`\n font-weight: normal;\n`;\n\nexport const LinkButton = styled.button.attrs({className: 'btn btn-link'})`\n font-weight: normal;\n padding: 8px 16px !important;\n font-size: 12px;\n font-style: normal;\n font-weight: 600;\n line-height: 16px;\n gap: 6px;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {UserPropertyField} from '@mattermost/types/properties';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n name: string;\n onConfirm: () => void;\n onCancel?: () => void;\n onExited: () => void;\n}\n\nconst noop = () => {};\n\nexport const useUserPropertyFieldDelete = () => {\n const dispatch = useDispatch();\n const promptDelete = (field: UserPropertyField) => {\n return new Promise<boolean>((resolve) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.USER_PROPERTY_FIELD_DELETE,\n dialogType: RemoveUserPropertyFieldModal,\n dialogProps: {\n name: field.name,\n onConfirm: () => resolve(true),\n },\n }));\n });\n };\n\n return {promptDelete} as const;\n};\n\nfunction RemoveUserPropertyFieldModal({\n name,\n onExited,\n onCancel,\n onConfirm,\n}: Props) {\n const {formatMessage} = useIntl();\n\n const title = formatMessage({\n id: 'admin.system_properties.confirm.delete.title',\n defaultMessage: 'Delete {name} property',\n }, {name});\n\n const confirmButtonText = formatMessage({\n id: 'admin.system_properties.confirm.delete.button',\n defaultMessage: 'Delete',\n });\n\n const message = (\n <FormattedMessage\n id={'admin.system_properties.confirm.delete.text'}\n defaultMessage={'Deleting this property will remove all user-defined values associated with it.'}\n />\n );\n\n return (\n <GenericModal\n confirmButtonText={confirmButtonText}\n handleCancel={onCancel ?? noop}\n handleConfirm={onConfirm}\n modalHeaderText={title}\n onExited={onExited}\n compassDesign={true}\n isDeleteModal={true}\n >\n {message}\n </GenericModal>\n );\n}\n\nexport default RemoveUserPropertyFieldModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactElement} from 'react';\nimport {useState, useCallback, useEffect} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from 'types/store';\n\nexport class BatchProcessingError<T = Error> extends Error {\n cause?: {[key: string]: T};\n}\n\nexport type SectionHook = SectionIO & {\n content: ReactElement;\n}\n\nexport type SectionIO = {\n save: () => void;\n cancel: () => void;\n loading: boolean;\n saving: boolean;\n saveError: Error | undefined;\n hasChanges: boolean;\n isValid: boolean;\n};\n\nexport type TLoadingState<TError extends Error> = boolean | TError;\n\nconst status = <T extends Error>(state: TLoadingState<T>) => {\n const loading = state === true;\n const error = state instanceof Error ? state : undefined;\n\n return {loading, error};\n};\n\n/**\n * Track loading and error states of an async operation.\n * Error is cleared when setting loading status.\n * @param initialState -\n */\nexport const useOperationStatus = <T extends Error>(initialState: TLoadingState<T>) => {\n const [state, setState] = useState<TLoadingState<T>>(initialState);\n return [status(state), setState] as const;\n};\n\nexport type ReadOperations<T> = {\n get: () => Promise<T | undefined>;\n select?: (state: GlobalState) => T | undefined;\n opts?: {forceInitialGet: boolean; initial?: Partial<T>};\n}\n\nexport interface CollectionIO<T extends {id: string}> {\n create?: (patch?: Partial<T>) => void;\n update?: (item: T) => void;\n delete?: ((item: T) => void) | ((id: T['id']) => void);\n reorder?: (item: T, nextOrder: number) => void;\n}\n\n/**\n * Monitored async operation with stateful error and loading status handling.\n * @param initialStatus Provide default loading status. e.g. `true` if operation starts immediately or `false` if manually triggered.\n */\nexport function useOperation<T, TArgs extends unknown[], TErr extends Error>(op: (...args: TArgs) => T | undefined | Promise<T | undefined>, initialStatus = true) {\n const [status, setStatus] = useOperationStatus<TErr>(initialStatus);\n\n const doOp = useCallback(async (...args: TArgs) => {\n setStatus(true);\n try {\n const response = await op(...args);\n setStatus(false);\n return response;\n } catch (err) {\n setStatus(err);\n return undefined;\n }\n }, [op]);\n\n return [doOp, status, setStatus] as const;\n}\n\n/**\n * Use current thing from redux selector or async read operation\n * @param ops Read\n * @param ops.get Async operation to retrieve thing if not selected or needs hydration. e.g. a client4 method or dispatched action creator.\n * @param ops.select Redux selector to retrieve thing from the store. Selected thing takes precedence over get-acquired thing.\n * @param initial Provide the initial state of the thing, e.g. placeholder while the get operation is pending.\n * @returns The thing and related meta. Use returned `get` action to forcefully or manually get thing.\n * @remarks Current thing is designed to correspond to the real/saved thing e.g. most recent version of the thing on the server\n */\nexport function useThing<T>(ops: ReadOperations<T>, initial: T) {\n const forceInitialGet = ops.opts?.forceInitialGet ?? true;\n const selected = useSelector<GlobalState, T | undefined>((state) => ops.select?.(state));\n const [data, setData] = useState<T>(initial);\n const [get, status] = useOperation(ops.get, forceInitialGet || !selected);\n\n useEffect(() => {\n if (forceInitialGet || !selected) {\n get().then((value) => {\n if (value !== undefined) {\n setData(value);\n }\n });\n }\n }, [forceInitialGet, selected, get, setData]);\n\n return [selected ?? data, {...status, get, setData}] as const;\n}\n\n/**\n * Use a pending thing to be saved in the future. Designed to be used with a corresponding {@link useThing}.\n * Has built-in patching for simple/flat objects, or add your own layered write operations on top in your custom hook.\n * @param data Current version or \"source of truth\" version of thing.\n * @param opts.commit Action to save pending thing.\n * @remarks After successfully committing, sync the resulting thing back to the current thing to reconcile or complete or the cycle and clear any diffs.\n */\nexport function usePendingThing<T extends Record<string, unknown>, TErr extends Error>(\n data: T,\n opts: {\n commit: (pending: T, current: T) => T | Promise<T>;\n beforeUpdate?: (pending: T, current: T) => T;\n },\n) {\n const [pending, setPending] = useState(data);\n const hasChanges = pending !== data;\n\n const [doCommit, {loading: saving, error}, setStatus] = useOperation<T, Parameters<typeof opts.commit>, TErr>(opts.commit, false);\n\n useEffect(() => {\n setPending(data);\n }, [setPending, data]);\n\n const apply = useCallback((update: T | ((current: T) => T)) => {\n setPending((currentPending) => {\n const next = typeof update === 'function' ? update(currentPending) : ({...currentPending, ...update});\n\n if (opts.beforeUpdate) {\n return opts?.beforeUpdate(next, data);\n }\n\n return next;\n });\n }, [setPending, data, opts.beforeUpdate]);\n\n const reset = useCallback(() => {\n setPending(data);\n setStatus(false);\n }, [setPending, data, setStatus]);\n\n const commit = useCallback(() => {\n return doCommit(pending, data);\n }, [doCommit, pending, data]);\n\n return [pending, {saving, error, hasChanges, apply, commit, reset}] as const;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport groupBy from 'lodash/groupBy';\nimport isEmpty from 'lodash/isEmpty';\nimport {useMemo} from 'react';\n\nimport type {ClientError} from '@mattermost/client';\nimport type {UserPropertyField} from '@mattermost/types/properties';\nimport {collectionAddItem, collectionFromArray, collectionRemoveItem, collectionReplaceItem, collectionToArray} from '@mattermost/types/utilities';\nimport type {PartialExcept, IDMappedCollection, IDMappedObjects} from '@mattermost/types/utilities';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {generateId} from 'utils/utils';\n\nimport type {CollectionIO} from './section_utils';\nimport {useThing, usePendingThing, BatchProcessingError} from './section_utils';\n\nexport type UserPropertyFields = IDMappedCollection<UserPropertyField>;\n\ntype PendingOps<T extends {id: string}> = {[op: string]: T[]};\n\nexport const useUserPropertyFields = () => {\n // current fields\n const [fieldCollection, readIO] = useThing<UserPropertyFields>(useMemo(() => ({\n get: async () => {\n const data = await Client4.getCustomProfileAttributeFields();\n return collectionFromArray(data);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n select: (state) => {\n return undefined;\n },\n opts: {forceInitialGet: true},\n }), []), collectionFromArray([]));\n\n // pending fields to be saved\n const [pendingCollection, pendingIO] = usePendingThing<UserPropertyFields, BatchProcessingError<ClientError>>(fieldCollection, useMemo(() => ({\n commit: async (collection: UserPropertyFields, prevCollection: UserPropertyFields) => {\n // prepare ops\n const process = collectionToArray(collection).reduce<PendingOps<UserPropertyField>>((ops, item) => {\n // don't process unchanged items\n if (item === prevCollection.data[item.id]) {\n return ops;\n }\n\n switch (true) {\n case isCreatePending(item):\n ops.create.push(item);\n break;\n case isDeletePending(item):\n ops.delete.push(item);\n break;\n case item !== prevCollection.data[item.id]:\n ops.edit.push(item);\n }\n\n return ops;\n }, {delete: [], edit: [], create: []});\n\n const next: UserPropertyFields = {\n data: {...collection.data},\n order: [...collection.order],\n errors: {}, // start with errors cleared; don't keep stale errors\n };\n\n // delete - all\n await Promise.all(process.delete.map(async ({id}) => {\n return Client4.deleteCustomProfileAttributeField(id).\n then(() => {\n // data:deleted\n Reflect.deleteProperty(next.data, id);\n\n // order:deleted\n next.order = next.order.filter((orderId) => orderId !== id);\n }).\n catch((reason: ClientError) => {\n next.errors = {...next.errors, [id]: reason};\n });\n }));\n\n // update - all\n await Promise.all(process.edit.map(async (pendingItem) => {\n const {id, name, type} = pendingItem;\n\n return Client4.patchCustomProfileAttributeField(id, {name, type}).\n then((nextItem) => {\n // data:updated\n next.data[id] = nextItem;\n }).\n catch((reason: ClientError) => {\n next.errors = {...next.errors, [id]: reason};\n });\n }));\n\n // create - each, to preserve created/sort ordering\n for (const pendingItem of process.create) {\n const {id, name, type} = pendingItem;\n\n // eslint-disable-next-line no-await-in-loop\n await Client4.createCustomProfileAttributeField({name, type}).\n then((newItem) => {\n // data:created (delete pending data)\n Reflect.deleteProperty(next.data, id);\n next.data[newItem?.id] = newItem;\n\n // order:created (replace pending id with created id)\n next.order = next.order.map((orderId) => (orderId === pendingItem?.id ? newItem.id : orderId));\n }).\n catch((reason: ClientError) => {\n next.errors = {...next.errors, [id]: reason};\n });\n }\n\n if (isEmpty(next.errors)) {\n Reflect.deleteProperty(next, 'errors');\n } else {\n // set pendingIO master error\n throw new BatchProcessingError<ClientError>('error processing operations', {cause: next.errors});\n }\n\n return next;\n },\n beforeUpdate: (pending, current) => {\n const byNamesLower = (data: IDMappedObjects<UserPropertyField>) => {\n return groupBy(data, ({name}) => name.toLowerCase());\n };\n\n // Name\n const pendingByName = byNamesLower(pending.data);\n const currentByName = byNamesLower(current.data);\n\n const warnings = Object.values(pending.data).reduce<NonNullable<UserPropertyFields['warnings']>>((acc, field) => {\n if (!field.name) {\n // name not provided\n acc[field.id] = {name: ValidationWarningNameRequired};\n } else if (pendingByName[field.name.toLowerCase()]?.filter((x) => x.delete_at === 0)?.length > 1) {\n // duplicate pending name\n acc[field.id] = {name: ValidationWarningNameUnique};\n } else if (\n currentByName?.[field.name.toLowerCase()]?.length >= 1 &&\n field.id !== currentByName?.[field.name.toLowerCase()]?.[0]?.id\n ) {\n // name already in use\n const correspondingPending = pending.data[currentByName?.[field.name.toLowerCase()]?.[0]?.id];\n\n // except when corresponding field is going to be deleted, then it is no longer in conflict\n if (correspondingPending.delete_at === 0) {\n // not going to be deleted, so in conflict\n acc[field.id] = {name: ValidationWarningNameTaken};\n }\n }\n\n return acc;\n }, {});\n\n const next = {...pending, warnings};\n\n if (isEmpty(warnings)) {\n Reflect.deleteProperty(next, 'warnings');\n }\n\n return next;\n },\n\n }), []));\n\n // edit pending fields before saving\n const itemOps = useMemo(() => ({\n update: (field) => {\n pendingIO.apply((pending) => {\n return collectionReplaceItem(pending, field);\n });\n },\n create: () => {\n pendingIO.apply((pending) => {\n const name = getIncrementedName('Text', pending);\n const field = newPendingField({name, type: 'text'});\n return collectionAddItem(pending, field);\n });\n },\n delete: (id: string) => {\n pendingIO.apply((pending) => {\n const field = pending.data[id];\n\n if (isCreatePending(field)) {\n // immediately remove if deleting a field that is pending creation\n return collectionRemoveItem(pending, field);\n }\n\n return collectionReplaceItem(pending, {...field, delete_at: Date.now()});\n });\n },\n } satisfies CollectionIO<UserPropertyField>), [pendingIO.apply]);\n\n return [pendingCollection, readIO, pendingIO, itemOps] as const;\n};\n\nexport const ValidationWarningNameRequired = 'user_properties.validation.name_required';\nexport const ValidationWarningNameUnique = 'user_properties.validation.name_unique';\nexport const ValidationWarningNameTaken = 'user_properties.validation.name_taken';\n\nconst getIncrementedName = (desiredName: string, collection: UserPropertyFields) => {\n const names = new Set(Object.values(collection.data).map(({name}) => name));\n let newName = desiredName;\n let n = 1;\n while (names.has(newName)) {\n n++;\n newName = `${desiredName} ${n}`;\n }\n return newName;\n};\n\nconst PENDING = 'pending_';\nexport const isCreatePending = <T extends {id: string; delete_at: number; create_at: number}>(item: T) => {\n // has not been created and is not deleted\n return item.create_at === 0 && item.delete_at === 0;\n};\n\nexport const isDeletePending = <T extends {delete_at: number; create_at: number}>(item: T) => {\n // has been created and needs to be deleted\n return item.create_at !== 0 && item.delete_at !== 0;\n};\n\nexport const newPendingId = () => `${PENDING}${generateId()}`;\n\nexport const newPendingField = (patch: PartialExcept<UserPropertyField, 'name'>): UserPropertyField => {\n return {\n ...patch,\n type: 'text',\n group_id: 'custom_profile_attributes',\n id: newPendingId(),\n create_at: 0,\n delete_at: 0,\n update_at: 0,\n };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createColumnHelper, getCoreRowModel, getSortedRowModel, useReactTable, type ColumnDef} from '@tanstack/react-table';\nimport type {ReactNode} from 'react';\nimport React, {useEffect, useMemo, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport styled, {css} from 'styled-components';\n\nimport {PlusIcon, TextBoxOutlineIcon, TrashCanOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {UserPropertyField} from '@mattermost/types/properties';\nimport {collectionToArray} from '@mattermost/types/utilities';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport Constants from 'utils/constants';\n\nimport {DangerText, FieldDeleteButton, FieldInput, LinkButton} from './controls';\nimport type {SectionHook} from './section_utils';\nimport {useUserPropertyFieldDelete} from './user_properties_delete_modal';\nimport type {UserPropertyFields} from './user_properties_utils';\nimport {isCreatePending, useUserPropertyFields, ValidationWarningNameRequired, ValidationWarningNameTaken, ValidationWarningNameUnique} from './user_properties_utils';\n\nimport {AdminConsoleListTable} from '../list_table';\n\ntype Props = {\n data: UserPropertyFields;\n}\n\ntype FieldActions = {\n updateField: (field: UserPropertyField) => void;\n deleteField: (id: string) => void;\n}\n\nexport const useUserPropertiesTable = (): SectionHook => {\n const [userPropertyFields, readIO, pendingIO, itemOps] = useUserPropertyFields();\n const nonDeletedCount = Object.values(userPropertyFields.data).filter((f) => f.delete_at === 0).length;\n\n const save = async () => {\n const newData = await pendingIO.commit();\n\n // reconcile - zero pending changes\n if (newData && !newData.errors) {\n readIO.setData(newData);\n }\n };\n\n const content = readIO.loading ? (\n <LoadingScreen/>\n ) : (\n <>\n <UserPropertiesTable\n data={userPropertyFields}\n updateField={itemOps.update}\n deleteField={itemOps.delete}\n />\n {nonDeletedCount < Constants.MAX_CUSTOM_ATTRIBUTES && (\n <LinkButton onClick={itemOps.create}>\n <PlusIcon size={16}/>\n <FormattedMessage\n id='admin.system_properties.user_properties.add_property'\n defaultMessage='Add property'\n />\n </LinkButton>\n )}\n </>\n );\n\n return {\n content,\n loading: readIO.loading,\n hasChanges: pendingIO.hasChanges,\n isValid: !userPropertyFields.warnings,\n save,\n cancel: pendingIO.reset,\n saving: pendingIO.saving,\n saveError: pendingIO.error,\n };\n};\n\nexport function UserPropertiesTable({data: collection, updateField, deleteField}: Props & FieldActions) {\n const {formatMessage} = useIntl();\n const data = collectionToArray(collection);\n const col = createColumnHelper<UserPropertyField>();\n const columns = useMemo<Array<ColumnDef<UserPropertyField, any>>>(() => {\n return [\n col.accessor('name', {\n header: () => {\n return (\n <ColHeaderLeft>\n <FormattedMessage\n id='admin.system_properties.user_properties.table.property'\n defaultMessage='Property'\n />\n </ColHeaderLeft>\n );\n },\n cell: ({getValue, row}) => {\n const toDelete = row.original.delete_at !== 0;\n const warningId = collection.warnings?.[row.original.id]?.name;\n\n let warning;\n\n if (warningId === ValidationWarningNameRequired) {\n warning = (\n <FormattedMessage\n tagName={DangerText}\n id='admin.system_properties.user_properties.table.validation.name_required'\n defaultMessage='Please enter a property name.'\n />\n );\n } else if (warningId === ValidationWarningNameUnique) {\n warning = (\n <FormattedMessage\n tagName={DangerText}\n id='admin.system_properties.user_properties.table.validation.name_unique'\n defaultMessage='Property names must be unique.'\n />\n );\n } else if (warningId === ValidationWarningNameTaken) {\n warning = (\n <FormattedMessage\n tagName={DangerText}\n id='admin.system_properties.user_properties.table.validation.name_taken'\n defaultMessage='Property name already taken.'\n />\n );\n }\n\n return (\n <>\n <EditableValue\n strong={true}\n value={getValue()}\n label={formatMessage({id: 'admin.system_properties.user_properties.table.property_name.input.name', defaultMessage: 'Property Name'})}\n deleted={toDelete}\n borderless={!warning}\n testid='property-field-input'\n autoFocus={isCreatePending(row.original)}\n setValue={(value: string) => {\n updateField({...row.original, name: value.trim()});\n }}\n maxLength={Constants.MAX_CUSTOM_ATTRIBUTE_NAME_LENGTH}\n />\n {!toDelete && warning}\n </>\n );\n },\n enableHiding: false,\n enableSorting: false,\n }),\n col.accessor('type', {\n header: () => {\n return (\n <ColHeaderLeft>\n <FormattedMessage\n id='admin.system_properties.user_properties.table.type'\n defaultMessage='Type'\n />\n </ColHeaderLeft>\n );\n },\n cell: ({getValue, row}) => {\n let type = getValue();\n\n if (type === 'text') {\n type = (\n <>\n <TextBoxOutlineIcon\n size={18}\n color={'rgba(var(--center-channel-color-rgb), 0.64)'}\n />\n <FormattedMessage\n id='admin.system_properties.user_properties.table.type.text'\n defaultMessage='Text'\n />\n </>\n );\n }\n\n return (\n <TypeCellWrapper $deleted={row.original.delete_at !== 0}>\n {type}\n </TypeCellWrapper>\n );\n },\n enableHiding: false,\n enableSorting: false,\n }),\n col.display({\n id: 'actions',\n header: () => {\n return (\n <ColHeaderRight>\n <FormattedMessage\n id='admin.system_properties.user_properties.table.actions'\n defaultMessage='Actions'\n />\n </ColHeaderRight>\n );\n },\n cell: ({row}) => (\n <Actions\n field={row.original}\n updateField={updateField}\n deleteField={deleteField}\n />\n ),\n enableHiding: false,\n enableSorting: false,\n }),\n ];\n }, [updateField, deleteField, collection.warnings]);\n\n const table = useReactTable({\n data,\n columns,\n initialState: {\n sorting: [],\n },\n getCoreRowModel: getCoreRowModel<UserPropertyField>(),\n getSortedRowModel: getSortedRowModel<UserPropertyField>(),\n enableSortingRemoval: false,\n enableMultiSort: false,\n renderFallbackValue: '',\n meta: {\n tableId: 'userProperties',\n disablePaginationControls: true,\n },\n manualPagination: true,\n });\n\n return (\n <TableWrapper>\n <AdminConsoleListTable<UserPropertyField> table={table}/>\n </TableWrapper>\n );\n}\n\nconst TableWrapper = styled.div`\n table.adminConsoleListTable {\n\n td, th {\n &:after, &:before {\n display: none;\n }\n }\n\n thead {\n border-top: none;\n border-bottom: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\n tr {\n th.pinned {\n background: rgba(var(--center-channel-color-rgb), 0.04);\n padding-block-end: 8px;\n padding-block-start: 8px;\n }\n }\n }\n\n tbody {\n tr {\n border-top: none;\n border-bottom: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\n border-bottom-color: rgba(var(--center-channel-color-rgb), 0.08) !important;\n td {\n padding-block-end: 4px;\n padding-block-start: 4px;\n\n &:last-child {\n padding-inline-end: 12px;\n }\n }\n }\n }\n\n tfoot {\n border-top: none;\n }\n }\n .adminConsoleListTableContainer {\n padding: 2px 0px;\n }\n`;\n\nconst Actions = ({field, deleteField}: {field: UserPropertyField} & FieldActions) => {\n const {promptDelete} = useUserPropertyFieldDelete();\n const {formatMessage} = useIntl();\n\n const handleDelete = () => {\n if (isCreatePending(field)) {\n // skip prompt when field is pending creation\n deleteField(field.id);\n } else {\n promptDelete(field).then(() => deleteField(field.id));\n }\n };\n\n return (\n <ActionsRoot>\n {field.delete_at === 0 && (\n <FieldDeleteButton\n onClick={handleDelete}\n aria-label={formatMessage({id: 'admin.system_properties.user_properties.table.actions.delete', defaultMessage: 'Delete'})}\n >\n <TrashCanOutlineIcon\n size={18}\n color={'rgba(var(--center-channel-color-rgb), 0.64)'}\n />\n </FieldDeleteButton>\n )}\n </ActionsRoot>\n );\n};\n\nconst TypeCellWrapper = styled.div<{$deleted?: boolean}>`\n ${({$deleted}) => $deleted && css`\n && {\n color: #D24B4E;\n text-decoration: line-through;\n }\n `};\n\n vertical-align: middle;\n display: inline-flex;\n gap: 6px;\n align-items: center;\n`;\n\nconst ColHeaderLeft = styled.div`\n display: inline-block;\n`;\n\nconst ColHeaderRight = styled.div`\n display: inline-block;\n width: 100%;\n text-align: right;\n`;\n\nconst ActionsRoot = styled.div`\n text-align: right;\n`;\n\ntype EditableValueProps = {\n value: string;\n label?: string;\n testid?: string;\n setValue: (value: string) => void;\n autoFocus?: boolean;\n disabled?: boolean;\n deleted?: boolean;\n footer?: ReactNode;\n strong?: boolean;\n maxLength?: number;\n borderless?: boolean;\n};\nconst EditableValue = (props: EditableValueProps) => {\n const [value, setValue] = useState(props.value);\n\n useEffect(() => {\n setValue(props.value);\n }, [props.value]);\n\n return (\n <>\n <FieldInput\n type='text'\n aria-label={props.label}\n data-testid={props.testid}\n disabled={props.disabled ?? props.deleted}\n $deleted={props.deleted}\n $strong={props.strong}\n $borderless={props.borderless}\n maxLength={props.maxLength}\n autoFocus={props.autoFocus}\n onFocus={(e) => {\n if (props.autoFocus) {\n e.target.select();\n }\n }}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n }}\n onBlur={() => {\n if (value !== props.value) {\n props.setValue(value);\n }\n }}\n />\n {props.footer}\n </>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {setNavigationBlocked} from 'actions/admin_actions';\n\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {AdminSection, AdminWrapper, DangerText, SectionContent, SectionHeader, SectionHeading} from './controls';\nimport {useUserPropertiesTable} from './user_properties_table';\n\nimport SaveChangesPanel from '../save_changes_panel';\nimport type {SearchableStrings} from '../types';\n\ntype Props = {\n disabled: boolean;\n}\n\nexport default function SystemProperties(props: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n const userProperties = useUserPropertiesTable();\n\n const saving = userProperties.saving;\n const hasChanges = userProperties.hasChanges;\n const isValid = userProperties.isValid;\n const saveError = userProperties.saveError;\n\n const handleSave = () => {\n userProperties.save();\n };\n\n const handleCancel = () => {\n userProperties.cancel();\n };\n\n useEffect(() => {\n // block nav when changes are pending\n dispatch(setNavigationBlocked(hasChanges));\n }, [hasChanges]);\n\n return (\n <div\n className='wrapper--fixed'\n data-testid='systemProperties'\n >\n <AdminHeader>\n <FormattedMessage {...msg.pageTitle}/>\n </AdminHeader>\n <AdminWrapper>\n <AdminSection data-testid='user_properties'>\n <SectionHeader>\n <hgroup>\n <FormattedMessage\n tagName={SectionHeading}\n id='admin.system_properties.user_properties.title'\n defaultMessage='User Properties'\n />\n <FormattedMessage\n id='admin.system_properties.user_properties.subtitle'\n defaultMessage='Customize the properties to show in user profiles'\n />\n </hgroup>\n </SectionHeader>\n <SectionContent $compact={true}>\n {userProperties.content}\n </SectionContent>\n </AdminSection>\n </AdminWrapper>\n <SaveChangesPanel\n saving={saving}\n saveNeeded={hasChanges}\n onClick={handleSave}\n onCancel={handleCancel}\n serverError={saveError ? (\n <FormattedMessage\n tagName={DangerText}\n id='admin.system_properties.details.saving_changes_error'\n defaultMessage='There was an error while saving the configuration'\n />\n ) : undefined}\n savingMessage={formatMessage({id: 'admin.system_properties.details.saving_changes', defaultMessage: 'Saving configuration…'})}\n isDisabled={props.disabled || saving || !isValid}\n />\n </div>\n );\n}\n\nconst msg = defineMessages({\n pageTitle: {id: 'admin.sidebar.system_properties', defaultMessage: 'System Properties'},\n});\n\nexport const searchableStrings: SearchableStrings = Object.values(msg);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport SystemProperties from './system_properties';\n\nexport {searchableStrings} from './system_properties';\n\nexport default SystemProperties;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessages, type MessageDescriptor} from 'react-intl';\n\nexport const rolesStrings: Record<string, Record<string, MessageDescriptor>> = {\n system_admin: defineMessages({\n name: {\n id: 'admin.permissions.roles.system_admin.name',\n defaultMessage: 'System Admin',\n },\n description: {\n id: 'admin.permissions.roles.system_admin.description',\n defaultMessage: 'Access to modifying everything.',\n },\n type: {\n id: 'admin.permissions.roles.system_admin.type',\n defaultMessage: 'System Role',\n },\n }),\n system_user_manager: defineMessages({\n name: {\n id: 'admin.permissions.roles.system_user_manager.name',\n defaultMessage: 'User Manager',\n },\n description: {\n id: 'admin.permissions.roles.system_user_manager.description',\n defaultMessage: 'Enough access to help with user management.',\n },\n type: {\n id: 'admin.permissions.roles.system_user_manager.type',\n defaultMessage: 'System Role',\n },\n }),\n system_manager: defineMessages({\n name: {\n id: 'admin.permissions.roles.system_manager.name',\n defaultMessage: 'System Manager',\n },\n description: {\n id: 'admin.permissions.roles.system_manager.description',\n defaultMessage: 'Slightly less access than system admin.',\n },\n type: {\n id: 'admin.permissions.roles.system_manager.type',\n defaultMessage: 'System Role',\n },\n }),\n system_read_only_admin: defineMessages({\n name: {\n id: 'admin.permissions.roles.system_read_only_admin.name',\n defaultMessage: 'Viewer',\n },\n description: {\n id: 'admin.permissions.roles.system_read_only_admin.description',\n defaultMessage: 'Read only access for oversight.',\n },\n type: {\n id: 'admin.permissions.roles.system_read_only_admin.type',\n defaultMessage: 'System Role',\n },\n }),\n system_custom_group_admin: defineMessages({\n name: {\n id: 'admin.permissions.roles.system_custom_group_admin.name',\n defaultMessage: 'Custom Group Manager',\n },\n description: {\n id: 'admin.permissions.roles.system_custom_group_admin.description',\n defaultMessage: 'Administers all Custom Groups across the system.',\n },\n type: {\n id: 'admin.permissions.roles.system_custom_group_admin.type',\n defaultMessage: 'System Role',\n },\n }),\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Role} from '@mattermost/types/roles';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport './system_roles.scss';\nimport {rolesStrings} from './strings';\n\ntype Props = {\n roles: Record<string, Role>;\n}\n\nconst columns: Column[] = [\n {\n name: 'Role',\n field: 'role',\n width: 2,\n },\n {\n name: 'Description',\n field: 'description',\n width: 3,\n },\n {\n name: 'Type',\n field: 'type',\n width: 2,\n },\n {\n name: '',\n field: 'edit',\n width: 1,\n textAlign: 'right',\n },\n];\n\nexport default class SystemRoles extends React.PureComponent<Props> {\n render() {\n const {roles} = this.props;\n const roleNames = ['system_admin', 'system_manager', 'system_user_manager', 'system_custom_group_admin', 'system_read_only_admin'];\n const rows: Row[] = [];\n roleNames.forEach((name) => {\n const role = roles[name];\n if (role) {\n rows.push({\n cells: {\n role: <FormattedMessage {...rolesStrings[role.name].name}/>,\n description: <FormattedMessage {...rolesStrings[role.name].description}/>,\n type: <FormattedMessage {...rolesStrings[role.name].type}/>,\n edit: (\n <span\n className='SystemRoles_editRow'\n data-testid={`${role.name}_edit`}\n >\n <Link to={`/admin_console/user_management/system_roles/${role.id}`} >\n <FormattedMessage\n id='admin.permissions.roles.edit'\n defaultMessage='Edit'\n />\n </Link>\n </span>\n ),\n },\n onClick: () => getHistory().push(`/admin_console/user_management/system_roles/${role.id}`),\n });\n }\n });\n\n return (\n <div className='wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage\n id='admin.permissions.systemRoles'\n defaultMessage='Delegated Granular Administration'\n />\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <AdminPanel\n id='SystemRoles'\n title={defineMessage({id: 'admin.permissions.systemRolesBannerTitle', defaultMessage: 'Admin Roles'})}\n subtitle={defineMessage({id: 'admin.permissions.systemRolesBannerText', defaultMessage: 'Manage different levels of access to the system console.'})}\n >\n <div className='SystemRoles'>\n <DataGrid\n rows={rows}\n columns={columns}\n page={1}\n startCount={0}\n endCount={rows.length}\n loading={false}\n nextPage={() => {}}\n previousPage={() => {}}\n />\n </div>\n </AdminPanel>\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles_helpers';\n\nimport type {GlobalState} from 'types/store';\n\nimport SystemRoles from './system_roles';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n roles: getRoles(state),\n };\n}\n\nexport default connect(mapStateToProps)(SystemRoles);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessages, type MessageDescriptor} from 'react-intl';\n\nexport const sectionStrings: Record<string, Record<string, MessageDescriptor>> = {\n about: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_about.name',\n defaultMessage: 'About',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_about.description',\n defaultMessage: 'The ability to install or upgrade your servers enterprise licensing.',\n },\n }),\n about_edition_and_license: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_about_edition_and_license.name',\n defaultMessage: 'Edition and License',\n },\n }),\n billing: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_billing.name',\n defaultMessage: 'Billing',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_billing.description',\n defaultMessage: 'Access subscription details, billing history, company information and payment information.',\n },\n }),\n reporting: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_reporting.name',\n defaultMessage: 'Reporting',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_reporting.description',\n defaultMessage: 'Review site statistics, team statistics and server logs.',\n },\n }),\n reporting_site_statistics: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_reporting_site_statistics.name',\n defaultMessage: 'Site Statistics',\n },\n }),\n reporting_team_statistics: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_reporting_team_statistics.name',\n defaultMessage: 'Team Statistics',\n },\n }),\n reporting_server_logs: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_reporting_server_logs.name',\n defaultMessage: 'Server Logs',\n },\n }),\n user_management: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management.name',\n defaultMessage: 'User Management',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_user_management.description',\n defaultMessage: 'Review users, groups, teams, channels, permissions and system roles.',\n },\n }),\n user_management_users: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management_users.name',\n defaultMessage: 'Users',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_user_management_users.description',\n defaultMessage: 'Cannot reset admin passwords',\n },\n }),\n user_management_groups: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management_groups.name',\n defaultMessage: 'Groups',\n },\n }),\n user_management_teams: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management_teams.name',\n defaultMessage: 'Teams',\n },\n }),\n user_management_channels: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management_channels.name',\n defaultMessage: 'Channels',\n },\n }),\n user_management_permissions: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management_permissions.name',\n defaultMessage: 'Permissions',\n },\n }),\n user_management_system_roles: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_user_management_system_roles.name',\n defaultMessage: 'Delegated Granular Administration',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_user_management_system_roles.description',\n defaultMessage: 'Restricts the System Console interface only. The underlying API endpoints are accessible to all users in a read-only state for basic product functionality.',\n },\n }),\n environment: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment.name',\n defaultMessage: 'Environment',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_environment.description',\n defaultMessage: 'Review server environment configuration such as URLs, database and performance.',\n },\n }),\n environment_web_server: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_web_server.name',\n defaultMessage: 'Web Server',\n },\n }),\n environment_database: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_database.name',\n defaultMessage: 'Database',\n },\n }),\n environment_elasticsearch: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_elasticsearch.name',\n defaultMessage: 'Elasticsearch',\n },\n }),\n environment_file_storage: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_file_storage.name',\n defaultMessage: 'File Storage',\n },\n }),\n environment_image_proxy: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_image_proxy.name',\n defaultMessage: 'Image Proxy',\n },\n }),\n environment_smtp: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_smtp.name',\n defaultMessage: 'SMTP',\n },\n }),\n environment_push_notification_server: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_push_notification_server.name',\n defaultMessage: 'Push Notification Server',\n },\n }),\n environment_high_availability: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_high_availability.name',\n defaultMessage: 'High Availability',\n },\n }),\n environment_rate_limiting: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_rate_limiting.name',\n defaultMessage: 'Rate Limiting',\n },\n }),\n environment_logging: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_logging.name',\n defaultMessage: 'Logging',\n },\n }),\n environment_session_lengths: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_session_lengths.name',\n defaultMessage: 'Session Lengths',\n },\n }),\n environment_performance_monitoring: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_performance_monitoring.name',\n defaultMessage: 'Performance Monitoring',\n },\n }),\n environment_developer: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_environment_developer.name',\n defaultMessage: 'Developer',\n },\n }),\n site: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site.name',\n defaultMessage: 'Site Configuration',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_site.description',\n defaultMessage: 'Review site specific configurations such as site name, notification defaults and file sharing.',\n },\n }),\n site_customization: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_customization.name',\n defaultMessage: 'Customization',\n },\n }),\n site_localization: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_localization.name',\n defaultMessage: 'Localization',\n },\n }),\n site_users_and_teams: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_users_and_teams.name',\n defaultMessage: 'Users and Teams',\n },\n }),\n site_notifications: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_notifications.name',\n defaultMessage: 'Notifications',\n },\n }),\n site_announcement_banner: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_announcement_banner.name',\n defaultMessage: 'Announcement Banner',\n },\n }),\n site_emoji: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_emoji.name',\n defaultMessage: 'Emoji',\n },\n }),\n site_posts: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_posts.name',\n defaultMessage: 'Posts',\n },\n }),\n site_file_sharing_and_downloads: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_file_sharing_and_downloads.name',\n defaultMessage: 'File Sharing and Downloads',\n },\n }),\n site_public_links: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_public_links.name',\n defaultMessage: 'Public Links',\n },\n }),\n site_notices: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_site_notices.name',\n defaultMessage: 'Notices',\n },\n }),\n authentication: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication.name',\n defaultMessage: 'Authentication',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_authentication.description',\n defaultMessage: 'Review the configuration around how users can signup and access Mattermost.',\n },\n }),\n authentication_signup: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_signup.name',\n defaultMessage: 'Signup',\n },\n }),\n authentication_email: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_email.name',\n defaultMessage: 'Email',\n },\n }),\n authentication_password: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_password.name',\n defaultMessage: 'Password',\n },\n }),\n authentication_mfa: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_mfa.name',\n defaultMessage: 'MFA',\n },\n }),\n authentication_ldap: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_ldap.name',\n defaultMessage: 'AD/LDAP',\n },\n }),\n authentication_saml: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_saml.name',\n defaultMessage: 'SAML 2.0',\n },\n }),\n authentication_openid: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_openid.name',\n defaultMessage: 'OpenID Connect',\n },\n }),\n authentication_guest_access: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_authentication_guest_access.name',\n defaultMessage: 'Guest Access',\n },\n }),\n plugins: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_plugins.name',\n defaultMessage: 'Plugins',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_plugins.description',\n defaultMessage: 'Review installed plugins and their configuration.',\n },\n }),\n integrations: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_integrations.name',\n defaultMessage: 'Integrations',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_integrations.description',\n defaultMessage: 'Review integration configurations such as webhooks, bots and cross-origin requests.',\n },\n }),\n integrations_integration_management: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_integrations_integration_management.name',\n defaultMessage: 'Integration Management',\n },\n }),\n integrations_bot_accounts: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_integrations_bot_accounts.name',\n defaultMessage: 'Bot Accounts',\n },\n }),\n integrations_gif: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_integrations_gif.name',\n defaultMessage: 'GIF',\n },\n }),\n integrations_cors: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_integrations_cors.name',\n defaultMessage: 'CORS',\n },\n }),\n compliance: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_compliance.name',\n defaultMessage: 'Compliance',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_compliance.description',\n defaultMessage: 'Review compliance settings such as retention, exports and activity logs.',\n },\n }),\n compliance_data_retention_policy: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_compliance_data_retention_policy.name',\n defaultMessage: 'Data Retention Policy',\n },\n }),\n compliance_compliance_export: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_compliance_compliance_export.name',\n defaultMessage: 'Compliance Export',\n },\n }),\n compliance_compliance_monitoring: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_compliance_compliance_monitoring.name',\n defaultMessage: 'Compliance Monitoring',\n },\n }),\n compliance_custom_terms_of_service: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_compliance_custom_terms_of_service.name',\n defaultMessage: 'Custom Terms of Service',\n },\n }),\n experimental: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_experimental.name',\n defaultMessage: 'Experimental',\n },\n description: {\n id: 'admin.permissions.sysconsole_section_experimental.description',\n defaultMessage: 'Review the settings of experimental features',\n },\n }),\n experimental_features: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_experimental_features.name',\n defaultMessage: 'Features',\n },\n }),\n experimental_feature_flags: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_experimental_feature_flags.name',\n defaultMessage: 'Feature Flags',\n },\n }),\n experimental_bleve: defineMessages({\n name: {\n id: 'admin.permissions.sysconsole_section_experimental_bleve.name',\n defaultMessage: 'Bleve',\n },\n }),\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport type ReadAccess = 'read';\nexport const readAccess: ReadAccess = 'read';\nexport type WriteAccess = 'write';\nexport const writeAccess: WriteAccess = 'write';\nexport type NoAccess = false;\nexport const noAccess: NoAccess = false;\nexport type MixedAccess = 'mixed';\nexport const mixedAccess: MixedAccess = 'mixed';\n\nexport type PermissionAccess = ReadAccess | WriteAccess | NoAccess;\nexport type PermissionsToUpdate = Record<string, ReadAccess | WriteAccess | NoAccess>;\nexport type PermissionToUpdate = {\n name: string;\n value: PermissionAccess;\n};\n\nexport type SystemSection = {\n name: string;\n hasDescription?: boolean;\n subsections?: SystemSection[];\n disabled?: boolean;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport * as Utils from 'utils/utils';\n\nimport {noAccess, writeAccess, readAccess, mixedAccess} from './types';\nimport type {PermissionAccess, PermissionToUpdate, SystemSection, WriteAccess, NoAccess, ReadAccess, MixedAccess} from './types';\n\nimport './system_role_permissions.scss';\n\ntype Props = {\n section: SystemSection;\n access: MixedAccess | ReadAccess | NoAccess | WriteAccess;\n updatePermissions: (permissions: PermissionToUpdate[]) => void;\n isDisabled?: boolean;\n}\n\nexport default class SystemRolePermissionDropdown extends React.PureComponent<Props> {\n updatePermission = (value: PermissionAccess) => {\n const {section} = this.props;\n const permissions: PermissionToUpdate[] = [];\n if (section.subsections && section.subsections.length > 0) {\n section.subsections.forEach(({name, disabled}) => {\n if (!disabled) {\n permissions.push({name, value});\n }\n });\n } else {\n permissions.push({name: section.name, value});\n }\n this.props.updatePermissions(permissions);\n };\n\n renderOption = (label: JSX.Element, description: JSX.Element) => {\n return (\n <div className='PermissionSectionDropdownOptions'>\n <div className='PermissionSectionDropdownOptions_label'>\n {label}\n </div>\n <div className='PermissionSectionDropdownOptions_description'>\n {description}\n </div>\n </div>\n );\n };\n\n render() {\n const {isDisabled, section} = this.props;\n\n const canWriteLabel = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.write.title'}\n defaultMessage='Can edit'\n />\n );\n\n const canWriteDescription = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.write.description'}\n defaultMessage='Can add, edit and delete anything in this section.'\n />\n );\n\n const canReadLabel = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.read.title'}\n defaultMessage='Read only'\n />\n );\n const canReadDescription = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.read.description'}\n defaultMessage={'Can view this section but can\\'t edit anything in it'}\n />\n );\n\n const noAccessLabel = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.no_access.title'}\n defaultMessage='No access'\n />\n );\n\n const mixedAccessLabel = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.mixed_access.title'}\n defaultMessage='Mixed access'\n />\n );\n\n const noAccessDescription = (\n <FormattedMessage\n id={'admin.permissions.system_role_permissions.no_access.description'}\n defaultMessage={'No access to this section and it will be hidden in the navigation.'}\n />\n );\n\n let currentAccess = noAccessLabel;\n switch (this.props.access) {\n case readAccess:\n currentAccess = canReadLabel;\n break;\n case writeAccess:\n currentAccess = canWriteLabel;\n break;\n case mixedAccess:\n currentAccess = mixedAccessLabel;\n break;\n default:\n currentAccess = noAccessLabel;\n break;\n }\n\n const ariaLabel = Utils.localizeMessage({id: 'admin.permissions.system_role_permissions.change_access', defaultMessage: 'Change role access on a system console section'});\n return (\n <MenuWrapper\n isDisabled={isDisabled}\n >\n <button\n id={`systemRolePermissionDropdown${section.name}`}\n className='PermissionSectionDropdownButton dropdown-toggle theme'\n type='button'\n aria-expanded='true'\n >\n <div className='PermissionSectionDropdownButton_text'>\n {currentAccess}\n </div>\n <div className='PermissionSectionDropdownButton_icon'>\n <DropdownIcon/>\n </div>\n </button>\n <Menu ariaLabel={ariaLabel}>\n <Menu.ItemAction\n onClick={() => this.updatePermission(writeAccess)}\n text={this.renderOption(canWriteLabel, canWriteDescription)}\n />\n <Menu.ItemAction\n onClick={() => this.updatePermission(readAccess)}\n text={this.renderOption(canReadLabel, canReadDescription)}\n />\n <Menu.ItemAction\n onClick={() => this.updatePermission(noAccess)}\n text={this.renderOption(noAccessLabel, noAccessDescription)}\n />\n </Menu>\n </MenuWrapper>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport {sectionStrings} from './strings';\nimport SystemRolePermissionDropdown from './system_role_permission_dropdown';\nimport {noAccess, writeAccess, readAccess, mixedAccess} from './types';\nimport type {PermissionsToUpdate, PermissionToUpdate, SystemSection, PermissionAccess} from './types';\n\nimport './system_role_permissions.scss';\n\ntype Props = {\n readOnly?: boolean;\n setSectionVisible: (name: string, visible: boolean) => void;\n section: SystemSection;\n permissionsMap: Record<string, boolean>;\n visibleSections: Record<string, boolean>;\n permissionsToUpdate: PermissionsToUpdate;\n updatePermissions: (permissions: PermissionToUpdate[]) => void;\n}\n\nexport default class SystemRolePermission extends React.PureComponent<Props> {\n isSectionVisible = (section: SystemSection, visibleSections: Record<string, boolean>) => {\n const {permissionsMap, permissionsToUpdate} = this.props;\n if (Object.keys(visibleSections).includes(section.name)) {\n return visibleSections[section.name];\n }\n return this.getAccessForSection(section, permissionsMap, permissionsToUpdate) === mixedAccess;\n };\n\n renderSubsectionToggle = (section: SystemSection, isSectionVisible: boolean) => {\n if (!section.subsections || section.subsections.length === 0) {\n return null;\n }\n const chevron = isSectionVisible ? (<i className='Icon icon-chevron-up'/>) : (<i className='Icon icon-chevron-down'/>);\n const message = isSectionVisible ? (\n <FormattedMessage\n id='admin.permissions.system_role_permissions.hide_subsections'\n defaultMessage='Hide {subsectionsCount} subsections'\n values={{subsectionsCount: section.subsections.length}}\n />\n ) : (\n <FormattedMessage\n id='admin.permissions.system_role_permissions.show_subsections'\n defaultMessage='Show {subsectionsCount} subsections'\n values={{subsectionsCount: section.subsections.length}}\n />\n );\n return (\n <div className='PermissionSubsectionsToggle'>\n <button\n onClick={() => this.props.setSectionVisible(section.name, !isSectionVisible)}\n className='dropdown-toggle theme color--link style--none'\n >\n {message}\n {chevron}\n </button>\n </div>\n );\n };\n\n renderSubsections = (section: SystemSection, permissionsMap: Record<string, boolean>, permissionsToUpdate: PermissionsToUpdate, isSectionVisible: boolean) => {\n if (!section.subsections || section.subsections.length === 0) {\n return null;\n }\n return (\n <div>\n {isSectionVisible &&\n <div className='PermissionSubsections'>\n {section.subsections.map((subsection) => this.renderSectionRow(subsection, permissionsMap, permissionsToUpdate, isSectionVisible))}\n </div>\n }\n </div>\n );\n };\n\n renderSectionRow = (section: SystemSection, permissionsMap: Record<string, boolean>, permissionsToUpdate: PermissionsToUpdate, isSectionVisible: boolean) => {\n const name = sectionStrings[section.name] ? <FormattedMessage {...sectionStrings[section.name].name}/> : section.name;\n const description = sectionStrings[section.name] ? <FormattedMessage {...sectionStrings[section.name].description}/> : '';\n return (\n <div\n key={section.name}\n className='PermissionSection'\n >\n <div className='PermissionSectionText'>\n <div className='PermissionSectionText_title'>\n {name}\n </div>\n\n {section.hasDescription && description &&\n <div className='PermissionSection_description'>\n {description}\n </div>\n }\n\n {this.renderSubsectionToggle(section, isSectionVisible)}\n </div>\n <div className='PermissionSectionDropdown'>\n <SystemRolePermissionDropdown\n section={section}\n updatePermissions={this.props.updatePermissions}\n access={this.getAccessForSection(section, permissionsMap, permissionsToUpdate)}\n isDisabled={this.props.readOnly || Boolean(section.disabled)}\n />\n </div>\n </div>\n );\n };\n\n getAccessForSection = (section: SystemSection, permissions: Record<string, boolean>, permissionsToUpdate: Record<string, PermissionAccess>) => {\n // If we have subsections then use them to determine access to show.\n if (section.subsections && section.subsections.length > 0) {\n let hasNoAccess = false;\n let canRead = false;\n let canWrite = false;\n section.subsections.forEach((subsection) => {\n switch (this.getAccessForSectionByName(subsection.name, permissions, permissionsToUpdate)) {\n case readAccess:\n canRead = true;\n break;\n case writeAccess:\n canWrite = true;\n break;\n default:\n hasNoAccess = true;\n break;\n }\n });\n\n // If the role has more than one type of access across the subsection then mark it as mixed access.\n if ([canRead, canWrite, hasNoAccess].filter((val) => val).length > 1) {\n return mixedAccess;\n } else if (canRead) {\n return readAccess;\n } else if (canWrite) {\n return writeAccess;\n } else if (hasNoAccess) {\n return noAccess;\n }\n }\n return this.getAccessForSectionByName(section.name, permissions, permissionsToUpdate);\n };\n\n getAccessForSectionByName = (sectionName: string, permissions: Record<string, boolean>, permissionsToUpdate: Record<string, PermissionAccess>) => {\n // Assume sysadmin has write access for everything, this is a bit of a hack but it should be left in until `user_management_read|write_system_roles` is actually a permission\n if (permissions[Permissions.MANAGE_SYSTEM]) {\n return writeAccess;\n }\n\n let access: PermissionAccess = false;\n if (sectionName in permissionsToUpdate) {\n access = permissionsToUpdate[sectionName];\n } else {\n if (permissions[`sysconsole_read_${sectionName}`] === true) {\n access = readAccess;\n }\n\n if (permissions[`sysconsole_write_${sectionName}`] === true) {\n access = writeAccess;\n }\n }\n\n return access;\n };\n\n render() {\n const {section, permissionsMap, permissionsToUpdate, visibleSections} = this.props;\n const isSectionVisible = this.isSectionVisible(section, visibleSections);\n return (\n <div className='PermissionRow'>\n {this.renderSectionRow(section, permissionsMap, permissionsToUpdate, isSectionVisible)}\n {this.renderSubsections(section, permissionsMap, permissionsToUpdate, isSectionVisible)}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\n\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\n\nimport ExternalLink from 'components/external_link';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport Constants from 'utils/constants';\n\nimport SystemRolePermission from './system_role_permission';\nimport type {PermissionsToUpdate, PermissionToUpdate, SystemSection} from './types';\n\nimport './system_role_permissions.scss';\n\ntype Props = {\n role: Role;\n permissionsToUpdate: PermissionsToUpdate;\n updatePermissions: (permissions: PermissionToUpdate[]) => void;\n readOnly?: boolean;\n isLicensedForCloud: boolean;\n}\n\ntype State = {\n visibleSections: Record<string, boolean>;\n}\n\n// the actual permissions correlating to these values are of the format `sysconsole_(read|write)_name(.subsection.name)`\nconst sectionsList: SystemSection[] = [\n {\n name: 'about',\n hasDescription: true,\n subsections: [\n {name: 'about_edition_and_license'},\n ],\n },\n {\n name: 'billing',\n hasDescription: true,\n subsections: [],\n },\n {\n name: 'reporting',\n hasDescription: true,\n subsections: [\n {name: 'reporting_site_statistics'},\n {name: 'reporting_team_statistics'},\n {name: 'reporting_server_logs'},\n ],\n },\n {\n name: 'user_management',\n hasDescription: true,\n subsections: [\n {name: 'user_management_users', hasDescription: true},\n {name: 'user_management_groups'},\n {name: 'user_management_teams'},\n {name: 'user_management_channels'},\n {name: 'user_management_permissions'},\n {name: 'user_management_system_roles', hasDescription: true, disabled: true},\n ],\n },\n {\n name: 'environment',\n hasDescription: true,\n subsections: [\n {name: 'environment_web_server'},\n {name: 'environment_database'},\n {name: 'environment_elasticsearch'},\n {name: 'environment_file_storage'},\n {name: 'environment_image_proxy'},\n {name: 'environment_smtp'},\n {name: 'environment_push_notification_server'},\n {name: 'environment_high_availability'},\n {name: 'environment_rate_limiting'},\n {name: 'environment_logging'},\n {name: 'environment_session_lengths'},\n {name: 'environment_performance_monitoring'},\n {name: 'environment_developer'},\n ],\n },\n {\n name: 'site',\n hasDescription: true,\n subsections: [\n {name: 'site_customization'},\n {name: 'site_localization'},\n {name: 'site_users_and_teams'},\n {name: 'site_notifications'},\n {name: 'site_announcement_banner'},\n {name: 'site_emoji'},\n {name: 'site_posts'},\n {name: 'site_file_sharing_and_downloads'},\n {name: 'site_public_links'},\n {name: 'site_notices'},\n ],\n },\n {\n name: 'authentication',\n hasDescription: true,\n subsections: [\n {name: 'authentication_signup'},\n {name: 'authentication_email'},\n {name: 'authentication_password'},\n {name: 'authentication_mfa'},\n {name: 'authentication_ldap'},\n {name: 'authentication_saml'},\n {name: 'authentication_openid'},\n {name: 'authentication_guest_access'},\n ],\n },\n {\n name: 'plugins',\n hasDescription: true,\n subsections: [],\n },\n {\n name: 'integrations',\n hasDescription: true,\n subsections: [\n {name: 'integrations_integration_management'},\n {name: 'integrations_bot_accounts'},\n {name: 'integrations_gif'},\n {name: 'integrations_cors'},\n ],\n },\n {\n name: 'compliance',\n hasDescription: true,\n subsections: [\n {name: 'compliance_data_retention_policy'},\n {name: 'compliance_compliance_export'},\n {name: 'compliance_compliance_monitoring'},\n {name: 'compliance_custom_terms_of_service'},\n ],\n },\n {\n name: 'experimental',\n hasDescription: true,\n subsections: [\n {name: 'experimental_features'},\n {name: 'experimental_feature_flags'},\n {name: 'experimental_bleve'},\n ],\n },\n];\n\nconst SECTIONS_BY_ROLES: Record<string, Record<string, boolean>> = {\n [Constants.PERMISSIONS_SYSTEM_USER_MANAGER]: {\n user_management: true,\n authentication: true,\n },\n};\n\nconst getPermissionsMap = memoizeResult((permissions: string[]) => {\n return permissions.reduce((permissionsMap, permission) => {\n permissionsMap[permission] = true;\n return permissionsMap;\n }, {} as Record<string, boolean>);\n});\n\nconst getSectionsListForRole = memoizeResult((sections: SystemSection[], roleName: string, sectionsByRole: Record<string, Record<string, boolean>>) => {\n return sections.filter((section) => (!sectionsByRole[roleName] || sectionsByRole[roleName][section.name]));\n});\n\nexport default class SystemRolePermissions extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n visibleSections: {},\n };\n }\n\n removeSection = (name: string) => {\n const sectionIndex = sectionsList.findIndex((section) => section.name === name);\n if (sectionIndex > -1) {\n sectionsList.splice(sectionIndex, 1);\n }\n };\n\n updatePermissions = (permissions: PermissionToUpdate[]) => {\n this.props.updatePermissions(permissions);\n };\n\n setSectionVisible = (name: string, visible: boolean) => {\n const {visibleSections} = this.state;\n this.setState({\n visibleSections: {\n ...visibleSections,\n [name]: visible,\n },\n });\n };\n\n getRows = (permissionsMap: Record<string, boolean>, permissionsToUpdate: PermissionsToUpdate, visibleSections: Record<string, boolean>) => {\n const {isLicensedForCloud} = this.props;\n let editedSectionsByRole = {\n ...SECTIONS_BY_ROLES,\n };\n\n if (this.props.role.name === Constants.PERMISSIONS_SYSTEM_CUSTOM_GROUP_ADMIN) {\n return (\n <>\n <p>\n <FormattedMessage\n id='admin.permissions.roles.system_custom_group_admin.introduction'\n defaultMessage='The built-in Custom Group Manager role can be used to delegate the administration of <a>Custom Groups</a> to users other than the System Admin.'\n values={{\n a: (chunks: string) => (\n <ExternalLink\n href='https://docs.mattermost.com/welcome/manage-custom-groups.html'\n location='adminConsoleSystemRoles'\n >\n {chunks}\n </ExternalLink>\n ),\n }}\n />\n </p>\n <p>\n <FormattedMessage\n id='admin.permissions.roles.system_custom_group_admin.deauthorize_reminder'\n defaultMessage=\"Don't forget to deauthorize all other system users from administering Custom Groups by unchecking the associated permissions checkbox in System console > User Management > Permissions.\"\n />\n </p>\n <p>\n <FormattedMessage\n id='admin.permissions.roles.system_custom_group_admin.permissions_info'\n defaultMessage='This role has permission to create, edit, and delete custom user groups by selecting <b>User groups</b> from the Products menu.'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </p>\n </>\n\n );\n }\n\n if (this.props.role.name === Constants.PERMISSIONS_SYSTEM_USER_MANAGER) {\n let permissionsToShow: Record<string, boolean> = {};\n Object.keys(permissionsMap).forEach((permission) => {\n if (permission.startsWith('sysconsole_')) {\n const permissionShortName = permission.replace(/sysconsole_(read|write)_/, '');\n permissionsToShow = {\n ...permissionsToShow,\n [permissionShortName]: true,\n };\n }\n });\n\n editedSectionsByRole = {\n [Constants.PERMISSIONS_SYSTEM_USER_MANAGER]: {\n ...editedSectionsByRole[Constants.PERMISSIONS_SYSTEM_USER_MANAGER],\n ...permissionsToShow,\n },\n };\n }\n\n if (!isLicensedForCloud) {\n // Remove the billing section if it's not licensed for cloud\n this.removeSection('billing');\n }\n\n if (isLicensedForCloud) {\n // Remove the site configuration section if it's licensed for cloud\n this.removeSection('about');\n this.removeSection('environment');\n }\n\n return getSectionsListForRole(sectionsList, this.props.role.name, editedSectionsByRole).map((section: SystemSection) => {\n return (\n <SystemRolePermission\n key={section.name}\n section={section}\n permissionsMap={permissionsMap}\n permissionsToUpdate={permissionsToUpdate}\n visibleSections={visibleSections}\n setSectionVisible={this.setSectionVisible}\n updatePermissions={this.props.updatePermissions}\n readOnly={this.props.readOnly}\n />\n );\n });\n };\n\n render() {\n const {role, permissionsToUpdate} = this.props;\n const {visibleSections} = this.state;\n const permissionsMap = getPermissionsMap(role.permissions);\n return (\n <AdminPanel\n id='SystemRolePermissions'\n title={defineMessage({id: 'admin.permissions.system_role_permissions.title', defaultMessage: 'Privileges'})}\n subtitle={defineMessage({id: 'admin.permissions.system_role_permissions.description', defaultMessage: 'Level of access to the system console.'})}\n >\n <div className='SystemRolePermissions'>\n {this.getRows(permissionsMap, permissionsToUpdate, visibleSections)}\n </div>\n </AdminPanel>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport ProfilePicture from 'components/profile_picture';\n\ntype Props = {\n user: UserProfile;\n}\n\nconst UserGridName = ({\n user,\n}: Props) => {\n return (\n <div className='UserGrid_nameRow'>\n <ProfilePicture\n src={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n status={user.status}\n size='md'\n />\n\n <div className='UserGrid_name'>\n <span>\n {`${user.username} - ${user.first_name} ${user.last_name}`}\n </span>\n <span className='ug-email'>\n {user.email}\n </span>\n </div>\n </div>\n );\n};\n\nexport default UserGridName;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\ntype Props = {\n user: UserProfile;\n removeUser: (user: UserProfile) => void;\n isDisabled?: boolean;\n}\n\nconst UserGridRemove = ({\n user,\n removeUser,\n isDisabled,\n}: Props) => {\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n if (!isDisabled) {\n removeUser(user);\n }\n };\n\n return (\n <div className='UserGrid_removeRow'>\n <a\n onClick={handleClick}\n href='#'\n role='button'\n className={isDisabled ? 'disabled' : ''}\n >\n <FormattedMessage\n id='admin.user_grid.remove'\n defaultMessage='Remove'\n />\n </a>\n </div>\n );\n};\n\nexport default UserGridRemove;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {filterProfiles} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {filterProfilesStartingWithTerm, profileListToMap, isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\nimport ProfilePicture from 'components/profile_picture';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport {displayEntireNameForUser} from 'utils/utils';\n\nimport {rolesStrings} from '../../strings';\n\nconst USERS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 20;\n\ntype UserProfileValue = Value & UserProfile;\n\nexport type Props = {\n role: Role;\n users: UserProfile[];\n excludeUsers: { [userId: string]: UserProfile };\n includeUsers: { [userId: string]: UserProfile };\n intl: IntlShape;\n onAddCallback: (users: UserProfile[]) => void;\n onExited: () => void;\n\n actions: {\n getProfiles: (page: number, perPage?: number, options?: Record<string, any>) => Promise<ActionResult<UserProfile[]>>;\n searchProfiles: (term: string, options?: Record<string, any>) => Promise<ActionResult<UserProfile[]>>;\n };\n}\n\ntype State = {\n searchResults: UserProfile[];\n values: UserProfileValue[];\n show: boolean;\n saving: boolean;\n addError: null;\n loading: boolean;\n term: string;\n}\n\nfunction searchUsersToAdd(users: Record<string, UserProfile>, term: string): Record<string, UserProfile> {\n const profilesList: UserProfile[] = Object.keys(users).map((key) => users[key]);\n const filteredProfilesList = filterProfilesStartingWithTerm(profilesList, term);\n return filterProfiles(profileListToMap(filteredProfilesList), {});\n}\n\nexport class AddUsersToRoleModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n searchResults: [],\n values: [],\n show: true,\n saving: false,\n addError: null,\n loading: true,\n term: '',\n };\n }\n\n componentDidMount = async () => {\n await this.props.actions.getProfiles(0, USERS_PER_PAGE * 2);\n this.setUsersLoadingState(false);\n };\n\n setUsersLoadingState = (loading: boolean) => {\n this.setState({loading});\n };\n\n search = async (term: string) => {\n this.setUsersLoadingState(true);\n const searchResults: UserProfile[] = [];\n const search = term !== '';\n if (search) {\n const {data} = await this.props.actions.searchProfiles(term, {replace: true});\n data!.forEach((user) => {\n if (!user.is_bot) {\n searchResults.push(user);\n }\n });\n } else {\n await this.props.actions.getProfiles(0, USERS_PER_PAGE * 2);\n }\n this.setState({loading: false, searchResults, term});\n };\n\n handleHide = () => {\n this.setState({show: false});\n };\n\n handleExit = () => {\n if (this.props.onExited) {\n this.props.onExited();\n }\n };\n\n renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {\n let rowSelected = '';\n if (isSelected) {\n rowSelected = 'more-modal__row--selected';\n }\n\n return (\n <div\n key={option.id}\n ref={isSelected ? 'selected' : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => onMouseMove(option)}\n >\n <ProfilePicture\n src={Client4.getProfilePictureUrl(option.id, option.last_picture_update)}\n size='md'\n />\n <div className='more-modal__details'>\n <div className='more-modal__name'>\n {displayEntireNameForUser(option)}\n {option.is_bot && <BotTag/>}\n {isGuest(option.roles) && <GuestTag className='popoverlist'/>}\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i\n className='icon icon-plus'\n />\n </div>\n </div>\n </div>\n );\n };\n\n renderValue = (value: { data: UserProfileValue }): string => {\n return value.data?.username || '';\n };\n\n renderAriaLabel = (option: UserProfileValue): string => {\n return option?.username || '';\n };\n\n handleAdd = (value: UserProfileValue) => {\n const values: UserProfileValue[] = [...this.state.values];\n if (!values.includes(value)) {\n values.push(value);\n }\n this.setState({values});\n };\n\n handleDelete = (values: UserProfileValue[]) => {\n this.setState({values});\n };\n\n handlePageChange = (page: number, prevPage: number) => {\n if (page > prevPage) {\n const needMoreUsers = (this.props.users.length / USERS_PER_PAGE) <= page + 1;\n this.setUsersLoadingState(needMoreUsers);\n this.props.actions.getProfiles(page, USERS_PER_PAGE * 2).\n then(() => this.setUsersLoadingState(false));\n }\n };\n\n handleSubmit = () => {\n this.props.onAddCallback(this.state.values);\n this.handleHide();\n };\n\n render = (): JSX.Element => {\n const numRemainingText = (\n <div id='numPeopleRemaining'>\n <FormattedMessage\n id='multiselect.numPeopleRemaining'\n defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {person} other {people}}. '\n values={{\n num: MAX_SELECTABLE_VALUES - this.state.values.length,\n }}\n />\n </div>\n );\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n const buttonSubmitLoadingText = defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'});\n\n let addError = null;\n if (this.state.addError) {\n addError = (<div className='has-error col-sm-12'><label className='control-label font-weight--normal'>{this.state.addError}</label></div>);\n }\n\n let usersToDisplay: UserProfile[] = [];\n usersToDisplay = this.state.term ? this.state.searchResults : this.props.users;\n if (this.props.excludeUsers) {\n const hasUser = (user: UserProfile) => !this.props.excludeUsers[user.id];\n usersToDisplay = usersToDisplay.filter(hasUser);\n }\n\n if (this.props.includeUsers) {\n let {includeUsers} = this.props;\n if (this.state.term) {\n includeUsers = searchUsersToAdd(includeUsers, this.state.term);\n }\n usersToDisplay = [...usersToDisplay, ...Object.values(includeUsers)];\n }\n\n const options = usersToDisplay.map((user) => {\n return {label: user.username, value: user.id, ...user};\n });\n\n const name = rolesStrings[this.props.role.name] ? <FormattedMessage {...rolesStrings[this.props.role.name].name}/> : this.props.role.name;\n\n return (\n <Modal\n id='addUsersToRoleModal'\n dialogClassName={'a11y__modal more-modal more-direct-channels'}\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.handleExit}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title componentClass='h1'>\n <FormattedMessage\n id='add_users_to_role.title'\n defaultMessage='Add users to {roleName}'\n values={{\n roleName: (\n <strong>\n {name}\n </strong>\n ),\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {addError}\n <MultiSelect\n key='addUsersToRoleKey'\n options={options}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n ariaLabelRenderer={this.renderAriaLabel}\n values={this.state.values}\n valueRenderer={this.renderValue}\n perPage={USERS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.handleAdd}\n handleSubmit={this.handleSubmit}\n maxValues={MAX_SELECTABLE_VALUES}\n numRemainingText={numRemainingText}\n buttonSubmitText={buttonSubmitText}\n buttonSubmitLoadingText={buttonSubmitLoadingText}\n saving={this.state.saving}\n loading={this.state.loading}\n placeholderText={defineMessage({id: 'multiselect.placeholder', defaultMessage: 'Search and add members'})}\n />\n </Modal.Body>\n </Modal>\n );\n };\n}\n\nexport default injectIntl(AddUsersToRoleModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getProfiles, searchProfiles} from 'mattermost-redux/actions/users';\nimport {getProfiles as selectProfiles} from 'mattermost-redux/selectors/entities/users';\n\nimport AddUsersToRoleModal from './add_users_to_role_modal';\nimport type {Props} from './add_users_to_role_modal';\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n const filterOptions: {[key: string]: any} = {active: true, exclude_roles: [props.role.name], exclude_bots: true};\n const users: UserProfile[] = selectProfiles(state, filterOptions);\n\n return {\n users,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getProfiles,\n searchProfiles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddUsersToRoleModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\nimport type {UserProfile, UsersStats, GetFilteredUsersStatsOpts} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport UserGridName from 'components/admin_console/user_grid/user_grid_name';\nimport UserGridRemove from 'components/admin_console/user_grid/user_grid_remove';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\nimport Tag from 'components/widgets/tag/tag';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport AddUsersToRoleModal from '../add_users_to_role_modal';\n\nexport type Props = {\n users: UserProfile[];\n role: Role;\n totalCount: number;\n term: string;\n usersToRemove: Record<string, UserProfile>;\n usersToAdd: Record<string, UserProfile>;\n onAddCallback: (users: UserProfile[]) => void;\n onRemoveCallback: (user: UserProfile) => void;\n actions: {\n getFilteredUsersStats: (filters: GetFilteredUsersStatsOpts) => Promise<ActionResult<UsersStats>>;\n getProfiles: (page?: number | undefined, perPage?: number | undefined, options?: any) => Promise<ActionResult>;\n searchProfiles: (term: string, options: any) => Promise<ActionResult>;\n setUserGridSearch: (term: string) => void;\n };\n readOnly?: boolean;\n}\n\ntype State = {\n loading: boolean;\n page: number;\n includeUsers: Record<string, UserProfile>;\n excludeUsers: Record<string, UserProfile>;\n}\n\nconst USERS_PER_PAGE = 10;\n\nexport default class SystemRoleUsers extends React.PureComponent<Props, State> {\n searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n loading: true,\n page: 0,\n includeUsers: {},\n excludeUsers: {},\n };\n }\n\n async componentDidMount() {\n const {getProfiles, getFilteredUsersStats, setUserGridSearch} = this.props.actions;\n await Promise.all([\n setUserGridSearch(''),\n getProfiles(0, USERS_PER_PAGE, {role: this.props.role.name}),\n getFilteredUsersStats({roles: [this.props.role.name]}),\n ]);\n this.setStateLoading(false);\n }\n\n async componentDidUpdate(prevProps: Props) {\n if (prevProps.term !== this.props.term) {\n this.setStateLoading(true);\n clearTimeout(this.searchTimeoutId);\n const {term} = this.props;\n\n if (term === '') {\n this.searchTimeoutId = 0;\n this.setStateLoading(false);\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n await prevProps.actions.searchProfiles(term, {role: this.props.role.name});\n\n if (searchTimeoutId !== this.searchTimeoutId) {\n return;\n }\n this.setStateLoading(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n }\n\n setStateLoading = (loading: boolean) => {\n this.setState({loading});\n };\n\n getVisibleTotalCount = (): number => {\n const {usersToRemove, usersToAdd, totalCount} = this.props;\n const usersToAddCount = Object.keys(usersToAdd).length;\n const usersToRemoveCount = Object.keys(usersToRemove).length;\n return totalCount + (usersToAddCount - usersToRemoveCount);\n };\n\n getPaginationProps = (): {startCount: number; endCount: number; total: number} => {\n const {term, usersToRemove, usersToAdd} = this.props;\n const {page} = this.state;\n\n let total: number;\n let endCount = 0;\n const startCount = (page * USERS_PER_PAGE) + 1;\n\n if (term === '') {\n total = this.getVisibleTotalCount();\n } else {\n total = this.props.users.length + Object.keys(usersToAdd).length;\n this.props.users.forEach((u) => {\n if (usersToRemove[u.id]) {\n total -= 1;\n }\n });\n }\n\n endCount = (page + 1) * USERS_PER_PAGE;\n endCount = endCount > total ? total : endCount;\n\n return {startCount, endCount, total};\n };\n\n onSearch = async (term: string) => {\n this.props.actions.setUserGridSearch(term);\n };\n\n nextPage = async () => {\n if (this.state.loading) {\n return;\n }\n const page = this.state.page + 1;\n this.setState({loading: true});\n await this.props.actions.getProfiles(page, USERS_PER_PAGE, {role: this.props.role.name});\n this.setState({loading: false, page});\n };\n\n previousPage = async () => {\n if (this.state.loading || this.state.page === 0) {\n return;\n }\n this.setState({page: this.state.page - 1});\n };\n\n getRows = () => {\n const {users, readOnly, usersToAdd, usersToRemove} = this.props;\n const {startCount, endCount} = this.getPaginationProps();\n\n // Remove users to remove and add users to add\n let usersToDisplay = users;\n usersToDisplay = usersToDisplay.filter((user) => !usersToRemove[user.id]);\n usersToDisplay = [...Object.values(usersToAdd), ...usersToDisplay];\n usersToDisplay = usersToDisplay.slice(startCount - 1, endCount);\n\n return usersToDisplay.map((user) => {\n return {\n cells: {\n id: user.id,\n name: <UserGridName user={user}/>,\n new: usersToAdd[user.id] ? (\n <Tag\n variant={'info'}\n uppercase={true}\n text={(\n <FormattedMessage\n id='admin.user_grid.new'\n defaultMessage='New'\n />\n )}\n />\n ) : null,\n remove: (\n <UserGridRemove\n user={user}\n removeUser={this.onRemoveCallback}\n isDisabled={readOnly}\n />\n ),\n },\n };\n });\n };\n\n getColumns = () => {\n const name: JSX.Element = (\n <FormattedMessage\n id='admin.user_grid.name'\n defaultMessage='Name'\n />\n );\n\n return [\n {\n name,\n field: 'name',\n width: 3,\n fixed: true,\n },\n {\n name: '',\n field: 'new',\n width: 1,\n fixed: true,\n },\n {\n name: '',\n field: 'remove',\n textAlign: 'right' as const,\n fixed: true,\n },\n ];\n };\n\n onAddCallback = (users: UserProfile[]) => {\n this.props.onAddCallback(users);\n };\n\n onRemoveCallback = (user: UserProfile) => {\n this.props.onRemoveCallback(user);\n };\n\n render() {\n const {page, loading} = this.state;\n const {term, role, usersToAdd, usersToRemove, readOnly} = this.props;\n const {startCount, endCount, total} = this.getPaginationProps();\n return (\n\n <AdminPanel\n id='SystemRoleUsers'\n title={defineMessage({id: 'admin.permissions.system_role_users.title', defaultMessage: 'Assigned People'})}\n subtitle={defineMessage({id: 'admin.permissions.system_role_users.description', defaultMessage: 'List of people assigned to this system role.'})}\n button={\n <ToggleModalButton\n id='addRoleMembers'\n className='btn btn-primary'\n modalId={ModalIdentifiers.ADD_USER_TO_ROLE}\n dialogType={AddUsersToRoleModal}\n disabled={readOnly}\n dialogProps={{\n role,\n onAddCallback: this.onAddCallback,\n skipCommit: true,\n excludeUsers: usersToAdd,\n includeUsers: usersToRemove,\n }}\n >\n <FormattedMessage\n id='admin.permissions.system_role_users.add_people'\n defaultMessage='Add People'\n />\n </ToggleModalButton>\n }\n >\n <DataGrid\n rows={this.getRows()}\n columns={this.getColumns()}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n page={page}\n startCount={startCount}\n endCount={endCount}\n loading={loading}\n onSearch={this.onSearch}\n term={term}\n total={total}\n />\n </AdminPanel>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getFilteredUsersStats, getProfiles, searchProfiles} from 'mattermost-redux/actions/users';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles_helpers';\nimport {getProfiles as selectProfiles, getFilteredUsersStats as selectFilteredUserStats, makeSearchProfilesStartingWithTerm, filterProfiles} from 'mattermost-redux/selectors/entities/users';\nimport {filterProfilesStartingWithTerm, profileListToMap} from 'mattermost-redux/utils/user_utils';\n\nimport {setUserGridSearch} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport SystemRoleUsers from './system_role_users';\n\ntype OwnProps = {\n roleName: string;\n usersToAdd: Record<string, UserProfile>;\n usersToRemove: Record<string, UserProfile>;\n}\n\nfunction searchUsersToAdd(users: Record<string, UserProfile>, term: string): Record<string, UserProfile> {\n const profiles = filterProfilesStartingWithTerm(Object.keys(users).map((key) => users[key]), term);\n return filterProfiles(profileListToMap(profiles), {});\n}\n\nfunction mapStateToProps(state: GlobalState, props: OwnProps) {\n const {roleName} = props;\n const role = getRoles(state)[roleName];\n const totalCount = selectFilteredUserStats(state)?.total_users_count || 0;\n const term = state.views.search.userGridSearch?.term || '';\n const filters = {roles: [role.name]};\n const searchProfilesStartingWithTerm = makeSearchProfilesStartingWithTerm();\n\n let users = [];\n let {usersToAdd} = props;\n if (term) {\n users = searchProfilesStartingWithTerm(state, term, false, filters);\n usersToAdd = searchUsersToAdd(usersToAdd, term);\n } else {\n users = selectProfiles(state, filters);\n }\n\n return {\n role,\n users,\n totalCount,\n term,\n usersToAdd,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getProfiles,\n getFilteredUsersStats,\n searchProfiles,\n setUserGridSearch,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SystemRoleUsers);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport difference from 'lodash/difference';\nimport uniq from 'lodash/uniq';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Role} from '@mattermost/types/roles';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport SaveChangesPanel from 'components/admin_console/save_changes_panel';\nimport FormError from 'components/form_error';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\n\nimport {isError} from 'types/actions';\n\nimport SystemRolePermissions from './system_role_permissions';\nimport SystemRoleUsers from './system_role_users';\nimport {writeAccess} from './types';\nimport type {PermissionToUpdate, PermissionsToUpdate} from './types';\n\nimport {rolesStrings} from '../strings';\n\ntype Props = {\n role: Role;\n isDisabled?: boolean;\n isLicensedForCloud: boolean;\n\n actions: {\n editRole(role: Role): Promise<ActionResult>;\n updateUserRoles(userId: string, roles: string): Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => void;\n };\n}\n\ntype State = {\n usersToAdd: Record<string, UserProfile>;\n usersToRemove: Record<string, UserProfile>;\n permissionsToUpdate: PermissionsToUpdate;\n updatedRolePermissions: string[];\n saving: boolean;\n saveNeeded: boolean;\n serverError: JSX.Element | undefined;\n saveKey: number;\n}\n\nexport default class SystemRole extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n usersToAdd: {},\n usersToRemove: {},\n saving: false,\n saveNeeded: false,\n serverError: undefined,\n permissionsToUpdate: {},\n saveKey: 0,\n updatedRolePermissions: [],\n };\n }\n\n getSaveStateNeeded = (nextState: Partial<State>): boolean => {\n const {role} = this.props;\n const {usersToAdd, usersToRemove, updatedRolePermissions, permissionsToUpdate} = {...this.state, ...nextState};\n let saveNeeded = false;\n saveNeeded = Object.keys(usersToAdd).length > 0 || Object.keys(usersToRemove).length > 0;\n if (Object.keys(permissionsToUpdate).length > 0) {\n saveNeeded = saveNeeded || difference(updatedRolePermissions, role.permissions).length > 0 || difference(role.permissions, updatedRolePermissions).length > 0;\n }\n return saveNeeded;\n };\n\n addUsersToRole = (users: UserProfile[]) => {\n const {actions: {setNavigationBlocked}} = this.props;\n const usersToAdd = {\n ...this.state.usersToAdd,\n };\n const usersToRemove = {\n ...this.state.usersToRemove,\n };\n users.forEach((user) => {\n if (usersToRemove[user.id]) {\n delete usersToRemove[user.id];\n } else {\n usersToAdd[user.id] = user;\n }\n });\n\n const saveNeeded = this.getSaveStateNeeded({usersToAdd, usersToRemove});\n setNavigationBlocked(saveNeeded);\n this.setState({usersToAdd, usersToRemove, saveNeeded});\n };\n\n removeUserFromRole = (user: UserProfile) => {\n const {actions: {setNavigationBlocked}} = this.props;\n const usersToAdd = {\n ...this.state.usersToAdd,\n };\n const usersToRemove = {\n ...this.state.usersToRemove,\n };\n if (usersToAdd[user.id]) {\n delete usersToAdd[user.id];\n } else {\n usersToRemove[user.id] = user;\n }\n\n const saveNeeded = this.getSaveStateNeeded({usersToAdd, usersToRemove});\n setNavigationBlocked(saveNeeded);\n this.setState({usersToRemove, usersToAdd, saveNeeded});\n };\n\n handleSubmit = async () => {\n this.setState({saving: true, saveNeeded: false});\n const {usersToRemove, usersToAdd, updatedRolePermissions, permissionsToUpdate} = this.state;\n const {role, actions: {editRole, updateUserRoles, setNavigationBlocked}} = this.props;\n let serverError;\n\n // Do not update permissions if sysadmin or if roles have not been updated (to prevent overrwiting roles with no permissions)\n if (role.name !== Constants.PERMISSIONS_SYSTEM_ADMIN && Object.keys(permissionsToUpdate).length > 0) {\n const rolePermissionsWithAncillaryPermssions = await Client4.getAncillaryPermissions(updatedRolePermissions);\n\n const newRole: Role = {\n ...role,\n permissions: rolePermissionsWithAncillaryPermssions,\n };\n const result = await editRole(newRole);\n if (isError(result)) {\n serverError = <FormError error={result.error.message}/>;\n }\n }\n\n const userIdsToRemove = Object.keys(usersToRemove);\n if (userIdsToRemove.length > 0) {\n const removeUserPromises: Array<Promise<ActionResult>> = [];\n userIdsToRemove.forEach((userId) => {\n const user = usersToRemove[userId];\n const updatedRoles = uniq(user.roles.split(' ').filter((r) => r !== role.name)).join(' ');\n removeUserPromises.push(updateUserRoles(userId, updatedRoles));\n });\n\n const results = await Promise.all(removeUserPromises);\n const resultWithError = results.find(isError);\n\n // const count = result.filter(isSuccess).length; // To be used for potential telemetry\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n }\n }\n\n const userIdsToAdd = Object.keys(usersToAdd);\n if (userIdsToAdd.length > 0 && !serverError) {\n const addUserPromises: Array<Promise<ActionResult>> = [];\n userIdsToAdd.forEach((userId) => {\n const user = usersToAdd[userId];\n const updatedRoles = uniq([...user.roles.split(' '), role.name]).join(' ');\n addUserPromises.push(updateUserRoles(userId, updatedRoles));\n });\n\n const results = await Promise.all(addUserPromises);\n const resultWithError = results.find(isError);\n\n // const count = result.filter(isSuccess).length; // To be used for potential telemetry\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n }\n }\n\n let {saveKey} = this.state;\n if (!serverError) {\n saveKey += 1;\n }\n\n if (!serverError) {\n getHistory().push('/admin_console/user_management/system_roles');\n }\n setNavigationBlocked(Boolean(serverError));\n this.setState({\n saveNeeded: Boolean(serverError),\n saving: false,\n serverError,\n usersToAdd: {},\n usersToRemove: {},\n saveKey,\n });\n };\n\n updatePermissions = (permissions: PermissionToUpdate[]) => {\n const {role, actions: {setNavigationBlocked}} = this.props;\n const updatedPermissions: PermissionsToUpdate = {};\n permissions.forEach((perm) => {\n updatedPermissions[perm.name] = perm.value;\n });\n const permissionsToUpdate = {\n ...this.state.permissionsToUpdate,\n ...updatedPermissions,\n };\n\n let updatedRolePermissions: string[] = role.permissions.\n filter((permission) => permission.startsWith('sysconsole_') && !(permission.replace(/sysconsole_(read|write)_/, '') in permissionsToUpdate));\n\n Object.keys(permissionsToUpdate).forEach((permissionShortName) => {\n const value = permissionsToUpdate[permissionShortName];\n if (value) {\n const readPermission = `sysconsole_read_${permissionShortName}`;\n const writePermission = `sysconsole_write_${permissionShortName}`;\n\n if (value === writeAccess) {\n updatedRolePermissions.push(readPermission, writePermission);\n } else {\n updatedRolePermissions.push(readPermission);\n }\n }\n });\n\n // Make sure the sysadmin role always has manage system...\n if (role.name === Constants.PERMISSIONS_SYSTEM_ADMIN) {\n updatedRolePermissions.push(Permissions.MANAGE_SYSTEM);\n }\n\n updatedRolePermissions = uniq(updatedRolePermissions);\n const nextState = {\n permissionsToUpdate,\n updatedRolePermissions,\n };\n\n setNavigationBlocked(this.getSaveStateNeeded(nextState));\n this.setState({\n ...nextState,\n saveNeeded: this.getSaveStateNeeded(nextState),\n });\n };\n\n render() {\n const {usersToAdd, usersToRemove, saving, saveNeeded, serverError, permissionsToUpdate, saveKey} = this.state;\n const {role, isDisabled, isLicensedForCloud} = this.props;\n const name = rolesStrings[role.name] ? <FormattedMessage {...rolesStrings[role.name].name}/> : role.name;\n return (\n <div className='wrapper--fixed'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/system_roles'\n className='fa fa-angle-left back'\n />\n {name}\n </div>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <SystemRolePermissions\n role={role}\n isLicensedForCloud={isLicensedForCloud}\n permissionsToUpdate={permissionsToUpdate}\n updatePermissions={this.updatePermissions}\n readOnly={isDisabled || role.name === Constants.PERMISSIONS_SYSTEM_ADMIN}\n />\n\n <SystemRoleUsers\n key={saveKey}\n roleName={role.name}\n usersToAdd={usersToAdd}\n usersToRemove={usersToRemove}\n onAddCallback={this.addUsersToRole}\n onRemoveCallback={this.removeUserFromRole}\n readOnly={isDisabled}\n />\n </div>\n </div>\n\n <SaveChangesPanel\n saving={saving}\n cancelLink='/admin_console/user_management/system_roles'\n saveNeeded={saveNeeded}\n onClick={this.handleSubmit}\n serverError={serverError}\n isDisabled={isDisabled}\n />\n </div>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {editRole} from 'mattermost-redux/actions/roles';\nimport {updateUserRoles} from 'mattermost-redux/actions/users';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getRolesById} from 'mattermost-redux/selectors/entities/roles';\n\nimport {setNavigationBlocked} from 'actions/admin_actions.jsx';\n\nimport type {GlobalState} from 'types/store';\n\nimport SystemRole from './system_role';\n\ntype Props = {\n match: {\n params: {\n role_id: string;\n };\n };\n}\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n const role = getRolesById(state)[props.match.params.role_id];\n const license = getLicense(state);\n const isLicensedForCloud = license.Cloud === 'true';\n\n return {\n isLicensedForCloud,\n role,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n editRole,\n updateUserRoles,\n setNavigationBlocked,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SystemRole);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport ProfilePicture from 'components/profile_picture';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport './admin_user_card.scss';\n\ntype BulletProps = {\n user: UserProfile;\n}\n\nexport type Props = {\n user?: UserProfile;\n isLoading?: boolean;\n body?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nconst AdminUserCard = ({isLoading = false, ...props}: Props) => {\n if (!props.user || isLoading) {\n return (\n <div className='AdminUserCard'>\n <div className='AdminUserCard__header'>\n <ProfilePicture\n src=''\n size='xxl'\n wrapperClass='admin-user-card'\n />\n </div>\n <div className='noUserBody'>\n {isLoading && <LoadingSpinner/>}\n {!isLoading &&\n <FormattedMessage\n id='admin.userManagement.userDetail.notFound'\n defaultMessage='User not found'\n />\n }\n </div>\n\n </div>\n );\n }\n\n return (\n <div className='AdminUserCard'>\n <div className='AdminUserCard__header'>\n <ProfilePicture\n src={Client4.getProfilePictureUrl(props.user.id, props.user.last_picture_update)}\n size='xxl'\n wrapperClass='admin-user-card'\n userId={props.user.id}\n />\n <div className='AdminUserCard__user-info'>\n <span>{props.user.first_name} {props.user.last_name}</span>\n <Bullet user={props.user}/>\n <span className='AdminUserCard__user-nickname'>{props.user.nickname}</span>\n </div>\n <div className='AdminUserCard__user-id'>\n <FormattedMessage\n id='admin.userManagement.userDetail.userId'\n defaultMessage='User ID: {userId}'\n values={{\n userId: props.user.id,\n }}\n />\n </div>\n </div>\n <div className='AdminUserCard__body'>\n {props.body}\n </div>\n <div className='AdminUserCard__footer'>\n {props.footer}\n </div>\n </div>);\n};\n\nconst Bullet = (props: BulletProps) => {\n if ((props.user.first_name || props.user.last_name) && props.user.nickname) {\n return (<span>{' • '}</span>);\n }\n return null;\n};\n\nexport default AdminUserCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {isValidPassword} from 'utils/password';\n\ninterface PasswordConfig {\n minimumLength: number;\n requireLowercase: boolean;\n requireNumber: boolean;\n requireSymbol: boolean;\n requireUppercase: boolean;\n}\n\ntype State = {\n show: boolean;\n serverErrorNewPass: React.ReactNode;\n serverErrorCurrentPass: React.ReactNode;\n}\n\nexport type Props = {\n user?: UserProfile;\n currentUserId: string;\n onSuccess?: () => void;\n onExited: () => void;\n passwordConfig: PasswordConfig;\n actions: {\n updateUserPassword: (userId: string, currentPassword: string, password: string) => Promise<ActionResult>;\n };\n}\n\nexport default class ResetPasswordModal extends React.PureComponent<Props, State> {\n private currentPasswordRef: React.RefObject<HTMLInputElement>;\n private passwordRef: React.RefObject<HTMLInputElement>;\n\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n serverErrorNewPass: null,\n serverErrorCurrentPass: null,\n };\n\n this.currentPasswordRef = React.createRef();\n this.passwordRef = React.createRef();\n }\n\n public componentWillUnmount(): void {\n this.setState({\n serverErrorNewPass: null,\n serverErrorCurrentPass: null,\n });\n }\n\n private doSubmit = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n if (!this.props.user) {\n return;\n }\n\n let currentPassword = '';\n if (this.currentPasswordRef.current) {\n currentPassword = (this.currentPasswordRef.current as HTMLInputElement).value;\n if (currentPassword === '') {\n const errorMsg = (\n <FormattedMessage\n id='admin.reset_password.missing_current'\n defaultMessage='Please enter your current password.'\n />\n );\n this.setState({serverErrorCurrentPass: errorMsg});\n return;\n }\n }\n\n const password = (this.passwordRef.current as HTMLInputElement).value;\n\n const {valid, error} = isValidPassword(password, this.props.passwordConfig);\n if (!valid && error) {\n this.setState({serverErrorNewPass: error});\n return;\n }\n\n this.setState({serverErrorNewPass: null});\n\n const result = await this.props.actions.updateUserPassword(this.props.user.id, currentPassword, password);\n if ('error' in result) {\n this.setState({serverErrorCurrentPass: result.error.message});\n return;\n }\n this.props.onSuccess?.();\n this.setState({show: false});\n };\n\n private doCancel = (): void => {\n this.setState({\n show: false,\n serverErrorNewPass: null,\n serverErrorCurrentPass: null,\n });\n };\n\n public render(): JSX.Element {\n const user = this.props.user;\n if (user == null) {\n return <div/>;\n }\n\n let urlClass = 'input-group input-group--limit';\n let serverErrorNewPass = null;\n\n if (this.state.serverErrorNewPass) {\n urlClass += ' has-error';\n serverErrorNewPass = <div className='has-error'><p className='input__help error'>{this.state.serverErrorNewPass}</p></div>;\n }\n\n let title;\n if (user.auth_service) {\n title = (\n <FormattedMessage\n id='admin.reset_password.titleSwitch'\n defaultMessage='Switch Account to Email/Password'\n />\n );\n } else {\n title = (\n <FormattedMessage\n id='admin.reset_password.titleReset'\n defaultMessage='Reset Password'\n />\n );\n }\n\n let currentPassword = null;\n let serverErrorCurrentPass = null;\n let newPasswordFocus = true;\n if (this.props.currentUserId === user.id) {\n newPasswordFocus = false;\n let urlClassCurrentPass = 'input-group input-group--limit';\n if (this.state.serverErrorCurrentPass) {\n urlClassCurrentPass += ' has-error';\n serverErrorCurrentPass = <div className='has-error'><p className='input__help error'>{this.state.serverErrorCurrentPass}</p></div>;\n }\n currentPassword = (\n <div className='col-sm-10 password__group-addon-space'>\n <div className={urlClassCurrentPass}>\n <span\n data-toggle='tooltip'\n title='Current Password'\n className='input-group-addon password__group-addon'\n >\n <FormattedMessage\n id='admin.reset_password.curentPassword'\n defaultMessage='Current Password'\n />\n </span>\n <input\n type='password'\n ref={this.currentPasswordRef}\n className='form-control'\n autoFocus={true}\n />\n </div>\n </div>\n );\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.state.show}\n onHide={this.doCancel}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='resetPasswordModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='resetPasswordModalLabel'\n >\n {title}\n </Modal.Title>\n </Modal.Header>\n <form\n role='form'\n className='form-horizontal'\n >\n <Modal.Body>\n <div className='form-group'>\n {currentPassword}\n <div className='col-sm-10'>\n <div className={urlClass}>\n <span\n data-toggle='tooltip'\n title='New Password'\n className='input-group-addon password__group-addon'\n >\n <FormattedMessage\n id='admin.reset_password.newPassword'\n defaultMessage='New Password'\n />\n </span>\n <input\n type='password'\n ref={this.passwordRef}\n className='form-control'\n autoFocus={newPasswordFocus}\n />\n </div>\n {serverErrorNewPass}\n {serverErrorCurrentPass}\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.doCancel}\n >\n <FormattedMessage\n id='admin.reset_password.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n onClick={this.doSubmit}\n type='submit'\n className='btn btn-primary'\n >\n <FormattedMessage\n id='admin.reset_password.reset'\n defaultMessage='Reset'\n />\n </button>\n </Modal.Footer>\n </form>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {updateUserPassword} from 'mattermost-redux/actions/users';\nimport {getPasswordConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport ResetPasswordModal from './reset_password_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentUserId: getCurrentUserId(state),\n passwordConfig: getPasswordConfig(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n updateUserPassword,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ResetPasswordModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\n\nimport type {TeamWithMembership} from './types';\n\nimport './abstract_list.scss';\n\nconst PAGE_SIZE = 10;\n\ntype Props = {\n userId: string;\n headerLabels: Array<{\n label?: MessageDescriptor;\n style: React.CSSProperties;\n }>;\n data: TeamWithMembership[];\n onPageChangedCallback?: (paging: Paging) => void;\n total: number;\n renderRow: (item: TeamWithMembership) => JSX.Element;\n emptyList: MessageDescriptor;\n actions: {\n getTeamsData: (userId: string) => Promise<ActionResult<Team[]>>;\n removeGroup?: () => void;\n };\n}\n\ntype State = {\n loading: boolean;\n page: number;\n}\n\ntype Paging = {\n startCount: number;\n endCount: number;\n total: number;\n}\n\nexport default class AbstractList extends React.PureComponent<Props, State> {\n public static defaultProps = {\n data: [],\n };\n\n public constructor(props: Props) {\n super(props);\n this.state = {\n loading: true,\n page: 0,\n };\n }\n\n public componentDidMount() {\n this.performSearch();\n }\n\n private previousPage = async (e: React.MouseEvent<HTMLButtonElement>): Promise<void> => {\n e.preventDefault();\n const page = this.state.page < 1 ? 0 : this.state.page - 1;\n this.setState({page, loading: true});\n this.performSearch();\n };\n\n private nextPage = async (e: React.MouseEvent<HTMLButtonElement>): Promise<void> => {\n e.preventDefault();\n const page = this.state.page + 1;\n this.setState({page, loading: true});\n this.performSearch();\n };\n\n private performSearch = (): void => {\n const userId = this.props.userId;\n\n this.setState({loading: true});\n\n this.props.actions.getTeamsData(userId).then!(() => {\n if (this.props.onPageChangedCallback) {\n this.props.onPageChangedCallback(this.getPaging());\n }\n this.setState({loading: false});\n });\n };\n\n private getPaging(): Paging {\n const startCount = (this.state.page * PAGE_SIZE) + 1;\n let endCount = (this.state.page * PAGE_SIZE) + PAGE_SIZE;\n const total = this.props.total;\n if (endCount > total) {\n endCount = total;\n }\n return {startCount, endCount, total};\n }\n\n private renderHeaderLabels = () => {\n if (this.props.data.length > 0) {\n return (\n <div className='AbstractList__header'>\n {this.props.headerLabels.map((headerLabel, id) => {\n const key = id;\n const message = headerLabel.label ? <FormattedMessage {...headerLabel.label}/> : '';\n return (\n <div\n key={key}\n className='AbstractList__header-label'\n style={headerLabel.style}\n >\n {message}\n </div>\n );\n })}\n </div>\n );\n }\n return null;\n };\n\n private renderRows = (): JSX.Element | JSX.Element[] => {\n if (this.state.loading) {\n return (\n <div className='AbstractList__loading'>\n <i className='fa fa-spinner fa-pulse fa-2x'/>\n </div>\n );\n }\n if (this.props.data.length === 0) {\n return (\n <div className='AbstractList__empty'>\n <FormattedMessage {...this.props.emptyList}/>\n </div>\n );\n }\n const pageStart = this.state.page < 1 ? 0 : (this.state.page * PAGE_SIZE); // ie 0, 10, 20, etc.\n const pageEnd = this.state.page < 1 ? PAGE_SIZE : (this.state.page + 1) * PAGE_SIZE; // ie 10, 20, 30, etc.\n const pageData = this.props.data.slice(pageStart, pageEnd).map(this.props.renderRow); // ie 0-10, 10-20, etc.\n return pageData;\n };\n\n public render = (): JSX.Element => {\n const {startCount, endCount, total} = this.getPaging();\n const lastPage = endCount === total;\n const firstPage = this.state.page === 0;\n return (\n <div className='AbstractList'>\n {this.renderHeaderLabels()}\n <div className='AbstractList__body'>\n {this.renderRows()}\n </div>\n {total > 0 &&\n <div className='AbstractList__footer'>\n <div className='counter'>\n <FormattedMessage\n id='admin.team_channel_settings.list.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n values={{\n startCount,\n endCount,\n total,\n }}\n />\n </div>\n <button\n type='button'\n className={'btn btn-tertiary prev ' + (firstPage ? 'disabled' : '')}\n onClick={firstPage ? () => null : this.previousPage}\n disabled={firstPage}\n >\n <PreviousIcon/>\n </button>\n <button\n type='button'\n className={'btn btn-tertiary next ' + (lastPage ? 'disabled' : '')}\n onClick={lastPage ? () => null : this.nextPage}\n disabled={lastPage}\n >\n <NextIcon/>\n </button>\n </div>\n }\n </div>\n );\n };\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = React.HTMLAttributes<HTMLSpanElement> & {\n width?: string;\n height?: string;\n};\n\nexport default function EllipsisHorizontalIcon(props: Props) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width={props.width || '24px'}\n height={props.width || '24px'}\n viewBox='0 0 24 24'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.elipsisHorizontalIcon', defaultMessage: 'Ellipsis Horizontal Icon'})}\n >\n <path d='M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z'/>\n </svg>\n </span>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport EllipsisHorizontalIcon from 'components/widgets/icons/ellipsis_h_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport type {TeamWithMembership} from './types';\n\ntype Props = {\n team: TeamWithMembership;\n doRemoveUserFromTeam: (teamId: string) => void;\n doMakeUserTeamAdmin: (teamId: string) => void;\n doMakeUserTeamMember: (teamId: string) => void;\n isDisabled?: boolean;\n}\n\nconst TeamListDropdown = ({\n team,\n doRemoveUserFromTeam,\n doMakeUserTeamAdmin,\n doMakeUserTeamMember,\n isDisabled,\n}: Props) => {\n const intl = useIntl();\n\n const isAdmin = team.scheme_admin;\n const isMember = team.scheme_user && !team.scheme_admin;\n const isGuest = team.scheme_guest;\n const showMakeTeamAdmin = !isAdmin && !isGuest;\n const showMakeTeamMember = !isMember && !isGuest;\n\n const makeTeamAdminOnClick = useCallback(() => doMakeUserTeamAdmin(team.id), [team.id, doMakeUserTeamAdmin]);\n const makeTeamMemberOnClick = useCallback(() => doMakeUserTeamMember(team.id), [team.id, doMakeUserTeamMember]);\n const removeUserTeamOnClick = useCallback(() => doRemoveUserFromTeam(team.id), [team.id, doRemoveUserFromTeam]);\n\n return (\n <MenuWrapper isDisabled={isDisabled}>\n <button\n type='button'\n id={`teamListDropdown_${team.id}`}\n className='dropdown-toggle theme color--link style--none'\n aria-expanded='true'\n >\n <span className='SystemUserDetail__actions-menu-icon'><EllipsisHorizontalIcon/></span>\n </button>\n <div>\n <Menu\n openLeft={true}\n openUp={false}\n ariaLabel={intl.formatMessage({id: 'team_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of a team member'})}\n >\n <Menu.ItemAction\n id='makeTeamAdmin'\n show={showMakeTeamAdmin}\n onClick={makeTeamAdminOnClick}\n text={intl.formatMessage({id: 'team_members_dropdown.makeAdmin', defaultMessage: 'Make Team Admin'})}\n />\n <Menu.ItemAction\n show={showMakeTeamMember}\n onClick={makeTeamMemberOnClick}\n text={intl.formatMessage({id: 'team_members_dropdown.makeMember', defaultMessage: 'Make Team Member'})}\n />\n <Menu.ItemAction\n id='removeFromTeam'\n show={true}\n onClick={removeUserTeamOnClick}\n text={intl.formatMessage({id: 'team_members_dropdown.leave_team', defaultMessage: 'Remove from Team'})}\n buttonClass='SystemUserDetail__action-remove-team'\n />\n </Menu>\n </div>\n </MenuWrapper>\n );\n};\n\nexport default memo(TeamListDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport TeamIcon from 'components/widgets/team_icon/team_icon';\n\nimport * as Utils from 'utils/utils';\n\nimport TeamListDropdown from './team_list_dropdown';\nimport type {TeamWithMembership} from './types';\n\nimport './team_row.scss';\n\ntype Props = {\n team: TeamWithMembership;\n onRowClick?: () => void;\n doRemoveUserFromTeam: (teamId: string) => Promise<void>;\n doMakeUserTeamAdmin: (teamId: string) => Promise<void>;\n doMakeUserTeamMember: (teamId: string) => Promise<void>;\n readOnly?: boolean;\n}\n\nexport default class TeamRow extends React.PureComponent<Props> {\n private renderTeamType = (team: Team) => {\n if (team.group_constrained) {\n return (\n <FormattedMessage\n id={'admin.systemUserDetail.teamList.teamType.groupSync'}\n defaultMessage={'Group sync'}\n />\n );\n }\n if (team.allow_open_invite) {\n return (\n <FormattedMessage\n id={'admin.systemUserDetail.teamList.teamType.anyoneCanJoin'}\n defaultMessage={'Anyone can join'}\n />\n );\n }\n return (\n <FormattedMessage\n id={'admin.systemUserDetail.teamList.teamType.inviteOnly'}\n defaultMessage={'Invite only'}\n />\n );\n };\n private renderTeamRole = (team: TeamWithMembership) => {\n if (team.scheme_guest) {\n return (\n <FormattedMessage\n id={'admin.systemUserDetail.teamList.teamRole.guest'}\n defaultMessage={'Guest'}\n />\n );\n }\n if (team.scheme_admin && !team.scheme_guest) {\n return (\n <FormattedMessage\n id={'admin.systemUserDetail.teamList.teamRole.admin'}\n defaultMessage={'Team Admin'}\n />\n );\n }\n if (team.scheme_user && !team.scheme_guest && !team.scheme_admin) {\n return (\n <FormattedMessage\n id={'admin.systemUserDetail.teamList.teamRole.member'}\n defaultMessage={'Team Member'}\n />\n );\n }\n return null;\n };\n public render = (): JSX.Element => {\n const {team} = this.props;\n const teamIconUrl = Utils.imageURLForTeam(team);\n return (\n <div className={'TeamRow'}>\n <div className='TeamRow__row'>\n <div className='TeamRow__team-name'>\n <div className='col-sm-auto'>\n <TeamIcon\n size='sm'\n url={teamIconUrl}\n content={team.display_name}\n />\n </div>\n <div className='col-md-auto'>\n <b>{team.display_name}</b>\n {team.description && (\n <div className='overflow--ellipsis text-nowrap TeamRow__team-description'>\n {team.description}\n </div>)}\n </div>\n\n </div>\n\n <span className='TeamRow__description'>\n {this.renderTeamType(team)}\n </span>\n\n <span className='TeamRow__description'>\n {this.renderTeamRole(team)}\n </span>\n\n <span className='TeamRow__actions'>\n <TeamListDropdown\n team={team}\n doRemoveUserFromTeam={this.props.doRemoveUserFromTeam}\n doMakeUserTeamAdmin={this.props.doMakeUserTeamAdmin}\n doMakeUserTeamMember={this.props.doMakeUserTeamMember}\n isDisabled={this.props.readOnly}\n />\n </span>\n </div>\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessage} from 'react-intl';\n\nimport type {Team, TeamMembership} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {filterAndSortTeamsByDisplayName} from 'utils/team_utils';\n\nimport AbstractList from './abstract_list';\nimport TeamRow from './team_row';\nimport type {TeamWithMembership} from './types';\n\nconst headerLabels = [\n {\n label: defineMessage({\n id: 'admin.systemUserDetail.teamList.header.name',\n defaultMessage: 'Name',\n }),\n style: {\n flexGrow: 1,\n minWidth: '284px',\n marginLeft: '16px',\n },\n },\n {\n label: defineMessage({\n id: 'admin.systemUserDetail.teamList.header.type',\n defaultMessage: 'Type',\n }),\n style: {\n width: '150px',\n },\n },\n {\n label: defineMessage({\n id: 'admin.systemUserDetail.teamList.header.role',\n defaultMessage: 'Role',\n }),\n style: {\n width: '150px',\n },\n },\n {\n style: {\n width: '150px',\n },\n },\n];\n\ntype Props = {\n userId: string;\n locale: string;\n emptyList: MessageDescriptor;\n actions: {\n getTeamsData: (userId: string) => Promise<ActionResult<Team[]>>;\n getTeamMembersForUser: (userId: string) => Promise<ActionResult<TeamMembership[]>>;\n removeUserFromTeam: (teamId: string, userId: string) => Promise<ActionResult>;\n updateTeamMemberSchemeRoles: (teamId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => Promise<ActionResult>;\n };\n userDetailCallback: (teamsId: TeamMembership[]) => void;\n refreshTeams: boolean;\n readOnly?: boolean;\n}\n\ntype State = {\n teamsWithMemberships: TeamWithMembership[];\n serverError: string | null;\n}\n\nexport default class TeamList extends React.PureComponent<Props, State> {\n public static defaultProps = {\n emptyList: defineMessage({\n id: 'admin.team_settings.team_list.no_teams_found',\n defaultMessage: 'No teams found',\n }),\n refreshTeams: false,\n };\n\n public constructor(props: Props) {\n super(props);\n this.state = {\n teamsWithMemberships: [],\n serverError: null,\n };\n }\n\n public componentDidMount() {\n this.getTeamsAndMemberships();\n }\n\n public componentDidUpdate(prevProps: Props) {\n if (prevProps.refreshTeams !== this.props.refreshTeams) {\n this.getTeamsAndMemberships();\n }\n }\n\n private getTeamsAndMemberships = async (userId = this.props.userId): Promise<void> => {\n const teams = await this.props.actions.getTeamsData(userId);\n const memberships = await this.props.actions.getTeamMembersForUser(userId);\n return Promise.all([teams, memberships]).\n then(this.mergeTeamsWithMemberships).\n then((teamsWithMemberships) => {\n this.setState({teamsWithMemberships});\n this.props.userDetailCallback(teamsWithMemberships);\n });\n };\n\n // check this out\n private mergeTeamsWithMemberships = (data: [ActionResult<Team[]>, ActionResult<TeamMembership[]>]): TeamWithMembership[] => {\n const teams = data[0].data;\n const memberships = data[1].data;\n if (!teams || !memberships) {\n return [];\n }\n let teamsWithMemberships = teams.map((object: Team) => {\n const results = memberships.filter((team: TeamMembership) => team.team_id === object.id);\n const team = {...object, ...results[0]};\n return team;\n });\n teamsWithMemberships = filterAndSortTeamsByDisplayName(teamsWithMemberships, this.props.locale);\n return teamsWithMemberships;\n };\n\n private doRemoveUserFromTeam = async (teamId: string): Promise<void> => {\n const {error} = await this.props.actions.removeUserFromTeam(teamId, this.props.userId);\n if (error) {\n this.setState({serverError: error.message});\n } else {\n this.getTeamsAndMemberships();\n }\n };\n\n private doMakeUserTeamAdmin = async (teamId: string) => {\n const {error} = await this.props.actions.updateTeamMemberSchemeRoles(teamId, this.props.userId, true, true);\n if (error) {\n this.setState({serverError: error.message});\n } else {\n this.getTeamsAndMemberships();\n }\n };\n\n private doMakeUserTeamMember = async (teamId: string) => {\n const {error} = await this.props.actions.updateTeamMemberSchemeRoles(teamId, this.props.userId, true, false);\n if (error) {\n this.setState({serverError: error.message});\n } else {\n this.getTeamsAndMemberships();\n }\n };\n\n private renderRow = (item: TeamWithMembership): JSX.Element => {\n return (\n <TeamRow\n key={item.id}\n team={item}\n doRemoveUserFromTeam={this.doRemoveUserFromTeam}\n doMakeUserTeamAdmin={this.doMakeUserTeamAdmin}\n doMakeUserTeamMember={this.doMakeUserTeamMember}\n readOnly={this.props.readOnly}\n />\n );\n };\n\n public render(): JSX.Element {\n let serverError = null;\n if (this.state.serverError) {\n serverError = (\n <div className='SystemUserDetail__error has-error'>\n <label className='has-error control-label'>{this.state.serverError}</label>\n </div>\n );\n }\n return (\n <>\n <div>{serverError}</div>\n <AbstractList\n headerLabels={headerLabels}\n renderRow={this.renderRow}\n total={this.state.teamsWithMemberships.length}\n data={this.state.teamsWithMemberships}\n actions={this.props.actions}\n emptyList={this.props.emptyList}\n userId={this.props.userId}\n />\n </>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {\n getTeamsForUser,\n getTeamMembersForUser,\n removeUserFromTeam,\n updateTeamMemberSchemeRoles,\n} from 'mattermost-redux/actions/teams';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamList from './team_list';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n locale: getCurrentLocale(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTeamsData: getTeamsForUser,\n getTeamMembersForUser,\n removeUserFromTeam,\n updateTeamMemberSchemeRoles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\nimport {getDisplayName} from 'utils/utils';\n\ntype Props = {\n user: UserProfile;\n onConfirm: () => void;\n onExited: () => void;\n}\n\nexport default function ConfirmManageUserSettingsModal(props: Props) {\n const title = (\n <FormattedMessage\n id='userSettings.adminMode.modal_header'\n defaultMessage=\"Manage {userDisplayName}'s Settings\"\n values={{userDisplayName: getDisplayName(props.user)}}\n />\n );\n\n const message = (\n <FormattedMessage\n id='admin.user_item.manageSettings.confirm_dialog.body'\n defaultMessage=\"You are about to access {userDisplayName}'s account settings. Any modifications you make will take effect immediately in their account. {userDisplayName} retains the ability to view and modify these settings at any time.<br></br><br></br> Are you sure you want to proceed with managing {userDisplayName}'s settings?\"\n values={{\n userDisplayName: getDisplayName(props.user),\n br: (x: React.ReactNode) => (<><br/>{x}</>),\n }}\n />\n );\n\n const confirmButtonText = (\n <FormattedMessage\n id='admin.user_item.manageSettings'\n defaultMessage='Manage User Settings'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonText={confirmButtonText}\n onConfirm={props.onConfirm}\n onExited={props.onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default function AtIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 24 24'\n >\n <path\n fill='inherit'\n d='M12,15C12.81,15 13.5,14.7 14.11,14.11C14.7,13.5 15,12.81 15,12C15,11.19 14.7,10.5 14.11,9.89C13.5,9.3 12.81,9 12,9C11.19,9 10.5,9.3 9.89,9.89C9.3,10.5 9,11.19 9,12C9,12.81 9.3,13.5 9.89,14.11C10.5,14.7 11.19,15 12,15M12,2C14.75,2 17.1,3 19.05,4.95C21,6.9 22,9.25 22,12V13.45C22,14.45 21.65,15.3 21,16C20.3,16.67 19.5,17 18.5,17C17.3,17 16.31,16.5 15.56,15.5C14.56,16.5 13.38,17 12,17C10.63,17 9.45,16.5 8.46,15.54C7.5,14.55 7,13.38 7,12C7,10.63 7.5,9.45 8.46,8.46C9.45,7.5 10.63,7 12,7C13.38,7 14.55,7.5 15.54,8.46C16.5,9.45 17,10.63 17,12V13.45C17,13.86 17.16,14.22 17.46,14.53C17.76,14.84 18.11,15 18.5,15C18.92,15 19.27,14.84 19.57,14.53C19.87,14.22 20,13.86 20,13.45V12C20,9.81 19.23,7.93 17.65,6.35C16.07,4.77 14.19,4 12,4C9.81,4 7.93,4.77 6.35,6.35C4.77,7.93 4,9.81 4,12C4,14.19 4.77,16.07 6.35,17.65C7.93,19.23 9.81,20 12,20H17V22H12C9.25,22 6.9,21 4.95,19.05C3,17.1 2,14.75 2,12C2,9.25 3,6.9 4.95,4.95C6.9,3 9.25,2 12,2Z'\n />\n </svg>\n </span>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = React.HTMLAttributes<HTMLSpanElement>;\n\nconst EmailIcon: React.FC<Props> = (props) => {\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 24 24'\n >\n <path\n fill='inherit'\n d='M22 6C22 4.9 21.1 4 20 4H4C2.9 4 2 4.9 2 6V18C2 19.1 2.9 20 4 20H20C21.1 20 22 19.1 22 18V6M20 6L12 11L4 6H20M20 18H4V8L12 13L20 8V18Z'\n />\n </svg>\n </span>\n );\n};\n\nexport default React.memo(EmailIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = React.HTMLAttributes<HTMLSpanElement>;\n\nconst ShieldOutlineIcon = (props: Props) => {\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 24 24'\n >\n <path\n fill='inherit'\n d='M21,11C21,16.55 17.16,21.74 12,23C6.84,21.74 3,16.55 3,11V5L12,1L21,5V11M12,21C15.75,20 19,15.54 19,11.22V6.3L12,3.18L5,6.3V11.22C5,15.54 8.25,20 12,21Z'\n />\n </svg>\n </span>\n );\n};\nexport default React.memo(ShieldOutlineIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {PureComponent} from 'react';\nimport type {ChangeEvent, MouseEvent} from 'react';\nimport type {IntlShape, WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, defineMessage, injectIntl} from 'react-intl';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {Team, TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {isEmail} from 'mattermost-redux/utils/helpers';\n\nimport AdminUserCard from 'components/admin_console/admin_user_card/admin_user_card';\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport ResetPasswordModal from 'components/admin_console/reset_password_modal';\nimport TeamList from 'components/admin_console/system_user_detail/team_list';\nimport ConfirmManageUserSettingsModal from 'components/admin_console/system_users/system_users_list_actions/confirm_manage_user_settings_modal';\nimport ConfirmModal from 'components/confirm_modal';\nimport FormError from 'components/form_error';\nimport SaveButton from 'components/save_button';\nimport TeamSelectorModal from 'components/team_selector_modal';\nimport UserSettingsModal from 'components/user_settings/modal';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\nimport AtIcon from 'components/widgets/icons/at_icon';\nimport EmailIcon from 'components/widgets/icons/email_icon';\nimport SheidOutlineIcon from 'components/widgets/icons/shield_outline_icon';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {toTitleCase} from 'utils/utils';\n\nimport type {PropsFromRedux} from './index';\n\nimport './system_user_detail.scss';\n\nexport type Params = {\n user_id?: UserProfile['id'];\n};\n\nexport type Props = PropsFromRedux & RouteComponentProps<Params> & WrappedComponentProps;\n\nexport type State = {\n user?: UserProfile;\n emailField: string;\n isLoading: boolean;\n error?: string | null;\n isSaveNeeded: boolean;\n isSaving: boolean;\n teams: TeamMembership[];\n teamIds: Array<Team['id']>;\n refreshTeams: boolean;\n showResetPasswordModal: boolean;\n showDeactivateMemberModal: boolean;\n showTeamSelectorModal: boolean;\n};\n\nexport class SystemUserDetail extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n emailField: '',\n isLoading: false,\n error: null,\n isSaveNeeded: false,\n isSaving: false,\n teams: [],\n teamIds: [],\n refreshTeams: true,\n showResetPasswordModal: false,\n showDeactivateMemberModal: false,\n showTeamSelectorModal: false,\n };\n }\n\n getUser = async (userId: UserProfile['id']) => {\n this.setState({isLoading: true});\n\n try {\n const {data, error} = await this.props.getUser(userId) as ActionResult<UserProfile, ServerError>;\n if (data) {\n this.setState({\n user: data,\n emailField: data.email, // Set emailField to the email of the user for editing purposes\n isLoading: false,\n });\n } else {\n throw new Error(error ? error.message : 'Unknown error');\n }\n } catch (error) {\n console.log('SystemUserDetails-getUser: ', error); // eslint-disable-line no-console\n\n this.setState({\n isLoading: false,\n error: this.props.intl.formatMessage({id: 'admin.user_item.userNotFound', defaultMessage: 'Cannot load User'}),\n });\n }\n };\n\n componentDidMount() {\n const userId = this.props.match.params.user_id ?? '';\n if (userId) {\n // We dont have to handle the case of userId being empty here because the redirect will take care of it from the parent components\n this.getUser(userId);\n }\n }\n\n handleTeamsLoaded = (teams: TeamMembership[]) => {\n const teamIds = teams.map((team) => team.team_id);\n this.setState({teams});\n this.setState({teamIds});\n this.setState({refreshTeams: false});\n };\n\n handleAddUserToTeams = (teams: Team[]) => {\n if (!this.state.user) {\n return;\n }\n\n const promises = [];\n for (const team of teams) {\n promises.push(this.props.addUserToTeam(team.id, this.state.user.id));\n }\n Promise.all(promises).finally(() =>\n this.setState({refreshTeams: true}),\n );\n };\n\n handleActivateUser = async () => {\n if (!this.state.user || this.state.user?.auth_service === Constants.LDAP_SERVICE) {\n return;\n }\n\n try {\n const {error} = await this.props.updateUserActive(this.state.user.id, true) as ActionResult<boolean, ServerError>;\n if (error) {\n throw new Error(error.message);\n }\n\n await this.getUser(this.state.user.id);\n } catch (err) {\n console.error('SystemUserDetails-handleActivateUser', err); // eslint-disable-line no-console\n\n this.setState({error: this.props.intl.formatMessage({id: 'admin.user_item.userActivateFailed', defaultMessage: 'Failed to activate user'})});\n }\n };\n\n handleDeactivateMember = async () => {\n if (!this.state.user) {\n return;\n }\n\n try {\n const {error} = await this.props.updateUserActive(this.state.user.id, false) as ActionResult<boolean, ServerError>;\n if (error) {\n throw new Error(error.message);\n }\n\n await this.getUser(this.state.user.id);\n } catch (err) {\n console.error('SystemUserDetails-handleDeactivateMember', err); // eslint-disable-line no-console\n\n this.setState({error: this.props.intl.formatMessage({id: 'admin.user_item.userDeactivateFailed', defaultMessage: 'Failed to deactivate user'})});\n }\n\n this.toggleCloseModalDeactivateMember();\n };\n\n handleRemoveMFA = async () => {\n if (!this.state.user) {\n return;\n }\n\n try {\n const {error} = await this.props.updateUserMfa(this.state.user.id, false) as ActionResult<boolean, ServerError>;\n if (error) {\n throw new Error(error.message);\n }\n\n await this.getUser(this.state.user.id);\n } catch (err) {\n console.error('SystemUserDetails-handleRemoveMFA', err); // eslint-disable-line no-console\n\n this.setState({error: this.props.intl.formatMessage({id: 'admin.user_item.userMFARemoveFailed', defaultMessage: 'Failed to remove user\\'s MFA'})});\n }\n };\n\n handleEmailChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!this.state.user) {\n return;\n }\n\n const {target: {value}} = event;\n\n const didEmailChanged = value !== this.state.user.email;\n this.setState({\n emailField: value,\n isSaveNeeded: didEmailChanged,\n });\n\n this.props.setNavigationBlocked(didEmailChanged);\n };\n\n handleSubmit = async (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n\n if (this.state.isLoading || this.state.isSaving || !this.state.user) {\n return;\n }\n\n if (this.state.user.email === this.state.emailField) {\n return;\n }\n\n if (!isEmail(this.state.user.email)) {\n this.setState({error: this.props.intl.formatMessage({id: 'admin.user_item.invalidEmail', defaultMessage: 'Invalid email address'})});\n return;\n }\n\n const updatedUser = Object.assign({}, this.state.user, {email: this.state.emailField.trim().toLowerCase()});\n\n this.setState({\n error: null,\n isSaving: true,\n });\n\n try {\n const {data, error} = await this.props.patchUser(updatedUser) as ActionResult<UserProfile, ServerError>;\n if (data) {\n this.setState({\n user: data,\n emailField: data.email,\n error: null,\n isSaving: false,\n isSaveNeeded: false,\n });\n } else {\n throw new Error(error ? error.message : 'Unknown error');\n }\n } catch (err) {\n console.error('SystemUserDetails-handleSubmit', err); // eslint-disable-line no-console\n\n this.setState({\n error: this.props.intl.formatMessage({id: 'admin.user_item.userUpdateFailed', defaultMessage: 'Failed to update user'}),\n isSaving: false,\n isSaveNeeded: false,\n });\n }\n\n this.props.setNavigationBlocked(false);\n };\n\n /**\n * Modal close/open handlers\n */\n\n toggleOpenModalDeactivateMember = () => {\n if (this.state.user?.auth_service === Constants.LDAP_SERVICE) {\n return;\n }\n this.setState({showDeactivateMemberModal: true});\n };\n\n toggleCloseModalDeactivateMember = () => {\n this.setState({showDeactivateMemberModal: false});\n };\n\n toggleOpenModalResetPassword = () => {\n this.props.openModal({\n modalId: ModalIdentifiers.RESET_PASSWORD_MODAL,\n dialogType: ResetPasswordModal,\n dialogProps: {user: this.state.user},\n });\n };\n\n toggleCloseModalResetPassword = () => {\n this.setState({showResetPasswordModal: false});\n };\n\n toggleOpenTeamSelectorModal = () => {\n this.setState({showTeamSelectorModal: true});\n };\n\n toggleCloseTeamSelectorModal = () => {\n this.setState({showTeamSelectorModal: false});\n };\n\n openConfirmEditUserSettingsModal = () => {\n if (!this.state.user) {\n return;\n }\n\n this.props.openModal({\n modalId: ModalIdentifiers.CONFIRM_MANAGE_USER_SETTINGS_MODAL,\n dialogType: ConfirmManageUserSettingsModal,\n dialogProps: {\n user: this.state.user,\n onConfirm: this.openUserSettingsModal,\n },\n });\n };\n\n openUserSettingsModal = async () => {\n if (!this.state.user) {\n return;\n }\n\n this.props.openModal({\n modalId: ModalIdentifiers.USER_SETTINGS,\n dialogType: UserSettingsModal,\n dialogProps: {\n adminMode: true,\n isContentProductSettings: true,\n userID: this.state.user.id,\n },\n });\n };\n\n getManagedByLdapText = () => {\n if (this.state.user?.auth_service !== Constants.LDAP_SERVICE) {\n return null;\n }\n return (\n <>\n {' '}\n <FormattedMessage\n id='admin.user_item.managedByLdap'\n defaultMessage='(Managed By LDAP)'\n />\n </>\n );\n };\n\n render() {\n return (\n <div className='SystemUserDetail wrapper--fixed'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/users'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.systemUserDetail.title'\n defaultMessage='User Configuration'\n />\n </div>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n\n {/* User details */}\n <AdminUserCard\n user={this.state.user}\n isLoading={this.state.isLoading}\n body={\n <>\n <span>{this.state?.user?.position ?? ''}</span>\n <label>\n <FormattedMessage\n id='admin.userManagement.userDetail.email'\n defaultMessage='Email'\n />\n <EmailIcon/>\n <input\n className='form-control'\n type='text'\n value={this.state.emailField}\n onChange={this.handleEmailChange}\n disabled={this.state.error !== null || this.state.isSaving}\n />\n </label>\n <label>\n <FormattedMessage\n id='admin.userManagement.userDetail.username'\n defaultMessage='Username'\n />\n <AtIcon/>\n <span>{this.state?.user?.username}</span>\n </label>\n <label>\n <FormattedMessage\n id='admin.userManagement.userDetail.authenticationMethod'\n defaultMessage='Authentication Method'\n />\n <SheidOutlineIcon/>\n <span>{getUserAuthenticationTextField(this.props.intl, this.props.mfaEnabled, this.state.user)}</span>\n </label>\n </>\n }\n footer={\n <>\n <button\n className='btn btn-secondary'\n onClick={this.toggleOpenModalResetPassword}\n >\n <FormattedMessage\n id='admin.user_item.resetPwd'\n defaultMessage='Reset Password'\n />\n </button>\n {this.state.user?.mfa_active && (\n <button\n className='btn btn-secondary'\n onClick={this.handleRemoveMFA}\n >\n <FormattedMessage\n id='admin.user_item.resetMfa'\n defaultMessage='Remove MFA'\n />\n </button>\n )}\n {this.state.user?.delete_at !== 0 && (\n <button\n className='btn btn-secondary'\n onClick={this.handleActivateUser}\n disabled={this.state.user?.auth_service === Constants.LDAP_SERVICE}\n >\n <FormattedMessage\n id='admin.user_item.makeActive'\n defaultMessage='Activate'\n />\n {this.getManagedByLdapText()}\n </button>\n )}\n {this.state.user?.delete_at === 0 && (\n <button\n className='btn btn-secondary btn-danger'\n onClick={this.toggleOpenModalDeactivateMember}\n disabled={this.state.user?.auth_service === Constants.LDAP_SERVICE}\n >\n <FormattedMessage\n id='admin.user_item.deactivate'\n defaultMessage='Deactivate'\n />\n {this.getManagedByLdapText()}\n </button>\n )}\n\n {\n this.props.showManageUserSettings &&\n <button\n className='manageUserSettingsBtn btn btn-tertiary'\n onClick={this.openConfirmEditUserSettingsModal}\n >\n <FormattedMessage\n id='admin.user_item.manageSettings'\n defaultMessage='Manage User Settings'\n />\n </button>\n }\n\n {\n this.props.showLockedManageUserSettings &&\n <WithTooltip\n title={defineMessage({\n id: 'generic.enterprise_feature',\n defaultMessage: 'Enterprise feature',\n })}\n hint={defineMessage({\n id: 'admin.user_item.manageSettings.disabled_tooltip',\n defaultMessage: 'Please upgrade to Enterprise to manage user settings',\n })}\n >\n <button\n className='manageUserSettingsBtn btn disabled'\n >\n <div className='RestrictedIndicator__content'>\n <i className={classNames('RestrictedIndicator__icon-tooltip', 'icon', 'icon-key-variant')}/>\n </div>\n <FormattedMessage\n id='admin.user_item.manageSettings'\n defaultMessage='Manage User Settings'\n />\n </button>\n </WithTooltip>\n }\n </>\n }\n />\n\n {/* User's team details */}\n <AdminPanel\n title={defineMessage({\n id: 'admin.userManagement.userDetail.teamsTitle',\n defaultMessage: 'Team Membership',\n })}\n subtitle={defineMessage({\n id: 'admin.userManagement.userDetail.teamsSubtitle',\n defaultMessage: 'Teams to which this user belongs',\n })}\n button={\n <div className='add-team-button'>\n <button\n type='button'\n className='btn btn-primary'\n onClick={this.toggleOpenTeamSelectorModal}\n disabled={this.state.isLoading || this.state.error !== null}\n >\n <FormattedMessage\n id='admin.userManagement.userDetail.addTeam'\n defaultMessage='Add Team'\n />\n </button>\n </div>\n }\n >\n {this.state.isLoading && (\n <div className='teamlistLoading'>\n <LoadingSpinner/>\n </div>\n )}\n {!this.state.isLoading && this.state.user?.id && (\n <TeamList\n userId={this.state.user.id}\n userDetailCallback={this.handleTeamsLoaded}\n refreshTeams={this.state.refreshTeams}\n />\n )}\n </AdminPanel>\n </div>\n </div>\n\n {/* Footer */}\n <div className='admin-console-save'>\n <SaveButton\n saving={this.state.isSaving}\n disabled={!this.state.isSaveNeeded || this.state.isLoading || this.state.error !== null || this.state.isSaving}\n onClick={this.handleSubmit}\n />\n <div className='error-message'>\n <FormError error={this.state.error}/>\n </div>\n </div>\n {/* mounting of Modals */}\n <ConfirmModal\n show={this.state.showDeactivateMemberModal}\n title={\n <FormattedMessage\n id='deactivate_member_modal.title'\n defaultMessage='Deactivate {username}'\n values={{\n username: this.state.user?.username ?? '',\n }}\n />\n }\n message={\n <div>\n <FormattedMessage\n id='deactivate_member_modal.desc'\n defaultMessage='This action deactivates {username}. They will be logged out and not have access to any teams or channels on this system. Are you sure you want to deactivate {username}?'\n values={{\n username: this.state.user?.username ?? '',\n }}\n />\n {this.state.user?.auth_service !== '' && this.state.user?.auth_service !== Constants.EMAIL_SERVICE && (\n <strong>\n <br/>\n <br/>\n <FormattedMessage\n id='deactivate_member_modal.sso_warning'\n defaultMessage='You must also deactivate this user in the SSO provider or they will be reactivated on next login or sync.'\n />\n </strong>\n )}\n </div>\n }\n confirmButtonClass='btn btn-danger'\n confirmButtonText={\n <FormattedMessage\n id='deactivate_member_modal.deactivate'\n defaultMessage='Deactivate'\n />\n }\n onConfirm={this.handleDeactivateMember}\n onCancel={this.toggleCloseModalDeactivateMember}\n />\n\n {this.state.showTeamSelectorModal && (\n <TeamSelectorModal\n onModalDismissed={this.toggleCloseTeamSelectorModal}\n onTeamsSelected={this.handleAddUserToTeams}\n alreadySelected={this.state.teamIds}\n excludeGroupConstrained={true}\n />\n )}\n </div>\n );\n }\n}\n\nexport default injectIntl(SystemUserDetail);\n\nexport function getUserAuthenticationTextField(intl: IntlShape, mfaEnabled: Props['mfaEnabled'], user?: UserProfile): string {\n if (!user) {\n return '';\n }\n\n let authenticationTextField;\n\n if (user.auth_service) {\n let service;\n if (user.auth_service === Constants.LDAP_SERVICE || user.auth_service === Constants.SAML_SERVICE) {\n service = user.auth_service.toUpperCase();\n } else if (user.auth_service === Constants.OFFICE365_SERVICE) {\n // override service name office365 to text Entra ID\n service = intl.formatMessage({\n id: 'admin.oauth.office365',\n defaultMessage: 'Entra ID',\n });\n } else {\n service = toTitleCase(user.auth_service);\n }\n authenticationTextField = service;\n } else {\n authenticationTextField = intl.formatMessage({\n id: 'admin.userManagement.userDetail.email',\n defaultMessage: 'Email',\n });\n }\n\n if (mfaEnabled) {\n if (user.mfa_active) {\n authenticationTextField += ', ';\n authenticationTextField += intl.formatMessage({id: 'admin.userManagement.userDetail.mfa', defaultMessage: 'MFA'});\n }\n }\n\n return authenticationTextField;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getUserPreferences} from 'mattermost-redux/actions/preferences';\nimport {addUserToTeam} from 'mattermost-redux/actions/teams';\nimport {updateUserActive, getUser, patchUser, updateUserMfa} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {setNavigationBlocked} from 'actions/admin_actions.jsx';\nimport {openModal} from 'actions/views/modals';\nimport {getShowLockedManageUserSettings, getShowManageUserSettings} from 'selectors/admin_console';\n\nimport SystemUserDetail from './system_user_detail';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n const showManageUserSettings = getShowManageUserSettings(state);\n const showLockedManageUserSettings = getShowLockedManageUserSettings(state);\n\n return {\n mfaEnabled: config?.EnableMultifactorAuthentication === 'true' || false,\n showManageUserSettings,\n showLockedManageUserSettings,\n };\n}\n\nconst mapDispatchToProps = {\n getUser,\n patchUser,\n updateUserActive,\n updateUserMfa,\n addUserToTeam,\n setNavigationBlocked,\n openModal,\n getUserPreferences,\n};\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\nexport default connector(SystemUserDetail);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport enum ColumnNames {\n username = 'usernameColumn',\n displayName = 'displayNameColumn',\n email = 'emailColumn',\n createAt = 'createAtColumn',\n lastLoginAt = 'lastLoginColumn',\n lastStatusAt = 'lastStatusAtColumn',\n lastPostDate = 'lastPostDateColumn',\n daysActive = 'daysActiveColumn',\n totalPosts = 'totalPostsColumn',\n actions = 'actionsColumn',\n}\n\nexport enum StatusFilter {\n Any = 'any',\n Active = 'active',\n Deactivated = 'deactivated',\n}\n\nexport enum RoleFilters {\n Any = 'any',\n Admin = 'system_admin',\n Member = 'system_user',\n Guest = 'system_guest',\n}\n\nexport enum TeamFilters {\n AllTeams = 'teams_filter_for_all_teams',\n NoTeams = 'teams_filter_for_no_teams',\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {revokeSessionsForAllUsers} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {emitUserLoggedOutEvent} from 'actions/global_actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\n\nexport function RevokeSessionsButton() {\n const dispatch = useDispatch();\n\n const [showModal, setShowModal] = useState(false);\n\n function handleModalToggle() {\n setShowModal((showModal) => !showModal);\n }\n\n async function handleModalConfirm() {\n const {data} = await dispatch(revokeSessionsForAllUsers());\n\n if (data) {\n emitUserLoggedOutEvent();\n } else {\n setShowModal(false);\n }\n }\n\n return (\n <SystemPermissionGate permissions={[Permissions.REVOKE_USER_ACCESS_TOKEN]}>\n <button\n className='btn btn-tertiary btn-danger'\n onClick={handleModalToggle}\n >\n <FormattedMessage\n id='admin.system_users.revokeAllSessions'\n defaultMessage='Revoke All Sessions'\n />\n </button>\n <ConfirmModal\n show={showModal}\n title={\n <FormattedMessage\n id='admin.system_users.revoke_all_sessions_modal_title'\n defaultMessage='Revoke all sessions in the system'\n />\n }\n message={\n <FormattedMessage\n id='admin.system_users.revoke_all_sessions_modal_message'\n defaultMessage='This action revokes all sessions in the system. All users will be logged out from all devices, including your session. Are you sure you want to revoke all sessions?'\n />\n }\n confirmButtonClass='btn btn-danger'\n confirmButtonText={\n <FormattedMessage\n id='admin.system_users.revoke_all_sessions_button'\n defaultMessage='Revoke All Sessions'\n />\n }\n onConfirm={handleModalConfirm}\n onCancel={handleModalToggle}\n />\n </SystemPermissionGate>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Column, CoreColumn} from '@tanstack/react-table';\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {UserReport} from '@mattermost/types/reports';\n\nimport * as Menu from 'components/menu';\nimport Input from 'components/widgets/inputs/input/input';\nimport Tag from 'components/widgets/tag/tag';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ColumnNames} from '../constants';\n\nimport './system_users_column_toggler.scss';\n\ninterface Props {\n isMySql: boolean;\n allColumns: Array<Column<UserReport>>;\n visibleColumnsLength: number;\n}\n\nexport function SystemUsersColumnTogglerMenu(props: Props) {\n const {formatMessage} = useIntl();\n\n function getColumnName(columnId: CoreColumn<UserReport, unknown>['id']) {\n switch (columnId) {\n case ColumnNames.username:\n return (\n <FormattedMessage\n id='admin.system_users.list.userDetails'\n defaultMessage='User details'\n />\n );\n case ColumnNames.email:\n return (\n <FormattedMessage\n id='admin.system_users.list.email'\n defaultMessage='Email'\n />\n );\n case ColumnNames.createAt:\n return (\n <FormattedMessage\n id='admin.system_users.list.memberSince'\n defaultMessage='Member since'\n />\n );\n case ColumnNames.lastLoginAt:\n return (\n <FormattedMessage\n id='admin.system_users.list.lastLoginAt'\n defaultMessage='Last login'\n />\n );\n case ColumnNames.lastStatusAt:\n return (\n <FormattedMessage\n id='admin.system_users.list.lastActivity'\n defaultMessage='Last activity'\n />\n );\n case ColumnNames.lastPostDate:\n return (\n <FormattedMessage\n id='admin.system_users.list.lastPost'\n defaultMessage='Last post'\n />\n );\n case ColumnNames.daysActive:\n return (\n <FormattedMessage\n id='admin.system_users.list.daysActive'\n defaultMessage='Days active'\n />\n );\n case ColumnNames.totalPosts:\n return (\n <FormattedMessage\n id='admin.system_users.list.totalPosts'\n defaultMessage='Messages posted'\n />\n );\n case ColumnNames.actions:\n return (\n <FormattedMessage\n id='admin.system_users.list.actions'\n defaultMessage='Actions'\n />\n );\n default:\n return <span/>;\n }\n }\n\n return (\n <div className='systemUsersColumnToggler'>\n <Menu.Container\n menuButton={{\n id: 'systemUsersColumnTogglerMenuButton',\n class: 'inputWithMenu',\n 'aria-label': formatMessage({\n id: 'admin.system_users.column_toggler.menuButtonAriaLabel',\n defaultMessage:\n 'Open menu to select columns to display',\n }),\n as: 'div',\n children: (\n <Input\n label={formatMessage({\n id: 'admin.system_users.column_toggler.placeholder',\n defaultMessage: 'Columns',\n })}\n name='colXC'\n value={formatMessage(\n {\n id: 'admin.system_users.column_toggler.menuButtonText',\n defaultMessage: '{selectedCount} selected',\n },\n {\n selectedCount: props.visibleColumnsLength,\n },\n )}\n readOnly={true}\n inputSuffix={\n <i className='icon icon-chevron-down'/>\n }\n />\n ),\n }}\n menu={{\n id: 'systemUsersColumnTogglerMenu',\n 'aria-label': formatMessage({\n id: 'admin.system_users.column_toggler.dropdownAriaLabel',\n defaultMessage: 'Columns visibility menu',\n }),\n }}\n >\n {props.allColumns.map((column) => {\n let leadingElement;\n if (column.getIsVisible()) {\n leadingElement = (\n <i className='icon icon-checkbox-marked'/>\n );\n } else {\n leadingElement = (\n <i className='icon icon-checkbox-blank-outline'/>\n );\n }\n\n const postStatsColumns: string[] = [ColumnNames.lastPostDate, ColumnNames.daysActive, ColumnNames.totalPosts];\n if (props.isMySql && postStatsColumns.includes(column.id)) {\n return (\n <WithTooltip\n key={column.id}\n title={formatMessage({id: 'admin.system_users.column_toggler.mysql_unavailable.title', defaultMessage: 'Not available for servers using MySQL'})}\n hint={formatMessage({id: 'admin.system_users.column_toggler.mysql_unavailable.desc', defaultMessage: 'Please use the export functionality to view these values'})}\n isVertical={false}\n >\n <Menu.Item\n className='systemUsersColumnToggler__lockedItem'\n role='menuitemcheckbox'\n labels={getColumnName(column.id)}\n disabled={true}\n leadingElement={leadingElement}\n trailingElements={<Tag text={formatMessage({id: 'admin.system_users.column_toggler.mysql_unavailable.label', defaultMessage: 'Not available'})}/>}\n onClick={column.getToggleVisibilityHandler()}\n />\n </WithTooltip>\n );\n }\n\n return (\n <Menu.Item\n key={column.id}\n id={column.id}\n role='menuitemcheckbox'\n labels={getColumnName(column.id)}\n disabled={!column.getCanHide()}\n leadingElement={leadingElement}\n onClick={column.getToggleVisibilityHandler()}\n />\n );\n })}\n </Menu.Container>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {ReportDuration} from '@mattermost/types/reports';\n\nimport {setAdminConsoleUsersManagementTableProperties} from 'actions/views/admin';\n\nimport * as Menu from 'components/menu';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport './system_users_date_range_menu.scss';\n\nfunction get30DaysBack(now: Date) {\n const prev = new Date(now);\n prev.setDate(prev.getDate() - 30);\n return prev;\n}\n\nfunction get6MonthsBack(now: Date) {\n const prev = new Date(now);\n prev.setMonth(prev.getMonth() - 6);\n return prev;\n}\n\nfunction getBeginningOfLastMonth(now: Date) {\n const beginningOfMonth = new Date(now);\n beginningOfMonth.setMonth(beginningOfMonth.getMonth() - 1);\n beginningOfMonth.setDate(1);\n return beginningOfMonth;\n}\n\nfunction getEndOfLastMonth(now: Date) {\n const endOfMonth = new Date(now);\n endOfMonth.setDate(1);\n endOfMonth.setDate(endOfMonth.getDate() - 1);\n return endOfMonth;\n}\n\ntype Props = {\n dateRange: ReportDuration;\n}\n\nexport function SystemUsersDateRangeMenu(props: Props) {\n const {formatMessage, formatDate} = useIntl();\n\n const dispatch = useDispatch();\n\n const now = new Date();\n\n function getSelectedDateRange(dateRange: ReportDuration) {\n if (dateRange === ReportDuration.Last30Days) {\n return formatMessage({\n id: 'admin.system_users.date_range_selector.date_range.last_30_days',\n defaultMessage: 'Last 30 days',\n });\n } else if (dateRange === ReportDuration.PreviousMonth) {\n return formatMessage({\n id: 'admin.system_users.date_range_selector.date_range.previous_month',\n defaultMessage: 'Previous month',\n });\n } else if (dateRange === ReportDuration.Last6Months) {\n return formatMessage({\n id: 'admin.system_users.date_range_selector.date_range.last_6_months',\n defaultMessage: 'Last 6 months',\n });\n }\n\n return formatMessage({\n id: 'admin.system_users.date_range_selector.date_range.all_time',\n defaultMessage: 'All time',\n });\n }\n\n function updateDateRange(value?: ReportDuration) {\n dispatch(setAdminConsoleUsersManagementTableProperties({dateRange: value}));\n }\n\n return (\n <div className='systemUsersDateRangeSelector'>\n <Menu.Container\n menuButton={{\n id: 'systemUsersDateRangeSelectorMenuButton',\n class: 'inputWithMenu',\n 'aria-label': formatMessage({\n id: 'admin.system_users.date_range_selector.menuButtonAriaLabel',\n defaultMessage:\n 'Open menu to select columns to display',\n }),\n as: 'div',\n children: (\n <Input\n label={formatMessage({\n id: 'admin.system_users.date_range_selector.label',\n defaultMessage: 'Duration',\n })}\n name='colXC'\n value={getSelectedDateRange(props.dateRange)}\n readOnly={true}\n inputSuffix={\n <i className='icon icon-chevron-down'/>\n }\n />\n ),\n }}\n menu={{\n id: 'systemUsersDateRangeSelectorMenu',\n 'aria-label': formatMessage({\n id: 'admin.system_users.date_range_selector.dropdownAriaLabel',\n defaultMessage: 'Date range menu',\n }),\n width: '250px',\n }}\n >\n <Menu.Item\n key={ReportDuration.AllTime}\n id={ReportDuration.AllTime}\n labels={\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.all_time'\n defaultMessage='All time'\n />\n }\n trailingElements={props.dateRange === ReportDuration.AllTime && <i className='icon icon-check'/>}\n onClick={() => updateDateRange()}\n />\n <Menu.Item\n key={ReportDuration.Last30Days}\n id={ReportDuration.Last30Days}\n labels={\n <>\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.last_30_days'\n defaultMessage='Last 30 days'\n />\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.sublabel'\n defaultMessage='{startDate} - {endDate}'\n values={{\n startDate: formatDate(get30DaysBack(now)),\n endDate: formatDate(now),\n }}\n />\n </>\n }\n trailingElements={props.dateRange === ReportDuration.Last30Days && <i className='icon icon-check'/>}\n onClick={() => updateDateRange(ReportDuration.Last30Days)}\n />\n <Menu.Item\n key={ReportDuration.PreviousMonth}\n id={ReportDuration.PreviousMonth}\n labels={\n <>\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.previous_month'\n defaultMessage='Previous month'\n />\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.sublabel'\n defaultMessage='{startDate} - {endDate}'\n values={{\n startDate: formatDate(getBeginningOfLastMonth(now)),\n endDate: formatDate(getEndOfLastMonth(now)),\n }}\n />\n </>\n }\n trailingElements={props.dateRange === ReportDuration.PreviousMonth && <i className='icon icon-check'/>}\n onClick={() => updateDateRange(ReportDuration.PreviousMonth)}\n />\n <Menu.Item\n key={ReportDuration.Last6Months}\n id={ReportDuration.Last6Months}\n labels={\n <>\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.last_6_months'\n defaultMessage='Last 6 months'\n />\n <FormattedMessage\n id='admin.system_users.date_range_selector.date_range.sublabel'\n defaultMessage='{startDate} - {endDate}'\n values={{\n startDate: formatDate(get6MonthsBack(now), {month: 'numeric', year: 'numeric'}),\n endDate: formatDate(now, {month: 'numeric', year: 'numeric'}),\n }}\n />\n </>\n\n }\n trailingElements={props.dateRange === ReportDuration.Last6Months && <i className='icon icon-check'/>}\n onClick={() => updateDateRange(ReportDuration.Last6Months)}\n />\n <Menu.Separator/>\n <Menu.Item\n key='trailing_message'\n id='trailing_message'\n className='systemUsersDateRangeSelector__trailing-message'\n labels={\n <>\n <span/>\n <FormattedMessage\n id='admin.system_users.date_range_selector.trailing_message'\n defaultMessage='Note: This filter will only affect values in the <strong>Last Post, Days Active, and Messages Posted</strong> columns.'\n values={{\n strong: (chunks: React.ReactNode) => (<strong>{chunks}</strong>),\n }}\n />\n </>\n }\n disabled={true}\n />\n </Menu.Container>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n error: ServerError;\n onExited: () => void;\n}\n\nexport function ExportErrorModal({error, onExited}: Props) {\n const isInProgress = error.status_code === 400 &&\n error.server_error_id === 'app.report.start_users_batch_export.job_exists';\n\n let title = (\n <FormattedMessage\n id='export_error_modal.title'\n defaultMessage='Export could not be initiated'\n />\n );\n\n let message = (\n <>\n <FormattedMessage\n id='export_error_modal.desc'\n defaultMessage='We’re not able to initiate an export of this data at the moment. Please wait a few minutes and try again.'\n />\n <div className='error'>{error.message}</div>\n </>\n );\n\n if (isInProgress) {\n title = (\n <FormattedMessage\n id='export_error_modal.inProgress.title'\n defaultMessage='Export is in progress'\n />\n );\n message = (\n <FormattedMessage\n id='export_error_modal.inProgress.desc'\n defaultMessage={'You\\'ve already started an export of this data. Please wait a few more minutes to access the CSV file or to generate the report again.'}\n />\n );\n }\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonText={\n <FormattedMessage\n id='generic.okay'\n defaultMessage='Okay'\n />\n }\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {ReportDuration} from '@mattermost/types/reports';\n\nimport {getAdminConsoleUserManagementTableProperties} from 'selectors/views/admin';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n onConfirm: (checked: boolean) => void;\n onExited: () => void;\n}\n\nexport function ExportUserDataModal({onConfirm, onExited}: Props) {\n const tableFilterProps = useSelector(getAdminConsoleUserManagementTableProperties);\n const dateRange = tableFilterProps.dateRange ?? ReportDuration.AllTime;\n\n const title = (\n <FormattedMessage\n id='export_user_data_modal.title'\n defaultMessage='Export user data'\n />\n );\n\n let message = (\n <FormattedMessage\n id='export_user_data_modal.dange_range.all_time'\n defaultMessage={'You\\'re about to export user data for all time. When the export is ready, a CSV file will be sent to you in a Mattermost direct message. This export will take a few minutes.'}\n />\n );\n if (dateRange === ReportDuration.Last30Days) {\n message = (\n <FormattedMessage\n id='export_user_data_modal.dange_range.last_30_days'\n defaultMessage={'You\\'re about to export user data for the last 30 days. When the export is ready, a CSV file will be sent to you in a Mattermost direct message. This export will take a few minutes.'}\n />\n );\n } else if (dateRange === ReportDuration.PreviousMonth) {\n message = (\n <FormattedMessage\n id='export_user_data_modal.dange_range.previous_month'\n defaultMessage={'You\\'re about to export user data for the previous month. When the export is ready, a CSV file will be sent to you in a Mattermost direct message. This export will take a few minutes.'}\n />\n );\n } else if (dateRange === ReportDuration.Last6Months) {\n message = (\n <FormattedMessage\n id='export_user_data_modal.dange_range.last_6_months'\n defaultMessage={'You\\'re about to export user data for the last 6 months. When the export is ready, a CSV file will be sent to you in a Mattermost direct message. This export will take a few minutes.'}\n />\n );\n }\n\n const tableFiltersAreSet = tableFilterProps.filterRole !== '' || tableFilterProps.filterStatus || tableFilterProps.filterTeam !== '';\n if (tableFiltersAreSet) {\n message = (\n <>\n {message}\n <p className='mt-3 text-muted'>\n <FormattedMessage\n id='export_user_data_modal.export_data.table_filters_note'\n defaultMessage={'Note: The exported data will use the filters you have set in the users list. To export all data first remove the filters.'}\n />\n </p>\n </>\n );\n }\n\n const exportDataButton = (\n <FormattedMessage\n id='export_user_data_modal.export_data'\n defaultMessage='Export data'\n />\n );\n\n const checkboxText = (\n <FormattedMessage\n id='export_user_data_modal.do_not_show'\n defaultMessage='Do not show this again'\n />\n );\n\n return (\n <ConfirmModalRedux\n id='exportUserDataModal'\n title={title}\n message={message}\n confirmButtonText={exportDataButton}\n showCheckbox={true}\n checkboxText={checkboxText}\n checkboxInFooter={true}\n onConfirm={onConfirm}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport SetupSystemSvg from 'components/common/svg_images_components/setup_system';\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\nimport './upgrade_export_data_modal.scss';\n\ntype Props = {\n onExited: () => void;\n}\n\nexport function UpgradeExportDataModal({onExited}: Props) {\n const openPricingModal = useOpenPricingModal();\n\n const confirm = () => {\n openPricingModal();\n };\n\n const title = (\n <FormattedMessage\n id='upgrade_export_data_modal.title'\n defaultMessage='Upgrade to export data reports'\n />\n );\n\n const message = (\n <>\n <FormattedMessage\n id='upgrade_export_data_modal.desc'\n defaultMessage='Export detailed data reports with ease and analyse user statistics conveniently. Upgrade to the Professional plan to gain access to data export.'\n />\n <div className='upgrade-export-data-modal__svg-image'>\n <SetupSystemSvg\n width={250}\n height={188}\n />\n </div>\n </>\n );\n\n const viewPlansButton = (\n <FormattedMessage\n id='upgrade_export_data_modal.view_plans'\n defaultMessage='View Plans'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonText={viewPlansButton}\n onConfirm={confirm}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {SortingState} from '@tanstack/react-table';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {UserReportSortColumns, ReportSortDirection} from '@mattermost/types/reports';\nimport type {UserReportOptions, UserReport} from '@mattermost/types/reports';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {PAGE_SIZES} from 'components/admin_console/list_table';\n\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nimport {ColumnNames, RoleFilters, StatusFilter, TeamFilters} from '../constants';\nimport type {TableOptions} from '../system_users';\nimport type {OptionType as TeamFilterOptionType} from '../system_users_filters_popover/system_users_filter_team';\n\nexport function convertTableOptionsToUserReportOptions(tableOptions?: TableOptions): UserReportOptions {\n return {\n page_size: tableOptions?.pageSize || PAGE_SIZES[0],\n from_column_value: tableOptions?.fromColumnValue,\n from_id: tableOptions?.fromId,\n direction: tableOptions?.direction,\n ...getSortColumnForOptions(tableOptions?.sortColumn),\n ...getSortDirectionForOptions(tableOptions?.sortIsDescending),\n ...getSearchFilterOption(tableOptions?.searchTerm),\n ...getTeamFilterOption(tableOptions?.filterTeam),\n ...getStatusFilterOption(tableOptions?.filterStatus),\n ...getRoleFilterOption(tableOptions?.filterRole),\n date_range: tableOptions?.dateRange,\n };\n}\n\n/**\n * Converts the sorting column name to API compatible sorting column name. Default sorting column name is by username.\n */\nexport function getSortColumnForOptions(id?: SortingState[0]['id']): Pick<UserReportOptions, 'sort_column'> {\n let sortColumn: UserReportOptions['sort_column'];\n\n if (id === ColumnNames.email) {\n sortColumn = UserReportSortColumns.email;\n } else if (id === ColumnNames.createAt) {\n sortColumn = UserReportSortColumns.createAt;\n } else {\n // Default sorting to first User details column\n sortColumn = UserReportSortColumns.username;\n }\n\n return {\n sort_column: sortColumn,\n };\n}\n\n/**\n * Converts the sorting direction to API compatible sorting direction. Default sorting direction is ascending.\n */\nexport function getSortDirectionForOptions(desc?: SortingState[0]['desc']): Pick<UserReportOptions, 'sort_direction'> {\n let sortDirection: UserReportOptions['sort_direction'];\n\n if (desc) {\n sortDirection = ReportSortDirection.descending;\n } else {\n sortDirection = ReportSortDirection.ascending;\n }\n\n return {\n sort_direction: sortDirection,\n };\n}\n\n/**\n * It returns the value of that column on which sorting is applied.\n */\nexport function getSortableColumnValueBySortColumn(row: UserReport, sortColumn: AdminConsoleUserManagementTableProperties['sortColumn']): string {\n switch (sortColumn) {\n case ColumnNames.email:\n return row.email;\n case ColumnNames.createAt:\n return String(row.create_at);\n default:\n return row.username;\n }\n}\n\nexport function getTeamFilterOption(teamId?: string): Partial<Pick<UserReportOptions, 'team_filter' | 'has_no_team'>> {\n if (!teamId || teamId === TeamFilters.AllTeams) {\n return {\n team_filter: undefined,\n has_no_team: undefined,\n };\n } else if (teamId === TeamFilters.NoTeams) {\n return {\n team_filter: undefined,\n has_no_team: true,\n };\n }\n\n return {\n team_filter: teamId,\n has_no_team: undefined,\n };\n}\n\nexport function getStatusFilterOption(status?: string): Partial<Pick<UserReportOptions, 'hide_active' | 'hide_inactive'>> {\n if (status === StatusFilter.Active) {\n return {\n hide_inactive: true,\n };\n } else if (status === StatusFilter.Deactivated) {\n return {\n hide_active: true,\n };\n }\n\n return {\n hide_active: undefined,\n hide_inactive: undefined,\n };\n}\n\nexport function getPaginationInfo(pageIndex: number, pageSize: number, currentLength: number, total?: number) {\n if (!currentLength) {\n return (\n <FormattedMessage\n id='admin.system_users_list.pagination.no_users'\n defaultMessage='0 users'\n />\n );\n }\n\n const firstPage = (pageIndex * pageSize) + 1;\n const lastPage = (pageIndex * pageSize) + currentLength;\n const totalItems = total || 0;\n\n return (\n <FormattedMessage\n id='admin.system_users_list.pagination'\n defaultMessage='Showing {firstPage} - {lastPage} of {totalItems} users'\n values={{\n firstPage,\n lastPage,\n totalItems,\n }}\n />\n );\n}\n\nexport function getDefaultSelectedValueFromList<T extends {value: string}>(value: string, options: T[]) {\n const option = options.find((option) => option.value === value);\n\n if (option) {\n return option;\n }\n\n return options[0];\n}\n\nexport function getDefaultSelectedTeam(teamId: Team['id'] | string, label?: string): TeamFilterOptionType {\n if (!teamId || teamId === TeamFilters.AllTeams) {\n return {\n value: TeamFilters.AllTeams,\n label: (\n <FormattedMessage\n id='admin.system_users.filters.team.allTeams'\n defaultMessage='All Teams'\n />\n ),\n };\n } else if (teamId === TeamFilters.NoTeams) {\n return {\n value: TeamFilters.NoTeams,\n label: (\n <FormattedMessage\n id='admin.system_users.filters.team.noTeams'\n defaultMessage='No Teams'\n />\n ),\n };\n }\n\n return {\n value: teamId,\n label: label || '',\n };\n}\n\nexport function getRoleFilterOption(role?: string): Pick<UserReportOptions, 'role_filter'> {\n if (!role || role === RoleFilters.Any) {\n return {role_filter: undefined};\n }\n return {role_filter: role};\n}\n\nexport function getSearchFilterOption(search?: string): Pick<UserReportOptions, 'search_term'> {\n if (!search || search.trim().length === 0) {\n return {search_term: undefined};\n }\n\n return {search_term: search};\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {ReportDuration} from '@mattermost/types/reports';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {startUsersBatchExport} from 'actions/views/admin';\nimport {openModal} from 'actions/views/modals';\nimport {getAdminConsoleUserManagementTableProperties} from 'selectors/views/admin';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {LicenseSkus, ModalIdentifiers} from 'utils/constants';\n\nimport {ExportErrorModal} from './export_error_modal';\nimport {ExportUserDataModal} from './export_user_data_modal';\nimport {UpgradeExportDataModal} from './upgrade_export_data_modal';\n\nimport {convertTableOptionsToUserReportOptions} from '../utils';\nimport './system_users_export.scss';\n\ninterface Props {\n currentUserId: UserProfile['id'];\n usersLenght: number;\n}\n\nexport function SystemUsersExport(props: Props) {\n const {formatMessage} = useIntl();\n\n const dispatch = useDispatch();\n\n const skipDialog = useSelector((state: GlobalState) => get(state, Preferences.CATEGORY_REPORTING, Preferences.HIDE_BATCH_EXPORT_CONFIRM_MODAL, '')) === 'true';\n const tableFilterProps = useSelector(getAdminConsoleUserManagementTableProperties);\n const tableOptionsToUserReport = convertTableOptionsToUserReportOptions(tableFilterProps);\n if (tableOptionsToUserReport.date_range === undefined) {\n tableOptionsToUserReport.date_range = ReportDuration.AllTime;\n }\n\n const license = useSelector(getLicense);\n const isLicensed = license.IsLicensed === 'true' && (license.SkuShortName === LicenseSkus.Professional || license.SkuShortName === LicenseSkus.Enterprise);\n\n async function doExport(checked?: boolean) {\n const {error} = await dispatch(startUsersBatchExport(tableOptionsToUserReport));\n if (error) {\n dispatch(openModal({\n modalId: ModalIdentifiers.EXPORT_ERROR_MODAL,\n dialogType: ExportErrorModal,\n dialogProps: {error},\n }));\n return;\n }\n\n if (checked) {\n dispatch(savePreferences(props.currentUserId, [{\n category: Preferences.CATEGORY_REPORTING,\n name: Preferences.HIDE_BATCH_EXPORT_CONFIRM_MODAL,\n user_id: props.currentUserId,\n value: 'true',\n }]));\n }\n }\n\n function handleExport() {\n if (!props.usersLenght) {\n return;\n }\n if (!isLicensed) {\n dispatch(openModal({\n modalId: ModalIdentifiers.UPGRADE_EXPORT_DATA_MODAL,\n dialogType: UpgradeExportDataModal,\n dialogProps: {},\n }));\n return;\n }\n\n if (skipDialog) {\n doExport();\n return;\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.EXPORT_USER_DATA_MODAL,\n dialogType: ExportUserDataModal,\n dialogProps: {onConfirm: doExport},\n }));\n }\n\n const button = (\n <button\n onClick={handleExport}\n className='btn btn-md btn-tertiary'\n disabled={!props.usersLenght}\n >\n <span className='icon icon-download-outline'/>\n <FormattedMessage\n id='admin.system_users.exportButton'\n defaultMessage='Export'\n />\n </button>\n );\n\n if (!isLicensed) {\n return (\n <>\n <WithTooltip\n title={formatMessage({id: 'admin.system_users.exportButton.notLicensed.title', defaultMessage: 'Professional feature'})}\n hint={formatMessage({id: 'admin.system_users.exportButton.notLicensed.hint', defaultMessage: 'This feature is available on the professional plan'})}\n >\n {button}\n </WithTooltip>\n <div className='system-users-export__keyIndicator'>\n <i className='icon icon-key-variant'/>\n </div>\n </>\n );\n }\n\n return button;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport styled from 'styled-components';\n\n/**\n * This is a styled div that should be used as a container for popovers.\n * It has basic styling common to all popovers containers, however, it can be extended to add more styling.\n */\nexport const StyledPopoverContainer = styled.div`\n border-radius: 4px;\n border: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n background-color: var(--center-channel-bg);\n box-shadow: var(--elevation-4);\n z-index: 9999;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport DropdownInput from 'components/dropdown_input';\n\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nimport {StatusFilter} from '../../constants';\nimport {getDefaultSelectedValueFromList} from '../../utils';\n\ntype OptionType = {\n label: string;\n value: StatusFilter;\n}\n\ninterface Props {\n initialValue: AdminConsoleUserManagementTableProperties['filterStatus'];\n onChange: (value: AdminConsoleUserManagementTableProperties['filterStatus']) => void;\n}\n\nexport function SystemUsersFiltersStatus(props: Props) {\n const {formatMessage} = useIntl();\n\n const options = useMemo(() => {\n return [\n {\n value: StatusFilter.Any,\n label: formatMessage({\n id: 'admin.system_users.filters.status.any',\n defaultMessage: 'Any',\n }),\n },\n {\n value: StatusFilter.Active,\n label: formatMessage({\n id: 'admin.system_users.filters.status.active',\n defaultMessage: 'Activated users',\n }),\n },\n {\n value: StatusFilter.Deactivated,\n label: formatMessage({\n id: 'admin.system_users.filters.status.deactive',\n defaultMessage: 'Deactivated users',\n }),\n },\n ];\n }, []);\n\n const [value, setValue] = useState(() => getDefaultSelectedValueFromList(props.initialValue, options));\n\n function handleChange(value: OptionType) {\n setValue(value);\n\n props.onChange(value.value);\n }\n\n return (\n <DropdownInput<OptionType>\n name='filterStatus'\n showLegend={true}\n isSearchable={false}\n legend={formatMessage({id: 'admin.system_users.filters.status.title', defaultMessage: 'Status'})}\n options={options}\n value={value}\n onChange={handleChange}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport DropdownInput from 'components/dropdown_input';\n\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nimport {RoleFilters} from '../../constants';\nimport {getDefaultSelectedValueFromList} from '../../utils';\n\ntype OptionType = {\n label: string;\n value: RoleFilters;\n}\n\ntype Props = {\n initialValue: AdminConsoleUserManagementTableProperties['filterRole'];\n onChange: (value: AdminConsoleUserManagementTableProperties['filterRole']) => void;\n};\n\nexport function SystemUsersFilterRole(props: Props) {\n const {formatMessage} = useIntl();\n\n const options = useMemo(() => {\n return [\n {\n value: RoleFilters.Any,\n label: formatMessage({\n id: 'admin.system_users.filters.role.any',\n defaultMessage: 'Any',\n }),\n },\n {\n value: RoleFilters.Admin,\n label: formatMessage({\n id: 'admin.system_users.filters.role.system_admin',\n defaultMessage: 'System Admin',\n }),\n },\n {\n value: RoleFilters.Member,\n label: formatMessage({\n id: 'admin.system_users.filters.role.system_user',\n defaultMessage: 'Member',\n }),\n },\n {\n value: RoleFilters.Guest,\n label: formatMessage({\n id: 'admin.system_users.filters.role.system_guest',\n defaultMessage: 'Guest',\n }),\n },\n ];\n }, []);\n\n const [value, setValue] = useState(() => getDefaultSelectedValueFromList(props.initialValue, options));\n\n function handleChange(value: OptionType) {\n setValue(value);\n\n props.onChange(value.value);\n }\n\n return (\n <DropdownInput<OptionType>\n name='filterRole'\n showLegend={true}\n isSearchable={false}\n legend={formatMessage({id: 'admin.system_users.filters.role.title', defaultMessage: 'Role'})}\n options={options}\n value={value}\n onChange={handleChange}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {CSSProperties, ReactElement} from 'react';\nimport React, {useEffect, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport {components} from 'react-select';\nimport type {IndicatorContainerProps, ControlProps, OptionProps, OptionsType, ValueType, StylesConfig} from 'react-select';\nimport AsyncSelect from 'react-select/async';\n\nimport type {Team, TeamSearchOpts} from '@mattermost/types/teams';\n\nimport {getTeams, searchTeams} from 'mattermost-redux/actions/teams';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport InputError from 'components/input_error';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {TeamFilters} from '../../constants';\nimport {getDefaultSelectedTeam} from '../../utils';\n\nimport './async_team_select.scss';\n\nconst TEAMS_PER_PAGE = 50;\n\nexport type OptionType = {\n label: string | ReactElement;\n value: string;\n}\n\ninterface Props {\n className?: string;\n error?: string;\n initialValue: Team['id'];\n initialLabel?: string;\n onChange: (value: Team['id'], label?: string) => void;\n}\n\nexport function SystemUsersFilterTeam(props: Props) {\n const {formatMessage} = useIntl();\n\n const dispatch = useDispatch();\n\n const [error, setError] = useState('');\n\n const [list, setList] = useState<OptionsType<OptionType>>();\n const [pageNumber, setPageNumber] = useState(0);\n const [value, setValue] = useState<ValueType<OptionType>>(getDefaultSelectedTeam(props.initialValue, props.initialLabel));\n\n async function loadListInPageNumber(page: number) {\n try {\n const response = await dispatch(getTeams(page, TEAMS_PER_PAGE, true)) as ActionResult<{teams: Team[]}>;\n if (response && response.data && response.data.teams && response.data.teams.length > 0) {\n const list = response.data.teams.\n map((team: Team) => ({\n value: team.id,\n label: team.display_name,\n })).\n sort((a: OptionType, b: OptionType) => (a.label as string).localeCompare(b.label as string));\n\n if (page === 0) {\n const initialOptions = [\n {\n label: formatMessage({id: 'admin.system_users.filters.team.allTeams', defaultMessage: 'All teams'}),\n value: TeamFilters.AllTeams,\n },\n {\n label: formatMessage({id: 'admin.system_users.filters.team.noTeams', defaultMessage: 'No teams'}),\n value: TeamFilters.NoTeams,\n },\n ];\n setList([...initialOptions, ...list]);\n } else {\n setList((existingList) => [...(existingList ?? []), ...list]);\n }\n\n setPageNumber(page + 1);\n }\n } catch (error) {\n setError(formatMessage({id: 'admin.system_users.filters.team.errorLoading', defaultMessage: 'Error while loading teams'}));\n console.error(error); // eslint-disable-line no-console\n }\n }\n\n async function searchInList(term: string, callBack: (options: OptionsType<{label: string; value: string}>) => void) {\n try {\n const response = await dispatch(searchTeams(term, {page: 0, per_page: TEAMS_PER_PAGE} as TeamSearchOpts));\n if (response && response.data && response.data.teams && response.data.teams.length > 0) {\n const teams = response.data.teams.map((team: Team) => ({\n value: team.id,\n label: team.display_name,\n }));\n\n callBack(teams);\n }\n\n callBack([]);\n } catch (error) {\n setError(formatMessage({id: 'admin.system_users.filters.team.errorSearching', defaultMessage: 'Error while searching teams'}));\n console.error(error); // eslint-disable-line no-console\n callBack([]);\n }\n }\n\n function handleMenuScrolledToBottom() {\n loadListInPageNumber(pageNumber);\n }\n\n function handleOnChange(value: ValueType<OptionType>) {\n setValue(value);\n props.onChange((value as OptionType).value as string, (value as OptionType).label as string);\n }\n\n useEffect(() => {\n loadListInPageNumber(0);\n }, []);\n\n return (\n <div\n className='DropdownInput Input_container'\n >\n <fieldset\n className={classNames('Input_fieldset Input_fieldset___legend', props.className, {\n Input_fieldset___error: props.error || error,\n })}\n >\n <legend className='Input_legend Input_legend___focus'>\n {formatMessage({id: 'admin.system_users.filters.team.title', defaultMessage: 'Team'})}\n </legend>\n <div className='Input_wrapper'>\n <AsyncSelect\n id='asyncTeamSelect'\n inputId='asyncTeamSelectInput'\n classNamePrefix='DropDown'\n className={classNames('Input Input__focus', props.className)}\n styles={styles}\n isMulti={false}\n isClearable={false}\n hideSelectedOptions={false}\n cacheOptions={false}\n placeholder={''} // Since we have a default value, we don't need placeholder\n loadingMessage={() => formatMessage({id: 'admin.channels.filterBy.team.loading', defaultMessage: 'Loading teams'})}\n noOptionsMessage={() => formatMessage({id: 'admin.channels.filterBy.team.noTeams', defaultMessage: 'No teams found'})}\n loadOptions={searchInList}\n defaultOptions={list}\n value={value}\n onChange={handleOnChange}\n onMenuScrollToBottom={handleMenuScrolledToBottom}\n components={{\n IndicatorsContainer,\n LoadingIndicator,\n Option,\n Control,\n }}\n />\n </div>\n </fieldset>\n <InputError\n message={props.error || error}\n />\n </div>\n );\n}\n\nconst styles: Partial<StylesConfig> = {\n input: (provided: CSSProperties) => ({\n ...provided,\n color: 'var(--center-channel-color)',\n }),\n control: (provided: CSSProperties) => ({\n ...provided,\n border: 'none',\n boxShadow: 'none',\n padding: '0 2px',\n cursor: 'pointer',\n }),\n indicatorSeparator: (provided: CSSProperties) => ({\n ...provided,\n display: 'none',\n }),\n menu: (provided: CSSProperties) => ({\n ...provided,\n zIndex: 100,\n }),\n menuPortal: (provided: CSSProperties) => ({\n ...provided,\n zIndex: 100,\n }),\n};\n\nconst IndicatorsContainer = (props: IndicatorContainerProps<OptionType>) => {\n return (\n <div className='asyncTeamSelectInput__indicatorsContainer'>\n <components.IndicatorsContainer {...props}>\n <i className='icon icon-chevron-down'/>\n </components.IndicatorsContainer>\n </div>\n );\n};\n\nconst Control = (props: ControlProps<OptionType>) => {\n return (\n <div className='asyncTeamSelectInput__controlContainer'>\n <components.Control {...props}/>\n </div>\n );\n};\n\nconst Option = (props: OptionProps<OptionType>) => {\n return (\n <div\n className={classNames('asyncTeamSelectInput__option', {\n selected: props.isSelected,\n focused: props.isFocused,\n })}\n >\n <components.Option {...props}/>\n </div>\n );\n};\n\nconst LoadingIndicator = () => {\n return (\n <LoadingSpinner/>\n );\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {autoUpdate, useClick, useDismiss, useFloating, useInteractions, useRole, FloatingFocusManager, useTransitionStyles, autoPlacement, offset} from '@floating-ui/react';\nimport React, {useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {setAdminConsoleUsersManagementTableProperties} from 'actions/views/admin';\n\nimport {StyledPopoverContainer} from 'components/styled_popover_container';\n\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nimport {SystemUsersFiltersStatus} from './styled_users_filters_status';\nimport {SystemUsersFilterRole} from './system_users_filter_role';\nimport {SystemUsersFilterTeam} from './system_users_filter_team';\n\nimport './system_users_filter_popover.scss';\nimport {RoleFilters, StatusFilter, TeamFilters} from '../constants';\n\ntype FiltersState = Partial<Pick<AdminConsoleUserManagementTableProperties, 'filterTeam' | 'filterTeamLabel' | 'filterRole' | 'filterStatus'>>;\n\ninterface Props {\n filterTeam: AdminConsoleUserManagementTableProperties['filterTeam'];\n filterTeamLabel: AdminConsoleUserManagementTableProperties['filterTeamLabel'];\n filterRole: AdminConsoleUserManagementTableProperties['filterRole'];\n filterStatus: AdminConsoleUserManagementTableProperties['filterStatus'];\n}\n\nexport function SystemUsersFilterPopover(props: Props) {\n const dispatch = useDispatch();\n const {formatMessage} = useIntl();\n\n const [isPopoverOpen, setPopoverOpen] = useState(false);\n\n const [filterState, setFilterState] = useState<FiltersState>({});\n\n const {context: floatingContext, refs: floatingRefs, floatingStyles} = useFloating({\n open: isPopoverOpen,\n onOpenChange: setPopoverOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(10),\n autoPlacement({\n allowedPlacements: ['bottom-start', 'top-start'],\n }),\n ],\n });\n const {isMounted, styles: floatingTransistionStyles} = useTransitionStyles(floatingContext);\n const floatingContextClick = useClick(floatingContext);\n const floatingContextDismiss = useDismiss(floatingContext);\n const floatingContextRole = useRole(floatingContext);\n const {getReferenceProps, getFloatingProps} = useInteractions([\n floatingContextClick,\n floatingContextDismiss,\n floatingContextRole,\n ]);\n\n function handleTeamFilterChange(teamFilter: string, teamFilterLabel?: string) {\n let filterTeam;\n let filterTeamLabel;\n if (teamFilter === TeamFilters.AllTeams) {\n filterTeam = '';\n filterTeamLabel = '';\n } else if (teamFilter === TeamFilters.NoTeams) {\n filterTeam = TeamFilters.NoTeams;\n filterTeamLabel = '';\n } else {\n filterTeam = teamFilter;\n\n // We need to set the label for selected team,\n // since we might not have the selected team label in the list of teams when we are navigating back from the user details page.\n filterTeamLabel = teamFilterLabel;\n }\n\n setFilterState({...filterState, filterTeam, filterTeamLabel});\n }\n\n function handleRoleFilterChange(roleFilter: string) {\n let filterRole = '';\n if (roleFilter === RoleFilters.Admin) {\n filterRole = RoleFilters.Admin;\n } else if (roleFilter === RoleFilters.Member) {\n filterRole = RoleFilters.Member;\n } else if (roleFilter === RoleFilters.Guest) {\n filterRole = RoleFilters.Guest;\n }\n\n setFilterState({...filterState, filterRole});\n }\n\n function handleStatusFilterChange(statusFilter: string) {\n let filterStatus = '';\n if (statusFilter === StatusFilter.Active) {\n filterStatus = 'active';\n } else if (statusFilter === StatusFilter.Deactivated) {\n filterStatus = 'deactivated';\n }\n\n setFilterState({...filterState, filterStatus});\n }\n\n function handleApplyFilters() {\n dispatch(setAdminConsoleUsersManagementTableProperties(filterState));\n setPopoverOpen(false);\n }\n\n const filterStatusApplied = props.filterStatus.length > 0 ? 1 : 0;\n const filterRoleApplied = props.filterRole.length > 0 ? 1 : 0;\n const filterTeamApplied = props.filterTeam.length > 0 ? 1 : 0;\n const filtersCount = filterStatusApplied + filterRoleApplied + filterTeamApplied;\n\n return (\n <div className='systemUsersFilterContainer'>\n <button\n {...getReferenceProps()}\n ref={floatingRefs.setReference}\n className='btn btn-md btn-tertiary'\n aria-controls='systemUsersFilterPopover'\n >\n <i className='icon icon-filter-variant'/>\n {formatMessage({id: 'admin.system_users.filtersMenu', defaultMessage: 'Filters ({count})'}, {count: filtersCount})}\n </button>\n {isMounted && (\n <FloatingFocusManager\n context={floatingContext}\n >\n <StyledPopoverContainer\n {...getFloatingProps()}\n id='systemUsersFilterPopover'\n ref={floatingRefs.setFloating}\n style={Object.assign({}, floatingStyles, floatingTransistionStyles)}\n className='systemUsersFilterPopoverContainer'\n aria-labelledby='header'\n >\n <h4 id='header'>\n {formatMessage({id: 'admin.system_users.filtersPopover.title', defaultMessage: 'Filter by'})}\n </h4>\n <div className='body'>\n <SystemUsersFilterTeam\n initialValue={props.filterTeam}\n initialLabel={props.filterTeamLabel}\n onChange={handleTeamFilterChange}\n />\n <SystemUsersFilterRole\n initialValue={props.filterRole}\n onChange={handleRoleFilterChange}\n />\n <SystemUsersFiltersStatus\n initialValue={props.filterStatus}\n onChange={handleStatusFilterChange}\n />\n </div>\n <div className='footer'>\n <button\n className='btn btn-md btn-primary'\n onClick={handleApplyFilters}\n type='submit'\n >\n {formatMessage({id: 'admin.system_users.filtersPopover.apply', defaultMessage: 'Apply'})}\n </button>\n </div>\n </StyledPopoverContainer>\n </FloatingFocusManager>\n )}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {General} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport ExternalLink from 'components/external_link';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {DeveloperLinks} from 'utils/constants';\n\nimport {isSuccess} from 'types/actions';\n\nexport type Props = {\n user?: UserProfile;\n userAccessTokensEnabled: boolean;\n\n // defining custom function type instead of using React.MouseEventHandler\n // to make the event optional\n onSuccess: (roles: string) => void;\n onExited: () => void;\n actions: {\n updateUserRoles: (userId: string, roles: string) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n show: boolean;\n user?: UserProfile;\n error: any | null;\n hasPostAllRole: boolean;\n hasPostAllPublicRole: boolean;\n hasUserAccessTokenRole: boolean;\n isSystemAdmin: boolean;\n}\n\nfunction getStateFromProps(props: Props): State {\n const roles = props.user && props.user.roles ? props.user.roles : '';\n\n return {\n show: true,\n user: props.user,\n error: null,\n hasPostAllRole: UserUtils.hasPostAllRole(roles),\n hasPostAllPublicRole: UserUtils.hasPostAllPublicRole(roles),\n hasUserAccessTokenRole: UserUtils.hasUserAccessTokenRole(roles),\n isSystemAdmin: UserUtils.isSystemAdmin(roles),\n };\n}\n\nexport default class ManageRolesModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = getStateFromProps(props);\n }\n\n static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n if (prevState.user?.id !== nextProps.user?.id) {\n return getStateFromProps(nextProps);\n }\n return null;\n }\n\n handleError = (error: any) => {\n this.setState({\n error,\n });\n };\n\n handleSystemAdminChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.name === 'systemadmin') {\n this.setState({isSystemAdmin: true});\n } else if (e.target.name === 'systemmember') {\n this.setState({isSystemAdmin: false});\n }\n };\n\n handleUserAccessTokenChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n hasUserAccessTokenRole: e.target.checked,\n });\n };\n\n handlePostAllChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n hasPostAllRole: e.target.checked,\n });\n };\n\n handlePostAllPublicChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n hasPostAllPublicRole: e.target.checked,\n });\n };\n\n trackRoleChanges = (roles: string, oldRoles: string) => {\n if (UserUtils.hasUserAccessTokenRole(roles) && !UserUtils.hasUserAccessTokenRole(oldRoles)) {\n trackEvent('actions', 'add_roles', {role: General.SYSTEM_USER_ACCESS_TOKEN_ROLE});\n } else if (!UserUtils.hasUserAccessTokenRole(roles) && UserUtils.hasUserAccessTokenRole(oldRoles)) {\n trackEvent('actions', 'remove_roles', {role: General.SYSTEM_USER_ACCESS_TOKEN_ROLE});\n }\n\n if (UserUtils.hasPostAllRole(roles) && !UserUtils.hasPostAllRole(oldRoles)) {\n trackEvent('actions', 'add_roles', {role: General.SYSTEM_POST_ALL_ROLE});\n } else if (!UserUtils.hasPostAllRole(roles) && UserUtils.hasPostAllRole(oldRoles)) {\n trackEvent('actions', 'remove_roles', {role: General.SYSTEM_POST_ALL_ROLE});\n }\n\n if (UserUtils.hasPostAllPublicRole(roles) && !UserUtils.hasPostAllPublicRole(oldRoles)) {\n trackEvent('actions', 'add_roles', {role: General.SYSTEM_POST_ALL_PUBLIC_ROLE});\n } else if (!UserUtils.hasPostAllPublicRole(roles) && UserUtils.hasPostAllPublicRole(oldRoles)) {\n trackEvent('actions', 'remove_roles', {role: General.SYSTEM_POST_ALL_PUBLIC_ROLE});\n }\n };\n\n onHide = () => {\n this.setState({show: false});\n };\n\n handleSave = async () => {\n this.setState({error: null});\n\n let roles = General.SYSTEM_USER_ROLE;\n\n if (this.state.isSystemAdmin) {\n roles += ' ' + General.SYSTEM_ADMIN_ROLE;\n } else if (this.state.hasUserAccessTokenRole) {\n roles += ' ' + General.SYSTEM_USER_ACCESS_TOKEN_ROLE;\n if (this.state.hasPostAllRole) {\n roles += ' ' + General.SYSTEM_POST_ALL_ROLE;\n } else if (this.state.hasPostAllPublicRole) {\n roles += ' ' + General.SYSTEM_POST_ALL_PUBLIC_ROLE;\n }\n }\n\n const result = await this.props.actions.updateUserRoles(this.props.user!.id, roles);\n this.trackRoleChanges(roles, this.props.user!.roles);\n\n if (isSuccess(result)) {\n this.props.onSuccess(roles);\n this.onHide();\n } else {\n this.handleError(\n <FormattedMessage\n id='admin.manage_roles.saveError'\n defaultMessage='Unable to save roles.'\n />,\n );\n }\n };\n\n renderContents = () => {\n const {user} = this.props;\n\n if (user == null) {\n return <div/>;\n }\n\n let name = UserUtils.getFullName(user);\n if (name) {\n name += ` (@${user.username})`;\n } else {\n name = `@${user.username}`;\n }\n\n let additionalRoles;\n if (this.state.hasUserAccessTokenRole || this.state.isSystemAdmin || user.is_bot) {\n additionalRoles = (\n <div>\n <p>\n <FormattedMessage\n id='admin.manage_roles.additionalRoles'\n defaultMessage='Select additional permissions for the account. <link>Read more about roles and permissions</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PERSONAL_ACCESS_TOKENS}\n location='manage_roles_modal'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n <div className='checkbox'>\n <label>\n <input\n type='checkbox'\n checked={this.state.hasPostAllRole || this.state.isSystemAdmin}\n disabled={this.state.isSystemAdmin}\n onChange={this.handlePostAllChange}\n />\n <strong>\n <FormattedMessage\n id='admin.manage_roles.postAllRoleTitle'\n defaultMessage='post:all'\n />\n </strong>\n <FormattedMessage\n id='admin.manage_roles.postAllRole'\n defaultMessage='Access to post to all Mattermost channels including direct messages.'\n />\n </label>\n </div>\n <div className='checkbox'>\n <label>\n <input\n type='checkbox'\n checked={this.state.hasPostAllPublicRole || this.state.hasPostAllRole || this.state.isSystemAdmin}\n disabled={this.state.hasPostAllRole || this.state.isSystemAdmin}\n onChange={this.handlePostAllPublicChange}\n />\n <strong>\n <FormattedMessage\n id='admin.manage_roles.postAllPublicRoleTitle'\n defaultMessage='post:channels'\n />\n </strong>\n <FormattedMessage\n id='admin.manage_roles.postAllPublicRole'\n defaultMessage='Access to post to all Mattermost public channels.'\n />\n </label>\n </div>\n </div>\n );\n }\n\n let userAccessTokenContent;\n if (this.props.userAccessTokensEnabled) {\n if (user.is_bot) {\n userAccessTokenContent = (\n <div>\n <div className='member-row--padded member-row-lone-padding'>\n {additionalRoles}\n </div>\n </div>\n );\n } else {\n userAccessTokenContent = (\n <div>\n <div className='checkbox'>\n <label>\n <input\n type='checkbox'\n checked={this.state.hasUserAccessTokenRole || this.state.isSystemAdmin}\n disabled={this.state.isSystemAdmin}\n onChange={this.handleUserAccessTokenChange}\n />\n <FormattedMessage\n id='admin.manage_roles.allowUserAccessTokens'\n defaultMessage='Allow this account to generate <link>personal access tokens</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PERSONAL_ACCESS_TOKENS}\n location='manage_roles_modal'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n <span className='d-block pt-2 pb-2 light'>\n <FormattedMessage\n id='admin.manage_roles.allowUserAccessTokensDesc'\n defaultMessage=\"Removing this permission doesn't delete existing tokens. To delete them, go to the user's Manage Tokens menu.\"\n />\n </span>\n </label>\n </div>\n <div className='member-row--padded'>\n {additionalRoles}\n </div>\n </div>\n );\n }\n }\n\n let email = user.email;\n if (user.is_bot) {\n email = '';\n }\n\n return (\n <div>\n <div className='manage-teams__user'>\n <Avatar\n size='lg'\n username={user.username}\n url={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n />\n <div className='manage-teams__info'>\n <div className='manage-teams__name'>\n {name}\n {user.is_bot && <BotTag/>}\n </div>\n <div className='manage-teams__email'>\n {email}\n </div>\n </div>\n </div>\n <div>\n <div className='manage-row--inner'>\n <div className='radio-inline'>\n <label>\n <input\n name='systemadmin'\n type='radio'\n checked={this.state.isSystemAdmin}\n onChange={this.handleSystemAdminChange}\n />\n <FormattedMessage\n id='admin.manage_roles.systemAdmin'\n defaultMessage='System Admin'\n />\n </label>\n </div>\n <div className='radio-inline'>\n <label>\n <input\n name='systemmember'\n type='radio'\n checked={!this.state.isSystemAdmin}\n onChange={this.handleSystemAdminChange}\n />\n <FormattedMessage\n id='admin.manage_roles.systemMember'\n defaultMessage='Member'\n />\n </label>\n </div>\n </div>\n {userAccessTokenContent}\n </div>\n </div>\n );\n };\n\n render() {\n return (\n <Modal\n show={this.state.show}\n onHide={this.onHide}\n onExited={this.props.onExited}\n dialogClassName='a11y__modal manage-teams'\n role='none'\n aria-labelledby='manageRolesModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='manageRolesModalLabel'\n >\n <FormattedMessage\n id='admin.manage_roles.manageRolesTitle'\n defaultMessage='Manage Roles'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {this.renderContents()}\n {this.state.error}\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='admin.manage_roles.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n type='button'\n className='btn btn-primary'\n onClick={this.handleSave}\n >\n <FormattedMessage\n id='admin.manage_roles.save'\n defaultMessage='Save'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {updateUserRoles} from 'mattermost-redux/actions/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport ManageRolesModal from './manage_roles_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n userAccessTokensEnabled: state.entities.admin.config.ServiceSettings!.EnableUserAccessTokens,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n updateUserRoles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ManageRolesModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Team, TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {isAdmin, isSystemAdmin, isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\ntype Props = {\n team: Team;\n user: UserProfile;\n teamMember: TeamMembership;\n onError: (error: JSX.Element) => void;\n onMemberChange: (teamId: string) => void;\n updateTeamMemberSchemeRoles: (teamId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean,) => Promise<ActionResult>;\n handleRemoveUserFromTeam: (teamId: string) => void;\n}\n\nconst ManageTeamsDropdown = (props: Props) => {\n const {formatMessage} = useIntl();\n\n const makeTeamAdmin = async () => {\n const {error} = await props.updateTeamMemberSchemeRoles(props.teamMember.team_id, props.user.id, true, true);\n if (error) {\n props.onError(\n <FormattedMessage\n id='admin.manage_teams.makeAdminError'\n defaultMessage='Unable to make user a team admin.'\n />);\n } else {\n props.onMemberChange(props.teamMember.team_id);\n }\n };\n\n const makeMember = async () => {\n const {error} = await props.updateTeamMemberSchemeRoles(props.teamMember.team_id, props.user.id, true, false);\n if (error) {\n props.onError(\n <FormattedMessage\n id='admin.manage_teams.makeMemberError'\n defaultMessage='Unable to make user a member.'\n />,\n );\n } else {\n props.onMemberChange(props.teamMember.team_id);\n }\n };\n\n const removeFromTeam = () => props.handleRemoveUserFromTeam(props.teamMember.team_id);\n\n const isTeamAdmin = isAdmin(props.teamMember.roles) || props.teamMember.scheme_admin;\n const isSysAdmin = isSystemAdmin(props.user.roles);\n const isGuestUser = isGuest(props.user.roles);\n\n const {team} = props;\n let title;\n if (isSysAdmin) {\n title = formatMessage({id: 'admin.user_item.sysAdmin', defaultMessage: 'System Admin'});\n } else if (isTeamAdmin) {\n title = formatMessage({id: 'admin.user_item.teamAdmin', defaultMessage: 'Team Admin'});\n } else if (isGuestUser) {\n title = formatMessage({id: 'admin.user_item.guest', defaultMessage: 'Guest'});\n } else {\n title = formatMessage({id: 'admin.user_item.teamMember', defaultMessage: 'Team Member'});\n }\n\n return (\n <MenuWrapper>\n <a>\n <span>{title} </span>\n <span className='caret'/>\n </a>\n <Menu\n openLeft={true}\n ariaLabel={formatMessage({id: 'team_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of a team member'})}\n >\n <Menu.ItemAction\n show={!isTeamAdmin && !isGuestUser}\n onClick={makeTeamAdmin}\n text={formatMessage({id: 'admin.user_item.makeTeamAdmin', defaultMessage: 'Make Team Admin'})}\n />\n <Menu.ItemAction\n show={isTeamAdmin}\n onClick={makeMember}\n text={formatMessage({id: 'admin.user_item.makeMember', defaultMessage: 'Make Team Member'})}\n />\n <Menu.ItemAction\n show={!team.group_constrained}\n onClick={removeFromTeam}\n text={formatMessage({id: 'team_members_dropdown.leave_team', defaultMessage: 'Remove from Team'})}\n />\n </Menu>\n </MenuWrapper>\n );\n};\n\nexport default ManageTeamsDropdown;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n teamId: string;\n handleRemoveUserFromTeam: (team: string) => void;\n}\n\nconst RemoveFromTeamButton = ({teamId, handleRemoveUserFromTeam}: Props) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n handleRemoveUserFromTeam(teamId);\n };\n\n return (\n <button\n type='button'\n className='btn btn-danger'\n onClick={handleClick}\n >\n <FormattedMessage\n id='team_members_dropdown.leave_team'\n defaultMessage='Remove from Team'\n />\n </button>\n );\n};\n\nexport default RemoveFromTeamButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team, TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport LoadingScreen from 'components/loading_screen';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {filterAndSortTeamsByDisplayName} from 'utils/team_utils';\nimport * as Utils from 'utils/utils';\n\nimport ManageTeamsDropdown from './manage_teams_dropdown';\nimport RemoveFromTeamButton from './remove_from_team_button';\n\nexport type Props = {\n locale: string;\n user?: UserProfile;\n onExited: () => void;\n actions: {\n getTeamMembersForUser: (userId: string) => Promise<ActionResult>;\n getTeamsForUser: (userId: string) => Promise<ActionResult>;\n updateTeamMemberSchemeRoles: (teamId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => Promise<ActionResult>;\n removeUserFromTeam: (teamId: string, userId: string) => Promise<ActionResult>;\n };\n}\n\nconst ManageTeamsModal = ({locale, onExited, user, actions}: Props) => {\n const [error, setError] = React.useState<JSX.Element | null>(null);\n const [teams, setTeams] = React.useState<Team[] | null>(null);\n const [teamMembers, setTeamMembers] = React.useState<TeamMembership[] | null>(null);\n const [show, setShow] = React.useState(true);\n\n useEffect(() => {\n if (user) {\n loadTeamsAndTeamMembers(user);\n }\n }, [user]);\n\n useEffect(() => {\n if (user?.id) {\n setTeams(null);\n setTeamMembers(null);\n }\n }, [user?.id]);\n\n const onModalDismissed = () => {\n setShow(false);\n };\n\n const loadTeamsAndTeamMembers = async (user: UserProfile) => {\n await getTeamMembers(user.id);\n const {data} = await actions.getTeamsForUser(user.id);\n setTeams(filterAndSortTeamsByDisplayName(data, locale));\n };\n\n const handleError = (error: JSX.Element) => setError(error);\n\n const getTeamMembers = async (userId: string) => {\n const {data} = await actions.getTeamMembersForUser(userId);\n if (data) {\n setTeamMembers(data);\n }\n };\n\n const handleMemberRemove = (teamId: string) => {\n setTeams(teams!.filter((team) => team.id !== teamId));\n setTeamMembers(teamMembers!.filter((teamMember: TeamMembership) => teamMember.team_id !== teamId));\n };\n\n const handleRemoveUserFromTeam = async (teamId: string) => {\n const {error} = await actions.removeUserFromTeam(teamId, user ? user.id : '');\n if (error) {\n handleError(\n <FormattedMessage\n id='admin.manage_teams.removeError'\n defaultMessage='Unable to remove user from team.'\n />);\n } else {\n handleMemberRemove(teamId);\n }\n };\n\n const handleMemberChange = () => getTeamMembers(user ? user.id : '');\n\n const renderContents = () => {\n if (!user) {\n return <LoadingScreen/>;\n }\n\n const isSystemAdmin = isAdmin(user.roles);\n\n let name = Utils.getFullName(user);\n if (name) {\n name += ` (@${user.username})`;\n } else {\n name = `@${user.username}`;\n }\n\n let teamList;\n if (teams && teamMembers) {\n teamList = teams.map((team) => {\n const teamMember = teamMembers.find((member: TeamMembership) => member.team_id === team.id);\n if (!teamMember) {\n return null;\n }\n\n const action = isSystemAdmin ? (\n <RemoveFromTeamButton\n teamId={team.id}\n handleRemoveUserFromTeam={handleRemoveUserFromTeam}\n />\n ) : (\n <ManageTeamsDropdown\n user={user}\n team={team}\n teamMember={teamMember}\n onError={handleError}\n onMemberChange={handleMemberChange}\n updateTeamMemberSchemeRoles={actions.updateTeamMemberSchemeRoles}\n handleRemoveUserFromTeam={handleRemoveUserFromTeam}\n />\n );\n\n return (\n <div\n key={team.id}\n className='manage-teams__team'\n >\n <div className='manage-teams__team-name'>\n {team.display_name}\n </div>\n <div className='manage-teams__team-actions'>\n {action}\n </div>\n </div>\n );\n });\n } else {\n teamList = <LoadingScreen/>;\n }\n\n let systemAdminIndicator = null;\n if (isSystemAdmin) {\n systemAdminIndicator = (\n <div className='manage-teams__system-admin'>\n <FormattedMessage\n id='admin.user_item.sysAdmin'\n defaultMessage='System Admin'\n />\n </div>\n );\n }\n\n return (\n <div>\n <div className='manage-teams__user'>\n <Avatar\n username={user.username}\n url={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n size='lg'\n />\n <div className='manage-teams__info'>\n <div className='manage-teams__name'>\n {name}\n </div>\n <div className='manage-teams__email'>\n {user.email}\n </div>\n </div>\n {systemAdminIndicator}\n </div>\n <div className='manage-teams__teams'>\n {teamList}\n </div>\n </div>\n );\n };\n\n return (\n <Modal\n show={show}\n onHide={onModalDismissed}\n onExited={onExited}\n dialogClassName='a11y__modal manage-teams modal--overflow-visible'\n role='none'\n aria-labelledby='manageTeamsModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='manageTeamsModalLabel'\n >\n <FormattedMessage\n id='admin.user_item.manageTeams'\n defaultMessage='Manage Teams'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {renderContents()}\n {error}\n </Modal.Body>\n </Modal>\n );\n};\n\nexport default ManageTeamsModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {updateTeamMemberSchemeRoles, getTeamMembersForUser, getTeamsForUser, removeUserFromTeam} from 'mattermost-redux/actions/teams';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport type {GlobalState} from 'types/store';\n\nimport ManageTeamsModal from './manage_teams_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n locale: getCurrentLocale(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTeamMembersForUser,\n getTeamsForUser,\n updateTeamMemberSchemeRoles,\n removeUserFromTeam,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ManageTeamsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nexport interface RevokeTokenButtonProps {\n actions: {\n revokeUserAccessToken: (\n tokenId: string\n ) => Promise<ActionResult>;\n };\n tokenId: string;\n onError: (errorMessage: string) => void;\n}\n\nconst RevokeTokenButton = (props: RevokeTokenButtonProps) => {\n const handleClick = async (e: React.MouseEvent) => {\n e.preventDefault();\n\n const response = await props.actions.revokeUserAccessToken(props.tokenId);\n trackEvent('system_console', 'revoke_user_access_token');\n\n if ('error' in response) {\n props.onError(response.error.message);\n }\n };\n\n return (\n <button\n type='button'\n className='btn btn-danger'\n onClick={handleClick}\n >\n <FormattedMessage\n id='admin.revoke_token_button.delete'\n defaultMessage='Delete'\n />\n </button>\n );\n};\n\nexport default React.memo(RevokeTokenButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {revokeUserAccessToken} from 'mattermost-redux/actions/users';\n\nimport RevokeTokenButton from './revoke_token_button';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n revokeUserAccessToken,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(RevokeTokenButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserAccessToken, UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport RevokeTokenButton from 'components/admin_console/revoke_token_button';\nimport ExternalLink from 'components/external_link';\nimport LoadingScreen from 'components/loading_screen';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {DeveloperLinks} from 'utils/constants';\n\nexport type Props = {\n\n /**\n * The user the roles are being managed for\n */\n user: UserProfile;\n\n /**\n * The personal access tokens for a user, object with token ids as keys\n */\n userAccessTokens?: Record<string, UserAccessToken>;\n\n onExited: () => void;\n actions: {\n\n /**\n * Function to get a user's access tokens\n */\n getUserAccessTokensForUser: (userId: string, page: number, perPage: number) => void;\n };\n};\n\ntype State = {\n show: boolean;\n error: string | null;\n}\n\nexport default class ManageTokensModal extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n this.state = {\n show: true,\n error: null,\n };\n }\n\n public componentDidMount(): void {\n const userId = this.props.user ? this.props.user.id : null;\n if (userId) {\n this.props.actions.getUserAccessTokensForUser(userId, 0, 200);\n }\n }\n\n private handleError = (error: string): void => {\n this.setState({\n error,\n });\n };\n\n private onModalDismissed = () => {\n this.setState({show: false});\n };\n\n private renderContents = (): JSX.Element => {\n const {user, userAccessTokens} = this.props;\n\n let name = UserUtils.getFullName(user);\n if (name) {\n name += ` (@${user.username})`;\n } else {\n name = `@${user.username}`;\n }\n\n let tokenList;\n if (userAccessTokens) {\n const userAccessTokensList = Object.values(userAccessTokens);\n\n if (userAccessTokensList.length === 0) {\n tokenList = (\n <div className='manage-row__empty'>\n <FormattedMessage\n id='admin.manage_tokens.userAccessTokensNone'\n defaultMessage='No personal access tokens.'\n />\n </div>\n );\n } else {\n tokenList = userAccessTokensList.map((token: UserAccessToken) => {\n return (\n <div\n key={token.id}\n className='manage-teams__team'\n >\n <div className='manage-teams__team-name'>\n <div className='whitespace--nowrap overflow--ellipsis'>\n <FormattedMessage\n id='admin.manage_tokens.userAccessTokensNameLabel'\n defaultMessage='Token Description: '\n />\n {token.description}\n </div>\n <div className='whitespace--nowrap overflow--ellipsis'>\n <FormattedMessage\n id='admin.manage_tokens.userAccessTokensIdLabel'\n defaultMessage='Token ID: '\n />\n {token.id}\n </div>\n </div>\n <div className='manage-teams__team-actions'>\n <RevokeTokenButton\n tokenId={token.id}\n onError={this.handleError}\n />\n </div>\n </div>\n );\n });\n }\n } else {\n tokenList = <LoadingScreen/>;\n }\n\n return (\n <div>\n <div className='manage-teams__user'>\n <Avatar\n username={user.username}\n url={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n size='lg'\n />\n <div className='manage-teams__info'>\n <div className='manage-teams__name'>\n {name}\n </div>\n <div className='manage-teams__email'>\n {user.email}\n </div>\n </div>\n </div>\n <div className='pt-3'>\n <FormattedMessage\n id='admin.manage_tokens.userAccessTokensDescription'\n defaultMessage='Personal access tokens function similarly to session tokens and can be used by integrations to <linkAuthentication>interact with this Mattermost server</linkAuthentication>. Tokens are disabled if the user is deactivated. Learn more about <linkPersonalAccessTokens>personal access tokens</linkPersonalAccessTokens>.'\n values={{\n linkAuthentication: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://api.mattermost.com/#tag/authentication'\n location='manage_tokens_modal'\n >\n {msg}\n </ExternalLink>\n ),\n linkPersonalAccessTokens: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PERSONAL_ACCESS_TOKENS}\n location='manage_tokens_modal'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n <div className='manage-teams__teams'>\n {tokenList}\n </div>\n </div>\n );\n };\n\n public render = (): JSX.Element => {\n return (\n <Modal\n show={this.state.show}\n onHide={this.onModalDismissed}\n onExited={this.props.onExited}\n dialogClassName='a11y__modal manage-teams'\n role='none'\n aria-labelledby='manageTokensModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='manageTokensModalLabel'\n >\n <FormattedMessage\n id='admin.manage_tokens.manageTokensTitle'\n defaultMessage='Manage Personal Access Tokens'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {this.renderContents()}\n {this.state.error}\n </Modal.Body>\n </Modal>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getUserAccessTokensForUser} from 'mattermost-redux/actions/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport ManageTokensModal from './manage_tokens_modal';\n\ntype OwnProps = {\n user?: UserProfile;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const userId = ownProps.user ? ownProps.user.id : '';\n\n const userAccessTokens = state.entities.admin.userAccessTokensByUser;\n\n return {\n userAccessTokens: userAccessTokens === undefined ? undefined : userAccessTokens[userId],\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getUserAccessTokensForUser,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ManageTokensModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {isEmail} from 'mattermost-redux/utils/helpers';\n\ntype State = {\n show: boolean;\n error: JSX.Element|string|null;\n isEmailError: boolean;\n isCurrentPasswordError: boolean;\n}\n\ntype Props = {\n user?: UserProfile;\n currentUserId: string;\n onSuccess: (email: string) => void;\n onExited: () => void;\n actions: {\n patchUser: (user: UserProfile) => Promise<ActionResult>;\n };\n}\n\nexport default class ResetEmailModal extends React.PureComponent<Props, State> {\n private emailRef: React.RefObject<HTMLInputElement>;\n private currentPasswordRef: React.RefObject<HTMLInputElement>;\n\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n error: null,\n isEmailError: false,\n isCurrentPasswordError: false,\n };\n\n this.emailRef = React.createRef();\n this.currentPasswordRef = React.createRef();\n }\n\n private isEmailValid = (): boolean => {\n if (!this.emailRef.current || !this.emailRef.current.value || !isEmail(this.emailRef.current.value)) {\n const errMsg = (\n <FormattedMessage\n id='user.settings.general.validEmail'\n defaultMessage='Please enter a valid email address.'\n />\n );\n this.setState({error: errMsg, isEmailError: true});\n return false;\n }\n\n this.setState({error: null, isEmailError: false});\n return true;\n };\n\n private isCurrentPasswordValid = (): boolean => {\n if (!this.currentPasswordRef.current || !this.currentPasswordRef.current.value) {\n const errMsg = (\n <FormattedMessage\n id='admin.reset_email.missing_current_password'\n defaultMessage='Please enter your current password.'\n />\n );\n\n this.setState({error: errMsg, isCurrentPasswordError: true});\n return false;\n }\n this.setState({error: null, isCurrentPasswordError: false});\n return true;\n };\n\n private doSubmit = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n if (!this.props.user) {\n return;\n }\n\n if (!this.isEmailValid()) {\n return;\n }\n\n const user = {\n ...this.props.user,\n email: (this.emailRef.current as HTMLInputElement).value.trim().toLowerCase(),\n };\n\n if (this.props.user?.id === this.props.currentUserId) {\n if (!this.isCurrentPasswordValid()) {\n return;\n }\n user.password = (this.currentPasswordRef.current as HTMLInputElement).value;\n }\n\n const result = await this.props.actions.patchUser(user);\n if ('error' in result) {\n this.setState({\n error: result.error.message,\n isEmailError: result.error.server_error_id === 'app.user.save.email_exists.app_error',\n isCurrentPasswordError: result.error.server_error_id === 'api.user.check_user_password.invalid.app_error',\n });\n return;\n }\n\n this.props.onSuccess(user.email);\n this.setState({show: false});\n };\n\n private doCancel = (): void => {\n this.setState({\n show: false,\n error: null,\n });\n };\n\n public render(): JSX.Element {\n const user = this.props.user;\n if (!user) {\n return <div/>;\n }\n\n const groupClass = 'input-group input-group--limit mb-5';\n\n const title = (\n <FormattedMessage\n id='admin.reset_email.titleReset'\n defaultMessage='Update Email'\n />\n );\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.state.show}\n onHide={this.doCancel}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='resetEmailModalLabel'\n data-testid='resetEmailModal'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='resetEmailModalLabel'\n >\n {title}\n </Modal.Title>\n </Modal.Header>\n <form\n role='form'\n className='form-horizontal'\n >\n <Modal.Body>\n <div className='form-group'>\n <div className='col-sm-10'>\n <div\n className={`${groupClass}${this.state.isEmailError ? ' has-error' : ''}`}\n data-testid='resetEmailForm'\n >\n <span\n data-toggle='tooltip'\n title='New Email'\n className='input-group-addon email__group-addon'\n >\n <FormattedMessage\n id='admin.reset_email.newEmail'\n defaultMessage='New Email'\n />\n </span>\n <input\n type='email'\n ref={this.emailRef}\n className='form-control'\n maxLength={128}\n autoFocus={true}\n />\n </div>\n\n {this.props.user?.id === this.props.currentUserId && (\n <div\n className={`${groupClass}${this.state.isCurrentPasswordError ? ' has-error' : ''}`}\n data-testid='resetEmailForm'\n >\n <span\n data-toggle='tooltip'\n title='Current Password'\n className='input-group-addon email__group-addon'\n >\n <FormattedMessage\n id='admin.reset_email.currentPassword'\n defaultMessage='Current Password'\n />\n </span>\n <input\n type='password'\n ref={this.currentPasswordRef}\n className='form-control'\n />\n </div>\n )}\n\n {this.state.error && (\n <div className='has-error'>\n <p className='input__help error'>\n {this.state.error}\n </p>\n </div>\n )}\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.doCancel}\n >\n <FormattedMessage\n id='admin.reset_email.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n onClick={this.doSubmit}\n type='submit'\n className='btn btn-primary'\n data-testid='resetEmailButton'\n >\n <FormattedMessage\n id='admin.reset_email.reset'\n defaultMessage='Reset'\n />\n </button>\n </Modal.Footer>\n </form>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {patchUser} from 'mattermost-redux/actions/users';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\n\nimport type {GlobalState} from 'types/store';\n\nimport ResetEmailModal from './reset_email_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentUserId: getCurrentUserId(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchUser,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ResetEmailModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {createGroupTeamsAndChannels} from 'mattermost-redux/actions/groups';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n user: UserProfile;\n onExited: () => void;\n onError: (error: ServerError) => void;\n}\n\nexport default function CreateGroupSyncablesMembershipsModal({user, onExited, onError}: Props) {\n const dispatch = useDispatch();\n\n async function confirm() {\n const {error} = await dispatch(createGroupTeamsAndChannels(user.id));\n if (error) {\n onError(error);\n }\n }\n\n const title = (\n <FormattedMessage\n id='create_group_memberships_modal.title'\n defaultMessage='Re-add {username} to teams and channels'\n values={{\n username: user.username,\n }}\n />\n );\n\n const message = (\n <FormattedMessage\n id='create_group_memberships_modal.desc'\n defaultMessage=\"You're about to add or re-add {username} to teams and channels based on their LDAP group membership. You can revert this change at any time.\"\n values={{\n username: user.username,\n }}\n />\n );\n\n const createGroupMembershipsButton = (\n <FormattedMessage\n id='create_group_memberships_modal.create'\n defaultMessage='Yes'\n />\n );\n\n const cancelGroupMembershipsButton = (\n <FormattedMessage\n id='create_group_memberships_modal.cancel'\n defaultMessage='No'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonClass='btn btn-danger'\n cancelButtonText={cancelGroupMembershipsButton}\n confirmButtonText={createGroupMembershipsButton}\n onConfirm={confirm}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {updateUserActive} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/admin';\nimport {getExternalBotAccounts} from 'mattermost-redux/selectors/entities/bots';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\nimport ExternalLink from 'components/external_link';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n user: UserProfile;\n onExited: () => void;\n onSuccess: () => void;\n onError: (error: ServerError) => void;\n}\n\nexport default function DeactivateMemberModal({user, onExited, onSuccess, onError}: Props) {\n const dispatch = useDispatch();\n const config = useSelector(getConfig);\n const bots = useSelector(getExternalBotAccounts);\n const siteURL = config.ServiceSettings?.SiteURL;\n\n async function deactivateMember() {\n const {error} = await dispatch(updateUserActive(user.id, false));\n if (error) {\n onError(error);\n } else {\n onSuccess();\n }\n }\n\n const title = (\n <FormattedMessage\n id='deactivate_member_modal.title'\n defaultMessage='Deactivate {username}'\n values={{\n username: user.username,\n }}\n />\n );\n\n const defaultMessage = (\n <FormattedMessage\n id='deactivate_member_modal.desc'\n defaultMessage='This action deactivates {username}. They will be logged out and not have access to any teams or channels on this system.\\n'\n values={{\n username: user.username,\n }}\n />);\n\n let warning;\n if (user.auth_service !== '' && user.auth_service !== Constants.EMAIL_SERVICE) {\n warning = (\n <strong>\n <br/>\n <br/>\n <FormattedMessage\n id='deactivate_member_modal.sso_warning'\n defaultMessage='You must also deactivate this user in the SSO provider or they will be reactivated on next login or sync.'\n />\n </strong>\n );\n }\n\n const confirmationMessage = (\n <FormattedMessage\n id='deactivate_member_modal.desc.confirm'\n defaultMessage='Are you sure you want to deactivate {username}?'\n values={{\n username: user.username,\n }}\n />);\n let messageForUsersWithBotAccounts;\n if (config.ServiceSettings?.DisableBotsWhenOwnerIsDeactivated) {\n for (const bot of Object.values(bots)) {\n if ((bot.owner_id === user.id) && (bot.delete_at === 0)) {\n messageForUsersWithBotAccounts = (\n <>\n <ul>\n <li>\n <FormattedMessage\n id='deactivate_member_modal.desc.for_users_with_bot_accounts1'\n defaultMessage='This action deactivates {username}'\n values={{\n username: user.username,\n }}\n />\n </li>\n <li>\n <FormattedMessage\n id='deactivate_member_modal.desc.for_users_with_bot_accounts2'\n defaultMessage='They will be logged out and not have access to any teams or channels on this system.'\n />\n </li>\n <li>\n <FormattedMessage\n id='deactivate_member_modal.desc.for_users_with_bot_accounts3'\n defaultMessage='Bot accounts they manage will be disabled along with their integrations. To enable them again, go to <linkBots>Integrations > Bot Accounts</linkBots>. <linkDocumentation>Learn more about bot accounts</linkDocumentation>.'\n values={{\n siteURL,\n linkBots: (msg: React.ReactNode) => (\n <a\n href={`${siteURL}/_redirect/integrations/bots`}\n >\n {msg}\n </a>\n ),\n linkDocumentation: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://mattermost.com/pl/default-bot-accounts'\n location='system_users_dropdown'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </li>\n </ul>\n <p/>\n <p/>\n </>\n );\n break;\n }\n }\n }\n const message = (\n <div>\n {messageForUsersWithBotAccounts || defaultMessage}\n {confirmationMessage}\n {warning}\n </div>\n );\n\n const confirmButtonClass = 'btn btn-danger';\n const deactivateMemberButton = (\n <FormattedMessage\n id='deactivate_member_modal.deactivate'\n defaultMessage='Deactivate'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonClass={confirmButtonClass}\n confirmButtonText={deactivateMemberButton}\n onConfirm={deactivateMember}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {demoteUserToGuest} from 'mattermost-redux/actions/users';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n user: UserProfile;\n onExited: () => void;\n onSuccess: () => void;\n onError: (error: ServerError) => void;\n}\n\nexport default function DemoteToGuestModal({user, onExited, onSuccess, onError}: Props) {\n const dispatch = useDispatch();\n\n async function confirm() {\n const {error} = await dispatch(demoteUserToGuest(user.id));\n if (error) {\n onError(error);\n } else {\n onSuccess();\n }\n }\n\n const title = (\n <FormattedMessage\n id='demote_to_user_modal.title'\n defaultMessage='Demote User {username} to Guest'\n values={{\n username: user.username,\n }}\n />\n );\n\n const message = (\n <FormattedMessage\n id='demote_to_user_modal.desc'\n defaultMessage={'This action demotes the user {username} to a guest. It will restrict the user\\'s ability to join public channels and interact with users outside of the channels they are currently members of. Are you sure you want to demote user {username} to guest?'}\n values={{\n username: user.username,\n }}\n />\n );\n\n const demoteGuestButton = (\n <FormattedMessage\n id='demote_to_user_modal.demote'\n defaultMessage='Demote'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonClass='btn btn-danger'\n confirmButtonText={demoteGuestButton}\n onConfirm={confirm}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {promoteGuestToUser} from 'mattermost-redux/actions/users';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n user: UserProfile;\n onSuccess: () => void;\n onExited: () => void;\n onError: (error: ServerError) => void;\n}\n\nexport default function PromoteToMemberModal({user, onExited, onSuccess, onError}: Props) {\n const dispatch = useDispatch();\n\n async function confirm() {\n const {error} = await dispatch(promoteGuestToUser(user.id));\n if (error) {\n onError(error);\n } else {\n onSuccess();\n }\n }\n\n const title = (\n <FormattedMessage\n id='promote_to_user_modal.title'\n defaultMessage='Promote guest {username} to member'\n values={{\n username: user.username,\n }}\n />\n );\n\n const message = (\n <FormattedMessage\n id='promote_to_user_modal.desc'\n defaultMessage='This action promotes the guest {username} to a member. It will allow the user to join public channels and interact with users outside of the channels they are currently members of. Are you sure you want to promote guest {username} to member?'\n values={{\n username: user.username,\n }}\n />\n );\n\n const promoteUserButton = (\n <FormattedMessage\n id='promote_to_user_modal.promote'\n defaultMessage='Promote'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonClass='btn btn-danger'\n confirmButtonText={promoteUserButton}\n onConfirm={confirm}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {revokeAllSessionsForUser} from 'mattermost-redux/actions/users';\n\nimport {emitUserLoggedOutEvent} from 'actions/global_actions';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n user: UserProfile;\n currentUser: UserProfile;\n onExited: () => void;\n onError: (error: ServerError) => void;\n}\n\nexport default function RevokeSessionsModal({user, currentUser, onExited, onError}: Props) {\n const dispatch = useDispatch();\n\n async function confirm() {\n const {data, error} = await dispatch(revokeAllSessionsForUser(user.id));\n if (data && user.id === currentUser.id) {\n emitUserLoggedOutEvent();\n } else if (error) {\n onError(error);\n }\n }\n\n const title = (\n <FormattedMessage\n id='revoke_user_sessions_modal.title'\n defaultMessage='Revoke Sessions for {username}'\n values={{\n username: user.username,\n }}\n />\n );\n\n const message = (\n <FormattedMessage\n id='revoke_user_sessions_modal.desc'\n defaultMessage='This action revokes all sessions for {username}. They will be logged out from all devices. Are you sure you want to revoke all sessions for {username}?'\n values={{\n username: user.username,\n }}\n />\n );\n\n const revokeUserButtonButton = (\n <FormattedMessage\n id='revoke_user_sessions_modal.revoke'\n defaultMessage='Revoke'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={title}\n message={message}\n confirmButtonClass='btn btn-danger'\n confirmButtonText={revokeUserButtonButton}\n onConfirm={confirm}\n onExited={onExited}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useMemo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {updateUserActive} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport General from 'mattermost-redux/constants/general';\nimport {getConfig} from 'mattermost-redux/selectors/entities/admin';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles_helpers';\nimport {isSystemAdmin, isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport {adminResetMfa} from 'actions/admin_actions';\nimport {openModal} from 'actions/views/modals';\nimport {getShowManageUserSettings} from 'selectors/admin_console';\n\nimport ManageRolesModal from 'components/admin_console/manage_roles_modal';\nimport ManageTeamsModal from 'components/admin_console/manage_teams_modal';\nimport ManageTokensModal from 'components/admin_console/manage_tokens_modal';\nimport ResetEmailModal from 'components/admin_console/reset_email_modal';\nimport ResetPasswordModal from 'components/admin_console/reset_password_modal';\nimport * as Menu from 'components/menu';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport UserSettingsModal from 'components/user_settings/modal';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport ConfirmManageUserSettingsModal from './confirm_manage_user_settings_modal';\nimport CreateGroupSyncablesMembershipsModal from './create_group_syncables_membership_modal';\nimport DeactivateMemberModal from './deactivate_member_modal';\nimport DemoteToGuestModal from './demote_to_guest_modal';\nimport PromoteToMemberModal from './promote_to_member_modal';\nimport RevokeSessionsModal from './revoke_sessions_modal';\n\ninterface Props {\n user: UserProfile;\n currentUser: UserProfile;\n tableId?: string;\n rowIndex: number;\n onError: (error: ServerError) => void;\n updateUser: (user: Partial<UserProfile>) => void;\n}\n\nexport function SystemUsersListAction({user, currentUser, tableId, rowIndex, onError, updateUser}: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const config = useSelector(getConfig);\n const isLicensed = useSelector(getLicense)?.IsLicensed === 'true';\n const haveSysConsoleWriteUserManagementUsersPermissions = useSelector((state: GlobalState) => haveISystemPermission(state, {permission: Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_USERS}));\n const showManageUserSettings = useSelector(getShowManageUserSettings);\n\n function getTranslatedUserRole(userRoles: UserProfile['roles']) {\n if (user.delete_at > 0) {\n return (\n <FormattedMessage\n id='admin.system_users.list.actions.deactivated'\n defaultMessage='Deactivated'\n />\n );\n } else if (user.roles.length > 0 && isSystemAdmin(userRoles)) {\n return (\n <FormattedMessage\n id='admin.system_users.list.actions.userAdmin'\n defaultMessage='System Admin'\n />\n );\n } else if (isGuest(userRoles)) {\n return (\n <FormattedMessage\n id='admin.system_users.list.actions.userGuest'\n defaultMessage='Guest'\n />\n );\n }\n\n return (\n <FormattedMessage\n id='admin.system_users.list.actions.userMember'\n defaultMessage='Member'\n />\n );\n }\n\n const menuButtonId = `actionMenuButton-${tableId}-${rowIndex}`;\n const menuId = `actionMenu-${tableId}-${rowIndex}`;\n const menuItemIdPrefix = `actionMenuItem-${tableId}-${rowIndex}`;\n\n const isCurrentUserSystemAdmin = useMemo(() => isSystemAdmin(currentUser.roles), [currentUser.roles]);\n\n // Disable if SystemAdmin being edited by non SystemAdmin eg. userManager with EditOtherUsers permissions\n const isNonSystemAdminEditingSystemAdmin = !isCurrentUserSystemAdmin && isSystemAdmin(user.roles);\n const disableEditingOtherUsers = isNonSystemAdminEditingSystemAdmin || !haveSysConsoleWriteUserManagementUsersPermissions;\n\n const handleManageRolesClick = useCallback(() => {\n function onRoleUpdateSuccess(roles: string) {\n updateUser({roles});\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.MANAGE_ROLES_MODAL,\n dialogType: ManageRolesModal,\n dialogProps: {\n user,\n onSuccess: onRoleUpdateSuccess,\n },\n }));\n }, [user, updateUser]);\n\n const handleManageTeamsClick = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.MANAGE_TEAMS_MODAL,\n dialogType: ManageTeamsModal,\n dialogProps: {\n user,\n },\n }));\n }, [user]);\n\n const handleManageUserSettingsClick = useCallback(() => {\n function onConfirmManageUserSettingsClick() {\n dispatch(openModal({\n modalId: ModalIdentifiers.USER_SETTINGS,\n dialogType: UserSettingsModal,\n dialogProps: {\n adminMode: true,\n isContentProductSettings: true,\n userID: user.id,\n },\n }));\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.CONFIRM_MANAGE_USER_SETTINGS_MODAL,\n dialogType: ConfirmManageUserSettingsModal,\n dialogProps: {\n user,\n onConfirm: onConfirmManageUserSettingsClick,\n },\n }));\n }, [user]);\n\n const handleManageTokensClick = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.MANAGE_TOKENS_MODAL,\n dialogType: ManageTokensModal,\n dialogProps: {\n user,\n },\n }));\n }, [user.id]);\n\n const handleResetPasswordClick = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.RESET_PASSWORD_MODAL,\n dialogType: ResetPasswordModal,\n dialogProps: {\n user,\n },\n }));\n }, [user]);\n\n const handleRemoveMfaClick = useCallback(async () => {\n await adminResetMfa(user.id, null, onError).then(() => {\n updateUser({mfa_active: false});\n });\n\n try {\n await adminResetMfa(user.id, null, onError);\n updateUser({mfa_active: false});\n } catch (error) {\n onError(error);\n }\n }, [user.id, updateUser, onError]);\n\n const handleSwitchToEmailPasswordClick = useCallback(() => {\n function onSwitchToEmailPasswordSuccess() {\n updateUser({auth_service: undefined});\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.RESET_PASSWORD_MODAL,\n dialogType: ResetPasswordModal,\n dialogProps: {\n user,\n onSuccess: onSwitchToEmailPasswordSuccess,\n },\n }));\n }, [user, updateUser]);\n\n const handleUpdateEmailClick = useCallback(() => {\n function onUpdateEmailSuccess(email: string) {\n updateUser({email});\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.RESET_EMAIL_MODAL,\n dialogType: ResetEmailModal,\n dialogProps: {\n user,\n onSuccess: onUpdateEmailSuccess,\n },\n }));\n }, [user, updateUser]);\n\n const handlePromoteToMemberClick = useCallback(() => {\n function onPromoteToMemberSuccess() {\n updateUser({roles: user.roles.replace(General.SYSTEM_GUEST_ROLE, '')});\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.PROMOTE_TO_MEMBER_MODAL,\n dialogType: PromoteToMemberModal,\n dialogProps: {\n user,\n onError,\n onSuccess: onPromoteToMemberSuccess,\n },\n }));\n }, [user, updateUser, onError]);\n\n const handleDemoteToGuestClick = useCallback(() => {\n function onDemoteToGuestSuccess() {\n updateUser({roles: `${user.roles} ${General.SYSTEM_GUEST_ROLE}`});\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.DEMOTE_TO_GUEST_MODAL,\n dialogType: DemoteToGuestModal,\n dialogProps: {\n user,\n onError,\n onSuccess: onDemoteToGuestSuccess,\n },\n }));\n }, [user, updateUser, onError]);\n\n const handleRemoveSessionsClick = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.REVOKE_SESSIONS_MODAL,\n dialogType: RevokeSessionsModal,\n dialogProps: {\n user,\n currentUser,\n onError,\n },\n }));\n }, [user, currentUser.id, onError]);\n\n const handleReSyncUserViaLdapGroupsClick = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.CREATE_GROUP_SYNCABLES_MEMBERSHIP_MODAL,\n dialogType: CreateGroupSyncablesMembershipsModal,\n dialogProps: {\n user,\n onError,\n },\n }));\n }, [user, onError]);\n\n const handleActivateUserClick = useCallback(async () => {\n if (user.auth_service === Constants.LDAP_SERVICE) {\n return;\n }\n\n const {error} = await dispatch(updateUserActive(user.id, true));\n\n if (error) {\n onError(error);\n } else {\n updateUser({delete_at: 0});\n }\n }, [user.id, user.auth_service, updateUser, onError]);\n\n const handleDeactivateMemberClick = useCallback(() => {\n if (user.auth_service === Constants.LDAP_SERVICE) {\n return;\n }\n function onDeactivateMemberSuccess() {\n updateUser({delete_at: new Date().getMilliseconds()});\n }\n\n dispatch(\n openModal({\n modalId: ModalIdentifiers.DEACTIVATE_MEMBER_MODAL,\n dialogType: DeactivateMemberModal,\n dialogProps: {\n user,\n onError,\n onSuccess: onDeactivateMemberSuccess,\n },\n }),\n );\n }, [user, updateUser, onError]);\n\n const disableActivationToggle = user.auth_service === Constants.LDAP_SERVICE;\n\n const getManagedByLDAPText = (managedByLDAP: boolean) => {\n return managedByLDAP ? {\n trailingElements: formatMessage({\n id: 'admin.system_users.list.actions.menu.managedByLdap',\n defaultMessage: 'Managed by LDAP',\n }),\n } : {};\n };\n\n return (\n <Menu.Container\n menuButton={{\n id: menuButtonId,\n class: classNames('btn btn-quaternary btn-sm', {\n disabled: disableEditingOtherUsers,\n }),\n disabled: disableEditingOtherUsers,\n children: (\n <>\n {getTranslatedUserRole(user.roles)}\n {!disableEditingOtherUsers && (\n <i\n aria-hidden='true'\n className='icon icon-chevron-down'\n />\n )}\n </>\n ),\n }}\n menu={{\n id: menuId,\n 'aria-label': formatMessage({\n id: 'admin.system_users.list.actions.menu.dropdownAriaLabel',\n defaultMessage: 'User actions menu',\n }),\n }}\n >\n {user.delete_at > 0 && (\n <Menu.Item\n id={`${menuItemIdPrefix}-active`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.activate'\n defaultMessage='Activate'\n />\n }\n disabled={disableActivationToggle}\n {...getManagedByLDAPText(disableActivationToggle)}\n onClick={handleActivateUserClick}\n />\n )}\n {isCurrentUserSystemAdmin &&\n <Menu.Item\n id={`${menuItemIdPrefix}-manageRoles`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.manageRoles'\n defaultMessage='Manage roles'\n />\n }\n onClick={handleManageRolesClick}\n />\n }\n <Menu.Item\n id={`${menuItemIdPrefix}-manageTeams`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.manageTeams'\n defaultMessage='Manage teams'\n />\n }\n onClick={handleManageTeamsClick}\n />\n {showManageUserSettings &&\n <Menu.Item\n id={`${menuItemIdPrefix}-manageTeams`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.manageSettings'\n defaultMessage='Manage user settings'\n />\n }\n onClick={handleManageUserSettingsClick}\n />\n }\n {config.ServiceSettings?.EnableUserAccessTokens &&\n <Menu.Item\n id={`${menuItemIdPrefix}-manageTokens`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.manageTokens'\n defaultMessage='Manage tokens'\n />\n }\n onClick={handleManageTokensClick}\n />\n }\n {!user.auth_service &&\n <Menu.Item\n id={`${menuItemIdPrefix}-resetPassword`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.resetPassword'\n defaultMessage='Reset password'\n />\n }\n onClick={handleResetPasswordClick}\n />\n }\n {user.mfa_active && config.ServiceSettings?.EnableMultifactorAuthentication &&\n <Menu.Item\n id={`${menuItemIdPrefix}-removeMFA`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.removeMFA'\n defaultMessage='Remove MFA'\n />\n }\n onClick={handleRemoveMfaClick}\n />\n }\n {Boolean(user.auth_service) && config.ServiceSettings?.ExperimentalEnableAuthenticationTransfer &&\n <Menu.Item\n id={`${menuItemIdPrefix}-switchToEmailPassword`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.switchToEmailPassword'\n defaultMessage='Switch to Email/Password'\n />\n }\n onClick={handleSwitchToEmailPasswordClick}\n />\n }\n {!user.auth_service &&\n <Menu.Item\n id={`${menuItemIdPrefix}-updateEmail`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.updateEmail'\n defaultMessage='Update email'\n />\n }\n onClick={handleUpdateEmailClick}\n />\n }\n {isGuest(user.roles) &&\n <Menu.Item\n id={`${menuItemIdPrefix}-promoteToMember`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.promoteToMember'\n defaultMessage='Promote to member'\n />\n }\n onClick={handlePromoteToMemberClick}\n />\n }\n {!isGuest(user.roles) && user.id !== currentUser.id && isLicensed && config.GuestAccountsSettings?.Enable &&\n <Menu.Item\n id={`${menuItemIdPrefix}-demoteToGuest`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.demoteToGuest'\n defaultMessage='Demote to guest'\n />\n }\n onClick={handleDemoteToGuestClick}\n />\n }\n <SystemPermissionGate permissions={[Permissions.REVOKE_USER_ACCESS_TOKEN]}>\n {!user.delete_at &&\n <Menu.Item\n id={`${menuItemIdPrefix}-removeSessions`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.removeSessions'\n defaultMessage='Remove sessions'\n />\n }\n onClick={handleRemoveSessionsClick}\n />\n }\n </SystemPermissionGate>\n <SystemPermissionGate permissions={[Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS]}>\n {(user.auth_service === Constants.LDAP_SERVICE || (user.auth_service === Constants.SAML_SERVICE && config.SamlSettings?.EnableSyncWithLdap)) &&\n <Menu.Item\n id={`${menuItemIdPrefix}-resyncUserViaLdapGroups`}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.resyncUserViaLdapGroups'\n defaultMessage='Re-sync user via LDAP groups'\n />\n }\n onClick={handleReSyncUserViaLdapGroupsClick}\n />\n }\n </SystemPermissionGate>\n {user.delete_at === 0 && (\n <Menu.Item\n id={`${menuItemIdPrefix}-deactivate`}\n isDestructive={true}\n labels={\n <FormattedMessage\n id='admin.system_users.list.actions.menu.deactivate'\n defaultMessage='Deactivate'\n />\n }\n onClick={handleDeactivateMemberClick}\n disabled={disableActivationToggle}\n {...getManagedByLDAPText(disableActivationToggle)}\n />\n )}\n </Menu.Container>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent} from 'react';\nimport React, {useRef, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {setAdminConsoleUsersManagementTableProperties} from 'actions/views/admin';\n\nimport Input from 'components/widgets/inputs/input/input';\n\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nimport './system_users_search.scss';\n\ntype Props = {\n searchTerm: AdminConsoleUserManagementTableProperties['searchTerm'];\n}\n\nexport function SystemUsersSearch(props: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const timeout = useRef<NodeJS.Timeout>();\n\n const [inputValue, setInputValue] = useState(props.searchTerm);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n const {target: {value}} = event;\n setInputValue(value);\n\n clearTimeout(timeout.current);\n timeout.current = setTimeout(() => {\n dispatch(setAdminConsoleUsersManagementTableProperties({searchTerm: value}));\n }, 500);\n }\n\n function handleClear() {\n setInputValue('');\n dispatch(setAdminConsoleUsersManagementTableProperties({searchTerm: ''}));\n }\n\n return (\n <div className='system-users__filter'>\n <Input\n type='text'\n clearable={true}\n name='searchTerm'\n containerClassName='systemUsersSearch'\n placeholder={formatMessage({id: 'admin.system_users.search.placeholder', defaultMessage: 'Search users'})}\n inputPrefix={<i className={'icon icon-magnify'}/>}\n onChange={handleChange}\n onClear={handleClear}\n value={inputValue}\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {PaginationState, SortingState, VisibilityState, ColumnDef, CellContext, OnChangeFn} from '@tanstack/react-table';\nimport {useReactTable, getCoreRowModel, getSortedRowModel} from '@tanstack/react-table';\nimport React, {useEffect, useMemo, useState} from 'react';\nimport {useIntl, FormattedMessage, defineMessages} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport {CursorPaginationDirection} from '@mattermost/types/reports';\nimport type {ReportDuration, UserReport} from '@mattermost/types/reports';\n\nimport Preferences from 'mattermost-redux/constants/preferences';\n\nimport {AdminConsoleListTable, ElapsedDurationCell, PAGE_SIZES, LoadingStates} from 'components/admin_console/list_table';\nimport type {TableMeta} from 'components/admin_console/list_table';\nimport AlertBanner from 'components/alert_banner';\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {getDisplayName, imageURLForUser} from 'utils/utils';\n\nimport type {AdminConsoleUserManagementTableProperties} from 'types/store/views';\n\nimport {ColumnNames} from './constants';\nimport {RevokeSessionsButton} from './revoke_sessions_button';\nimport {SystemUsersColumnTogglerMenu} from './system_users_column_toggler_menu';\nimport {SystemUsersDateRangeMenu} from './system_users_date_range_menu';\nimport {SystemUsersExport} from './system_users_export';\nimport {SystemUsersFilterPopover} from './system_users_filters_popover';\nimport {SystemUsersListAction} from './system_users_list_actions';\nimport {SystemUsersSearch} from './system_users_search';\nimport {getSortableColumnValueBySortColumn, getPaginationInfo, convertTableOptionsToUserReportOptions} from './utils';\n\nimport './system_users.scss';\n\nimport type {PropsFromRedux} from './index';\n\ntype Props = PropsFromRedux;\n\nexport type TableOptions = {\n pageSize?: PaginationState['pageSize'];\n sortColumn?: SortingState[0]['id'];\n sortIsDescending?: SortingState[0]['desc'];\n fromColumnValue?: AdminConsoleUserManagementTableProperties['cursorColumnValue'];\n fromId?: AdminConsoleUserManagementTableProperties['cursorUserId'];\n direction?: CursorPaginationDirection;\n searchTerm?: string;\n filterTeam?: AdminConsoleUserManagementTableProperties['filterTeam'];\n filterRole?: AdminConsoleUserManagementTableProperties['filterRole'];\n filterStatus?: AdminConsoleUserManagementTableProperties['filterStatus'];\n dateRange?: ReportDuration;\n}\n\ntype UserReportWithError = UserReport & {error?: ServerError};\n\nconst tableId = 'systemUsersTable';\n\nconst messages = defineMessages({\n title: {id: 'admin.system_users.title', defaultMessage: '{siteName} Users'},\n});\n\nexport const searchableStrings: Array<string|MessageDescriptor|[MessageDescriptor, {[key: string]: any}]> = [[messages.title, {siteName: ''}]];\n\nfunction SystemUsers(props: Props) {\n const {formatMessage} = useIntl();\n const history = useHistory();\n\n const [userReports, setUserReports] = useState<UserReportWithError[]>([]);\n const [userCount, setUserCount] = useState<number | undefined>();\n const [loadingState, setLoadingState] = useState<LoadingStates>(LoadingStates.Loading);\n const [showMySqlBanner, setShowMySqlBanner] = useState(props.isMySql && !props.hideMySqlNotification);\n\n // Effect to get the total user count\n useEffect(() => {\n const getUserCount = async (tableOptions?: TableOptions) => {\n const {data} = await props.getUserCountForReporting(convertTableOptionsToUserReportOptions(tableOptions));\n setUserCount(data);\n };\n\n getUserCount({\n pageSize: props.tablePropertyPageSize,\n sortColumn: props.tablePropertySortColumn,\n sortIsDescending: props.tablePropertySortIsDescending,\n fromColumnValue: props.tablePropertyCursorColumnValue,\n fromId: props.tablePropertyCursorUserId,\n direction: props.tablePropertyCursorDirection,\n searchTerm: props.tablePropertySearchTerm,\n filterTeam: props.tablePropertyFilterTeam,\n filterRole: props.tablePropertyFilterRole,\n filterStatus: props.tablePropertyFilterStatus,\n });\n }, [\n props.tablePropertyPageSize,\n props.tablePropertySortColumn,\n props.tablePropertySortIsDescending,\n props.tablePropertyCursorDirection,\n props.tablePropertyCursorColumnValue,\n props.tablePropertyCursorUserId,\n props.tablePropertySearchTerm,\n props.tablePropertyFilterTeam,\n props.tablePropertyFilterRole,\n props.tablePropertyFilterStatus,\n ]);\n\n // Effect to get the user reports\n useEffect(() => {\n async function fetchUserReportsWithOptions(tableOptions?: TableOptions) {\n setLoadingState(LoadingStates.Loading);\n\n const {data} = await props.getUserReports(convertTableOptionsToUserReportOptions(tableOptions));\n\n if (data) {\n if (data.length > 0) {\n setUserReports(data);\n } else {\n setUserReports([]);\n }\n setLoadingState(LoadingStates.Loaded);\n } else {\n setLoadingState(LoadingStates.Failed);\n }\n }\n\n fetchUserReportsWithOptions({\n pageSize: props.tablePropertyPageSize,\n sortColumn: props.tablePropertySortColumn,\n sortIsDescending: props.tablePropertySortIsDescending,\n fromColumnValue: props.tablePropertyCursorColumnValue,\n fromId: props.tablePropertyCursorUserId,\n direction: props.tablePropertyCursorDirection,\n searchTerm: props.tablePropertySearchTerm,\n filterTeam: props.tablePropertyFilterTeam,\n filterRole: props.tablePropertyFilterRole,\n filterStatus: props.tablePropertyFilterStatus,\n dateRange: props.tablePropertyDateRange,\n });\n }, [\n props.tablePropertyPageSize,\n props.tablePropertySortColumn,\n props.tablePropertySortIsDescending,\n props.tablePropertyCursorDirection,\n props.tablePropertyCursorColumnValue,\n props.tablePropertyCursorUserId,\n props.tablePropertySearchTerm,\n props.tablePropertyFilterRole,\n props.tablePropertyFilterTeam,\n props.tablePropertyFilterStatus,\n props.tablePropertyDateRange,\n ]);\n\n function handleDismissMySqlNotice() {\n setShowMySqlBanner(false);\n props.savePreferences(props.currentUser.id, [{\n category: Preferences.CATEGORY_REPORTING,\n name: Preferences.HIDE_MYSQL_STATS_NOTIFICATION,\n user_id: props.currentUser.id,\n value: 'true',\n }]);\n }\n\n // Handlers for table actions\n\n function handleRowClick(userId: UserReport['id']) {\n if (userId.length !== 0) {\n const remoteID = userReports.find((userReport) => userReport.id === userId)?.remote_id;\n if (!remoteID) {\n history.push(`/admin_console/user_management/user/${userId}`);\n }\n }\n }\n\n function handlePreviousPageClick() {\n if (!userReports.length) {\n return;\n }\n\n props.setAdminConsoleUsersManagementTableProperties({\n pageIndex: props.tablePropertyPageIndex - 1,\n cursorDirection: CursorPaginationDirection.prev,\n cursorUserId: userReports[0].id,\n cursorColumnValue: getSortableColumnValueBySortColumn(userReports[0], props.tablePropertySortColumn),\n });\n }\n\n function handleNextPageClick() {\n if (!userReports.length) {\n return;\n }\n\n props.setAdminConsoleUsersManagementTableProperties({\n pageIndex: props.tablePropertyPageIndex + 1,\n cursorDirection: CursorPaginationDirection.next,\n cursorUserId: userReports[userReports.length - 1].id,\n cursorColumnValue: getSortableColumnValueBySortColumn(userReports[userReports.length - 1], props.tablePropertySortColumn),\n });\n }\n\n function handleSortingChange(updateFn: (currentSortingState: SortingState) => SortingState) {\n const currentSortingState = [{id: props.tablePropertySortColumn, desc: props.tablePropertySortIsDescending}];\n const [updatedSortingState] = updateFn(currentSortingState);\n\n if (props.tablePropertySortColumn !== updatedSortingState.id) {\n // If we are clicking on a new column, we want to sort in descending order\n updatedSortingState.desc = false;\n }\n\n props.setAdminConsoleUsersManagementTableProperties({\n pageIndex: 0,\n cursorDirection: undefined, // reset the cursor to the beginning on any filter change\n cursorUserId: undefined,\n cursorColumnValue: undefined,\n sortColumn: updatedSortingState.id,\n sortIsDescending: updatedSortingState.desc,\n });\n }\n\n function handlePaginationChange(updateFn: (currentPaginationState: PaginationState) => PaginationState) {\n const currentPaginationState = {pageIndex: 0, pageSize: props.tablePropertyPageSize};\n const updatedPaginationState = updateFn(currentPaginationState);\n\n props.setAdminConsoleUsersManagementTableProperties({\n pageIndex: 0,\n cursorDirection: undefined, // reset the cursor to the beginning on any filter change\n cursorUserId: undefined,\n cursorColumnValue: undefined,\n pageSize: updatedPaginationState.pageSize,\n });\n }\n\n function handleColumnVisibilityChange(updateFn: (currentVisibilityState: VisibilityState) => VisibilityState) {\n const updatedVisibilityState = updateFn(props.tablePropertyColumnVisibility);\n\n props.setAdminConsoleUsersManagementTableProperties({\n columnVisibility: Object.assign({}, props.tablePropertyColumnVisibility, updatedVisibilityState),\n });\n }\n\n function updateUserReport(userId: string, updatedReport: Partial<UserReportWithError>) {\n setUserReports(userReports.map((user) => {\n if (user.id === userId) {\n return {\n ...user,\n error: undefined,\n ...updatedReport,\n };\n }\n\n return user;\n }));\n }\n\n const columns: Array<ColumnDef<UserReport, any>> = useMemo(\n () => [\n {\n id: ColumnNames.username,\n accessorKey: 'username',\n header: formatMessage({\n id: 'admin.system_users.list.userDetails',\n defaultMessage: 'User details',\n }),\n cell: (info: CellContext<UserReportWithError, null>) => {\n const isRemoteUser = Boolean(info.row.original?.remote_id?.length);\n return (\n <div>\n <div className='profilePictureContainer'>\n <img\n className='profilePicture'\n src={imageURLForUser(info.row.original.id)}\n aria-hidden='true'\n />\n </div>\n <div\n className='displayName'\n title={getDisplayName(info.row.original)}\n >\n {getDisplayName(info.row.original) || ''}\n {isRemoteUser && (\n <SharedUserIndicator\n title={formatMessage({id: 'admin.system_users.list.userIsRemote', defaultMessage: 'Remote user'})}\n ariaLabel={formatMessage({id: 'admin.system_users.list.userIsRemoteAriaLabel', defaultMessage: 'This is a remote user'})}\n role='img'\n className='icon-12'\n withTooltip={true}\n />\n )}\n </div>\n <div\n className='userName'\n title={info.row.original.username}\n >\n {info.row.original.username}\n </div>\n {info.row.original.error &&\n <div\n className='error'\n title={info.row.original.error.message}\n >\n {info.row.original.error.message}\n </div>}\n </div>\n );\n },\n enableHiding: false,\n enablePinning: true,\n enableSorting: true,\n },\n {\n id: ColumnNames.email,\n accessorKey: 'email',\n header: formatMessage({\n id: 'admin.system_users.list.email',\n defaultMessage: 'Email',\n }),\n cell: (info: CellContext<UserReport, string>) => info.getValue() || '',\n enableHiding: true,\n enablePinning: false,\n enableSorting: true,\n },\n {\n id: ColumnNames.createAt,\n accessorKey: 'create_at',\n header: formatMessage({\n id: 'admin.system_users.list.memberSince',\n defaultMessage: 'Member since',\n }),\n cell: (info: CellContext<UserReport, number>) => <ElapsedDurationCell date={info.getValue()}/>,\n enableHiding: true,\n enablePinning: false,\n enableSorting: true,\n },\n {\n id: ColumnNames.lastLoginAt,\n accessorKey: 'last_login_at',\n header: formatMessage({\n id: 'admin.system_users.list.lastLoginAt',\n defaultMessage: 'Last login',\n }),\n cell: (info: CellContext<UserReport, number | undefined>) => <ElapsedDurationCell date={info.getValue()}/>,\n enableHiding: true,\n enablePinning: false,\n enableSorting: false,\n },\n {\n id: ColumnNames.lastStatusAt,\n accessorKey: 'last_status_at',\n header: formatMessage({\n id: 'admin.system_users.list.lastActivity',\n defaultMessage: 'Last activity',\n }),\n cell: (info: CellContext<UserReport, number | undefined>) => <ElapsedDurationCell date={info.getValue()}/>,\n enableHiding: true,\n enablePinning: false,\n enableSorting: false,\n },\n {\n id: ColumnNames.lastPostDate,\n accessorKey: 'last_post_date',\n header: formatMessage({\n id: 'admin.system_users.list.lastPost',\n defaultMessage: 'Last post',\n }),\n cell: (info: CellContext<UserReport, number | undefined>) => <ElapsedDurationCell date={info.getValue()}/>,\n enableHiding: !props.isMySql,\n enablePinning: false,\n enableSorting: false,\n },\n {\n id: ColumnNames.daysActive,\n accessorKey: 'days_active',\n header: formatMessage({\n id: 'admin.system_users.list.daysActive',\n defaultMessage: 'Days active',\n }),\n cell: (info: CellContext<UserReport, number | undefined>) => info.getValue() || null,\n meta: {\n isNumeric: true,\n },\n enableHiding: !props.isMySql,\n enablePinning: false,\n enableSorting: false,\n },\n {\n id: ColumnNames.totalPosts,\n accessorKey: 'total_posts',\n header: formatMessage({\n id: 'admin.system_users.list.totalPosts',\n defaultMessage: 'Messages posted',\n }),\n cell: (info: CellContext<UserReport, number | undefined>) => info.getValue() || null,\n meta: {\n isNumeric: true,\n },\n enableHiding: !props.isMySql,\n enablePinning: false,\n enableSorting: false,\n },\n {\n id: ColumnNames.actions,\n accessorKey: 'actions',\n header: formatMessage({\n id: 'admin.system_users.list.actions',\n defaultMessage: 'Actions',\n }),\n cell: (info: CellContext<UserReport, null>) => {\n if (info.row.original?.remote_id?.length) {\n return (<></>);\n }\n return (\n <SystemUsersListAction\n rowIndex={info.cell.row.index}\n tableId={tableId}\n user={info.row.original}\n currentUser={props.currentUser}\n updateUser={(updatedUser) => updateUserReport(info.row.original.id, updatedUser)}\n onError={(error) => updateUserReport(info.row.original.id, {error})}\n />\n );\n },\n enableHiding: false,\n enablePinning: true,\n enableSorting: false,\n },\n ],\n [props.currentUser, userReports],\n );\n\n // Table state which are correctly formatted for the table component\n\n const sortingTableState = [{\n id: props && props.tablePropertySortColumn && props.tablePropertySortColumn.length > 0 ? props.tablePropertySortColumn : ColumnNames.username,\n desc: props?.tablePropertySortIsDescending ?? false,\n }];\n\n const paginationTableState = {\n pageIndex: props?.tablePropertyPageIndex ?? 0,\n pageSize: props?.tablePropertyPageSize || PAGE_SIZES[0],\n };\n\n const columnVisibility = {\n ...props.tablePropertyColumnVisibility,\n ...(props.isMySql ? {\n [ColumnNames.lastPostDate]: false,\n [ColumnNames.daysActive]: false,\n [ColumnNames.totalPosts]: false,\n } : {}),\n };\n\n const table = useReactTable({\n data: userReports,\n columns,\n state: {\n sorting: sortingTableState,\n pagination: paginationTableState,\n columnVisibility,\n },\n meta: {\n tableId: 'systemUsersTable',\n tableCaption: formatMessage({id: 'admin.system_users.list.caption', defaultMessage: 'System Users'}),\n loadingState,\n disablePrevPage: !props.tablePropertyCursorUserId || props.tablePropertyPageIndex <= 0 || (props.tablePropertyCursorDirection === 'prev' && userReports.length < paginationTableState.pageSize),\n disableNextPage: props.tablePropertyCursorDirection === 'next' && userReports.length < paginationTableState.pageSize,\n onRowClick: handleRowClick,\n onPreviousPageClick: handlePreviousPageClick,\n onNextPageClick: handleNextPageClick,\n paginationInfo: getPaginationInfo(paginationTableState.pageIndex, paginationTableState.pageSize, userReports.length, userCount),\n hasDualSidedPagination: true,\n } as TableMeta,\n getCoreRowModel: getCoreRowModel<UserReport>(),\n getSortedRowModel: getSortedRowModel<UserReport>(),\n onPaginationChange: handlePaginationChange as OnChangeFn<PaginationState>,\n onSortingChange: handleSortingChange as OnChangeFn<SortingState>,\n onColumnVisibilityChange: handleColumnVisibilityChange as OnChangeFn<VisibilityState>,\n manualSorting: true,\n enableSortingRemoval: false,\n enableMultiSort: false,\n manualFiltering: true,\n manualPagination: true,\n renderFallbackValue: '',\n });\n\n return (\n <div\n className='wrapper--fixed'\n data-testid='systemUsersSection'\n >\n <AdminHeader>\n <FormattedMessage\n {...messages.title}\n values={{siteName: props.siteName}}\n >\n {(formatMessageChunk) => (\n <span id='systemUsersTable-headerId'>{formatMessageChunk}</span>\n )}\n </FormattedMessage>\n <RevokeSessionsButton/>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n {showMySqlBanner &&\n <AlertBanner\n className='systemUsers__mySqlAlertBanner'\n mode='warning'\n title={\n <FormattedMessage\n id='admin.system_users.mysql_stats.title'\n defaultMessage='Some statistics are unavailable for servers using MySQL'\n />\n }\n message={\n <>\n <FormattedMessage\n id='admin.system_users.mysql_stats.desc'\n defaultMessage='Use of MySQL may limit the availability of some statistics features. We recommend transitioning from MySQL to PostgreSQL to fully leverage improved performance and comprehensive analytics. While you’re still using MySQL, please use the export functionality to view all user statistics.'\n />\n <div className='systemUsers__mySqlAlertBanner-buttons'>\n <button\n type='button'\n className='btn btn-primary'\n onClick={() => window.open('https://mattermost.com/pl/user-stats-learn-more', '_blank')}\n >\n <FormattedMessage\n id='admin.system_users.mysql_stats.learn_more'\n defaultMessage='Learn more'\n />\n </button>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={handleDismissMySqlNotice}\n >\n <FormattedMessage\n id='admin.system_users.mysql_stats.dismiss'\n defaultMessage='Dismiss'\n />\n </button>\n </div>\n </>\n }\n onDismiss={handleDismissMySqlNotice}\n />\n }\n <div className='admin-console__container ignore-marking'>\n <div className='admin-console__filters-rows'>\n <SystemUsersSearch\n searchTerm={props.tablePropertySearchTerm}\n />\n <SystemUsersFilterPopover\n filterTeam={props.tablePropertyFilterTeam}\n filterTeamLabel={props.tablePropertyFilterTeamLabel}\n filterRole={props.tablePropertyFilterRole}\n filterStatus={props.tablePropertyFilterStatus}\n />\n <SystemUsersColumnTogglerMenu\n isMySql={props.isMySql}\n allColumns={table.getAllLeafColumns()}\n visibleColumnsLength={table.getVisibleLeafColumns()?.length ?? 0}\n />\n <SystemUsersDateRangeMenu\n dateRange={props.tablePropertyDateRange}\n />\n <SystemUsersExport\n currentUserId={props.currentUser.id}\n usersLenght={userReports.length}\n />\n </div>\n <AdminConsoleListTable<UserReport>\n table={table}\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport default SystemUsers;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\n\nimport {ReportDuration} from '@mattermost/types/reports';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport Preferences from 'mattermost-redux/constants/preferences';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {get as getPreferences} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getUserCountForReporting, getUserReports, setAdminConsoleUsersManagementTableProperties} from 'actions/views/admin';\nimport {adminConsoleUserManagementTablePropertiesInitialState} from 'reducers/views/admin';\nimport {getAdminConsoleUserManagementTableProperties} from 'selectors/views/admin';\n\nimport type {GlobalState} from 'types/store';\n\nimport {RoleFilters, StatusFilter, TeamFilters} from './constants';\nimport SystemUsers from './system_users';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n const siteName = config.SiteName;\n const mfaEnabled = config.EnableMultifactorAuthentication === 'true';\n const enableUserAccessTokens = config.EnableUserAccessTokens === 'true';\n const experimentalEnableAuthenticationTransfer = config.ExperimentalEnableAuthenticationTransfer === 'true';\n const isMySql = config.SQLDriverName === 'mysql';\n const hideMySqlNotification = getPreferences(state, Preferences.CATEGORY_REPORTING, Preferences.HIDE_MYSQL_STATS_NOTIFICATION, '') === 'true';\n\n const currentUser = getCurrentUser(state);\n\n const tableProperties = getAdminConsoleUserManagementTableProperties(state);\n const tablePropertySortColumn = tableProperties?.sortColumn ?? adminConsoleUserManagementTablePropertiesInitialState.sortColumn;\n const tablePropertySortIsDescending = tableProperties?.sortIsDescending ?? adminConsoleUserManagementTablePropertiesInitialState.sortIsDescending;\n const tablePropertyPageSize = tableProperties?.pageSize ?? adminConsoleUserManagementTablePropertiesInitialState.pageSize;\n const tablePropertyPageIndex = tableProperties?.pageIndex ?? adminConsoleUserManagementTablePropertiesInitialState.pageIndex;\n const tablePropertyCursorDirection = tableProperties?.cursorDirection ?? adminConsoleUserManagementTablePropertiesInitialState.cursorDirection;\n const tablePropertyCursorUserId = tableProperties?.cursorUserId ?? adminConsoleUserManagementTablePropertiesInitialState.cursorUserId;\n const tablePropertyCursorColumnValue = tableProperties?.cursorColumnValue ?? adminConsoleUserManagementTablePropertiesInitialState.cursorColumnValue;\n const tablePropertyColumnVisibility = tableProperties?.columnVisibility ?? adminConsoleUserManagementTablePropertiesInitialState.columnVisibility;\n const tablePropertySearchTerm = tableProperties?.searchTerm ?? adminConsoleUserManagementTablePropertiesInitialState.searchTerm;\n const tablePropertyFilterTeam = tableProperties?.filterTeam ?? TeamFilters.AllTeams;\n const tablePropertyFilterTeamLabel = tableProperties?.filterTeamLabel ?? '';\n const tablePropertyFilterRole = tableProperties?.filterRole ?? RoleFilters.Any;\n const tablePropertyFilterStatus = tableProperties?.filterStatus ?? StatusFilter.Any;\n const tablePropertyDateRange = tableProperties?.dateRange ?? ReportDuration.AllTime;\n\n return {\n siteName,\n mfaEnabled,\n enableUserAccessTokens,\n experimentalEnableAuthenticationTransfer,\n currentUser,\n isMySql,\n hideMySqlNotification,\n tablePropertySortColumn,\n tablePropertySortIsDescending,\n tablePropertyPageSize,\n tablePropertyPageIndex,\n tablePropertyCursorDirection,\n tablePropertyCursorUserId,\n tablePropertyCursorColumnValue,\n tablePropertyColumnVisibility,\n tablePropertySearchTerm,\n tablePropertyFilterTeam,\n tablePropertyFilterTeamLabel,\n tablePropertyFilterRole,\n tablePropertyFilterStatus,\n tablePropertyDateRange,\n };\n}\n\nconst mapDispatchToProps = {\n getUserReports,\n getUserCountForReporting,\n savePreferences,\n setAdminConsoleUsersManagementTableProperties,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SystemUsers);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {MouseEvent} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\n\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\n\nimport type {TeamWithMembership} from '../system_user_detail/team_list/types';\n\nexport const PAGE_SIZE = 10;\n\ntype Paging = {\n startCount: number;\n endCount: number;\n total: number;\n};\n\ntype Props = {\n data: Array<Group | TeamWithMembership>;\n onPageChangedCallback?: (page: Paging, data: Array<Group | Team>) => void;\n total: number;\n header: JSX.Element;\n renderRow: (item: Group | TeamWithMembership) => JSX.Element;\n emptyListText: MessageDescriptor;\n actions: {\n getData: (page: number, perPage: number, notAssociatedToGroup?: string, excludeDefaultChannels?: boolean, includeDeleted?: boolean) => Promise<void>;\n };\n noPadding?: boolean;\n};\n\ntype State = {\n loading: boolean;\n page: number;\n};\n\nexport default class AbstractList extends React.PureComponent<Props, State> {\n static defaultProps = {\n data: [],\n noPadding: false,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n loading: true,\n page: 0,\n };\n }\n\n componentDidMount() {\n this.performSearch(this.state.page);\n }\n\n previousPage = async (e: MouseEvent<HTMLButtonElement>): Promise<void> => {\n e.preventDefault();\n const page = this.state.page < 1 ? 0 : this.state.page - 1;\n this.setState({page, loading: true});\n this.performSearch(page);\n };\n\n nextPage = async (e: MouseEvent<HTMLButtonElement>): Promise<void> => {\n e.preventDefault();\n const page = this.state.page + 1;\n this.setState({page, loading: true});\n this.performSearch(page);\n };\n\n renderHeader = (): JSX.Element | null => {\n if (this.props.data.length > 0) {\n return this.props.header;\n }\n return null;\n };\n\n renderRows = (): JSX.Element | JSX.Element[] => {\n if (this.state.loading) {\n return (\n <div className='groups-list-loading'>\n <i className='fa fa-spinner fa-pulse fa-2x'/>\n </div>\n );\n }\n if (this.props.data.length === 0) {\n return (\n <div className='groups-list-empty'>\n <FormattedMessage {...this.props.emptyListText}/>\n </div>\n );\n }\n const offset = this.state.page * PAGE_SIZE;\n return this.props.data.slice(offset, offset + PAGE_SIZE).map(this.props.renderRow);\n };\n\n performSearch = (page: number): void => {\n this.setState({loading: true});\n\n this.props.actions.getData(page, PAGE_SIZE, '', false, true).then((response) => {\n if (this.props.onPageChangedCallback) {\n this.props.onPageChangedCallback(this.getPaging(), response as unknown as Array<Group | Team>);\n }\n this.setState({loading: false});\n });\n };\n\n getPaging(): Paging {\n const startCount = (this.state.page * PAGE_SIZE) + 1;\n let endCount = (this.state.page * PAGE_SIZE) + PAGE_SIZE;\n const total = this.props.total;\n if (endCount > total) {\n endCount = total;\n }\n return {startCount, endCount, total};\n }\n\n render = () => {\n const {startCount, endCount, total} = this.getPaging();\n const {noPadding} = this.props;\n const lastPage = endCount === total;\n const firstPage = this.state.page === 0;\n return (\n <div\n className={classNames(\n 'groups-list',\n 'groups-list-no-padding',\n {\n 'groups-list-less-padding': noPadding,\n },\n )}\n >\n {this.renderHeader()}\n <div\n id='groups-list--body'\n className='groups-list--body'\n >\n {this.renderRows()}\n </div>\n {total > 0 && <div className='groups-list--footer'>\n <div className='counter'>\n <FormattedMessage\n id='admin.team_channel_settings.list.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n values={{\n startCount,\n endCount,\n total,\n }}\n />\n </div>\n <button\n type='button'\n className={'btn btn-tertiary prev ' + (firstPage ? 'disabled' : '')}\n onClick={firstPage ? undefined : this.previousPage}\n disabled={firstPage}\n >\n <PreviousIcon/>\n </button>\n <button\n type='button'\n className={'btn btn-tertiary next ' + (lastPage ? 'disabled' : '')}\n onClick={lastPage ? undefined : this.nextPage}\n disabled={lastPage}\n data-testid='page-link-next'\n >\n <NextIcon/>\n </button>\n </div>}\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {ChannelWithTeamData, ChannelSearchOpts} from '@mattermost/types/channels';\n\nimport {debounce} from 'mattermost-redux/actions/helpers';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport TeamFilterDropdown from 'components/admin_console/filter/team_filter_dropdown';\nimport {PAGE_SIZE} from 'components/admin_console/team_channel_settings/abstract_list';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport GlobeIcon from 'components/widgets/icons/globe_icon';\nimport LockIcon from 'components/widgets/icons/lock_icon';\n\nimport {getHistory} from 'utils/browser_history';\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Constants} from 'utils/constants';\n\nimport './channel_list.scss';\n\nexport interface ChannelListProps {\n actions: {\n searchAllChannels: (term: string, opts: ChannelSearchOpts) => Promise<ActionResult>;\n getData: (page: number, perPage: number, notAssociatedToGroup?: string, excludeDefaultChannels?: boolean, includeDeleted?: boolean) => Promise<ActionResult>;\n };\n data: ChannelWithTeamData[];\n total: number;\n}\n\ninterface ChannelListState {\n term: string;\n channels: ChannelWithTeamData[];\n loading: boolean;\n page: number;\n total: number;\n searchErrored: boolean;\n filters: ChannelSearchOpts;\n}\n\nconst ROW_HEIGHT = 40;\n\nconst messages = defineMessages({\n group: {\n id: 'admin.channel_settings.channel_row.managementMethod.group',\n defaultMessage: 'Group Sync',\n },\n manual: {\n id: 'admin.channel_settings.channel_row.managementMethod.manual',\n defaultMessage: 'Manual Invites',\n },\n});\n\nexport default class ChannelList extends React.PureComponent<ChannelListProps, ChannelListState> {\n constructor(props: ChannelListProps) {\n super(props);\n this.state = {\n loading: false,\n term: '',\n channels: [],\n page: 0,\n total: 0,\n searchErrored: false,\n filters: {},\n };\n }\n\n componentDidMount() {\n this.loadPage();\n }\n\n isSearching = (term: string, filters: ChannelSearchOpts) => {\n return term.length > 0 || Object.keys(filters).length > 0;\n };\n\n getPaginationProps = () => {\n const {page, term, filters} = this.state;\n const total = this.isSearching(term, filters) ? this.state.total : this.props.total;\n const startCount = (page * PAGE_SIZE) + 1;\n let endCount = (page + 1) * PAGE_SIZE;\n endCount = endCount > total ? total : endCount;\n return {startCount, endCount, total};\n };\n\n loadPage = async (page = 0, term = '', filters = {}) => {\n this.setState({loading: true, term, filters});\n if (this.isSearching(term, filters)) {\n if (page > 0) {\n this.searchChannels(page, term, filters);\n } else {\n this.searchChannelsDebounced(page, term, filters);\n }\n return;\n }\n\n await this.props.actions.getData(page, PAGE_SIZE, '', false, true);\n this.setState({page, loading: false});\n };\n\n searchChannels = async (page = 0, term = '', filters: ChannelSearchOpts = {}) => {\n let channels = [];\n let total = 0;\n let searchErrored = true;\n const response = await this.props.actions.searchAllChannels(term, {...filters, page, per_page: PAGE_SIZE, include_deleted: filters.deleted ?? true, include_search_by_id: true});\n if (response?.data) {\n channels = page > 0 ? this.state.channels.concat(response.data.channels) : response.data.channels;\n total = response.data.total_count;\n searchErrored = false;\n }\n this.setState({page, loading: false, channels, total, searchErrored});\n };\n\n searchChannelsDebounced = debounce((page, term, filters = {}) => this.searchChannels(page, term, filters), 300, false, () => {});\n\n nextPage = () => {\n this.loadPage(this.state.page + 1, this.state.term, this.state.filters);\n };\n\n previousPage = () => {\n this.setState({page: this.state.page - 1});\n };\n\n onSearch = async (term = '') => {\n this.loadPage(0, term, this.state.filters);\n };\n\n getColumns = (): Column[] => {\n const name: JSX.Element = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.nameHeader'\n defaultMessage='Name'\n />\n );\n const team: JSX.Element = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.teamHeader'\n defaultMessage='Team'\n />\n );\n const management: JSX.Element = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.managementHeader'\n defaultMessage='Management'\n />\n );\n\n return [\n {\n name,\n field: 'name',\n width: 4,\n fixed: true,\n },\n {\n name: team,\n field: 'team',\n width: 1.5,\n fixed: true,\n },\n {\n name: management,\n field: 'management',\n fixed: true,\n },\n {\n name: '',\n field: 'edit',\n textAlign: 'right',\n fixed: true,\n },\n ];\n };\n\n getRows = (): Row[] => {\n const {data} = this.props;\n const {channels, term, filters} = this.state;\n const {startCount, endCount} = this.getPaginationProps();\n let channelsToDisplay = this.isSearching(term, filters) ? channels : data;\n channelsToDisplay = channelsToDisplay.slice(startCount - 1, endCount);\n\n return channelsToDisplay.map((channel) => {\n let iconToDisplay = <GlobeIcon className='channel-icon'/>;\n\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n iconToDisplay = <LockIcon className='channel-icon'/>;\n }\n\n if (isArchivedChannel(channel)) {\n iconToDisplay = (\n <ArchiveIcon\n className='channel-icon'\n data-testid={`${channel.name}-archive-icon`}\n />\n );\n }\n\n const sharedChannelIcon = channel.shared ? (\n <SharedChannelIndicator\n className='channel-icon'\n withTooltip={true}\n />\n ) : null;\n\n return {\n cells: {\n id: channel.id,\n name: (\n <span\n className='group-name overflow--ellipsis row-content'\n data-testid='channel-display-name'\n >\n {iconToDisplay}\n <span className='TeamList_channelDisplayName'>\n {channel.display_name}\n </span>\n {sharedChannelIcon}\n </span>\n ),\n team: (\n <span className='group-description row-content'>\n {channel.team_display_name}\n </span>\n ),\n management: (\n <span className='group-description adjusted row-content'>\n <FormattedMessage {...(channel.group_constrained ? messages.group : messages.manual)}/>\n </span>\n ),\n edit: (\n <span\n className='group-actions TeamList_editRow'\n data-testid={`${channel.name}edit`}\n >\n <Link to={`/admin_console/user_management/channels/${channel.id}`} >\n <FormattedMessage\n id='admin.channel_settings.channel_row.configure'\n defaultMessage='Edit'\n />\n </Link>\n </span>\n ),\n },\n onClick: () => getHistory().push(`/admin_console/user_management/channels/${channel.id}`),\n };\n });\n };\n\n onFilter = (filterOptions: FilterOptions) => {\n const filters: ChannelSearchOpts = {};\n const {group_constrained: groupConstrained, exclude_group_constrained: excludeGroupConstrained} = filterOptions.management.values;\n const {public: publicChannels, private: privateChannels, deleted} = filterOptions.channels.values;\n const {team_ids: teamIds} = filterOptions.teams.values;\n if (publicChannels.value || privateChannels.value || deleted.value || groupConstrained.value || excludeGroupConstrained.value || (teamIds.value as string[]).length) {\n filters.public = publicChannels.value as boolean;\n if (filters.public) {\n trackEvent('admin_channels_page', 'public_filter_applied_to_channel_list');\n }\n\n filters.private = privateChannels.value as boolean;\n if (filters.private) {\n trackEvent('admin_channels_page', 'private_filter_applied_to_channel_list');\n }\n\n filters.deleted = deleted.value as boolean;\n if (filters.deleted) {\n trackEvent('admin_channels_page', 'archived_filter_applied_to_channel_list');\n }\n\n if (!(groupConstrained.value && excludeGroupConstrained.value)) {\n filters.group_constrained = groupConstrained.value as boolean;\n if (filters.group_constrained) {\n trackEvent('admin_channels_page', 'group_sync_filter_applied_to_channel_list');\n }\n filters.exclude_group_constrained = excludeGroupConstrained.value as boolean;\n if (filters.exclude_group_constrained) {\n trackEvent('admin_channels_page', 'manual_invites_filter_applied_to_channel_list');\n }\n }\n\n filters.team_ids = teamIds.value as string[];\n if (filters.team_ids.length > 0) {\n trackEvent('admin_channels_page', 'team_id_filter_applied_to_channel_list');\n }\n }\n this.loadPage(0, this.state.term, filters);\n };\n\n render = (): JSX.Element => {\n const {term, searchErrored} = this.state;\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n\n let placeholderEmpty: JSX.Element = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.no_channels_found'\n defaultMessage='No channels found'\n />\n );\n\n if (searchErrored) {\n placeholderEmpty = (\n <FormattedMessage\n id='admin.channel_settings.channel_list.search_channels_errored'\n defaultMessage='Something went wrong. Try again'\n />\n );\n }\n\n const rowsContainerStyles = {\n minHeight: `${rows.length * ROW_HEIGHT}px`,\n };\n\n const filterOptions: FilterOptions = {\n teams: {\n name: 'Teams',\n values: {\n team_ids: {\n name: (\n <FormattedMessage\n id='admin.team_settings.title'\n defaultMessage='Teams'\n />\n ),\n value: [],\n },\n },\n keys: ['team_ids'],\n type: TeamFilterDropdown,\n },\n management: {\n name: 'Management',\n values: {\n group_constrained: {\n name: (\n <FormattedMessage\n id='admin.channel_list.group_sync'\n defaultMessage='Group Sync'\n />\n ),\n value: false,\n },\n exclude_group_constrained: {\n name: (\n <FormattedMessage\n id='admin.channel_list.manual_invites'\n defaultMessage='Manual Invites'\n />\n ),\n value: false,\n },\n },\n keys: ['group_constrained', 'exclude_group_constrained'],\n },\n channels: {\n name: 'Channels',\n values: {\n public: {\n name: (\n <FormattedMessage\n id='admin.channel_list.public'\n defaultMessage='Public'\n />\n ),\n value: false,\n },\n private: {\n name: (\n <FormattedMessage\n id='admin.channel_list.private'\n defaultMessage='Private'\n />\n ),\n value: false,\n },\n deleted: {\n name: (\n <FormattedMessage\n id='admin.channel_list.archived'\n defaultMessage='Archived'\n />\n ),\n value: false,\n },\n },\n keys: ['public', 'private', 'deleted'],\n },\n };\n const filterProps = {\n options: filterOptions,\n keys: ['teams', 'channels', 'management'],\n onFilter: this.onFilter,\n };\n\n return (\n <div className='ChannelsList'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n onSearch={this.onSearch}\n term={term}\n placeholderEmpty={placeholderEmpty}\n rowsContainerStyles={rowsContainerStyles}\n filterProps={filterProps}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {ChannelWithTeamData} from '@mattermost/types/channels';\n\nimport {getAllChannelsWithCount as getData, searchAllChannels} from 'mattermost-redux/actions/channels';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\n\nimport {Constants} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport List from './channel_list';\n\nconst compareByDisplayName = (a: {display_name: string}, b: {display_name: string}) => a.display_name.localeCompare(b.display_name);\n\nconst getSortedListOfChannels = createSelector(\n 'getSortedListOfChannels',\n getAllChannels,\n (teams) => Object.values(teams).\n filter((c) => (c.type === Constants.OPEN_CHANNEL || c.type === Constants.PRIVATE_CHANNEL)).\n sort(compareByDisplayName),\n);\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n data: getSortedListOfChannels(state) as ChannelWithTeamData[],\n total: state.entities.channels.totalCount,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getData,\n searchAllChannels,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(List);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport ChannelsList from 'components/admin_console/team_channel_settings/channel/list';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\ntype Props = {\n siteName?: string;\n};\n\nexport const ChannelsSettings = ({siteName}: Props) => {\n return (\n <div className='wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage\n id='admin.channel_settings.groupsPageTitle'\n defaultMessage='{siteName} Channels'\n values={{siteName}}\n />\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <AdminPanel\n id='channels'\n title={defineMessage({id: 'admin.channel_settings.title', defaultMessage: 'Channels'})}\n subtitle={defineMessage({id: 'admin.channel_settings.description', defaultMessage: 'Manage channel settings.'})}\n subtitleValues={{startCount: 0, endCount: 1, total: 0}}\n >\n <ChannelsList/>\n </AdminPanel>\n </div>\n </div>\n </div>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {ChannelsSettings} from './channel_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const siteName = config.SiteName;\n\n return {\n siteName,\n };\n}\n\nexport default connect(mapStateToProps)(ChannelsSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {GroupStats} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport UserGridName from 'components/admin_console/user_grid/user_grid_name';\n\nimport Constants from 'utils/constants';\n\nconst USERS_PER_PAGE = 10;\n\nimport './member_list_group.scss';\n\nexport type Props = {\n searchTerm: string;\n users: UserProfile[];\n groupID: string;\n total: number;\n actions: {\n getProfilesInGroup: (groupID: string, page: number, perPage: number) => Promise<ActionResult<UserProfile[]>>;\n getGroupStats: (groupID: string) => Promise<ActionResult<GroupStats>>;\n searchProfiles: (term: string, options?: Record<string, unknown>) => Promise<ActionResult<UserProfile[]>>;\n setModalSearchTerm: (term: string) => void;\n };\n}\n\ntype State = {\n loading: boolean;\n page: number;\n}\n\nexport default class MemberListGroup extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n loading: true,\n page: 0,\n };\n }\n\n async componentDidMount() {\n const {actions, groupID} = this.props;\n await Promise.all([\n actions.getProfilesInGroup(groupID, 0, USERS_PER_PAGE * 2),\n actions.getGroupStats(groupID),\n ]);\n this.loadComplete();\n }\n\n componentWillUnmount() {\n this.props.actions.setModalSearchTerm('');\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.searchTerm !== this.props.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n\n const searchTerm = this.props.searchTerm;\n if (searchTerm === '') {\n this.loadComplete();\n this.searchTimeoutId = 0;\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n const {\n searchProfiles,\n } = this.props.actions;\n\n this.setState({loading: true});\n\n await searchProfiles(searchTerm, {in_group_id: this.props.groupID});\n\n if (searchTimeoutId !== this.searchTimeoutId) {\n return;\n }\n\n this.loadComplete();\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n }\n\n loadComplete = () => {\n this.setState({loading: false});\n };\n\n private nextPage = async () => {\n const {actions, groupID} = this.props;\n const page = this.state.page + 1;\n this.setState({loading: true, page});\n await actions.getProfilesInGroup(groupID, page, USERS_PER_PAGE * 2);\n this.setState({loading: false});\n };\n\n private previousPage = () => {\n this.setState({page: this.state.page - 1});\n };\n\n private getRows = (): Row[] => {\n const {users} = this.props;\n const {startCount, endCount} = this.getPaginationProps();\n\n let usersToDisplay = users;\n usersToDisplay = usersToDisplay.slice(startCount - 1, endCount);\n\n return usersToDisplay.map((user) => {\n return {\n cells: {\n id: user.id,\n name: (\n <UserGridName\n user={user}\n />\n ),\n },\n };\n });\n };\n\n private getColumns = (): Column[] => {\n return [\n {\n name: (\n <FormattedMessage\n id='admin.member_list_group.name'\n defaultMessage='Name'\n />\n ),\n field: 'name',\n },\n ];\n };\n\n private getPaginationProps = () => {\n let {total} = this.props;\n const {page} = this.state;\n const startCount = (this.state.page * USERS_PER_PAGE) + 1;\n let endCount = (page + 1) * USERS_PER_PAGE;\n\n if (this.props.searchTerm !== '') {\n total = this.props.users.length;\n }\n if (endCount > total) {\n endCount = total;\n }\n return {startCount, endCount, total};\n };\n\n public render = (): JSX.Element => {\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n\n const placeholderEmpty: JSX.Element = (\n <FormattedMessage\n id='admin.member_list_group.notFound'\n defaultMessage='No users found'\n />\n );\n\n return (\n <div className='MemberListGroup'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n onSearch={this.props.actions.setModalSearchTerm}\n term={this.props.searchTerm || ''}\n placeholderEmpty={placeholderEmpty}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getGroupStats} from 'mattermost-redux/actions/groups';\nimport {searchProfiles, getProfilesInGroup} from 'mattermost-redux/actions/users';\nimport {getGroupMemberCount} from 'mattermost-redux/selectors/entities/groups';\nimport {getProfilesInGroup as selectProfiles, searchProfilesInGroup} from 'mattermost-redux/selectors/entities/users';\n\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport MemberListGroup from './member_list_group';\n\ntype Props = {\n groupID: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const {groupID} = ownProps;\n const searchTerm = state.views.search.modalSearch;\n let users;\n if (searchTerm) {\n users = searchProfilesInGroup(state, groupID, searchTerm);\n } else {\n users = selectProfiles(state, groupID);\n }\n\n return {\n searchTerm,\n users,\n total: getGroupMemberCount(state, groupID) || 0,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getProfilesInGroup,\n searchProfiles,\n setModalSearchTerm,\n getGroupStats,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MemberListGroup);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect, useCallback} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport MemberListGroup from 'components/admin_console/member_list_group';\n\ntype Props = {\n group: Group;\n onExited: () => void;\n onLoad?: () => void;\n}\n\nconst GroupMembersModal: React.FC<Props> = ({\n group, onExited, onLoad,\n}) => {\n const [show, setShow] = useState(true);\n\n useEffect(() => {\n onLoad?.();\n }, []);\n\n const handleHide = useCallback(() => {\n setShow(false);\n }, []);\n\n const handleExit = useCallback(() => {\n onExited();\n }, [onExited]);\n\n const button = (\n <FormattedMessage\n id='admin.team_channel_settings.groupMembers.close'\n defaultMessage='Close'\n />\n );\n\n return (\n <Modal\n dialogClassName='a11y__modal settings-modal'\n show={show}\n onHide={handleHide}\n onExited={handleExit}\n role='none'\n aria-labelledby='groupMemberModalLabel'\n id='groupMembersModal'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='groupMemberModalLabel'\n >\n {group.display_name}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <MemberListGroup\n groupID={group.id}\n />\n </Modal.Body>\n <Modal.Footer>\n <button\n autoFocus={true}\n type='button'\n className='btn btn-primary'\n onClick={handleHide}\n id='closeModalButton'\n >\n {button}\n </button>\n </Modal.Footer>\n </Modal>\n );\n};\n\nexport default React.memo(GroupMembersModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport GroupMembersModal from 'components/admin_console/team_channel_settings/group/group_members_modal';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\ninterface GroupRowProps {\n group: Partial<Group>;\n removeGroup: (gid: string) => void;\n setNewGroupRole: (gid: string) => void;\n type: string;\n isDisabled?: boolean;\n}\n\nexport default class GroupRow extends React.PureComponent<GroupRowProps> {\n removeGroup = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n e.preventDefault();\n if (this.props.isDisabled) {\n return;\n }\n this.props.removeGroup(this.props.group.id!);\n };\n\n setNewGroupRole = () => {\n this.props.setNewGroupRole(this.props.group.id!);\n };\n\n displayCurrentRole = () => {\n const {group, type} = this.props;\n const channelAdmin = (\n <FormattedMessage\n id='admin.team_channel_settings.group_row.channelAdmin'\n defaultMessage='Channel Admin'\n />\n );\n const teamAdmin = (\n <FormattedMessage\n id='admin.team_channel_settings.group_row.teamAdmin'\n defaultMessage='Team Admin'\n />\n );\n const member = (\n <FormattedMessage\n id='admin.team_channel_settings.group_row.member'\n defaultMessage='Member'\n />\n );\n\n if (group.scheme_admin && type === 'channel') {\n return channelAdmin;\n } else if (group.scheme_admin && type === 'team') {\n return teamAdmin;\n }\n return member;\n };\n\n displayRoleToBe = () => {\n const {group, type} = this.props;\n if (!group.scheme_admin && type === 'channel') {\n return localizeMessage({id: 'admin.team_channel_settings.group_row.channelAdmin', defaultMessage: 'Channel Admin'});\n } else if (!group.scheme_admin && type === 'team') {\n return localizeMessage({id: 'admin.team_channel_settings.group_row.teamAdmin', defaultMessage: 'Team Admin'});\n }\n return localizeMessage({id: 'admin.team_channel_settings.group_row.member', defaultMessage: 'Member'});\n };\n\n render = () => {\n const {group} = this.props;\n return (\n <div\n id='group'\n className='group'\n >\n <div\n id='group-row'\n className='group-row'\n >\n <span className='group-name row-content'>\n {group.display_name || group.name}\n </span>\n <span className='group-description row-content'>\n <ToggleModalButton\n id={`${group.display_name}MembersToggle`}\n className='color--link'\n modalId={ModalIdentifiers.GROUP_MEMBERS}\n dialogType={GroupMembersModal}\n dialogProps={{\n group,\n }}\n >\n <FormattedMessage\n id='admin.team_channel_settings.group_row.members'\n defaultMessage='{memberCount, number} {memberCount, plural, one {member} other {members}}'\n values={{memberCount: group.member_count}}\n />\n </ToggleModalButton>\n </span>\n <div className='group-description row-content roles'>\n <MenuWrapper\n isDisabled={this.props.isDisabled}\n >\n <div>\n <a data-testid='current-role'>\n <span>{this.displayCurrentRole()}</span>\n <span className='caret'/>\n </a>\n </div>\n <Menu\n id='role-to-be-menu'\n openLeft={true}\n openUp={false}\n ariaLabel={localizeMessage({id: 'admin.team_channel_settings.group_row.memberRole', defaultMessage: 'Member Role'})}\n >\n <Menu.ItemAction\n id='role-to-be'\n onClick={this.setNewGroupRole}\n text={this.displayRoleToBe()}\n />\n </Menu>\n </MenuWrapper>\n </div>\n <span\n id='group-actions'\n className='group-actions'\n >\n <a\n href='#'\n onClick={this.removeGroup}\n className={this.props.isDisabled ? 'disabled' : ''}\n >\n <FormattedMessage\n id='admin.team_channel_settings.group_row.remove'\n defaultMessage='Remove'\n />\n </a>\n </span>\n </div>\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport AbstractList from 'components/admin_console/team_channel_settings/abstract_list';\n\nimport GroupRow from './group_row';\n\nimport type {PropsFromRedux, OwnProps} from './index';\n\nconst Header = () => {\n return (\n <div className='groups-list--header'>\n <div className='group-name group-name-adjusted'>\n <FormattedMessage\n id='admin.team_channel_settings.group_list.nameHeader'\n defaultMessage='Group Name'\n />\n </div>\n <div className='group-content'>\n <div className='group-description group-description-adjusted'>\n <FormattedMessage\n id='admin.team_channel_settings.group_list.membersHeader'\n defaultMessage='Member Count'\n />\n </div>\n <div className='group-description group-description-adjusted'>\n <FormattedMessage\n id='admin.team_channel_settings.group_list.rolesHeader'\n defaultMessage='Roles'\n />\n </div>\n <div className='group-actions'/>\n </div>\n </div>\n );\n};\n\ntype Props = OwnProps & PropsFromRedux;\n\nconst GroupList = ({\n removeGroup,\n setNewGroupRole,\n type,\n isDisabled,\n isModeSync,\n ...restProps\n}: Props) => {\n const renderRow = useCallback((item: Partial<Group>) => {\n return (\n <GroupRow\n key={item.id}\n group={item}\n removeGroup={removeGroup}\n setNewGroupRole={setNewGroupRole}\n type={type}\n isDisabled={isDisabled}\n />\n );\n }, [isDisabled, removeGroup, setNewGroupRole, type]);\n\n return (\n <AbstractList\n header={<Header/>}\n renderRow={renderRow}\n emptyListText={isModeSync ? messages.emptyListModeSync : messages.emptyList}\n {...restProps}\n />\n );\n};\n\nconst messages = defineMessages({\n emptyListModeSync: {\n id: 'admin.team_channel_settings.group_list.no-synced-groups',\n defaultMessage: 'At least one group must be specified',\n },\n emptyList: {\n id: 'admin.team_channel_settings.group_list.no-groups',\n defaultMessage: 'No groups specified yet',\n },\n});\n\nexport default memo(GroupList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Group} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {GlobalState} from 'types/store';\n\nimport GroupList from './group_list';\n\nexport type OwnProps = {\n groups: Group[];\n onGroupRemoved: (gid: string) => void;\n setNewGroupRole: (gid: string) => void;\n isModeSync: boolean;\n totalGroups: number;\n isDisabled?: boolean;\n type: string;\n onPageChangedCallback?: () => void;\n team?: Team;\n channel?: Partial<Channel>;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n return {\n data: ownProps.groups,\n removeGroup: ownProps.onGroupRemoved,\n setNewGroupRole: ownProps.setNewGroupRole,\n total: ownProps.totalGroups,\n };\n}\n\nfunction mapDispatchToProps() {\n return {\n actions: {\n getData: () => Promise.resolve(),\n },\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(GroupList);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Group} from '@mattermost/types/groups';\n\nimport AddGroupsToChannelModal from 'components/add_groups_to_channel_modal';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport GroupList from '../../group';\n\ninterface ChannelGroupsProps {\n synced: boolean;\n channel: Partial<Channel>;\n onAddCallback: (groupIDs: string[]) => void;\n totalGroups: number;\n groups: Group[];\n removedGroups: Array<{[key: string]: any}>;\n onGroupRemoved: (gid: string) => void;\n setNewGroupRole: (gid: string) => void;\n isDisabled?: boolean;\n}\n\nexport const ChannelGroups: React.FunctionComponent<ChannelGroupsProps> = (props: ChannelGroupsProps): JSX.Element => {\n const {onGroupRemoved, onAddCallback, totalGroups, groups, removedGroups, channel, synced, setNewGroupRole, isDisabled} = props;\n return (\n <AdminPanel\n id='channel_groups'\n title={\n synced ?\n defineMessage({id: 'admin.channel_settings.channel_detail.syncedGroupsTitle', defaultMessage: 'Synced Groups'}) :\n defineMessage({id: 'admin.channel_settings.channel_detail.groupsTitle', defaultMessage: 'Groups'})}\n subtitle={\n synced ?\n defineMessage({id: 'admin.channel_settings.channel_detail.syncedGroupsDescription', defaultMessage: 'Add and remove channel members based on their group membership.'}) :\n defineMessage({id: 'admin.channel_settings.channel_detail.groupsDescription', defaultMessage: 'Select groups to be added to this channel.'})}\n button={\n <ToggleModalButton\n id='addGroupsToChannelToggle'\n className='btn btn-primary'\n modalId={ModalIdentifiers.ADD_GROUPS_TO_CHANNEL}\n dialogType={AddGroupsToChannelModal}\n dialogProps={{\n channel,\n onAddCallback,\n skipCommit: true,\n includeGroups: removedGroups,\n excludeGroups: groups,\n }}\n disabled={isDisabled}\n >\n <FormattedMessage\n id='admin.channel_settings.channel_details.add_group'\n defaultMessage='Add Group'\n />\n </ToggleModalButton>\n }\n >\n {channel.id && (\n <GroupList\n channel={channel}\n groups={groups}\n totalGroups={totalGroups}\n onGroupRemoved={onGroupRemoved}\n setNewGroupRole={setNewGroupRole}\n isModeSync={synced}\n type='channel'\n isDisabled={isDisabled}\n />\n )}\n </AdminPanel>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport * as Utils from 'utils/utils';\n\nexport type BaseMembership = {\n user_id: string;\n scheme_user: boolean;\n scheme_admin: boolean;\n}\n\ntype Props = {\n user: UserProfile;\n membership?: BaseMembership | TeamMembership | ChannelMembership;\n scope: 'team' | 'channel';\n handleUpdateMembership: (membership: BaseMembership) => void;\n isDisabled?: boolean;\n}\n\nexport type Role = 'system_admin' | 'team_admin' | 'team_user' | 'channel_admin' | 'channel_user' | 'shared_member' | 'guest';\n\nexport default class UserGridRoleDropdown extends React.PureComponent<Props> {\n private getDropDownOptions = () => {\n if (this.props.scope === 'team') {\n return {\n makeAdmin: Utils.localizeMessage({id: 'team_members_dropdown.makeAdmin', defaultMessage: 'Make Team Admin'}),\n makeMember: Utils.localizeMessage({id: 'team_members_dropdown.makeMember', defaultMessage: 'Make Team Member'}),\n };\n }\n\n return {\n makeAdmin: Utils.localizeMessage({id: 'channel_members_dropdown.make_channel_admin', defaultMessage: 'Make Channel Admin'}),\n makeMember: Utils.localizeMessage({id: 'channel_members_dropdown.make_channel_member', defaultMessage: 'Make Channel Member'}),\n };\n };\n\n private getCurrentRole = (): Role => {\n const {user, membership, scope} = this.props;\n\n if (user.roles.includes('system_admin')) {\n return 'system_admin';\n } else if (membership) {\n if (scope === 'team') {\n if (user.remote_id) {\n return 'shared_member';\n } else if (membership.scheme_admin) {\n return 'team_admin';\n } else if (membership.scheme_user) {\n return 'team_user';\n }\n }\n\n if (scope === 'channel') {\n if (user.remote_id) {\n return 'shared_member';\n } else if (membership.scheme_admin) {\n return 'channel_admin';\n } else if (membership.scheme_user) {\n return 'channel_user';\n }\n }\n }\n\n return 'guest';\n };\n\n private getLocalizedRole = (role: Role) => {\n switch (role) {\n case 'system_admin':\n return Utils.localizeMessage({id: 'admin.user_grid.system_admin', defaultMessage: 'System Admin'});\n case 'team_admin':\n return Utils.localizeMessage({id: 'admin.user_grid.team_admin', defaultMessage: 'Team Admin'});\n case 'channel_admin':\n return Utils.localizeMessage({id: 'admin.user_grid.channel_admin', defaultMessage: 'Channel Admin'});\n case 'shared_member':\n return Utils.localizeMessage({id: 'admin.user_grid.shared_member', defaultMessage: 'Shared Member'});\n case 'team_user':\n case 'channel_user':\n return Utils.localizeMessage({id: 'admin.group_teams_and_channels_row.member', defaultMessage: 'Member'});\n default:\n return Utils.localizeMessage({id: 'admin.user_grid.guest', defaultMessage: 'Guest'});\n }\n };\n\n private handleMakeAdmin = () => {\n this.props.handleUpdateMembership({\n user_id: this.props.user.id,\n scheme_admin: true,\n scheme_user: true,\n });\n };\n\n private handleMakeUser = () => {\n this.props.handleUpdateMembership({\n user_id: this.props.user.id,\n scheme_admin: false,\n scheme_user: true,\n });\n };\n\n private getAriaLabel = () => {\n const {scope} = this.props;\n if (scope === 'team') {\n return Utils.localizeMessage({id: 'team_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of a team member'});\n }\n return Utils.localizeMessage({id: 'channel_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of channel member'});\n };\n\n public render = (): React.ReactNode => {\n if (!this.props.membership) {\n return null;\n }\n\n const {user, isDisabled} = this.props;\n\n const {makeAdmin, makeMember} = this.getDropDownOptions();\n const currentRole = this.getCurrentRole();\n const localizedRole = this.getLocalizedRole(currentRole);\n const ariaLabel = this.getAriaLabel();\n\n if (currentRole === 'shared_member') {\n return (\n <div className='more-modal__shared-actions'>\n <WithTooltip\n title={\n <FormattedMessage\n id='shared_user_indicator.tooltip'\n defaultMessage='From trusted organizations'\n />\n }\n >\n <span>\n {localizedRole}\n <i className='shared-user-icon icon-circle-multiple-outline'/>\n </span>\n </WithTooltip>\n </div>\n );\n }\n\n const dropdownEnabled = !['system_admin', 'guest'].includes(currentRole);\n const showMakeAdmin = ['channel_user', 'team_user'].includes(currentRole);\n const showMakeMember = ['channel_admin', 'team_admin'].includes(currentRole);\n\n if (!dropdownEnabled) {\n return localizedRole;\n }\n\n return (\n <MenuWrapper\n isDisabled={isDisabled}\n >\n <button\n id={`userGridRoleDropdown_${user.username}`}\n className='dropdown-toggle theme color--link style--none'\n type='button'\n aria-expanded='true'\n >\n <span>{localizedRole} </span>\n <DropdownIcon/>\n </button>\n <Menu ariaLabel={ariaLabel}>\n <Menu.ItemAction\n show={showMakeAdmin}\n onClick={this.handleMakeAdmin}\n text={makeAdmin}\n />\n <Menu.ItemAction\n show={showMakeMember}\n onClick={this.handleMakeUser}\n text={makeMember}\n />\n </Menu>\n </MenuWrapper>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport Tag from 'components/widgets/tag/tag';\n\nimport UserGridName from './user_grid_name';\nimport UserGridRemove from './user_grid_remove';\nimport UserGridRoleDropdown from './user_grid_role_dropdown';\nimport type {BaseMembership} from './user_grid_role_dropdown';\n\nimport './user_grid.scss';\n\ntype Props = {\n users: UserProfile[];\n scope: 'team' | 'channel';\n memberships: { [userId: string]: BaseMembership | TeamMembership | ChannelMembership };\n\n excludeUsers: { [userId: string]: UserProfile };\n includeUsers: { [userId: string]: UserProfile };\n\n loadPage: (page: number) => void;\n onSearch: (term: string) => void;\n removeUser: (user: UserProfile) => void;\n updateMembership: (membership: BaseMembership) => void;\n\n totalCount: number;\n loading: boolean;\n term: string;\n readOnly?: boolean;\n\n filterProps: {\n options: FilterOptions;\n keys: string[];\n onFilter: (options: FilterOptions) => void;\n };\n};\n\ntype State = {\n loading: boolean;\n page: number;\n membershipsToUpdate: { [userId: string]: BaseMembership | TeamMembership | ChannelMembership };\n};\n\nconst USERS_PER_PAGE = 10;\nconst ROW_HEIGHT = 80;\n\nexport default class UserGrid extends React.PureComponent<Props, State> {\n private pageLoaded = 0;\n\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n loading: false,\n page: 0,\n membershipsToUpdate: {},\n };\n }\n\n private loadPage = (page: number) => {\n this.setState({loading: true});\n this.props.loadPage(page);\n this.setState({page, loading: false});\n };\n\n private nextPage = () => {\n this.loadPage(this.state.page + 1);\n };\n\n private previousPage = () => {\n this.loadPage(this.state.page - 1);\n };\n\n private onSearch = async (term: string) => {\n this.props.onSearch(term);\n this.setState({page: 0});\n };\n\n private onFilter = async (filters: FilterOptions) => {\n this.props.filterProps?.onFilter(filters);\n this.setState({page: 0});\n };\n\n private getVisibleTotalCount = (): number => {\n const {includeUsers, excludeUsers, totalCount} = this.props;\n const includeUsersCount = Object.keys(includeUsers).length;\n const excludeUsersCount = Object.keys(excludeUsers).length;\n return totalCount + (includeUsersCount - excludeUsersCount);\n };\n\n public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {\n const {includeUsers, excludeUsers, term} = this.props;\n const {page} = this.state;\n\n let total: number;\n let endCount = 0;\n const startCount = (page * USERS_PER_PAGE) + 1;\n\n if (term === '') {\n total = this.getVisibleTotalCount();\n } else {\n total = this.props.users.length + Object.keys(includeUsers).length;\n this.props.users.forEach((u) => {\n if (excludeUsers[u.id]) {\n total -= 1;\n }\n });\n }\n\n endCount = (page + 1) * USERS_PER_PAGE;\n endCount = endCount > total ? total : endCount;\n\n return {startCount, endCount, total};\n };\n\n private removeUser = (user: UserProfile) => {\n const {excludeUsers} = this.props;\n if (excludeUsers[user.id] === user) {\n return;\n }\n\n let {page} = this.state;\n const {endCount} = this.getPaginationProps();\n\n this.props.removeUser(user);\n if (endCount > this.getVisibleTotalCount() && (endCount % USERS_PER_PAGE) === 1 && page > 0) {\n page--;\n }\n\n this.setState({page});\n };\n\n private updateMembership = (membership: BaseMembership) => {\n const {membershipsToUpdate} = this.state;\n const {memberships} = this.props;\n const userId = membership.user_id;\n membershipsToUpdate[userId] = {\n ...memberships[userId],\n ...membership,\n };\n\n this.props.updateMembership(membership);\n this.setState({membershipsToUpdate}, this.forceUpdate);\n };\n\n private newMembership = (user: UserProfile): BaseMembership => {\n return {\n user_id: user.id,\n scheme_admin: false,\n scheme_user: !user.roles.includes('guest'),\n };\n };\n\n private getRows = (): Row[] => {\n const {page, membershipsToUpdate} = this.state;\n const {memberships, users, excludeUsers, includeUsers, totalCount, term, scope, readOnly} = this.props;\n const {startCount, endCount} = this.getPaginationProps();\n\n let usersToDisplay = users;\n const includeUsersList = Object.values(includeUsers);\n\n // Remove users to remove and add users to add\n usersToDisplay = usersToDisplay.filter((user) => !excludeUsers[user.id]);\n usersToDisplay = [...includeUsersList, ...usersToDisplay];\n usersToDisplay = usersToDisplay.slice(startCount - 1, endCount);\n\n // Dont load more elements if searching\n if (term === '' && usersToDisplay.length < USERS_PER_PAGE && users.length < totalCount) {\n const numberOfUsersRemoved = Object.keys(excludeUsers).length;\n const pagesOfUsersRemoved = Math.floor(numberOfUsersRemoved / USERS_PER_PAGE);\n const pageToLoad = page + pagesOfUsersRemoved + 1;\n\n // Directly call action to load more users from parent component to load more users into the state\n if (pageToLoad > this.pageLoaded) {\n this.props.loadPage(pageToLoad);\n this.pageLoaded = pageToLoad;\n }\n }\n\n return usersToDisplay.map((user) => {\n const membership = membershipsToUpdate[user.id] || memberships[user.id] || this.newMembership(user);\n return {\n cells: {\n id: user.id,\n name: (\n <UserGridName\n user={user}\n />\n ),\n new: includeUsers[user.id] ? (\n <Tag\n className='NewUserBadge'\n text={(\n <FormattedMessage\n id='admin.user_grid.new'\n defaultMessage='New'\n />\n )}\n />\n ) : null,\n role: (\n <UserGridRoleDropdown\n user={user}\n membership={membership}\n handleUpdateMembership={this.updateMembership}\n scope={scope}\n isDisabled={readOnly}\n />\n ),\n remove: (\n <UserGridRemove\n user={user}\n removeUser={this.removeUser}\n isDisabled={readOnly}\n />\n ),\n },\n };\n });\n };\n\n private getColumns = (): Column[] => {\n const name: JSX.Element = (\n <FormattedMessage\n id='admin.user_grid.name'\n defaultMessage='Name'\n />\n );\n const role: JSX.Element = (\n <FormattedMessage\n id='admin.user_grid.role'\n defaultMessage='Role'\n />\n );\n\n return [\n {\n name,\n field: 'name',\n width: 3,\n fixed: true,\n },\n {\n name: '',\n field: 'new',\n fixed: true,\n },\n {\n name: role,\n field: 'role',\n\n // Requires overflow visible in order to render dropdown\n overflow: 'visible',\n },\n {\n name: '',\n field: 'remove',\n textAlign: 'right',\n fixed: true,\n },\n ];\n };\n\n public render = (): JSX.Element => {\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n\n const placeholderEmpty: JSX.Element = (\n <FormattedMessage\n id='admin.user_grid.notFound'\n defaultMessage='No users found'\n />\n );\n\n const rowsContainerStyles = {\n minHeight: `${rows.length * ROW_HEIGHT}px`,\n };\n\n return (\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading || this.props.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n onSearch={this.onSearch}\n term={this.props.term || ''}\n placeholderEmpty={placeholderEmpty}\n rowsContainerStyles={rowsContainerStyles}\n filterProps={{...this.props.filterProps, onFilter: this.onFilter}}\n />\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile, GetFilteredUsersStatsOpts} from '@mattermost/types/users';\n\nimport GeneralConstants from 'mattermost-redux/constants/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport UserGrid from 'components/admin_console/user_grid/user_grid';\nimport type {BaseMembership} from 'components/admin_console/user_grid/user_grid_role_dropdown';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n channelId: string;\n channel?: Channel;\n filters: GetFilteredUsersStatsOpts;\n\n users: UserProfile[];\n usersToRemove: Record<string, UserProfile>;\n usersToAdd: Record<string, UserProfile>;\n channelMembers: Record<string, ChannelMembership>;\n\n totalCount: number;\n searchTerm: string;\n loading?: boolean;\n enableGuestAccounts: boolean;\n\n onAddCallback: (users: UserProfile[]) => void;\n onRemoveCallback: (user: UserProfile) => void;\n updateRole: (userId: string, schemeUser: boolean, schemeAdmin: boolean) => void;\n\n isDisabled?: boolean;\n\n actions: {\n getChannelStats: (channelId: string) => Promise<ActionResult>;\n loadProfilesAndReloadChannelMembers: (page: number, perPage: number, channelId?: string, sort?: string, options?: {[key: string]: any}) => Promise<ActionResult>;\n searchProfilesAndChannelMembers: (term: string, options?: {[key: string]: any}) => Promise<ActionResult>;\n getFilteredUsersStats: (filters: GetFilteredUsersStatsOpts) => Promise<ActionResult>;\n setUserGridSearch: (term: string) => void;\n setUserGridFilters: (filters: GetFilteredUsersStatsOpts) => void;\n };\n}\n\ntype State = {\n loading: boolean;\n}\n\nconst PROFILE_CHUNK_SIZE = 10;\n\nexport default class ChannelMembers extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n loading: true,\n };\n }\n\n public componentDidMount() {\n const {channelId} = this.props;\n const {loadProfilesAndReloadChannelMembers, getChannelStats, setUserGridSearch, setUserGridFilters} = this.props.actions;\n Promise.all([\n setUserGridSearch(''),\n setUserGridFilters({}),\n getChannelStats(channelId),\n loadProfilesAndReloadChannelMembers(0, PROFILE_CHUNK_SIZE * 2, channelId, '', {active: true}),\n ]).then(() => this.setStateLoading(false));\n }\n\n public async componentDidUpdate(prevProps: Props) {\n const filtersModified = JSON.stringify(prevProps.filters) !== JSON.stringify(this.props.filters);\n const searchTermModified = prevProps.searchTerm !== this.props.searchTerm;\n if (filtersModified || searchTermModified) {\n this.setStateLoading(true);\n clearTimeout(this.searchTimeoutId);\n const {searchTerm, filters} = this.props;\n\n if (searchTerm === '') {\n this.searchTimeoutId = 0;\n if (filtersModified) {\n await prevProps.actions.loadProfilesAndReloadChannelMembers(0, PROFILE_CHUNK_SIZE * 2, prevProps.channelId, '', {active: true, ...filters});\n }\n this.setStateLoading(false);\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n await prevProps.actions.searchProfilesAndChannelMembers(searchTerm, {...filters, in_channel_id: this.props.channelId, allow_inactive: false});\n\n if (searchTimeoutId !== this.searchTimeoutId) {\n return;\n }\n this.setStateLoading(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n }\n\n private setStateLoading = (loading: boolean) => {\n this.setState({loading});\n };\n\n private loadPage = async (page: number) => {\n const {loadProfilesAndReloadChannelMembers} = this.props.actions;\n const {channelId, filters} = this.props;\n await loadProfilesAndReloadChannelMembers(page + 1, PROFILE_CHUNK_SIZE, channelId, '', {active: true, ...filters});\n };\n\n private removeUser = (user: UserProfile) => {\n this.props.onRemoveCallback(user);\n };\n\n private onAddCallback = (users: UserProfile[]) => {\n this.props.onAddCallback(users);\n };\n\n private onSearch = async (term: string) => {\n this.props.actions.setUserGridSearch(term);\n };\n\n private updateMembership = (membership: BaseMembership) => {\n this.props.updateRole(membership.user_id, membership.scheme_user, membership.scheme_admin);\n };\n\n private onFilter = async (filterOptions: FilterOptions) => {\n const roles = filterOptions.role.values;\n const systemRoles: string[] = [];\n const channelRoles: string[] = [];\n let filters = {};\n Object.keys(roles).forEach((filterKey: string) => {\n if (roles[filterKey].value) {\n if (filterKey.includes('channel')) {\n channelRoles.push(filterKey);\n } else {\n systemRoles.push(filterKey);\n }\n }\n });\n\n if (systemRoles.length > 0 || channelRoles.length > 0) {\n if (systemRoles.length > 0) {\n filters = {roles: systemRoles};\n }\n if (channelRoles.length > 0) {\n filters = {...filters, channel_roles: channelRoles};\n }\n [...systemRoles, ...channelRoles].forEach((role) => {\n trackEvent('admin_channel_config_page', `${role}_filter_applied_to_members_block`, {channel_id: this.props.channelId});\n });\n\n this.props.actions.setUserGridFilters(filters);\n this.props.actions.getFilteredUsersStats({in_channel: this.props.channelId, include_bots: true, ...filters});\n } else {\n this.props.actions.setUserGridFilters(filters);\n }\n };\n\n render = () => {\n const {users, channel, channelId, usersToAdd, usersToRemove, channelMembers, totalCount, searchTerm, isDisabled} = this.props;\n const filterOptions: FilterOptions = {\n role: {\n name: (\n <FormattedMessage\n id='admin.user_grid.role'\n defaultMessage='Role'\n />\n ),\n values: {\n [GeneralConstants.SYSTEM_GUEST_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.guest'\n defaultMessage='Guest'\n />\n ),\n value: false,\n },\n [GeneralConstants.CHANNEL_USER_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_item.member'\n defaultMessage='Member'\n />\n ),\n value: false,\n },\n [GeneralConstants.CHANNEL_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.channel_admin'\n defaultMessage='Channel Admin'\n />\n ),\n value: false,\n },\n [GeneralConstants.SYSTEM_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.system_admin'\n defaultMessage='System Admin'\n />\n ),\n value: false,\n },\n },\n keys: [GeneralConstants.SYSTEM_GUEST_ROLE, GeneralConstants.CHANNEL_USER_ROLE, GeneralConstants.CHANNEL_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE],\n },\n };\n\n if (!this.props.enableGuestAccounts) {\n delete filterOptions.role.values[GeneralConstants.SYSTEM_GUEST_ROLE];\n filterOptions.role.keys = [GeneralConstants.CHANNEL_USER_ROLE, GeneralConstants.CHANNEL_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE];\n }\n const filterProps = {\n options: filterOptions,\n keys: ['role'],\n onFilter: this.onFilter,\n };\n\n return (\n <AdminPanel\n id='channelMembers'\n title={defineMessage({id: 'admin.channel_settings.channel_detail.membersTitle', defaultMessage: 'Members'})}\n subtitle={defineMessage({id: 'admin.channel_settings.channel_detail.membersDescription', defaultMessage: 'A list of users who are currently in the channel right now'})}\n button={\n <ToggleModalButton\n id='addChannelMembers'\n className='btn btn-primary'\n modalId={ModalIdentifiers.CHANNEL_INVITE}\n dialogType={ChannelInviteModal}\n disabled={isDisabled}\n dialogProps={{\n channel,\n channelId,\n teamId: channel?.team_id,\n onAddCallback: this.onAddCallback,\n skipCommit: true,\n excludeUsers: usersToAdd,\n includeUsers: usersToRemove,\n }}\n >\n <FormattedMessage\n id='admin.team_settings.team_details.add_members'\n defaultMessage='Add Members'\n />\n </ToggleModalButton>\n }\n >\n <UserGrid\n loading={this.state.loading || Boolean(this.props.loading)}\n users={users}\n loadPage={this.loadPage}\n removeUser={this.removeUser}\n totalCount={totalCount}\n memberships={channelMembers}\n updateMembership={this.updateMembership}\n onSearch={this.onSearch}\n includeUsers={usersToAdd}\n excludeUsers={usersToRemove}\n term={searchTerm}\n scope={'channel'}\n readOnly={isDisabled}\n filterProps={filterProps}\n />\n </AdminPanel>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {ChannelStats} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getChannelStats} from 'mattermost-redux/actions/channels';\nimport {getFilteredUsersStats} from 'mattermost-redux/actions/users';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getChannelMembersInChannels, getAllChannelStats, getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {makeGetProfilesInChannel, makeSearchProfilesInChannel, filterProfiles, getFilteredUsersStats as selectFilteredUsersStats} from 'mattermost-redux/selectors/entities/users';\nimport {filterProfilesStartingWithTerm, profileListToMap} from 'mattermost-redux/utils/user_utils';\n\nimport {loadProfilesAndReloadChannelMembers, searchProfilesAndChannelMembers} from 'actions/user_actions';\nimport {setUserGridSearch, setUserGridFilters} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelMembers from './channel_members';\n\ntype Props = {\n channelId: string;\n usersToAdd: Record<string, UserProfile>;\n usersToRemove: Record<string, UserProfile>;\n};\n\nfunction searchUsersToAdd(users: Record<string, UserProfile>, term: string): Record<string, UserProfile> {\n const profiles = filterProfilesStartingWithTerm(Object.values(users), term);\n const filteredProfilesMap = filterProfiles(profileListToMap(profiles), {});\n\n return filteredProfilesMap;\n}\n\nconst getUserGridFilters = createSelector(\n 'getUserGridFilters',\n (state: GlobalState) => state.views.search.userGridSearch.filters,\n (filters = {}) => {\n return {...filters, active: true};\n },\n);\n\nfunction makeMapStateToProps() {\n const doGetProfilesInChannel = makeGetProfilesInChannel();\n const doSearchProfilesInChannel = makeSearchProfilesInChannel();\n\n return function mapStateToProps(state: GlobalState, props: Props) {\n const {channelId, usersToRemove} = props;\n let {usersToAdd} = props;\n\n const config = getConfig(state);\n const channelMembers = getChannelMembersInChannels(state)[channelId] || {};\n const channel = getChannel(state, channelId);\n const searchTerm = state.views.search.userGridSearch?.term || '';\n const filters = getUserGridFilters(state);\n\n let totalCount: number;\n if (Object.keys(filters).length === 1) {\n const stats: ChannelStats = getAllChannelStats(state)[channelId] || {\n member_count: 0,\n channel_id: channelId,\n pinnedpost_count: 0,\n guest_count: 0,\n files_count: 0,\n };\n totalCount = stats.member_count;\n } else {\n const filteredUserStats = selectFilteredUsersStats(state) || {\n total_users_count: 0,\n };\n totalCount = filteredUserStats.total_users_count ?? 0;\n }\n\n let users = [];\n if (searchTerm) {\n users = doSearchProfilesInChannel(state, channelId, searchTerm, false, filters);\n usersToAdd = searchUsersToAdd(usersToAdd, searchTerm);\n } else {\n users = doGetProfilesInChannel(state, channelId, filters);\n }\n\n return {\n filters,\n channelId,\n channel,\n users,\n channelMembers,\n usersToAdd,\n usersToRemove,\n totalCount,\n searchTerm,\n enableGuestAccounts: config.EnableGuestAccounts === 'true',\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getChannelStats,\n loadProfilesAndReloadChannelMembers,\n searchProfilesAndChannelMembers,\n getFilteredUsersStats,\n setUserGridSearch,\n setUserGridFilters,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ChannelMembers);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport isNil from 'lodash/isNil';\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\n\nimport type {ChannelModeration as ChannelPermissions} from '@mattermost/types/channels';\n\nimport {Permissions, Roles} from 'mattermost-redux/constants';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\nimport CheckboxCheckedIcon from 'components/widgets/icons/checkbox_checked_icon';\n\nimport type {ChannelModerationRoles} from './types';\n\nconst PERIOD_TO_SLASH_REGEX = /\\./g;\n\nconst MEMBERS_CAN_CREATE_POST_PERMISSION = 'create_post';\nconst GUESTS_CAN_CREATE_POST_PERMISSION = 'guest_create_post';\nconst MEMBERS_CAN_POST_REACTIONS_PERMISSION = 'reactions';\nconst GUESTS_CAN_POST_REACTIONS_PERMISSION = 'guest_reactions';\nconst MEMBERS_CAN_MANAGE_CHANNEL_MEMBERS_PERMISSION = 'manage_{public_or_private}_channel_members';\nconst GUESTS_CAN_MANAGE_CHANNEL_MEMBERS_PERMISSION = 'guest_manage_{public_or_private}_channel_members';\nconst MEMBERS_CAN_USE_CHANNEL_MENTIONS_PERMISSION = 'use_channel_mentions';\nconst GUESTS_CAN_USE_CHANNEL_MENTIONS_PERMISSION = 'guest_use_channel_mentions';\nconst MEMBERS_CAN_MANAGE_CHANNEL_BOOKMARKS_PERMISSION = 'manage_{public_or_private}_channel_bookmarks';\nconst GUESTS_CAN_MANAGE_CHANNEL_BOOKMARKS_PERMISSION = 'guest_manage_{public_or_private}_channel_bookmarks';\n\nfunction getChannelModerationPermissionNames(permission: string) {\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_POST) {\n return {\n disabledGuests: GUESTS_CAN_CREATE_POST_PERMISSION,\n disabledMembers: MEMBERS_CAN_CREATE_POST_PERMISSION,\n disabledBoth: MEMBERS_CAN_CREATE_POST_PERMISSION,\n };\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_REACTIONS) {\n return {\n disabledGuests: GUESTS_CAN_POST_REACTIONS_PERMISSION,\n disabledMembers: MEMBERS_CAN_POST_REACTIONS_PERMISSION,\n disabledBoth: MEMBERS_CAN_POST_REACTIONS_PERMISSION,\n };\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.MANAGE_MEMBERS) {\n return {\n disabledGuests: GUESTS_CAN_MANAGE_CHANNEL_MEMBERS_PERMISSION,\n disabledMembers: MEMBERS_CAN_MANAGE_CHANNEL_MEMBERS_PERMISSION,\n disabledBoth: MEMBERS_CAN_MANAGE_CHANNEL_MEMBERS_PERMISSION,\n };\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS) {\n return {\n disabledGuests: GUESTS_CAN_USE_CHANNEL_MENTIONS_PERMISSION,\n disabledMembers: MEMBERS_CAN_USE_CHANNEL_MENTIONS_PERMISSION,\n disabledBoth: MEMBERS_CAN_USE_CHANNEL_MENTIONS_PERMISSION,\n };\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.MANAGE_BOOKMARKS) {\n return {\n disabledGuests: GUESTS_CAN_MANAGE_CHANNEL_BOOKMARKS_PERMISSION,\n disabledMembers: MEMBERS_CAN_MANAGE_CHANNEL_BOOKMARKS_PERMISSION,\n disabledBoth: MEMBERS_CAN_MANAGE_CHANNEL_BOOKMARKS_PERMISSION,\n };\n }\n\n return null;\n}\n\nfunction getChannelModerationRowsMessages(permission: string): Record<string, MessageDescriptor> | null {\n const createPostRowMessages = defineMessages({\n title: {\n id: 'admin.channel_settings.channel_moderation.createPosts',\n defaultMessage: 'Create Posts',\n },\n description: {\n id: 'admin.channel_settings.channel_moderation.createPostsDesc',\n defaultMessage: 'The ability for members and guests to create posts in the channel.',\n },\n descriptionMembers: {\n id: 'admin.channel_settings.channel_moderation.createPostsDescMembers',\n defaultMessage: 'The ability for members to create posts in the channel.',\n },\n disabledGuests: {\n id: 'admin.channel_settings.channel_moderation.createPosts.disabledGuest',\n defaultMessage: 'Create posts for guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledMembers: {\n id: 'admin.channel_settings.channel_moderation.createPosts.disabledMember',\n defaultMessage: 'Create posts for members are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledBoth: {\n id: 'admin.channel_settings.channel_moderation.createPosts.disabledBoth',\n defaultMessage: 'Create posts for members and guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n });\n\n const postReactionsRowMessages = defineMessages({\n title: {\n id: 'admin.channel_settings.channel_moderation.postReactions',\n defaultMessage: 'Post Reactions',\n },\n description: {\n id: 'admin.channel_settings.channel_moderation.postReactionsDesc',\n defaultMessage: 'The ability for members and guests to post reactions.',\n },\n descriptionMembers: {\n id: 'admin.channel_settings.channel_moderation.postReactionsDescMembers',\n defaultMessage: 'The ability for members to post reactions.',\n },\n disabledGuests: {\n id: 'admin.channel_settings.channel_moderation.postReactions.disabledGuest',\n defaultMessage: 'Post reactions for guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledMembers: {\n id: 'admin.channel_settings.channel_moderation.postReactions.disabledMember',\n defaultMessage: 'Post reactions for members are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledBoth: {\n id: 'admin.channel_settings.channel_moderation.postReactions.disabledBoth',\n defaultMessage: 'Post reactions for members and guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n });\n\n const manageMembersRowMessages = defineMessages({\n title: {\n id: 'admin.channel_settings.channel_moderation.manageMembers',\n defaultMessage: 'Manage Members',\n },\n description: {\n id: 'admin.channel_settings.channel_moderation.manageMembersDesc',\n defaultMessage: 'The ability for members to add and remove people.',\n },\n disabledGuests: {\n id: 'admin.channel_settings.channel_moderation.manageMembers.disabledGuest',\n defaultMessage: 'Manage members for guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledMembers: {\n id: 'admin.channel_settings.channel_moderation.manageMembers.disabledMember',\n defaultMessage: 'Manage members for members are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledBoth: {\n id: 'admin.channel_settings.channel_moderation.manageMembers.disabledBoth',\n defaultMessage: 'Manage members for members and guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n });\n\n const channelMentionsRowMessages = defineMessages({\n title: {\n id: 'admin.channel_settings.channel_moderation.channelMentions',\n defaultMessage: 'Channel Mentions',\n },\n description: {\n id: 'admin.channel_settings.channel_moderation.channelMentionsDesc',\n defaultMessage: 'The ability for members and guests to use @all, @here and @channel.',\n },\n descriptionMembers: {\n id: 'admin.channel_settings.channel_moderation.channelMentionsDescMembers',\n defaultMessage: 'The ability for members to use @all, @here and @channel.',\n },\n disabledGuests: {\n id: 'admin.channel_settings.channel_moderation.channelMentions.disabledGuest',\n defaultMessage: 'Channel mentions for guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledMembers: {\n id: 'admin.channel_settings.channel_moderation.channelMentions.disabledMember',\n defaultMessage: 'Channel mentions for members are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledBoth: {\n id: 'admin.channel_settings.channel_moderation.channelMentions.disabledBoth',\n defaultMessage: 'Channel mentions for members and guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledGuestsDueToCreatePosts: {\n id: 'admin.channel_settings.channel_moderation.channelMentions.disabledGuestsDueToCreatePosts',\n defaultMessage: 'Guests can not use channel mentions without the ability to create posts.',\n },\n disabledMembersDueToCreatePosts: {\n id: 'admin.channel_settings.channel_moderation.channelMentions.disabledMemberDueToCreatePosts',\n defaultMessage: 'Members can not use channel mentions without the ability to create posts.',\n },\n disabledBothDueToCreatePosts: {\n id: 'admin.channel_settings.channel_moderation.channelMentions.disabledBothDueToCreatePosts',\n defaultMessage: 'Guests and members can not use channel mentions without the ability to create posts.',\n },\n });\n\n const manageBookmarksRowMessages = defineMessages({\n title: {\n id: 'admin.channel_settings.channel_moderation.manageBookmarks',\n defaultMessage: 'Manage Bookmarks',\n },\n description: {\n id: 'admin.channel_settings.channel_moderation.manageBookmarksDesc',\n defaultMessage: 'The ability for members and guests to add, delete and sort bookmarks.',\n },\n disabledGuests: {\n id: 'admin.channel_settings.channel_moderation.manageBookmarks.disabledGuest',\n defaultMessage: 'Manage bookmarks for guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledMembers: {\n id: 'admin.channel_settings.channel_moderation.manageBookmarks.disabledMember',\n defaultMessage: 'Manage bookmarks for members are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n disabledBoth: {\n id: 'admin.channel_settings.channel_moderation.manageBookmarks.disabledBoth',\n defaultMessage: 'Manage bookmarks for members and guests are disabled in [{scheme_name}](../permissions/{scheme_link}).',\n },\n });\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_POST) {\n return createPostRowMessages;\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_REACTIONS) {\n return postReactionsRowMessages;\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.MANAGE_MEMBERS) {\n return manageMembersRowMessages;\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS) {\n return channelMentionsRowMessages;\n }\n\n if (permission === Permissions.CHANNEL_MODERATED_PERMISSIONS.MANAGE_BOOKMARKS) {\n return manageBookmarksRowMessages;\n }\n\n return null;\n}\n\nconst channelModerationHeaderMessages = defineMessages({\n titleMessage: {\n id: 'admin.channel_settings.channel_moderation.title',\n defaultMessage: 'Advanced Access Control',\n },\n subtitleMessageForMembersAndGuests: {\n id: 'admin.channel_settings.channel_moderation.subtitle',\n defaultMessage: 'Manage the actions available to channel members and guests.',\n },\n subtitleMessageForMembers: {\n id: 'admin.channel_settings.channel_moderation.subtitleMembers',\n defaultMessage: 'Manage the actions available to channel members.',\n },\n});\n\ninterface ChannelModerationTableRow {\n name: string;\n guests?: boolean;\n members: boolean;\n guestsDisabled?: boolean;\n membersDisabled: boolean;\n onClick: (name: string, channelRole: ChannelModerationRoles) => void;\n errorMessages?: any;\n guestAccountsEnabled: boolean;\n readOnly?: boolean;\n}\n\nexport const ChannelModerationTableRow = (props: ChannelModerationTableRow) => {\n const channelModerationPermissionMessages = getChannelModerationRowsMessages(props.name);\n let descriptionId = channelModerationPermissionMessages?.description.id;\n let descriptionDefaultMessage = channelModerationPermissionMessages?.description.defaultMessage;\n if (!props.guestAccountsEnabled && channelModerationPermissionMessages?.descriptionMembers) {\n descriptionId = channelModerationPermissionMessages.descriptionMembers?.id ?? '';\n descriptionDefaultMessage = channelModerationPermissionMessages?.descriptionMembers?.defaultMessage ?? '';\n }\n return (\n <tr>\n <td>\n <div\n className='as-bs-label'\n data-testid={channelModerationPermissionMessages?.title?.id?.replace(PERIOD_TO_SLASH_REGEX, '-')}\n >\n <FormattedMessage\n id={channelModerationPermissionMessages?.title?.id}\n defaultMessage={channelModerationPermissionMessages?.title?.defaultMessage}\n />\n </div>\n <div\n data-testid={channelModerationPermissionMessages?.description?.id?.replace(PERIOD_TO_SLASH_REGEX, '-')}\n >\n <FormattedMessage\n id={descriptionId}\n defaultMessage={descriptionDefaultMessage}\n />\n </div>\n {props.errorMessages}\n </td>\n {props.guestAccountsEnabled &&\n <td>\n {!isNil(props.guests) &&\n <button\n type='button'\n data-testid={`${props.name}-${Roles.GUESTS}`}\n className={classNames(\n 'checkbox',\n {\n checked: props.guests && !props.guestsDisabled,\n disabled: props.guestsDisabled,\n },\n )}\n onClick={() => props.onClick(props.name, Roles.GUESTS as ChannelModerationRoles)}\n disabled={props.guestsDisabled || props.readOnly}\n >\n {props.guests && !props.guestsDisabled && <CheckboxCheckedIcon/>}\n </button>\n }\n </td>\n }\n <td>\n {!isNil(props.members) &&\n <button\n type='button'\n data-testid={`${props.name}-${Roles.MEMBERS}`}\n className={classNames(\n 'checkbox',\n {\n checked: props.members && !props.membersDisabled,\n disabled: props.membersDisabled,\n },\n )}\n onClick={() => props.onClick(props.name, Roles.MEMBERS as ChannelModerationRoles)}\n disabled={props.membersDisabled || props.readOnly}\n >\n {props.members && !props.membersDisabled && <CheckboxCheckedIcon/>}\n </button>\n }\n </td>\n </tr>\n );\n};\n\ninterface Props {\n channelPermissions?: ChannelPermissions[];\n onChannelPermissionsChanged: (name: string, channelRole: ChannelModerationRoles) => void;\n teamSchemeID?: string;\n teamSchemeDisplayName?: string;\n guestAccountsEnabled: boolean;\n isPublic: boolean;\n readOnly?: boolean;\n}\n\nexport default class ChannelModeration extends React.PureComponent<Props> {\n private errorMessagesToDisplay = (entry: ChannelPermissions): JSX.Element[] => {\n const channelModerationPermissionMessages = getChannelModerationRowsMessages(entry.name);\n\n const errorMessages: JSX.Element[] = [];\n const isGuestsDisabled = !isNil(entry.roles.guests?.enabled) && !entry.roles.guests?.enabled && this.props.guestAccountsEnabled;\n const isMembersDisabled = !entry.roles.members.enabled;\n let createPostsKey = '';\n if (entry.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS) {\n const createPostsObject = this.props.channelPermissions && this.props.channelPermissions!.find((permission) => permission.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_POST);\n if (!createPostsObject!.roles.guests!.value && this.props.guestAccountsEnabled && !createPostsObject!.roles.members!.value) {\n errorMessages.push(\n <div\n data-testid={channelModerationPermissionMessages?.disabledBothDueToCreatePosts?.id?.replace(PERIOD_TO_SLASH_REGEX, '-')}\n key={channelModerationPermissionMessages?.disabledBothDueToCreatePosts?.id}\n >\n <FormattedMessage\n id={channelModerationPermissionMessages?.disabledBothDueToCreatePosts?.id}\n defaultMessage={channelModerationPermissionMessages?.disabledBothDueToCreatePosts?.defaultMessage}\n />\n </div>,\n );\n return errorMessages;\n } else if (!createPostsObject!.roles.guests!.value && this.props.guestAccountsEnabled) {\n createPostsKey = 'disabledGuestsDueToCreatePosts';\n errorMessages.push(\n <div\n data-testid={channelModerationPermissionMessages?.disabledGuestsDueToCreatePosts?.id?.replace(PERIOD_TO_SLASH_REGEX, '-')}\n key={channelModerationPermissionMessages?.disabledGuestsDueToCreatePosts?.id}\n >\n <FormattedMessage\n id={channelModerationPermissionMessages?.disabledGuestsDueToCreatePosts?.id}\n defaultMessage={channelModerationPermissionMessages?.disabledGuestsDueToCreatePosts?.defaultMessage}\n />\n </div>,\n );\n } else if (!createPostsObject!.roles.members!.value) {\n createPostsKey = 'disabledMembersDueToCreatePosts';\n errorMessages.push(\n <div\n data-testid={channelModerationPermissionMessages?.disabledMembersDueToCreatePosts?.id?.replace(PERIOD_TO_SLASH_REGEX, '-')}\n key={channelModerationPermissionMessages?.disabledMembersDueToCreatePosts?.id}\n >\n <FormattedMessage\n id={channelModerationPermissionMessages?.disabledMembersDueToCreatePosts?.id}\n defaultMessage={channelModerationPermissionMessages?.disabledMembersDueToCreatePosts?.defaultMessage}\n />\n </div>,\n );\n }\n }\n\n let disabledKey;\n let disabledKeyId;\n let disabledKeyMessage;\n let schemeName = 'System Scheme';\n let schemeLink = 'system_scheme';\n\n if (this.props.teamSchemeID) {\n schemeName = this.props?.teamSchemeDisplayName + ' Team Scheme';\n schemeLink = `team_override_scheme/${this.props.teamSchemeID}`;\n }\n\n const permissionName = getChannelModerationPermissionNames(entry.name);\n\n if (isGuestsDisabled && isMembersDisabled && errorMessages.length <= 0) {\n disabledKey = 'disabledBoth';\n if (permissionName?.disabledBoth) {\n schemeLink += `?rowIdFromQuery=${permissionName.disabledBoth}`;\n if (schemeLink.includes('{public_or_private}')) {\n const publicOrPrivate = this.props.isPublic ? 'public' : 'private';\n schemeLink = schemeLink.replace('{public_or_private}', publicOrPrivate);\n }\n }\n disabledKeyId = channelModerationPermissionMessages?.disabledBoth?.id;\n disabledKeyMessage = channelModerationPermissionMessages?.disabledBoth?.defaultMessage;\n } else if (isGuestsDisabled && createPostsKey !== 'disabledGuestsDueToCreatePosts') {\n disabledKey = 'disabledGuests';\n if (permissionName?.disabledGuests) {\n schemeLink += `?rowIdFromQuery=${permissionName.disabledGuests}`;\n if (schemeLink.includes('{public_or_private}')) {\n const publicOrPrivate = this.props.isPublic ? 'public' : 'private';\n schemeLink = schemeLink.replace('{public_or_private}', publicOrPrivate);\n }\n }\n disabledKeyId = channelModerationPermissionMessages?.disabledGuests?.id;\n disabledKeyMessage = channelModerationPermissionMessages?.disabledGuests?.defaultMessage;\n } else if (isMembersDisabled && createPostsKey !== 'disabledMembersDueToCreatePosts') {\n disabledKey = 'disabledMembers';\n if (permissionName?.disabledMembers) {\n schemeLink += `?rowIdFromQuery=${permissionName.disabledMembers}`;\n if (schemeLink.includes('{public_or_private}')) {\n const publicOrPrivate = this.props.isPublic ? 'public' : 'private';\n schemeLink = schemeLink.replace('{public_or_private}', publicOrPrivate);\n }\n }\n disabledKeyId = channelModerationPermissionMessages?.disabledMembers?.id;\n disabledKeyMessage = channelModerationPermissionMessages?.disabledMembers?.defaultMessage;\n }\n\n if (schemeLink.includes('{public_or_private}')) {\n const publicOrPrivate = this.props.isPublic ? 'public' : 'private';\n schemeLink = schemeLink.replace('{public_or_private}', publicOrPrivate);\n }\n\n if (disabledKey) {\n errorMessages.push(\n <div\n data-testid={disabledKeyId?.replace(PERIOD_TO_SLASH_REGEX, '-')}\n key={disabledKeyId}\n >\n <FormattedMarkdownMessage\n id={disabledKeyId}\n defaultMessage={disabledKeyMessage as string}\n values={{\n scheme_name: schemeName,\n scheme_link: schemeLink,\n }}\n />\n </div>,\n );\n }\n return errorMessages;\n };\n\n render = (): JSX.Element => {\n const {channelPermissions, guestAccountsEnabled, onChannelPermissionsChanged, readOnly} = this.props;\n return (\n <AdminPanel\n id='channel_moderation'\n title={channelModerationHeaderMessages.titleMessage}\n subtitle={\n guestAccountsEnabled ?\n channelModerationHeaderMessages.subtitleMessageForMembersAndGuests :\n channelModerationHeaderMessages.subtitleMessageForMembers\n }\n >\n <div className='channel-moderation'>\n <div className='channel-moderation--body'>\n\n <table\n id='channel_moderation_table'\n className='channel-moderation--table'\n >\n <thead>\n <tr>\n <th>\n <FormattedMessage\n id='admin.channel_settings.channel_moderation.permissions'\n defaultMessage='Permissions'\n />\n </th>\n {guestAccountsEnabled &&\n <th>\n <FormattedMessage\n id='admin.channel_settings.channel_moderation.guests'\n defaultMessage='Guests'\n />\n </th>\n }\n <th>\n <FormattedMessage\n id='admin.channel_settings.channel_moderation.members'\n defaultMessage='Members'\n />\n </th>\n </tr>\n </thead>\n <tbody>\n {channelPermissions?.map((entry) => {\n return (\n <ChannelModerationTableRow\n key={entry.name}\n name={entry.name}\n guests={entry.roles.guests?.value}\n guestsDisabled={!entry.roles.guests?.enabled}\n members={entry.roles.members.value}\n membersDisabled={!entry.roles.members.enabled}\n onClick={onChannelPermissionsChanged}\n errorMessages={this.errorMessagesToDisplay(entry)}\n guestAccountsEnabled={guestAccountsEnabled}\n readOnly={readOnly}\n />\n );\n })}\n\n </tbody>\n </table>\n\n </div>\n </div>\n </AdminPanel>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport ExternalLink from 'components/external_link';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport LineSwitch from '../../line_switch';\n\ninterface Props {\n isPublic: boolean;\n isSynced: boolean;\n isDefault: boolean;\n onToggle: (isSynced: boolean, isPublic: boolean) => void;\n isDisabled?: boolean;\n groupsSupported?: boolean;\n}\n\nconst SyncGroupsToggle: React.SFC<Props> = (props: Props): JSX.Element => {\n const {isPublic, isSynced, isDefault, onToggle, isDisabled} = props;\n return (\n <LineSwitch\n id='syncGroupSwitch'\n disabled={isDisabled || isDefault}\n toggled={isSynced}\n last={isSynced}\n onToggle={() => {\n if (isDefault) {\n return;\n }\n onToggle(!isSynced, isPublic);\n }}\n title={(\n <FormattedMessage\n id='admin.channel_settings.channel_details.syncGroupMembers'\n defaultMessage='Sync Group Members'\n />\n )}\n subTitle={(\n <FormattedMessage\n id='admin.channel_settings.channel_details.syncGroupMembersDescr'\n defaultMessage='When enabled, adding and removing users from groups will add or remove them from this channel. The only way of inviting members to this channel is by adding the groups they belong to. <link>Learn More</link>'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://www.mattermost.com/pl/default-ldap-group-constrained-team-channel.html'\n location='channel_modes'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n )}\n />\n );\n};\n\nconst AllowAllToggle: React.SFC<Props> = (props: Props): JSX.Element | null => {\n const {isPublic, isSynced, isDefault, onToggle, isDisabled} = props;\n if (isSynced) {\n return null;\n }\n return (\n <LineSwitch\n id='allow-all-toggle'\n disabled={isDisabled || isDefault}\n toggled={isPublic}\n last={true}\n onToggle={() => {\n if (isDefault) {\n return;\n }\n onToggle(isSynced, !isPublic);\n }}\n title={(\n <FormattedMessage\n id='admin.channel_settings.channel_details.isPublic'\n defaultMessage='Public channel or private channel'\n />\n )}\n subTitle={isDefault ? (\n <FormattedMessage\n id='admin.channel_settings.channel_details.isDefaultDescr'\n defaultMessage='This default channel cannot be converted into a private channel.'\n />\n ) : (\n <FormattedMessage\n id='admin.channel_settings.channel_details.isPublicDescr'\n defaultMessage='Select Public for a channel any user can find and join. {br}Select Private to require channel invitations to join. {br}Use this switch to change this channel from public to private or from private to public.'\n values={{br: (<br/>)}}\n />\n )\n }\n onText={(\n <FormattedMessage\n id='channel_toggle_button.public'\n defaultMessage='Public'\n />\n )}\n offText={(\n <FormattedMessage\n id='channel_toggle_button.private'\n defaultMessage='Private'\n />\n )}\n />\n );\n};\n\nexport const ChannelModes: React.SFC<Props> = (props: Props): JSX.Element => {\n const {isPublic, isSynced, isDefault, onToggle, isDisabled, groupsSupported} = props;\n return (\n <AdminPanel\n id='channel_manage'\n title={defineMessage({id: 'admin.channel_settings.channel_detail.manageTitle', defaultMessage: 'Channel Management'})}\n subtitle={defineMessage({id: 'admin.channel_settings.channel_detail.manageDescription', defaultMessage: 'Choose between inviting members manually or syncing members automatically from groups.'})}\n >\n <div className='group-teams-and-channels'>\n <div className='group-teams-and-channels--body'>\n {groupsSupported &&\n <SyncGroupsToggle\n isPublic={isPublic}\n isSynced={isSynced}\n isDefault={isDefault}\n onToggle={onToggle}\n isDisabled={isDisabled}\n /> }\n <AllowAllToggle\n isPublic={isPublic}\n isSynced={isSynced}\n isDefault={isDefault}\n onToggle={onToggle}\n isDisabled={isDisabled}\n />\n </div>\n </div>\n </AdminPanel>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Team} from '@mattermost/types/teams';\n\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport './channel_profile.scss';\ninterface ChannelProfileProps {\n channel: Partial<Channel>;\n team?: Team;\n onToggleArchive?: () => void;\n isArchived: boolean;\n isDisabled?: boolean;\n}\n\nexport const ChannelProfile = (props: ChannelProfileProps): JSX.Element => {\n const {team, channel, isArchived, isDisabled} = props;\n\n const archiveBtn = isArchived ?\n defineMessage({id: 'admin.channel_settings.channel_details.unarchiveChannel', defaultMessage: 'Unarchive Channel'}) :\n defineMessage({id: 'admin.channel_settings.channel_details.archiveChannel', defaultMessage: 'Archive Channel'});\n\n let sharedBlock;\n if (channel.shared && channel.type) {\n sharedBlock = (\n <div className='channel-organizations'>\n <b>\n <FormattedMessage\n id='admin.channelSettings.channelDetail.channel_organizations'\n defaultMessage='Organizations'\n />\n </b>\n <br/>\n <SharedChannelIndicator\n className='shared-channel-icon'\n />\n <FormattedMessage\n id='admin.channel_settings.channel_detail.channelOrganizationsMessage'\n defaultMessage='Shared with trusted organizations'\n />\n </div>\n );\n }\n\n return (\n <AdminPanel\n id='channel_profile'\n title={defineMessage({id: 'admin.channel_settings.channel_detail.profileTitle', defaultMessage: 'Channel Profile'})}\n subtitle={defineMessage({id: 'admin.channel_settings.channel_detail.profileDescription', defaultMessage: 'Summary of the channel, including the channel name.'})}\n >\n <div className='group-teams-and-channels AdminChannelDetails'>\n <div className='group-teams-and-channels--body channel-desc-col'>\n <div className='channel-name'>\n <b>\n <FormattedMessage\n id='admin.channelSettings.channelDetail.channelName'\n defaultMessage='Name'\n />\n </b>\n <br/>\n {channel.display_name}\n </div>\n <div className='channel-team'>\n <b>\n <FormattedMessage\n id='admin.channelSettings.channelDetail.channelTeam'\n defaultMessage='Team'\n />\n </b>\n <br/>\n {team?.display_name}\n </div>\n {sharedBlock}\n <div className='AdminChannelDetails_archiveContainer'>\n <button\n type='button'\n className={\n classNames(\n 'btn',\n 'btn-secondary',\n {'btn-danger': !isArchived},\n {disabled: isDisabled},\n )\n }\n onClick={props.onToggleArchive}\n >\n {isArchived ?\n <i className='icon icon-archive-arrow-up-outline'/> :\n <i className='icon icon-archive-outline'/>}\n <FormattedMessage {...archiveBtn}/>\n </button>\n </div>\n </div>\n </div>\n </AdminPanel>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport ConfirmModal from 'components/confirm_modal';\n\ntype Props = {\n\n /*\n * Bool whether the modal is shown\n */\n show: boolean;\n\n /*\n * Action to call on confirm\n */\n onConfirm: (checked: boolean) => void;\n\n /*\n * Action to call on cancel\n */\n onCancel: (checked: boolean) => void;\n\n /*\n * Channel display name\n */\n displayName: string;\n\n /*\n * Channel privacy setting\n */\n toPublic: boolean;\n\n /*\n * Number of users to be removed\n */\n removeAmount: number;\n};\n\nconst ConvertAndRemoveConfirmModal = ({\n show,\n onConfirm,\n onCancel,\n displayName,\n toPublic,\n removeAmount,\n}: Props) => {\n const titleMessage = toPublic ?\n messages.toPublicTitle :\n messages.toPrivateTitle;\n\n const convertMessage = toPublic ?\n messages.toPublicMessage :\n messages.toPrivateMessage;\n\n const convertMessageSecondLine = toPublic ?\n messages.toPublicMessageSecondLine :\n messages.toPrivateMessageSecondLine;\n\n const confirmMessage = toPublic ?\n messages.toPublicConfirm :\n messages.toPrivateConfirm;\n\n const title = (\n <FormattedMessage\n {...titleMessage}\n values={{amount: removeAmount}}\n />\n );\n\n const message = (\n <>\n <p>\n <FormattedMessage\n {...convertMessage}\n values={{\n displayName: <strong>{displayName}</strong>,\n }}\n />\n </p>\n <p>\n <FormattedMessage\n {...convertMessageSecondLine}\n values={{\n displayName: <strong>{displayName}</strong>,\n }}\n />\n </p>\n <p>\n <FormattedMessage\n id='admin.team_channel_settings.removeConfirmModal.messageChannelFirstLine'\n defaultMessage='{amount, number} {amount, plural, one {user} other {users}} will be removed. They are not in groups linked to this channel.'\n values={{amount: removeAmount}}\n />\n </p>\n <p>\n <FormattedMessage\n id='admin.team_channel_settings.removeConfirmModal.messageChannelSecondLine'\n defaultMessage='Are you sure you wish to remove these users?'\n />\n </p>\n </>\n );\n\n const confirmButton = (\n <FormattedMessage\n {...confirmMessage}\n values={{amount: removeAmount}}\n />\n );\n\n const cancelButton = (\n <FormattedMessage\n id='admin.team_channel_settings.convertAndRemoveConfirmModal.cancel'\n defaultMessage='No, cancel'\n />\n );\n\n const modalClass = 'discard-changes-modal';\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n modalClass={modalClass}\n confirmButtonClass={'btn btn-primary'}\n confirmButtonText={confirmButton}\n cancelButtonText={cancelButton}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n );\n};\n\nconst messages = defineMessages({\n toPrivateConfirm: {\n id: 'admin.team_channel_settings.convertAndRemoveConfirmModal.toPrivateConfirm',\n defaultMessage:\n 'Yes, convert channel to private and remove {amount, number} {amount, plural, one {user} other {users}}',\n },\n toPrivateMessage: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPrivateMessageFirstLine',\n defaultMessage:\n 'When you convert {displayName} to a private channel, history and membership are preserved. Publicly shared files remain accessible to anyone with the link. Membership in a private channel is by invitation only.',\n },\n toPrivateMessageSecondLine: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPrivateMessageSecondLine',\n defaultMessage:\n 'Are you sure you want to convert {displayName} to a private channel?',\n },\n toPrivateTitle: {\n id: 'admin.team_channel_settings.convertAndRemoveConfirmModal.toPrivateTitle',\n defaultMessage:\n 'Convert channel to private and remove {amount, number} {amount, plural, one {user} other {users}}?',\n },\n toPublicConfirm: {\n id: 'admin.team_channel_settings.convertAndRemoveConfirmModal.toPublicConfirm',\n defaultMessage:\n 'Yes, convert channel to public and remove {amount, number} {amount, plural, one {user} other {users}}',\n },\n toPublicMessage: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPublicMessageFirstLine',\n defaultMessage:\n 'When you convert {displayName} to a public channel, history and membership are preserved. Public channels are discoverable and can be joined by users on the system without invitation.',\n },\n toPublicMessageSecondLine: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPublicMessageSecondLine',\n defaultMessage:\n 'Are you sure you want to convert {displayName} to a public channel?',\n },\n toPublicTitle: {\n id: 'admin.team_channel_settings.convertAndRemoveConfirmModal.toPublicTitle',\n defaultMessage:\n 'Convert channel to public and remove {amount, number} {amount, plural, one {user} other {users}}?',\n },\n});\n\nexport default ConvertAndRemoveConfirmModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport ConfirmModal from 'components/confirm_modal';\n\ntype Props = {\n\n /*\n * Bool whether the modal is shown\n */\n show: boolean;\n\n /*\n * Action to call on confirm\n */\n onConfirm: (checked: boolean) => void;\n\n /*\n * Action to call on cancel\n */\n onCancel: (checked: boolean) => void;\n\n /*\n * Channel display name\n */\n displayName: string;\n\n /*\n * Channel privacy setting\n */\n toPublic: boolean;\n};\n\nconst ConvertConfirmModal = ({show, onConfirm, onCancel, displayName, toPublic}: Props) => {\n let titleMessage;\n let convertMessage;\n let confirmMessage;\n let convertConfirmationMessage;\n if (toPublic) {\n titleMessage = messages.toPublicTitle;\n convertMessage = messages.toPublicMessage;\n confirmMessage = messages.toPublicConfirm;\n convertConfirmationMessage = messages.toPublicMessageConfirmation;\n } else {\n titleMessage = messages.toPrivateTitle;\n convertMessage = messages.toPrivateMessage;\n confirmMessage = messages.toPrivateConfirm;\n convertConfirmationMessage = messages.toPrivateMessageConfirmation;\n }\n\n const title = (\n <FormattedMessage\n {...titleMessage}\n values={{displayName}}\n />\n );\n\n const message = (\n <>\n <p>\n <FormattedMessage\n {...convertMessage}\n values={{displayName: <strong>{displayName}</strong>}}\n />\n </p>\n <p>\n <FormattedMessage\n {...convertConfirmationMessage}\n values={{displayName: <strong>{displayName}</strong>}}\n />\n </p>\n </>\n );\n\n const confirmButton = (\n <FormattedMessage\n {...confirmMessage}\n />\n );\n\n const cancelButton = (\n <FormattedMessage\n id='admin.team_channel_settings.convertConfirmModal.cancel'\n defaultMessage='No, cancel'\n />\n );\n\n const modalClass = 'discard-changes-modal';\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n modalClass={modalClass}\n confirmButtonClass={'btn btn-primary'}\n confirmButtonText={confirmButton}\n cancelButtonText={cancelButton}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n );\n};\n\nconst messages = defineMessages({\n toPrivateConfirm: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPrivateConfirm',\n defaultMessage: 'Yes, convert to private channel',\n },\n toPrivateMessage: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPrivateMessageFirstLine',\n defaultMessage: 'When you convert {displayName} to a private channel, history and membership are preserved. Publicly shared files remain accessible to anyone with the link. Membership in a private channel is by invitation only.',\n },\n toPrivateMessageConfirmation: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPrivateMessageSecondLine',\n defaultMessage: 'Are you sure you want to convert {displayName} to a private channel?',\n },\n toPrivateTitle: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPrivateTitle',\n defaultMessage: 'Convert {displayName} to a private channel?',\n },\n toPublicConfirm: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPublicConfirm',\n defaultMessage: 'Yes, convert to public channel',\n },\n toPublicMessage: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPublicMessageFirstLine',\n defaultMessage: 'When you convert {displayName} to a public channel, history and membership are preserved. Public channels are discoverable and can be joined by users on the system without invitation.',\n },\n toPublicMessageConfirmation: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPublicMessageSecondLine',\n defaultMessage: 'Are you sure you want to convert {displayName} to a public channel?',\n },\n toPublicTitle: {\n id: 'admin.team_channel_settings.convertConfirmModal.toPublicTitle',\n defaultMessage: 'Convert {displayName} to a public channel?',\n },\n});\n\nexport default ConvertConfirmModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport WithTooltip from 'components/with_tooltip';\n\ntype ProfileWithGroups = Partial<UserProfile & {\n groups: Array<Partial<Group>>;\n}>;\n\ninterface UsersToRemoveGroupsProps {\n user: ProfileWithGroups;\n}\n\nexport default function UsersToRemoveGroups(props: UsersToRemoveGroupsProps): JSX.Element {\n const {user} = props;\n const groups = user.groups || [];\n let column: JSX.Element | string;\n\n const message = (\n <FormattedMessage\n id={'team_channel_settings.group.group_user_row.numberOfGroups'}\n defaultMessage={'{amount, number} {amount, plural, one {Group} other {Groups}}'}\n values={{amount: groups.length}}\n />\n );\n\n if ((groups).length === 1) {\n column = String(groups[0].display_name);\n } else if (groups.length === 0) {\n column = message;\n } else {\n const tooltip = groups.map((g) => g.display_name).join(', ');\n\n column = (\n <WithTooltip\n title={tooltip}\n >\n <a href='#'>{message}</a>\n </WithTooltip>\n );\n }\n\n return (\n <div className='UsersToRemoveGroups'>\n {column}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {ChannelMembership} from '@mattermost/types/channels';\nimport type {Group} from '@mattermost/types/groups';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\ntype ProfileWithGroups = Partial<UserProfile & {\n groups: Array<Partial<Group>>;\n}>;\n\ninterface GroupUsersRoleProps {\n user: ProfileWithGroups;\n membership: TeamMembership | ChannelMembership;\n scope: 'team' | 'channel';\n}\n\nexport default function UsersToRemoveRole(props: GroupUsersRoleProps) {\n const intl = useIntl();\n const {user, membership, scope} = props;\n\n let role = 'guest';\n if (user.roles?.includes('system_admin')) {\n role = 'system_admin';\n } else if (membership) {\n if (scope === 'team') {\n if (membership.scheme_admin) {\n role = 'team_admin';\n } else if (membership.scheme_user) {\n role = 'team_user';\n }\n }\n\n if (scope === 'channel') {\n if (membership.scheme_admin) {\n role = 'channel_admin';\n } else if (membership.scheme_user) {\n role = 'channel_user';\n }\n }\n }\n\n let localizedRole;\n switch (role) {\n case 'system_admin':\n localizedRole = intl.formatMessage({id: 'admin.user_grid.system_admin', defaultMessage: 'System Admin'});\n break;\n\n case 'team_admin':\n localizedRole = intl.formatMessage({id: 'admin.user_grid.team_admin', defaultMessage: 'Team Admin'});\n break;\n\n case 'channel_admin':\n localizedRole = intl.formatMessage({id: 'admin.user_grid.channel_admin', defaultMessage: 'Channel Admin'});\n break;\n\n case 'team_user':\n case 'channel_user':\n localizedRole = intl.formatMessage({id: 'admin.group_teams_and_channels_row.member', defaultMessage: 'Member'});\n break;\n\n default:\n localizedRole = intl.formatMessage({id: 'admin.user_grid.guest', defaultMessage: 'Guest'});\n }\n\n return (\n <div className='UsersToRemoveRole'>\n {localizedRole}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport GeneralConstants from 'mattermost-redux/constants/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Row, Column} from 'components/admin_console/data_grid/data_grid';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport UserGridName from 'components/admin_console/user_grid/user_grid_name';\n\nimport UsersToRemoveGroups from './users_to_remove_groups';\nimport GroupUsersRole from './users_to_remove_role';\n\nimport './users_to_remove.scss';\n\nconst GROUP_MEMBERS_PAGE_SIZE = 10;\n\nexport type Filters = {\n roles?: string[];\n channel_roles?: string[];\n team_roles?: string[];\n}\n\nexport type Memberships = RelationOneToOne<UserProfile, TeamMembership> | RelationOneToOne<UserProfile, ChannelMembership>;\n\nexport interface Props {\n members: UserProfile[];\n memberships: Memberships;\n total: number;\n searchTerm: string;\n scope: 'team' | 'channel';\n scopeId: string;\n enableGuestAccounts: boolean;\n filters: Filters;\n actions: {\n loadTeamMembersForProfilesList: (profiles: UserProfile[], teamId: string) => Promise<ActionResult>;\n loadChannelMembersForProfilesList: (profiles: UserProfile[], channelId: string) => Promise<ActionResult>;\n setModalSearchTerm: (term: string) => ActionResult;\n setModalFilters: (filters: Filters) => ActionResult;\n };\n}\n\ninterface State {\n page: number;\n loading: boolean;\n}\n\nexport default class UsersToRemove extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n page: 0,\n loading: true,\n };\n }\n\n async componentDidMount() {\n const {members, total} = this.props;\n const MEMBERSHIPS_TO_LOAD_COUNT = 100;\n const promises = [];\n let membershipsLoaded = 0;\n\n // Pre-load all memberships since users are also already loaded into the state\n while (membershipsLoaded < total) {\n promises.push(this.loadMembersForProfilesList(members.slice(membershipsLoaded, membershipsLoaded + MEMBERSHIPS_TO_LOAD_COUNT)));\n membershipsLoaded += MEMBERSHIPS_TO_LOAD_COUNT;\n }\n await Promise.all(promises);\n this.setStateLoading(false);\n }\n\n setStateLoading = (loading: boolean) => {\n this.setState({loading});\n };\n\n componentWillUnmount() {\n this.props.actions.setModalSearchTerm('');\n this.props.actions.setModalFilters({});\n }\n\n loadMembersForProfilesList = async (profiles: UserProfile[]) => {\n const {loadChannelMembersForProfilesList, loadTeamMembersForProfilesList} = this.props.actions;\n const {scope, scopeId} = this.props;\n if (scope === 'channel') {\n await loadChannelMembersForProfilesList(profiles, scopeId);\n } else if (scope === 'team') {\n await loadTeamMembersForProfilesList(profiles, scopeId);\n }\n };\n\n previousPage = async () => {\n const page = this.state.page < 1 ? 0 : this.state.page - 1;\n this.setState({page});\n };\n\n nextPage = async () => {\n const {total} = this.props;\n const page = (this.state.page + 1) * GROUP_MEMBERS_PAGE_SIZE >= total ? this.state.page : this.state.page + 1;\n this.setState({page});\n };\n\n onSearch = (term: string) => {\n this.props.actions.setModalSearchTerm(term);\n this.setState({page: 0});\n };\n\n private onFilter = async (filterOptions: FilterOptions) => {\n const roles = filterOptions.role.values;\n const systemRoles: string[] = [];\n const teamRoles: string[] = [];\n const channelRoles: string[] = [];\n let filters = {};\n Object.keys(roles).forEach((filterKey: string) => {\n if (roles[filterKey].value) {\n if (filterKey.includes('team')) {\n teamRoles.push(filterKey);\n } else if (filterKey.includes('channel')) {\n channelRoles.push(filterKey);\n } else {\n systemRoles.push(filterKey);\n }\n }\n });\n\n if (systemRoles.length > 0 || teamRoles.length > 0 || channelRoles.length > 0) {\n if (systemRoles.length > 0) {\n filters = {roles: systemRoles};\n }\n if (teamRoles.length > 0) {\n filters = {...filters, team_roles: teamRoles};\n }\n if (channelRoles.length > 0) {\n filters = {...filters, channel_roles: channelRoles};\n }\n }\n this.props.actions.setModalFilters(filters);\n this.setState({page: 0});\n };\n\n private getPaginationProps = () => {\n const {page} = this.state;\n const startCount = (page * GROUP_MEMBERS_PAGE_SIZE) + 1;\n let endCount = (page * GROUP_MEMBERS_PAGE_SIZE) + GROUP_MEMBERS_PAGE_SIZE;\n const total = this.props.total;\n if (endCount > total) {\n endCount = total;\n }\n const lastPage = endCount === total;\n const firstPage = page === 0;\n\n return {startCount, endCount, page, lastPage, firstPage, total};\n };\n\n private getRows = (): Row[] => {\n const {members, memberships, scope} = this.props;\n const {startCount, endCount} = this.getPaginationProps();\n\n let usersToDisplay = members;\n usersToDisplay = usersToDisplay.slice(startCount - 1, endCount);\n\n if (this.state.loading) {\n return [];\n }\n\n return usersToDisplay.map((user) => {\n return {\n cells: {\n id: user.id,\n name: (\n <UserGridName\n key={user.id}\n user={user}\n />\n ),\n role: (\n <GroupUsersRole\n key={user.id}\n user={user}\n membership={memberships[user.id]}\n scope={scope}\n />\n ),\n groups: (\n <UsersToRemoveGroups\n key={user.id}\n user={user}\n />\n ),\n },\n };\n });\n };\n\n private getColumns = (): Column[] => {\n return [\n {\n name: (\n <FormattedMessage\n id='admin.team_channel_settings.user_list.nameHeader'\n defaultMessage='Name'\n />\n ),\n field: 'name',\n width: 5,\n },\n {\n name: (\n <FormattedMessage\n id='admin.team_channel_settings.user_list.roleHeader'\n defaultMessage='Role'\n />\n ),\n field: 'role',\n width: 2,\n },\n {\n name: (\n <FormattedMessage\n id='admin.team_channel_settings.user_list.groupsHeader'\n defaultMessage='Groups'\n />\n ),\n field: 'groups',\n width: 3,\n },\n ];\n };\n\n private getFilterOptions = (): FilterOptions => {\n const filterOptions: FilterOptions = {\n role: {\n name: (\n <FormattedMessage\n id='admin.user_grid.role'\n defaultMessage='Role'\n />\n ),\n values: {\n [GeneralConstants.SYSTEM_GUEST_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.guest'\n defaultMessage='Guest'\n />\n ),\n value: false,\n },\n [GeneralConstants.SYSTEM_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.system_admin'\n defaultMessage='System Admin'\n />\n ),\n value: false,\n },\n },\n keys: [GeneralConstants.SYSTEM_GUEST_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE],\n },\n };\n\n if (this.props.scope === 'channel') {\n filterOptions.role.values = {\n ...filterOptions.role.values,\n [GeneralConstants.CHANNEL_USER_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_item.member'\n defaultMessage='Member'\n />\n ),\n value: false,\n },\n [GeneralConstants.CHANNEL_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.channel_admin'\n defaultMessage='Channel Admin'\n />\n ),\n value: false,\n },\n };\n filterOptions.role.keys = [GeneralConstants.SYSTEM_GUEST_ROLE, GeneralConstants.CHANNEL_USER_ROLE, GeneralConstants.CHANNEL_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE];\n } else if (this.props.scope === 'team') {\n filterOptions.role.values = {\n ...filterOptions.role.values,\n [GeneralConstants.TEAM_USER_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_item.member'\n defaultMessage='Member'\n />\n ),\n value: false,\n },\n [GeneralConstants.TEAM_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.team_admin'\n defaultMessage='Team Admin'\n />\n ),\n value: false,\n },\n };\n filterOptions.role.keys = [GeneralConstants.SYSTEM_GUEST_ROLE, GeneralConstants.TEAM_USER_ROLE, GeneralConstants.TEAM_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE];\n }\n\n if (!this.props.enableGuestAccounts) {\n delete filterOptions.role.values[GeneralConstants.SYSTEM_GUEST_ROLE];\n filterOptions.role.keys.splice(0, 1);\n }\n\n return filterOptions;\n };\n\n public render = (): JSX.Element => {\n const rows: Row[] = this.getRows();\n const columns: Column[] = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n const options = this.getFilterOptions();\n const keys = ['role'];\n\n const placeholderEmpty: JSX.Element = (\n <FormattedMessage\n id='admin.member_list_group.notFound'\n defaultMessage='No users found'\n />\n );\n\n return (\n <div className='UsersToRemove'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n onSearch={this.onSearch}\n filterProps={{options, keys, onFilter: this.onFilter}}\n term={this.props.searchTerm || ''}\n placeholderEmpty={placeholderEmpty}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getChannelMembersInChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getMembersInTeams} from 'mattermost-redux/selectors/entities/teams';\nimport {filterProfiles} from 'mattermost-redux/selectors/entities/users';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {filterProfilesStartingWithTerm, profileListToMap} from 'mattermost-redux/utils/user_utils';\n\nimport {loadChannelMembersForProfilesList, loadTeamMembersForProfilesList} from 'actions/user_actions';\nimport {setModalSearchTerm, setModalFilters} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport UsersToRemove from './users_to_remove';\nimport type {Filters, Memberships} from './users_to_remove';\n\ntype Props = {\n members: UserProfile[];\n scope: 'team' | 'channel';\n scopeId: string;\n total: number;\n};\n\nfunction makeMapStateToProps() {\n const searchUsers = memoizeResult((users: UserProfile[], term: string, filters: Filters, memberships: Memberships) => {\n let profiles = users;\n if (term !== '') {\n profiles = filterProfilesStartingWithTerm(users, term);\n }\n\n if (Object.keys(filters).length > 0) {\n const filteredProfilesMap = filterProfiles(profileListToMap(profiles), filters, memberships);\n profiles = Object.keys(filteredProfilesMap).map((key) => filteredProfilesMap[key]);\n }\n\n return profiles;\n });\n\n return (state: GlobalState, props: Props) => {\n const {scope, scopeId} = props;\n let {members, total} = props;\n\n const searchTerm = state.views.search.modalSearch || '';\n const filters = state.views.search.modalFilters || {};\n\n let memberships = {};\n if (scope === 'channel') {\n memberships = getChannelMembersInChannels(state)[scopeId] || {};\n } else if (scope === 'team') {\n memberships = getMembersInTeams(state)[scopeId] || {};\n }\n\n if (searchTerm || Object.keys(filters).length > 0) {\n members = searchUsers(members, searchTerm, filters, memberships);\n total = members.length;\n }\n\n const enableGuestAccounts = getConfig(state)?.EnableGuestAccounts === 'true';\n\n return {\n ...props,\n members,\n total,\n searchTerm,\n scope,\n memberships,\n enableGuestAccounts,\n filters,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadChannelMembersForProfilesList,\n loadTeamMembersForProfilesList,\n setModalSearchTerm,\n setModalFilters,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(UsersToRemove);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport GroupsUsers from './group/group_users';\n\ntype Props = {\n\n /*\n * Number of users to be removed\n */\n total: number;\n\n /*\n * Scope that the users are to be removed from\n * can be either 'team' or 'channel'\n */\n scope: 'team' | 'channel';\n\n /*\n * Id of the scope that the users are to be removed from\n * can be either a Team ID or a Channel ID\n */\n scopeId: string;\n\n /*\n * users to be removed\n */\n users: UserProfile[];\n\n onExited?: () => void;\n};\n\nconst UsersToBeRemovedModal = ({total, scope, scopeId, users, onExited}: Props) => {\n const [show, setShow] = useState(true);\n\n const handleHide = useCallback(() => setShow(false), []);\n\n const title = (\n <FormattedMessage\n id='admin.teamChannelSettings.usersToBeRemovedModal.title'\n defaultMessage='<b>{total, number} {total, plural, one {User} other {Users}}</b> To Be Removed'\n values={{\n total,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n\n let message = (\n <FormattedMessage\n id='admin.team_channel_settings.usersToBeRemovedModal.message'\n defaultMessage='The members listed below are not in any of the groups currently linked to this team. Because this team is set to be managed by group sync they will all be removed once saved.'\n />\n );\n\n if (scope === 'channel') {\n message = (\n <FormattedMessage\n id='admin.team_channel_settings.usersToBeRemovedModal.channel_message'\n defaultMessage='The members listed below are not in any of the groups currently linked to this channel. Because this channel is set to be managed by group sync they will all be removed once saved.'\n />\n );\n }\n\n const button = (\n <FormattedMessage\n id='admin.team_channel_settings.usersToBeRemovedModal.close'\n defaultMessage='Close'\n />\n );\n\n return (\n <Modal\n dialogClassName='a11y__modal settings-modal'\n show={show}\n onHide={handleHide}\n onExited={onExited}\n id='confirmModal'\n role='none'\n aria-labelledby='confirmModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='confirmModalLabel'\n >\n {title}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className='group-users-to-remove-modal-description'>{message}</div>\n <GroupsUsers\n members={users}\n total={total}\n scope={scope}\n scopeId={scopeId}\n />\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n autoFocus={true}\n className='btn btn-primary'\n onClick={handleHide}\n id='closeModalButton'\n >\n {button}\n </button>\n </Modal.Footer>\n </Modal>\n );\n};\n\nexport default UsersToBeRemovedModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport FormError from 'components/form_error';\nimport ToggleModalButton from 'components/toggle_modal_button';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport UsersToBeRemovedModal from './users_to_be_removed_modal';\n\ntype NeedGroupsErrorProps = {\n warning?: boolean;\n isChannel?: boolean;\n};\n\nexport const NeedGroupsError = ({warning, isChannel = false}: NeedGroupsErrorProps) => {\n let error = (\n <FormattedMessage\n id='admin.team_channel_settings.need_groups'\n defaultMessage='You must add at least one group to manage this team by sync group members.'\n />\n );\n\n if (isChannel) {\n error = (\n <FormattedMessage\n id='admin.team_channel_settings.need_groups_channel'\n defaultMessage='You must add at least one group to manage this channel by sync group members.'\n />\n );\n }\n\n return (\n <FormError\n iconClassName={`fa-exclamation-${warning ? 'circle' : 'triangle'}`}\n textClassName={`has-${warning ? 'warning' : 'error'}`}\n error={error}\n />\n );\n};\n\nexport const NeedDomainsError = () => (\n <FormError\n error={(\n <FormattedMessage\n id='admin.team_channel_settings.need_domains'\n defaultMessage='Please specify allowed email domains.'\n />)}\n />\n);\n\ntype UsersWillBeRemovedProps = {\n users: UserProfile[];\n total: number;\n scope: string;\n scopeId: string;\n}\n\nexport const UsersWillBeRemovedError = ({users, total, scope, scopeId}: UsersWillBeRemovedProps) => {\n let error = (\n <FormattedMessage\n id='admin.team_channel_settings.users_will_be_removed'\n defaultMessage='{amount, number} {amount, plural, one {User} other {Users}} will be removed from this team. They are not in groups linked to this team.'\n values={{amount: total}}\n />\n );\n\n if (scope === 'channel') {\n error = (\n <FormattedMessage\n id='admin.team_channel_settings.channel_users_will_be_removed'\n defaultMessage='{amount, number} {amount, plural, one {User} other {Users}} will be removed from this channel. They are not in groups linked to this channel.'\n values={{amount: total}}\n />\n );\n }\n\n return (\n <FormError\n iconClassName='fa-exclamation-triangle'\n textClassName='has-warning'\n error={(\n <span>\n {error}\n <ToggleModalButton\n className='btn btn-tertiary'\n modalId={ModalIdentifiers.USERS_TO_BE_REMOVED}\n dialogType={UsersToBeRemovedModal}\n dialogProps={{total, users, scope, scopeId}}\n >\n <FormattedMessage\n id='admin.team_channel_settings.view_removed_users'\n defaultMessage='View These Users'\n />\n </ToggleModalButton>\n </span>\n )}\n />\n\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ConfirmModal from 'components/confirm_modal';\n\ntype Props = {\n\n /*\n * Bool whether the modal is shown\n */\n show: boolean;\n\n /*\n * Action to call on confirm\n */\n onConfirm: (checked: boolean) => void;\n\n /*\n * Action to call on cancel\n */\n onCancel: (checked: boolean) => void;\n\n /*\n * Indicates if the message is for removal from channel or team\n */\n inChannel: boolean;\n\n /*\n * Number of users to be removed\n */\n amount: number;\n};\n\nconst RemoveConfirmModal = ({show, onConfirm, onCancel, inChannel, amount}: Props) => {\n const title = (\n <FormattedMessage\n id='admin.team_channel_settings.removeConfirmModal.title'\n defaultMessage='Save and remove {amount, number} {amount, plural, one {user} other {users}}?'\n values={{amount}}\n />\n );\n\n let message;\n if (inChannel) {\n message = (\n <FormattedMessage\n id='admin.team_channel_settings.removeConfirmModal.messageChannel'\n defaultMessage='{amount, number} {amount, plural, one {user} other {users}} will be removed. They are not in groups linked to this channel. Are you sure you wish to remove {amount, plural, one {this user} other {these users}}?'\n values={{amount}}\n />\n );\n } else {\n message = (\n <FormattedMessage\n id='admin.team_channel_settings.removeConfirmModal.messageTeam'\n defaultMessage='{amount, number} {amount, plural, one {user} other {users}} will be removed. They are not in groups linked to this team. Are you sure you wish to remove {amount, plural, one {this user} other {these users}}?'\n values={{amount}}\n />\n );\n }\n\n const buttonClass = 'btn btn-primary';\n const button = (\n <FormattedMessage\n id='admin.team_channel_settings.removeConfirmModal.remove'\n defaultMessage='Save and remove {amount, plural, one {user} other {users}}'\n values={{amount}}\n />\n );\n\n const modalClass = 'discard-changes-modal';\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n modalClass={modalClass}\n confirmButtonClass={buttonClass}\n confirmButtonText={button}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n );\n};\n\nexport default RemoveConfirmModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport cloneDeep from 'lodash/cloneDeep';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel, ChannelModeration as ChannelPermissions, ChannelModerationPatch} from '@mattermost/types/channels';\nimport {SyncableType} from '@mattermost/types/groups';\nimport type {SyncablePatch, Group} from '@mattermost/types/groups';\nimport type {Scheme} from '@mattermost/types/schemes';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport ConfirmModal from 'components/confirm_modal';\nimport FormError from 'components/form_error';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\n\nimport {ChannelGroups} from './channel_groups';\nimport ChannelMembers from './channel_members';\nimport ChannelModeration from './channel_moderation';\nimport {ChannelModes} from './channel_modes';\nimport {ChannelProfile} from './channel_profile';\nimport type {ChannelModerationRoles} from './types';\n\nimport SaveChangesPanel from '../../../save_changes_panel';\nimport ConvertAndRemoveConfirmModal from '../../convert_and_remove_confirm_modal';\nimport ConvertConfirmModal from '../../convert_confirm_modal';\nimport {NeedGroupsError, UsersWillBeRemovedError} from '../../errors';\nimport RemoveConfirmModal from '../../remove_confirm_modal';\n\nexport interface ChannelDetailsProps {\n channelID: string;\n channel?: Channel;\n team?: Team;\n groups: Group[];\n totalGroups: number;\n allGroups: Record<string, Group>;\n channelPermissions: ChannelPermissions[];\n teamScheme?: Scheme;\n guestAccountsEnabled: boolean;\n channelModerationEnabled: boolean;\n channelGroupsEnabled: boolean;\n isDisabled?: boolean;\n actions: ChannelDetailsActions;\n}\n\ninterface ChannelDetailsState {\n isSynced: boolean;\n isPublic: boolean;\n isDefault: boolean;\n totalGroups: number;\n groups: Group[];\n usersToRemoveCount: number;\n usersToRemove: Record<string, UserProfile>;\n usersToAdd: Record<string, UserProfile>;\n rolesToUpdate: {\n [userId: string]: {\n schemeUser: boolean;\n schemeAdmin: boolean;\n };\n };\n saveNeeded: boolean;\n serverError: JSX.Element | undefined;\n previousServerError: JSX.Element | undefined;\n isPrivacyChanging: boolean;\n saving: boolean;\n showConvertConfirmModal: boolean;\n showRemoveConfirmModal: boolean;\n showConvertAndRemoveConfirmModal: boolean;\n channelPermissions: ChannelPermissions[];\n teamScheme?: Scheme;\n isLocalArchived: boolean;\n showArchiveConfirmModal: boolean;\n}\n\nexport type ChannelDetailsActions = {\n getGroups: (channelID: string, q?: string, page?: number, perPage?: number, filterAllowReference?: boolean) => Promise<ActionResult>;\n linkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: SyncablePatch) => Promise<ActionResult>;\n unlinkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType) => Promise<ActionResult>;\n membersMinusGroupMembers: (channelID: string, groupIDs: string[], page?: number, perPage?: number) => Promise<ActionResult>;\n setNavigationBlocked: (blocked: boolean) => {type: 'SET_NAVIGATION_BLOCKED'; blocked: boolean};\n getChannel: (channelId: string) => void;\n getTeam: (teamId: string) => Promise<ActionResult>;\n getChannelModerations: (channelId: string) => Promise<ActionResult>;\n patchChannel: (channelId: string, patch: Channel) => Promise<ActionResult>;\n updateChannelPrivacy: (channelId: string, privacy: string) => Promise<ActionResult>;\n patchGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: Partial<SyncablePatch>) => Promise<ActionResult>;\n patchChannelModerations: (channelID: string, patch: ChannelModerationPatch[]) => Promise<ActionResult>;\n loadScheme: (schemeID: string) => Promise<ActionResult>;\n addChannelMember: (channelId: string, userId: string, postRootId?: string) => Promise<ActionResult>;\n removeChannelMember: (channelId: string, userId: string) => Promise<ActionResult>;\n updateChannelMemberSchemeRoles: (channelId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => Promise<ActionResult>;\n deleteChannel: (channelId: string) => Promise<ActionResult>;\n unarchiveChannel: (channelId: string) => Promise<ActionResult>;\n};\n\nexport default class ChannelDetails extends React.PureComponent<ChannelDetailsProps, ChannelDetailsState> {\n constructor(props: ChannelDetailsProps) {\n super(props);\n this.state = {\n isSynced: Boolean(props.channel?.group_constrained),\n isPublic: props.channel?.type === Constants.OPEN_CHANNEL,\n isDefault: props.channel?.name === Constants.DEFAULT_CHANNEL,\n isPrivacyChanging: false,\n saving: false,\n totalGroups: props.totalGroups,\n showConvertConfirmModal: false,\n showRemoveConfirmModal: false,\n showConvertAndRemoveConfirmModal: false,\n usersToRemoveCount: 0,\n usersToRemove: {},\n usersToAdd: {},\n rolesToUpdate: {},\n groups: props.groups,\n saveNeeded: false,\n serverError: undefined,\n previousServerError: undefined,\n channelPermissions: props.channelPermissions,\n teamScheme: props.teamScheme,\n isLocalArchived: props.channel?.delete_at !== 0,\n showArchiveConfirmModal: false,\n };\n }\n\n componentDidUpdate(prevProps: ChannelDetailsProps) {\n const {channel, totalGroups, actions} = this.props;\n if (channel?.id !== prevProps.channel?.id || totalGroups !== prevProps.totalGroups) {\n this.setState({\n totalGroups,\n isSynced: Boolean(channel?.group_constrained),\n isPublic: channel?.type === Constants.OPEN_CHANNEL,\n isDefault: channel?.name === Constants.DEFAULT_CHANNEL,\n isLocalArchived: channel?.delete_at !== 0,\n });\n }\n\n // If we don't have the team and channel on mount, we need to request the team after we load the channel\n if (!prevProps.team?.id && !prevProps.channel?.team_id && channel?.team_id) {\n actions.getTeam(channel.team_id).\n then(async (data: any) => {\n if (data.data && data.data.scheme_id) {\n await actions.loadScheme(data.data.scheme_id);\n }\n }).\n then(() => this.setState({teamScheme: this.props.teamScheme}));\n }\n }\n\n componentDidMount() {\n const {channelID, channel, actions} = this.props;\n if (channelID) {\n if (this.props.channelModerationEnabled) {\n actions.getGroups(channelID).\n then(() => this.setState({groups: this.props.groups}));\n actions.getChannelModerations(channelID).then(() => this.restrictChannelMentions());\n }\n actions.getChannel(channelID);\n }\n\n if (channel?.team_id) {\n actions.getTeam(channel.team_id).\n then(async (data: any) => {\n if (data.data && data.data.scheme_id) {\n await actions.loadScheme(data.data.scheme_id);\n }\n }).\n then(() => this.setState({teamScheme: this.props.teamScheme}));\n }\n }\n\n private restrictChannelMentions() {\n // Disabling use_channel_mentions on every role that create_post is either disabled or has a value of false\n let channelPermissions = this.props.channelPermissions;\n const currentCreatePostRoles: any = channelPermissions.find((element) => element.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_POST)?.roles;\n if (currentCreatePostRoles) {\n for (const channelRole of Object.keys(currentCreatePostRoles)) {\n channelPermissions = channelPermissions.map((permission) => {\n if (permission.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS && (!currentCreatePostRoles[channelRole].value || !currentCreatePostRoles[channelRole].enabled)) {\n return {\n name: permission.name,\n roles: {\n ...permission.roles,\n [channelRole]: {\n value: false,\n enabled: false,\n },\n },\n };\n }\n return permission;\n });\n }\n }\n this.setState({channelPermissions});\n }\n\n private setToggles = (isSynced: boolean, isPublic: boolean) => {\n const {channel} = this.props;\n const isOriginallyPublic = channel?.type === Constants.OPEN_CHANNEL;\n this.setState(\n {\n saveNeeded: true,\n isSynced,\n isPublic,\n isPrivacyChanging: isPublic !== isOriginallyPublic,\n },\n () => this.processGroupsChange(this.state.groups),\n );\n this.props.actions.setNavigationBlocked(true);\n };\n\n async processGroupsChange(groups: Group[]) {\n const {actions, channelID} = this.props;\n actions.setNavigationBlocked(true);\n let serverError: JSX.Element | undefined;\n let usersToRemoveCount = 0;\n if (this.state.isSynced) {\n try {\n if (groups.length === 0) {\n serverError = (\n <NeedGroupsError\n warning={true}\n isChannel={true}\n />\n );\n } else {\n if (!channelID) {\n return;\n }\n\n const result = await actions.membersMinusGroupMembers(channelID, groups.map((g) => g.id));\n if ('data' in result) {\n usersToRemoveCount = result.data.total_count;\n if (usersToRemoveCount > 0) {\n serverError = (\n <UsersWillBeRemovedError\n total={usersToRemoveCount}\n users={result.data.users}\n scope='channel'\n scopeId={this.props.channelID}\n />\n );\n }\n }\n }\n } catch (ex) {\n serverError = ex;\n }\n }\n this.setState({groups, usersToRemoveCount, saveNeeded: true, serverError});\n }\n\n private handleGroupRemoved = (gid: string) => {\n const groups = this.state.groups.filter((g) => g.id !== gid);\n this.setState({totalGroups: this.state.totalGroups - 1});\n this.processGroupsChange(groups);\n };\n\n private setNewGroupRole = (gid: string) => {\n const groups = cloneDeep(this.state.groups).map((g) => {\n if (g.id === gid) {\n g.scheme_admin = !g.scheme_admin;\n }\n return g;\n });\n this.processGroupsChange(groups);\n };\n\n private channelPermissionsChanged = (name: string, channelRole: ChannelModerationRoles) => {\n const currentValueIndex = this.state.channelPermissions.findIndex((element) => element.name === name);\n const currentValue = this.state.channelPermissions[currentValueIndex].roles[channelRole]!.value;\n const newValue = !currentValue;\n let channelPermissions = [...this.state.channelPermissions];\n\n if (name === Permissions.CHANNEL_MODERATED_PERMISSIONS.CREATE_POST) {\n const originalObj = this.props.channelPermissions.find((element) => element.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS)?.roles![channelRole];\n channelPermissions = channelPermissions.map((permission) => {\n if (permission.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS && !newValue) {\n return {\n name: permission.name,\n roles: {\n ...permission.roles,\n [channelRole]: {\n value: false,\n enabled: false,\n },\n },\n };\n } else if (permission.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.USE_CHANNEL_MENTIONS) {\n return {\n name: permission.name,\n roles: {\n ...permission.roles,\n [channelRole]: {\n value: originalObj?.value,\n enabled: originalObj?.enabled,\n },\n },\n };\n }\n return permission;\n });\n }\n channelPermissions[currentValueIndex] = {\n ...channelPermissions[currentValueIndex],\n roles: {\n ...channelPermissions[currentValueIndex].roles,\n [channelRole]: {\n ...channelPermissions[currentValueIndex].roles[channelRole],\n value: newValue,\n },\n },\n };\n this.setState({channelPermissions, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n private handleGroupChange = (groupIDs: string[]) => {\n const groups = [...this.state.groups, ...groupIDs.map((gid: string) => this.props.allGroups[gid])];\n this.setState({totalGroups: this.state.totalGroups + groupIDs.length});\n this.processGroupsChange(groups);\n };\n\n private hideConvertConfirmModal = () => {\n this.setState({showConvertConfirmModal: false});\n };\n\n private hideRemoveConfirmModal = () => {\n this.setState({showRemoveConfirmModal: false});\n };\n\n private hideConvertAndRemoveConfirmModal = () => {\n this.setState({showConvertAndRemoveConfirmModal: false});\n };\n\n private hideArchiveConfirmModal = () => {\n this.setState({showArchiveConfirmModal: false});\n };\n\n private onSave = () => {\n const {channel} = this.props;\n const {isSynced, usersToRemoveCount, serverError} = this.state;\n let {isPublic, isPrivacyChanging} = this.state;\n if (this.channelToBeArchived()) {\n this.setState({showArchiveConfirmModal: true});\n return;\n }\n const isOriginallyPublic = channel?.type === Constants.OPEN_CHANNEL;\n if (isSynced) {\n isPublic = false;\n isPrivacyChanging = isOriginallyPublic;\n this.setState({\n isPublic,\n isPrivacyChanging,\n });\n }\n if (isPrivacyChanging && usersToRemoveCount > 0) {\n this.setState({showConvertAndRemoveConfirmModal: true});\n return;\n }\n if (isPrivacyChanging && usersToRemoveCount === 0 && !serverError) {\n this.setState({showConvertConfirmModal: true});\n return;\n }\n if (!isPrivacyChanging && usersToRemoveCount > 0) {\n this.setState({showRemoveConfirmModal: true});\n return;\n }\n this.handleSubmit();\n };\n\n private handleSubmit = async () => {\n const {groups: origGroups, channelID, actions, channel} = this.props;\n\n if (!channel) {\n return;\n }\n\n this.setState({showConvertConfirmModal: false, showRemoveConfirmModal: false, showConvertAndRemoveConfirmModal: false, showArchiveConfirmModal: false, saving: true});\n const {groups, isSynced, isPublic, isPrivacyChanging, channelPermissions, usersToAdd, usersToRemove, rolesToUpdate} = this.state;\n let serverError: JSX.Element | undefined;\n let saveNeeded = false;\n\n if (this.channelToBeArchived()) {\n const result = await actions.deleteChannel(channel.id);\n if ('error' in result) {\n serverError = <FormError error={result.error.message}/>;\n saveNeeded = true;\n } else {\n trackEvent('admin_channel_config_page', 'channel_archived', {channel_id: channelID});\n }\n this.setState({serverError, saving: false, saveNeeded, isPrivacyChanging: false, usersToRemoveCount: 0, rolesToUpdate: {}, usersToAdd: {}, usersToRemove: {}}, () => {\n actions.setNavigationBlocked(saveNeeded);\n if (!saveNeeded) {\n getHistory().push('/admin_console/user_management/channels');\n }\n });\n return;\n } else if (this.channelToBeRestored() && !this.state.serverError) {\n const result = await actions.unarchiveChannel(channel.id);\n if ('error' in result) {\n serverError = <FormError error={result.error.message}/>;\n } else {\n trackEvent('admin_channel_config_page', 'channel_unarchived', {channel_id: channelID});\n }\n this.setState({serverError, previousServerError: undefined});\n }\n\n if (this.state.groups.length === 0 && isSynced) {\n serverError = <NeedGroupsError isChannel={true}/>;\n saveNeeded = true;\n this.setState({serverError, saving: false, saveNeeded});\n actions.setNavigationBlocked(saveNeeded);\n return;\n }\n\n const promises = [];\n if (isPrivacyChanging) {\n const convert = actions.updateChannelPrivacy(channel.id, isPublic ? Constants.OPEN_CHANNEL : Constants.PRIVATE_CHANNEL);\n promises.push(\n convert.then((res: ActionResult) => {\n if ('error' in res) {\n return res;\n }\n return actions.patchChannel(channel.id, {\n ...channel,\n group_constrained: isSynced,\n });\n }),\n );\n } else {\n promises.push(\n actions.patchChannel(channel.id, {\n ...channel,\n group_constrained: isSynced,\n }),\n );\n }\n\n const patchChannelSyncable = groups.\n filter((g) => {\n return origGroups.some((group) => group.id === g.id && group.scheme_admin !== g.scheme_admin);\n }).\n map((g) => actions.patchGroupSyncable(g.id, channelID, SyncableType.Channel, {scheme_admin: g.scheme_admin}));\n\n const unlink = origGroups.\n filter((g) => {\n return !groups.some((group) => group.id === g.id);\n }).\n map((g) => actions.unlinkGroupSyncable(g.id, channelID, SyncableType.Channel));\n\n const link = groups.\n filter((g) => {\n return !origGroups.some((group) => group.id === g.id);\n }).\n map((g) => actions.linkGroupSyncable(g.id, channelID, SyncableType.Channel, {auto_add: true, scheme_admin: g.scheme_admin}));\n\n const groupActions = [...promises, ...patchChannelSyncable, ...unlink, ...link];\n if (groupActions.length > 0) {\n const result = await Promise.all(groupActions);\n const resultWithError = result.find((r) => 'error' in r);\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n } else {\n if (unlink.length > 0) {\n trackEvent('admin_channel_config_page', 'groups_removed_from_channel', {count: unlink.length, channel_id: channelID});\n }\n if (link.length > 0) {\n trackEvent('admin_channel_config_page', 'groups_added_to_channel', {count: link.length, channel_id: channelID});\n }\n\n const actionsToAwait: any[] = [];\n if (this.props.channelModerationEnabled) {\n actionsToAwait.push(actions.getGroups(channelID));\n }\n if (isPrivacyChanging) {\n // If the privacy is changing update the manage_members value for the channel moderation widget\n if (this.props.channelModerationEnabled) {\n actionsToAwait.push(\n actions.getChannelModerations(channelID).then(() => {\n const manageMembersIndex = channelPermissions.findIndex((element) => element.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.MANAGE_MEMBERS);\n if (channelPermissions) {\n const updatedManageMembers = this.props.channelPermissions.find((element) => element.name === Permissions.CHANNEL_MODERATED_PERMISSIONS.MANAGE_MEMBERS);\n channelPermissions[manageMembersIndex] = updatedManageMembers || channelPermissions[manageMembersIndex];\n }\n this.setState({channelPermissions});\n }),\n );\n }\n }\n if (actionsToAwait.length > 0) {\n await Promise.all(actionsToAwait);\n }\n await Promise.resolve();\n }\n }\n if (this.props.channelModerationEnabled) {\n const patchChannelPermissionsArray: ChannelModerationPatch[] = channelPermissions.map((p) => {\n return {\n name: p.name,\n roles: {\n ...(p.roles.members && p.roles.members.enabled && {members: p.roles.members!.value}),\n ...(p.roles.guests && p.roles.guests.enabled && {guests: p.roles.guests!.value}),\n },\n };\n });\n\n const patchChannelModerationsResult = await actions.patchChannelModerations(channelID, patchChannelPermissionsArray);\n if (patchChannelModerationsResult.error) {\n serverError = <FormError error={patchChannelModerationsResult.error.message}/>;\n }\n this.restrictChannelMentions();\n }\n\n let privacyChanging = isPrivacyChanging;\n if (serverError == null) {\n privacyChanging = false;\n }\n\n const usersToAddList = Object.values(usersToAdd);\n const usersToRemoveList = Object.values(usersToRemove);\n const userRolesToUpdate = Object.keys(rolesToUpdate);\n const usersToUpdate = usersToAddList.length > 0 || usersToRemoveList.length > 0 || userRolesToUpdate.length > 0;\n if (usersToUpdate && !isSynced) {\n const addUserActions: any[] = [];\n const removeUserActions: any[] = [];\n const {addChannelMember, removeChannelMember, updateChannelMemberSchemeRoles} = this.props.actions;\n usersToAddList.forEach((user) => {\n addUserActions.push(addChannelMember(channelID, user.id));\n });\n usersToRemoveList.forEach((user) => {\n removeUserActions.push(removeChannelMember(channelID, user.id));\n });\n\n if (addUserActions.length > 0) {\n const result = await Promise.all(addUserActions);\n const resultWithError = result.find((r) => 'error' in r);\n const count = result.filter((r) => 'data' in r).length;\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_channel_config_page', 'members_added_to_channel', {count, channel_id: channelID});\n }\n }\n\n if (removeUserActions.length > 0) {\n const result = await Promise.all(removeUserActions);\n const resultWithError = result.find((r) => 'error' in r);\n const count = result.filter((r) => 'data' in r).length;\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_channel_config_page', 'members_removed_from_channel', {count, channel_id: channelID});\n }\n }\n\n const rolesToPromote: any[] = [];\n const rolesToDemote: any[] = [];\n userRolesToUpdate.forEach((userId) => {\n const {schemeUser, schemeAdmin} = rolesToUpdate[userId];\n if (schemeAdmin) {\n rolesToPromote.push(updateChannelMemberSchemeRoles(channelID, userId, schemeUser, schemeAdmin));\n } else {\n rolesToDemote.push(updateChannelMemberSchemeRoles(channelID, userId, schemeUser, schemeAdmin));\n }\n });\n\n if (rolesToPromote.length > 0) {\n const result = await Promise.all(rolesToPromote);\n const resultWithError = result.find((r) => 'error' in r);\n const count = result.filter((r) => 'data' in r).length;\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_channel_config_page', 'members_elevated_to_channel_admin', {count, channel_id: channelID});\n }\n }\n\n if (rolesToDemote.length > 0) {\n const result = await Promise.all(rolesToDemote);\n const resultWithError = result.find((r) => 'error' in r);\n const count = result.filter((r) => 'data' in r).length;\n if (resultWithError && 'error' in resultWithError) {\n serverError = <FormError error={resultWithError.error.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_channel_config_page', 'admins_demoted_to_channel_member', {count, channel_id: channelID});\n }\n }\n }\n\n this.setState({serverError, saving: false, saveNeeded, isPrivacyChanging: privacyChanging, usersToRemoveCount: 0, rolesToUpdate: {}, usersToAdd: {}, usersToRemove: {}}, () => {\n actions.setNavigationBlocked(saveNeeded);\n if (!saveNeeded && !serverError) {\n getHistory().push('/admin_console/user_management/channels');\n }\n });\n };\n\n private channelToBeArchived = (): boolean => {\n const {isLocalArchived} = this.state;\n const isServerArchived = this.props.channel?.delete_at !== 0;\n return isLocalArchived && !isServerArchived;\n };\n\n private channelToBeRestored = (): boolean => {\n const {isLocalArchived} = this.state;\n const isServerArchived = this.props.channel?.delete_at !== 0;\n return !isLocalArchived && isServerArchived;\n };\n\n private addRolesToUpdate = (userId: string, schemeUser: boolean, schemeAdmin: boolean) => {\n const {rolesToUpdate} = this.state;\n rolesToUpdate[userId] = {schemeUser, schemeAdmin};\n this.setState({rolesToUpdate: {...rolesToUpdate}, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n private addUserToRemove = (user: UserProfile) => {\n let {usersToRemoveCount} = this.state;\n const {usersToAdd, usersToRemove, rolesToUpdate} = this.state;\n if (usersToAdd[user.id]?.id === user.id) {\n delete usersToAdd[user.id];\n } else if (usersToRemove[user.id]?.id !== user.id) {\n usersToRemoveCount += 1;\n usersToRemove[user.id] = user;\n }\n delete rolesToUpdate[user.id];\n this.setState({usersToRemove: {...usersToRemove}, usersToAdd: {...usersToAdd}, rolesToUpdate: {...rolesToUpdate}, usersToRemoveCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n private addUsersToAdd = (users: UserProfile[]) => {\n let {usersToRemoveCount} = this.state;\n const usersToRemove = {...this.state.usersToRemove};\n const usersToAdd = {...this.state.usersToAdd};\n users.forEach((user) => {\n if (usersToRemove[user.id]?.id === user.id) {\n delete usersToRemove[user.id];\n usersToRemoveCount -= 1;\n } else {\n usersToAdd[user.id] = user;\n }\n });\n this.setState({usersToAdd: {...usersToAdd}, usersToRemove: {...usersToRemove}, usersToRemoveCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n private onToggleArchive = () => {\n const {isLocalArchived, serverError, previousServerError} = this.state;\n const {isDisabled} = this.props;\n if (isDisabled) {\n return;\n }\n const newState: any = {\n saveNeeded: true,\n isLocalArchived: !isLocalArchived,\n };\n\n if (newState.isLocalArchived) {\n // if the channel is being archived then clear the other server\n // errors, they're no longer relevant.\n newState.previousServerError = serverError;\n newState.serverError = undefined;\n } else {\n // if the channel is being unarchived (maybe the user had toggled\n // and untoggled) the button, so reinstate any server errors that\n // were present.\n newState.serverError = previousServerError;\n newState.previousServerError = undefined;\n }\n this.props.actions.setNavigationBlocked(true);\n this.setState(newState);\n };\n\n public render = () => {\n const {\n totalGroups,\n saving,\n saveNeeded,\n serverError,\n isSynced,\n isPublic,\n isDefault,\n groups,\n showConvertConfirmModal,\n showRemoveConfirmModal,\n showConvertAndRemoveConfirmModal,\n usersToRemoveCount,\n channelPermissions,\n teamScheme,\n usersToRemove,\n usersToAdd,\n isLocalArchived,\n showArchiveConfirmModal,\n } = this.state;\n const {channel, team} = this.props;\n\n if (!channel) {\n return null;\n }\n\n const missingGroup = (og: {id: string}) => !groups.find((g: Group) => g.id === og.id);\n const removedGroups = this.props.groups.filter(missingGroup);\n const nonArchivedContent = (\n <>\n <ConvertConfirmModal\n show={showConvertConfirmModal}\n onCancel={this.hideConvertConfirmModal}\n onConfirm={this.handleSubmit}\n displayName={channel.display_name || ''}\n toPublic={isPublic}\n />\n\n {this.props.channelModerationEnabled &&\n <ChannelModeration\n channelPermissions={channelPermissions}\n onChannelPermissionsChanged={this.channelPermissionsChanged}\n teamSchemeID={teamScheme?.id}\n teamSchemeDisplayName={teamScheme?.display_name}\n guestAccountsEnabled={this.props.guestAccountsEnabled}\n isPublic={channel.type === Constants.OPEN_CHANNEL}\n readOnly={this.props.isDisabled}\n />\n }\n\n <RemoveConfirmModal\n show={showRemoveConfirmModal}\n onCancel={this.hideRemoveConfirmModal}\n onConfirm={this.handleSubmit}\n inChannel={true}\n amount={usersToRemoveCount}\n />\n\n <ConvertAndRemoveConfirmModal\n show={showConvertAndRemoveConfirmModal}\n onCancel={this.hideConvertAndRemoveConfirmModal}\n onConfirm={this.handleSubmit}\n displayName={channel.display_name || ''}\n toPublic={isPublic}\n removeAmount={usersToRemoveCount}\n />\n\n <ChannelModes\n isPublic={isPublic}\n isSynced={isSynced}\n isDefault={isDefault}\n onToggle={this.setToggles}\n isDisabled={this.props.isDisabled}\n groupsSupported={this.props.channelGroupsEnabled}\n />\n\n {this.props.channelGroupsEnabled &&\n <ChannelGroups\n synced={isSynced}\n channel={channel}\n totalGroups={totalGroups}\n groups={groups}\n removedGroups={removedGroups}\n onAddCallback={this.handleGroupChange}\n onGroupRemoved={this.handleGroupRemoved}\n setNewGroupRole={this.setNewGroupRole}\n isDisabled={this.props.isDisabled}\n />\n }\n\n {!isSynced &&\n <ChannelMembers\n onRemoveCallback={this.addUserToRemove}\n onAddCallback={this.addUsersToAdd}\n usersToRemove={usersToRemove}\n usersToAdd={usersToAdd}\n updateRole={this.addRolesToUpdate}\n channelId={this.props.channelID}\n isDisabled={this.props.isDisabled}\n />\n }\n </>\n );\n return (\n <div className='wrapper--fixed'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/channels'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.channel_settings.channel_detail.channel_configuration'\n defaultMessage='Channel Configuration'\n />\n </div>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <ChannelProfile\n channel={channel}\n team={team}\n onToggleArchive={this.onToggleArchive}\n isArchived={isLocalArchived}\n isDisabled={this.props.isDisabled}\n />\n <ConfirmModal\n show={showArchiveConfirmModal}\n title={\n <FormattedMessage\n id='admin.channel_settings.channel_detail.archive_confirm.title'\n defaultMessage='Save and Archive Channel'\n />\n }\n message={\n <FormattedMessage\n id='admin.channel_settings.channel_detail.archive_confirm.message'\n defaultMessage={'Saving will archive the channel from the team and make it\\'s contents inaccessible for all users. Are you sure you wish to save and archive this channel?'}\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='admin.channel_settings.channel_detail.archive_confirm.button'\n defaultMessage='Save and Archive Channel'\n />\n }\n onConfirm={this.handleSubmit}\n onCancel={this.hideArchiveConfirmModal}\n />\n {!isLocalArchived && nonArchivedContent}\n </div>\n </div>\n\n <SaveChangesPanel\n saving={saving}\n saveNeeded={saveNeeded}\n onClick={this.onSave}\n serverError={serverError}\n cancelLink='/admin_console/user_management/channels'\n isDisabled={this.props.isDisabled}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {\n addChannelMember,\n deleteChannel,\n getChannel as fetchChannel,\n getChannelModerations as fetchChannelModerations,\n membersMinusGroupMembers,\n patchChannel,\n patchChannelModerations,\n removeChannelMember,\n unarchiveChannel,\n updateChannelMemberSchemeRoles,\n updateChannelPrivacy,\n} from 'mattermost-redux/actions/channels';\nimport {\n getGroupsAssociatedToChannel as fetchAssociatedGroups,\n linkGroupSyncable,\n patchGroupSyncable,\n unlinkGroupSyncable,\n} from 'mattermost-redux/actions/groups';\nimport {getScheme as loadScheme} from 'mattermost-redux/actions/schemes';\nimport {getTeam as fetchTeam} from 'mattermost-redux/actions/teams';\nimport {getChannel, getChannelModerations} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getAllGroups, getGroupsAssociatedToChannel} from 'mattermost-redux/selectors/entities/groups';\nimport {getScheme} from 'mattermost-redux/selectors/entities/schemes';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setNavigationBlocked} from 'actions/admin_actions';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport ChannelDetails from './channel_details';\n\ntype OwnProps = {\n match: {\n params: {\n channel_id: string;\n };\n };\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n const license = getLicense(state);\n\n const isLicensed = license?.IsLicensed === 'true';\n\n // Channel Moderation is only available for Professional, Enterprise and backward compatible with E20\n const channelModerationEnabled = isLicensed && (license.SkuShortName === LicenseSkus.Professional || license.SkuShortName === LicenseSkus.Enterprise || license.SkuShortName === LicenseSkus.E20);\n\n // Channel Groups is only available for Enterprise and backward compatible with E20\n const channelGroupsEnabled = isLicensed && (license.SkuShortName === LicenseSkus.Enterprise || license.SkuShortName === LicenseSkus.E20);\n\n const guestAccountsEnabled = config.EnableGuestAccounts === 'true';\n const channelID = ownProps.match.params.channel_id;\n const channel = getChannel(state, channelID);\n const team = channel ? getTeam(state, channel.team_id) : undefined;\n const groups = getGroupsAssociatedToChannel(state, channelID);\n const totalGroups = groups.length;\n const allGroups = getAllGroups(state);\n const channelPermissions = getChannelModerations(state, channelID);\n const teamScheme = team ? getScheme(state, team.scheme_id) : undefined;\n return {\n channelID,\n channel,\n team,\n groups,\n totalGroups,\n allGroups,\n channelPermissions,\n teamScheme,\n guestAccountsEnabled,\n channelModerationEnabled,\n channelGroupsEnabled,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getGroups: fetchAssociatedGroups,\n linkGroupSyncable,\n unlinkGroupSyncable,\n membersMinusGroupMembers,\n setNavigationBlocked: setNavigationBlocked as any,\n getChannel: fetchChannel,\n getTeam: fetchTeam,\n getChannelModerations: fetchChannelModerations,\n patchChannel,\n updateChannelPrivacy,\n patchGroupSyncable,\n patchChannelModerations,\n loadScheme,\n addChannelMember,\n removeChannelMember,\n updateChannelMemberSchemeRoles,\n deleteChannel,\n unarchiveChannel,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelDetails);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Team, TeamSearchOpts, TeamsWithCount} from '@mattermost/types/teams';\n\nimport {debounce} from 'mattermost-redux/actions/helpers';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport DataGrid from 'components/admin_console/data_grid/data_grid';\nimport type {Column} from 'components/admin_console/data_grid/data_grid';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport {PAGE_SIZE} from 'components/admin_console/team_channel_settings/abstract_list';\nimport TeamIcon from 'components/widgets/team_icon/team_icon';\n\nimport {getHistory} from 'utils/browser_history';\nimport * as Utils from 'utils/utils';\n\nimport './team_list.scss';\n\nconst ROW_HEIGHT = 80;\n\ntype Props = {\n data: Team[];\n total: number;\n actions: {\n searchTeams(term: string, opts: TeamSearchOpts): Promise<ActionResult<TeamsWithCount>>;\n getData(page: number, size: number): void;\n };\n isLicensedForLDAPGroups?: boolean;\n}\n\ntype State = {\n loading: boolean;\n term: string;\n teams: Team[];\n page: number;\n total: number;\n searchErrored: boolean;\n filters: TeamSearchOpts;\n}\nexport default class TeamList extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n loading: false,\n term: '',\n teams: [],\n page: 0,\n total: 0,\n searchErrored: false,\n filters: {},\n };\n }\n\n componentDidMount() {\n this.loadPage();\n }\n\n isSearching = (term: string, filters: TeamSearchOpts) => {\n return (term.length + Object.keys(filters).length) > 0;\n };\n\n getPaginationProps = () => {\n const {page, term, filters} = this.state;\n const total = this.isSearching(term, filters) ? this.state.total : this.props.total;\n const startCount = (page * PAGE_SIZE) + 1;\n let endCount = (page + 1) * PAGE_SIZE;\n endCount = endCount > total ? total : endCount;\n return {startCount, endCount, total};\n };\n\n loadPage = async (page = 0, term = '', filters = {}) => {\n this.setState({loading: true, term, filters});\n\n if (this.isSearching(term, filters)) {\n if (page > 0) {\n this.searchTeams(page, term, filters);\n } else {\n this.searchTeamsDebounced(page, term, filters);\n }\n return;\n }\n\n await this.props.actions.getData(page, PAGE_SIZE);\n this.setState({page, loading: false});\n };\n\n searchTeams = async (page = 0, term = '', filters = {}) => {\n let teams: Team[] = [];\n let total = 0;\n let searchErrored = true;\n const response = await this.props.actions.searchTeams(term, {page, per_page: PAGE_SIZE, ...filters});\n if (response?.data) {\n teams = page > 0 ? this.state.teams.concat(response.data.teams) : response.data.teams;\n total = response.data.total_count;\n searchErrored = false;\n }\n this.setState({page, loading: false, teams, total, searchErrored});\n };\n\n searchTeamsDebounced = debounce((page, term, filters = {}) => this.searchTeams(page, term, filters), 300, false, () => {});\n\n nextPage = () => {\n this.loadPage(this.state.page + 1, this.state.term, this.state.filters);\n };\n\n previousPage = () => {\n this.setState({page: this.state.page - 1});\n };\n\n onSearch = (term = '') => {\n this.loadPage(0, term, this.state.filters);\n };\n\n onFilter = ({management}: FilterOptions) => {\n const filters: TeamSearchOpts = {};\n\n let groupConstrained;\n\n const {\n allow_open_invite: {value: allowOpenInvite},\n invite_only: {value: inviteOnly},\n } = management.values;\n\n const filtersList = [allowOpenInvite, inviteOnly];\n\n if (this.props.isLicensedForLDAPGroups) {\n groupConstrained = management.values.group_constrained.value;\n filtersList.push(groupConstrained);\n }\n\n // If all filters or no filters do nothing\n if (filtersList.includes(false) && filtersList.includes(true)) {\n // If requesting private and public teams then just exclude all group constrained teams in the results\n if (allowOpenInvite && inviteOnly) {\n filters.group_constrained = false;\n } else {\n // Since the API returns different results if a filter is set to false vs not set at all\n // we only set filters when needed and if not leave the filter option blank\n if (groupConstrained) {\n filters.group_constrained = true;\n }\n\n if (allowOpenInvite || inviteOnly) {\n filters.allow_open_invite = Boolean(allowOpenInvite);\n }\n }\n }\n\n this.loadPage(0, this.state.term, filters);\n };\n\n getColumns = (): Column[] => {\n const name = (\n <FormattedMessage\n id='admin.team_settings.team_list.nameHeader'\n defaultMessage='Name'\n />\n );\n const management = (\n <FormattedMessage\n id='admin.team_settings.team_list.mappingHeader'\n defaultMessage='Management'\n />\n );\n\n return [\n {\n name,\n field: 'name',\n width: 4,\n fixed: true,\n },\n {\n name: management,\n field: 'management',\n fixed: true,\n },\n {\n name: '',\n field: 'edit',\n textAlign: 'right',\n fixed: true,\n },\n ];\n };\n\n renderManagementMethodText = (team: Team) => {\n if (team.group_constrained) {\n return (\n <FormattedMessage\n id='admin.team_settings.team_row.managementMethod.groupSync'\n defaultMessage='Group Sync'\n />\n );\n } else if (team.allow_open_invite) {\n return (\n <FormattedMessage\n id='admin.team_settings.team_row.managementMethod.anyoneCanJoin'\n defaultMessage='Anyone Can Join'\n />\n );\n }\n return (\n <FormattedMessage\n id='admin.team_settings.team_row.managementMethod.inviteOnly'\n defaultMessage='Invite Only'\n />\n );\n };\n\n getRows = () => {\n const {data} = this.props;\n const {term, teams, filters} = this.state;\n const {startCount, endCount} = this.getPaginationProps();\n let teamsToDisplay = this.isSearching(term, filters) ? teams : data;\n teamsToDisplay = teamsToDisplay.slice(startCount - 1, endCount);\n\n return teamsToDisplay.map((team) => {\n return {\n cells: {\n id: team.id,\n name: (\n <div className='TeamList_nameColumn'>\n <div className='TeamList__lowerOpacity'>\n <TeamIcon\n size='sm'\n url={Utils.imageURLForTeam(team)}\n content={team.display_name}\n />\n </div>\n <div className='TeamList_nameText'>\n <b data-testid='team-display-name'>\n {team.display_name}\n {team.delete_at !== 0 && (\n <span className='archived-label'>\n {' '}\n <FormattedMessage\n id='admin.team_settings.team_row.archived'\n defaultMessage='(Archived)'\n />\n </span>\n )}\n </b>\n {team.description && (\n <div className='TeamList_descriptionText'>\n {team.description}\n </div>\n )}\n </div>\n </div>\n ),\n management: (\n <span\n data-testid={`${team.name}Management`}\n className='TeamList_managementText'\n >\n {this.renderManagementMethodText(team)}\n </span>\n ),\n edit: (\n <span\n data-testid={`${team.display_name}edit`}\n className='group-actions TeamList_editText'\n >\n <Link to={`/admin_console/user_management/teams/${team.id}`}>\n <FormattedMessage\n id='admin.team_settings.team_row.configure'\n defaultMessage='Edit'\n />\n </Link>\n </span>\n ),\n },\n onClick: () => getHistory().push(`/admin_console/user_management/teams/${team.id}`),\n };\n });\n };\n\n render() {\n const {term, searchErrored} = this.state;\n const rows = this.getRows();\n const columns = this.getColumns();\n const {startCount, endCount, total} = this.getPaginationProps();\n const {isLicensedForLDAPGroups} = this.props;\n\n let placeholderEmpty = (\n <FormattedMessage\n id='admin.team_settings.team_list.no_teams_found'\n defaultMessage='No teams found'\n />\n );\n\n if (searchErrored) {\n placeholderEmpty = (\n <FormattedMessage\n id='admin.team_settings.team_list.search_teams_errored'\n defaultMessage='Something went wrong. Try again'\n />\n );\n }\n\n type Value = {\n name: JSX.Element;\n value: boolean;\n };\n\n type Management = {\n name: JSX.Element;\n values: Values;\n keys: string[];\n };\n\n type FilterOptions = {\n management: Management;\n };\n\n type Values = {\n allow_open_invite: Value;\n invite_only: Value;\n group_constrained?: Value;\n };\n\n const filterOptions: FilterOptions = {\n management: {\n name: (\n <FormattedMessage\n id='admin.team_settings.team_list.mappingHeader'\n defaultMessage='Management'\n />\n ),\n values: {\n allow_open_invite: {\n name: (\n <FormattedMessage\n id='admin.team_settings.team_row.managementMethod.anyoneCanJoin'\n defaultMessage='Anyone Can Join'\n />\n ),\n value: false,\n },\n invite_only: {\n name: (\n <FormattedMessage\n id='admin.team_settings.team_row.managementMethod.inviteOnly'\n defaultMessage='Invite Only'\n />\n ),\n value: false,\n },\n },\n keys: ['allow_open_invite', 'invite_only'],\n },\n };\n\n if (isLicensedForLDAPGroups) {\n filterOptions.management.values.group_constrained = {\n name: (\n <FormattedMessage\n id='admin.team_settings.team_row.managementMethod.groupSync'\n defaultMessage='Group Sync'\n />\n ),\n value: false,\n };\n filterOptions.management.keys.push('group_constrained');\n }\n\n const filterProps = {\n options: filterOptions,\n keys: ['management'],\n onFilter: this.onFilter,\n };\n\n const rowsContainerStyles = {\n minHeight: `${rows.length * ROW_HEIGHT}px`,\n };\n\n return (\n <div className='TeamsList'>\n <DataGrid\n columns={columns}\n rows={rows}\n loading={this.state.loading}\n page={this.state.page}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n startCount={startCount}\n endCount={endCount}\n total={total}\n onSearch={this.onSearch}\n term={term}\n placeholderEmpty={placeholderEmpty}\n rowsContainerStyles={rowsContainerStyles}\n filterProps={filterProps}\n />\n </div>\n );\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getTeams as fetchTeams, searchTeams} from 'mattermost-redux/actions/teams';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getTeams} from 'mattermost-redux/selectors/entities/teams';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamList from './team_list';\n\nconst getSortedListOfTeams = createSelector(\n 'getSortedListOfTeams',\n getTeams,\n (teams) => Object.values(teams).sort((a, b) => a.display_name.localeCompare(b.display_name)),\n);\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n data: getSortedListOfTeams(state),\n total: state.entities.teams.totalCount || 0,\n isLicensedForLDAPGroups: state.entities.general.license.LDAPGroups === 'true',\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getData: (page: number, pageSize: number) => fetchTeams(page, pageSize, true),\n searchTeams,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport TeamList from 'components/admin_console/team_channel_settings/team/list';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\ntype Props = {\n siteName: string;\n};\n\nexport function TeamsSettings(props: Props) {\n return (\n <div className='wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage\n id='admin.team_settings.groupsPageTitle'\n defaultMessage='{siteName} Teams'\n values={{siteName: props.siteName}}\n />\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <AdminPanel\n id='teams'\n title={defineMessage({id: 'admin.team_settings.title', defaultMessage: 'Teams'})}\n subtitle={defineMessage({id: 'admin.team_settings.description', defaultMessage: 'Manage team settings.'})}\n >\n <TeamList/>\n </AdminPanel>\n </div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {TeamsSettings} from './team_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const siteName = config.SiteName as string;\n\n return {\n siteName,\n };\n}\n\nexport default connect(mapStateToProps)(TeamsSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\n\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport GroupList from '../../group';\n\ntype Props = {\n onGroupRemoved: (groupId: string) => void;\n syncChecked: boolean;\n team: Team;\n onAddCallback: (groupIds: string[]) => void;\n totalGroups: number;\n groups: Group[];\n removedGroups: Group[];\n setNewGroupRole: (groupId: string) => void;\n isDisabled?: boolean;\n};\n\nexport const TeamGroups = ({onGroupRemoved, syncChecked, team, onAddCallback, totalGroups, groups, removedGroups, setNewGroupRole, isDisabled}: Props) => (\n <AdminPanel\n id='team_groups'\n title={\n syncChecked ?\n defineMessage({id: 'admin.team_settings.team_detail.syncedGroupsTitle', defaultMessage: 'Synced Groups'}) :\n defineMessage({id: 'admin.team_settings.team_detail.groupsTitle', defaultMessage: 'Groups'})\n }\n subtitle={\n syncChecked ?\n defineMessage({id: 'admin.team_settings.team_detail.syncedGroupsDescription', defaultMessage: 'Add and remove team members based on their group membership.'}) :\n defineMessage({id: 'admin.team_settings.team_detail.groupsDescription', defaultMessage: 'Group members will be added to the team.'})\n }\n button={\n <ToggleModalButton\n id='addGroupsToTeamToggle'\n className='btn btn-primary'\n modalId={ModalIdentifiers.ADD_GROUPS_TO_TEAM}\n dialogType={AddGroupsToTeamModal}\n dialogProps={{\n team,\n onAddCallback,\n skipCommit: true,\n excludeGroups: groups,\n includeGroups: removedGroups,\n }}\n disabled={isDisabled}\n >\n <FormattedMessage\n id='admin.team_settings.team_details.add_group'\n defaultMessage='Add Group'\n />\n </ToggleModalButton>\n }\n >\n <GroupList\n team={team}\n isModeSync={syncChecked}\n groups={groups}\n totalGroups={totalGroups}\n onGroupRemoved={onGroupRemoved}\n setNewGroupRole={setNewGroupRole}\n type='team'\n isDisabled={isDisabled}\n />\n </AdminPanel>);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\nimport ProfilePicture from 'components/profile_picture';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport {displayEntireNameForUser} from 'utils/utils';\n\nconst USERS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 20;\n\ntype UserProfileValue = Value & UserProfile;\n\ntype Props = {\n team: Team;\n users: UserProfile[];\n intl: IntlShape;\n filterExcludeGuests?: boolean;\n excludeUsers: { [userId: string]: UserProfile };\n includeUsers: { [userId: string]: UserProfile };\n onAddCallback: (users: UserProfile[]) => void;\n onExited?: () => void;\n\n actions: {\n getProfilesNotInTeam: (teamId: string, groupConstrained: boolean, page: number, perPage?: number, options?: Record<string, any>) => Promise<ActionResult<UserProfile[]>>;\n searchProfiles: (term: string, options?: Record<string, any>) => Promise<ActionResult<UserProfile[]>>;\n };\n}\n\ntype State = {\n searchResults: UserProfile[];\n values: UserProfileValue[];\n show: boolean;\n search: boolean;\n saving: boolean;\n addError: null;\n loading: boolean;\n filterOptions: {[key: string]: any};\n}\n\nexport class AddUsersToTeamModal extends React.PureComponent<Props, State> {\n selectedItemRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: Props) {\n super(props);\n\n let filterOptions = {};\n if (props.filterExcludeGuests) {\n filterOptions = {role: 'system_user'};\n }\n\n this.state = {\n searchResults: [],\n values: [],\n show: true,\n search: false,\n saving: false,\n addError: null,\n loading: true,\n filterOptions,\n };\n\n this.selectedItemRef = React.createRef();\n }\n public componentDidMount = async () => {\n await this.props.actions.getProfilesNotInTeam(this.props.team.id, false, 0, USERS_PER_PAGE * 2);\n this.setUsersLoadingState(false);\n };\n\n private setUsersLoadingState = (loading: boolean) => {\n this.setState({loading});\n };\n\n public search = async (term: string) => {\n this.setUsersLoadingState(true);\n let searchResults: UserProfile[] = [];\n const search = term !== '';\n if (search) {\n const {data} = await this.props.actions.searchProfiles(term, {not_in_team_id: this.props.team.id, replace: true, ...this.state.filterOptions});\n searchResults = data!;\n } else {\n await this.props.actions.getProfilesNotInTeam(this.props.team.id, false, 0, USERS_PER_PAGE * 2);\n }\n this.setState({loading: false, searchResults, search});\n };\n\n public handleHide = () => {\n this.setState({show: false});\n };\n\n private handleExit = () => {\n if (this.props.onExited) {\n this.props.onExited();\n }\n };\n\n private renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {\n let rowSelected = '';\n if (isSelected) {\n rowSelected = 'more-modal__row--selected';\n }\n\n return (\n <div\n key={option.id}\n ref={isSelected ? this.selectedItemRef : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => onMouseMove(option)}\n >\n <ProfilePicture\n src={Client4.getProfilePictureUrl(option.id, option.last_picture_update)}\n size='md'\n />\n <div className='more-modal__details'>\n <div className='more-modal__name'>\n {displayEntireNameForUser(option)}\n {option.is_bot && <BotTag/>}\n {isGuest(option.roles) && <GuestTag className='popoverlist'/>}\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i\n className='icon icon-plus'\n />\n </div>\n </div>\n </div>\n );\n };\n\n private renderValue = (value: { data: UserProfileValue }): string => {\n return value.data?.username || '';\n };\n\n private renderAriaLabel = (option: UserProfileValue): string => {\n return option?.username || '';\n };\n\n private handleAdd = (value: UserProfileValue) => {\n const values: UserProfileValue[] = [...this.state.values];\n if (!values.includes(value)) {\n values.push(value);\n }\n this.setState({values});\n };\n\n private handleDelete = (values: UserProfileValue[]) => {\n this.setState({values});\n };\n\n private handlePageChange = (page: number, prevPage: number) => {\n if (page > prevPage) {\n const needMoreUsers = (this.props.users.length / USERS_PER_PAGE) <= page + 1;\n this.setUsersLoadingState(needMoreUsers);\n this.props.actions.getProfilesNotInTeam(this.props.team.id, false, page, USERS_PER_PAGE * 2).\n then(() => this.setUsersLoadingState(false));\n }\n };\n\n private handleSubmit = () => {\n this.props.onAddCallback(this.state.values);\n this.handleHide();\n };\n\n public render = (): JSX.Element => {\n const numRemainingText = (\n <div id='numPeopleRemaining'>\n <FormattedMessage\n id='multiselect.numPeopleRemaining'\n defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {person} other {people}}. '\n values={{\n num: MAX_SELECTABLE_VALUES - this.state.values.length,\n }}\n />\n </div>\n );\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n const buttonSubmitLoadingText = defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'});\n\n let addError = null;\n if (this.state.addError) {\n addError = (<div className='has-error col-sm-12'><label className='control-label font-weight--normal'>{this.state.addError}</label></div>);\n }\n\n let usersToDisplay: UserProfile[] = [];\n usersToDisplay = this.state.search ? this.state.searchResults : this.props.users;\n if (this.props.excludeUsers) {\n const hasUser = (user: UserProfile) => !this.props.excludeUsers[user.id];\n usersToDisplay = usersToDisplay.filter(hasUser);\n }\n if (this.props.includeUsers) {\n const includeUsers = Object.values(this.props.includeUsers);\n usersToDisplay = [...usersToDisplay, ...includeUsers];\n }\n\n const options = usersToDisplay.map((user) => {\n return {label: user.username, value: user.id, ...user};\n });\n\n return (\n <Modal\n id='addUsersToTeamModal'\n dialogClassName={'a11y__modal more-modal more-direct-channels'}\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.handleExit}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title componentClass='h1'>\n <FormattedMessage\n id='add_users_to_team.title'\n defaultMessage='Add New Members to {teamName} Team'\n values={{\n teamName: (\n <strong>{this.props.team.name}</strong>\n ),\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {addError}\n <MultiSelect\n key='addUsersToTeamKey'\n options={options}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n ariaLabelRenderer={this.renderAriaLabel}\n values={this.state.values}\n valueRenderer={this.renderValue}\n perPage={USERS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.handleAdd}\n handleSubmit={this.handleSubmit}\n maxValues={MAX_SELECTABLE_VALUES}\n numRemainingText={numRemainingText}\n buttonSubmitText={buttonSubmitText}\n buttonSubmitLoadingText={buttonSubmitLoadingText}\n saving={this.state.saving}\n loading={this.state.loading}\n placeholderText={defineMessage({id: 'multiselect.placeholder', defaultMessage: 'Search and add members'})}\n />\n </Modal.Body>\n </Modal>\n );\n };\n}\n\nexport default injectIntl(AddUsersToTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getProfilesNotInTeam, searchProfiles} from 'mattermost-redux/actions/users';\nimport {getProfilesNotInTeam as selectProfilesNotInTeam} from 'mattermost-redux/selectors/entities/users';\n\nimport AddUsersToTeamModal from './add_users_to_team_modal';\n\ntype Props = {\n team: Team;\n filterExcludeGuests?: boolean;\n};\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n const {id: teamId} = props.team;\n\n let filterOptions: {[key: string]: any} = {active: true};\n if (props.filterExcludeGuests) {\n filterOptions = {role: 'system_user', ...filterOptions};\n }\n\n const users: UserProfile[] = selectProfilesNotInTeam(state, teamId, filterOptions);\n\n return {\n users,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getProfilesNotInTeam,\n searchProfiles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddUsersToTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {TeamMembership, Team} from '@mattermost/types/teams';\nimport type {UserProfile, GetFilteredUsersStatsOpts} from '@mattermost/types/users';\n\nimport GeneralConstants from 'mattermost-redux/constants/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport AddUsersToTeamModal from 'components/add_users_to_team_modal';\nimport type {FilterOptions} from 'components/admin_console/filter/filter';\nimport UserGrid from 'components/admin_console/user_grid/user_grid';\nimport type {BaseMembership} from 'components/admin_console/user_grid/user_grid_role_dropdown';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n teamId: string;\n team?: Team;\n filters: GetFilteredUsersStatsOpts;\n\n users: UserProfile[];\n usersToRemove: Record<string, UserProfile>;\n usersToAdd: Record<string, UserProfile>;\n teamMembers: Record<string, TeamMembership>;\n\n totalCount: number;\n searchTerm: string;\n loading?: boolean;\n isDisabled?: boolean;\n enableGuestAccounts: boolean;\n\n onAddCallback: (users: UserProfile[]) => void;\n onRemoveCallback: (user: UserProfile) => void;\n updateRole: (userId: string, schemeUser: boolean, schemeAdmin: boolean) => void;\n\n actions: {\n getTeamStats: (teamId: string) => Promise<ActionResult>;\n loadProfilesAndReloadTeamMembers: (page: number, perPage: number, teamId: string, options?: {[key: string]: any}) => Promise<ActionResult>;\n searchProfilesAndTeamMembers: (term: string, options?: {[key: string]: any}) => Promise<ActionResult>;\n getFilteredUsersStats: (filters: GetFilteredUsersStatsOpts) => Promise<ActionResult>;\n setUserGridSearch: (term: string) => void;\n setUserGridFilters: (filters: GetFilteredUsersStatsOpts) => void;\n };\n}\n\ntype State = {\n loading: boolean;\n}\n\nconst PROFILE_CHUNK_SIZE = 10;\n\nexport default class TeamMembers extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n loading: true,\n };\n }\n\n public componentDidMount() {\n const {teamId} = this.props;\n const {loadProfilesAndReloadTeamMembers, getTeamStats, setUserGridSearch, setUserGridFilters} = this.props.actions;\n Promise.all([\n setUserGridSearch(''),\n setUserGridFilters({}),\n getTeamStats(teamId),\n loadProfilesAndReloadTeamMembers(0, PROFILE_CHUNK_SIZE * 2, teamId, {active: true}),\n ]).then(() => this.setStateLoading(false));\n }\n\n public async componentDidUpdate(prevProps: Props) {\n const filtersModified = JSON.stringify(prevProps.filters) !== JSON.stringify(this.props.filters);\n const searchTermModified = prevProps.searchTerm !== this.props.searchTerm;\n if (filtersModified || searchTermModified) {\n this.setStateLoading(true);\n clearTimeout(this.searchTimeoutId);\n const searchTerm = this.props.searchTerm;\n const filters = this.props.filters;\n\n if (searchTerm === '') {\n this.searchTimeoutId = 0;\n if (filtersModified) {\n await prevProps.actions.loadProfilesAndReloadTeamMembers(0, PROFILE_CHUNK_SIZE * 2, prevProps.teamId, {active: true, ...filters});\n }\n this.setStateLoading(false);\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n await prevProps.actions.searchProfilesAndTeamMembers(searchTerm, {...filters, team_id: this.props.teamId, allow_inactive: false});\n\n if (searchTimeoutId !== this.searchTimeoutId) {\n return;\n }\n this.setStateLoading(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n }\n\n private setStateLoading = (loading: boolean) => {\n this.setState({loading});\n };\n\n private loadPage = async (page: number) => {\n const {loadProfilesAndReloadTeamMembers} = this.props.actions;\n const {teamId, filters} = this.props;\n await loadProfilesAndReloadTeamMembers(page + 1, PROFILE_CHUNK_SIZE, teamId, {active: true, ...filters});\n };\n\n private removeUser = (user: UserProfile) => {\n this.props.onRemoveCallback(user);\n };\n\n private onAddCallback = (users: UserProfile[]) => {\n this.props.onAddCallback(users);\n };\n\n private onSearch = async (term: string) => {\n this.props.actions.setUserGridSearch(term);\n };\n\n private onFilter = async (filterOptions: FilterOptions) => {\n const roles = filterOptions.role.values;\n const systemRoles: string[] = [];\n const teamRoles: string[] = [];\n let filters = {};\n Object.keys(roles).forEach((filterKey: string) => {\n if (roles[filterKey].value) {\n if (filterKey.includes('team')) {\n teamRoles.push(filterKey);\n } else {\n systemRoles.push(filterKey);\n }\n }\n });\n\n if (systemRoles.length > 0 || teamRoles.length > 0) {\n if (systemRoles.length > 0) {\n filters = {roles: systemRoles};\n }\n if (teamRoles.length > 0) {\n filters = {...filters, team_roles: teamRoles};\n }\n\n [...systemRoles, ...teamRoles].forEach((role) => {\n trackEvent('admin_team_config_page', `${role}_filter_applied_to_members_block`, {team_id: this.props.teamId});\n });\n this.props.actions.setUserGridFilters(filters);\n this.props.actions.getFilteredUsersStats({in_team: this.props.teamId, include_bots: true, ...filters});\n } else {\n this.props.actions.setUserGridFilters(filters);\n }\n };\n\n private updateMembership = (membership: BaseMembership) => {\n this.props.updateRole(membership.user_id, membership.scheme_user, membership.scheme_admin);\n };\n\n public render = () => {\n const {users, team, usersToAdd, usersToRemove, teamMembers, totalCount, searchTerm, isDisabled} = this.props;\n\n const filterOptions: FilterOptions = {\n role: {\n name: (\n <FormattedMessage\n id='admin.user_grid.role'\n defaultMessage='Role'\n />\n ),\n values: {\n [GeneralConstants.SYSTEM_GUEST_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.guest'\n defaultMessage='Guest'\n />\n ),\n value: false,\n },\n [GeneralConstants.TEAM_USER_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_item.member'\n defaultMessage='Member'\n />\n ),\n value: false,\n },\n [GeneralConstants.TEAM_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.team_admin'\n defaultMessage='Team Admin'\n />\n ),\n value: false,\n },\n [GeneralConstants.SYSTEM_ADMIN_ROLE]: {\n name: (\n <FormattedMessage\n id='admin.user_grid.system_admin'\n defaultMessage='System Admin'\n />\n ),\n value: false,\n },\n },\n keys: [GeneralConstants.SYSTEM_GUEST_ROLE, GeneralConstants.TEAM_USER_ROLE, GeneralConstants.TEAM_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE],\n },\n };\n if (!this.props.enableGuestAccounts) {\n delete filterOptions.role.values[GeneralConstants.SYSTEM_GUEST_ROLE];\n filterOptions.role.keys = [GeneralConstants.TEAM_USER_ROLE, GeneralConstants.TEAM_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE];\n }\n const filterKeys = ['role'];\n const filterProps = {\n options: filterOptions,\n keys: filterKeys,\n onFilter: this.onFilter,\n };\n\n return (\n <AdminPanel\n id='teamMembers'\n title={defineMessage({id: 'admin.team_settings.team_detail.membersTitle', defaultMessage: 'Members'})}\n subtitle={defineMessage({id: 'admin.team_settings.team_detail.membersDescription', defaultMessage: 'A list of users who are currently in the team right now'})}\n button={\n <ToggleModalButton\n id='addTeamMembers'\n className='btn btn-primary'\n modalId={ModalIdentifiers.ADD_USER_TO_TEAM}\n dialogType={AddUsersToTeamModal}\n disabled={isDisabled}\n dialogProps={{\n team,\n onAddCallback: this.onAddCallback,\n skipCommit: true,\n excludeUsers: usersToAdd,\n includeUsers: usersToRemove,\n filterExcludeGuests: true,\n }}\n >\n <FormattedMessage\n id='admin.team_settings.team_details.add_members'\n defaultMessage='Add Members'\n />\n </ToggleModalButton>\n }\n >\n <UserGrid\n loading={this.state.loading || Boolean(this.props.loading)}\n users={users}\n loadPage={this.loadPage}\n removeUser={this.removeUser}\n totalCount={totalCount}\n memberships={teamMembers}\n updateMembership={this.updateMembership}\n onSearch={this.onSearch}\n term={searchTerm}\n includeUsers={usersToAdd}\n excludeUsers={usersToRemove}\n scope={'team'}\n readOnly={isDisabled}\n filterProps={filterProps}\n />\n </AdminPanel>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getTeamStats as loadTeamStats} from 'mattermost-redux/actions/teams';\nimport {getFilteredUsersStats} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getMembersInTeams, getTeamStats, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesInTeam, searchProfilesInTeam, filterProfiles, getFilteredUsersStats as selectFilteredUsersStats} from 'mattermost-redux/selectors/entities/users';\nimport {filterProfilesStartingWithTerm, profileListToMap} from 'mattermost-redux/utils/user_utils';\n\nimport {loadProfilesAndReloadTeamMembers, searchProfilesAndTeamMembers} from 'actions/user_actions';\nimport {setUserGridSearch, setUserGridFilters} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamMembers from './team_members';\n\ntype Props = {\n teamId: string;\n usersToAdd: Record<string, UserProfile>;\n usersToRemove: Record<string, UserProfile>;\n};\n\nfunction searchUsersToAdd(users: Record<string, UserProfile>, term: string): Record<string, UserProfile> {\n const profiles = filterProfilesStartingWithTerm(Object.keys(users).map((key) => users[key]), term);\n const filteredProfilesMap = filterProfiles(profileListToMap(profiles), {});\n\n return filteredProfilesMap;\n}\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n const {teamId, usersToRemove} = props;\n let {usersToAdd} = props;\n\n const teamMembers = getMembersInTeams(state)[teamId] || {};\n const team = getTeam(state, teamId);\n const config = getConfig(state);\n const searchTerm = state.views.search.userGridSearch?.term || '';\n const filters = state.views.search.userGridSearch?.filters || {};\n\n let totalCount: number;\n if (Object.keys(filters).length === 0) {\n const stats = getTeamStats(state)[teamId] || {active_member_count: 0};\n totalCount = stats.active_member_count;\n } else {\n const filteredUserStats = selectFilteredUsersStats(state) || {\n total_users_count: 0,\n };\n totalCount = filteredUserStats.total_users_count ?? 0;\n }\n\n let users = [];\n if (searchTerm) {\n users = searchProfilesInTeam(state, teamId, searchTerm, false, {active: true, ...filters});\n usersToAdd = searchUsersToAdd(usersToAdd, searchTerm);\n } else {\n users = getProfilesInTeam(state, teamId, {active: true, ...filters});\n }\n\n return {\n filters,\n teamId,\n team,\n users,\n teamMembers,\n usersToAdd,\n usersToRemove,\n totalCount,\n searchTerm,\n enableGuestAccounts: config.EnableGuestAccounts === 'true',\n };\n}\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTeamStats: loadTeamStats,\n loadProfilesAndReloadTeamMembers,\n searchProfilesAndTeamMembers,\n getFilteredUsersStats,\n setUserGridSearch,\n setUserGridFilters,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamMembers);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\n\nimport ExternalLink from 'components/external_link';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\n\nimport LineSwitch from '../../line_switch';\n\ntype Props = {\n syncChecked: boolean;\n allAllowedChecked: boolean;\n allowedDomainsChecked: boolean;\n allowedDomains: string;\n onToggle: (syncChecked: boolean, allAllowedChecked: boolean, allowedDomainsChecked: boolean, allowedDomains: string) => void;\n isDisabled?: boolean;\n}\n\nconst SyncGroupsToggle = ({syncChecked, allAllowedChecked, allowedDomainsChecked, allowedDomains, onToggle, isDisabled}: Props) => (\n <LineSwitch\n id='syncGroupSwitch'\n disabled={isDisabled}\n toggled={syncChecked}\n last={syncChecked}\n onToggle={() => onToggle(!syncChecked, allAllowedChecked, allowedDomainsChecked, allowedDomains)}\n title={(\n <FormattedMessage\n id='admin.team_settings.team_details.syncGroupMembers'\n defaultMessage='Sync Group Members'\n />\n )}\n subTitle={(\n <FormattedMessage\n id='admin.team_settings.team_details.syncGroupMembersDescr'\n defaultMessage='When enabled, adding and removing users from groups will add or remove them from this team. The only way of inviting members to this team is by adding the groups they belong to. <link>Learn More</link>'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href='https://www.mattermost.com/pl/default-ldap-group-constrained-team-channel.html'\n location='team_modes'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n )}\n />);\n\nconst AllowAllToggle = ({syncChecked, allAllowedChecked, allowedDomainsChecked, allowedDomains, onToggle, isDisabled}: Props) =>\n (syncChecked ? null : (\n <LineSwitch\n id='allowAllToggleSwitch'\n disabled={isDisabled}\n toggled={allAllowedChecked}\n singleLine={true}\n onToggle={() => onToggle(syncChecked, !allAllowedChecked, allowedDomainsChecked, allowedDomains)}\n title={(\n <FormattedMessage\n id='admin.team_settings.team_details.anyoneCanJoin'\n defaultMessage='Anyone can join this team'\n />\n )}\n subTitle={(\n <FormattedMessage\n id='admin.team_settings.team_details.anyoneCanJoinDescr'\n defaultMessage='This team can be discovered allowing anyone with an account to join this team.'\n />\n )}\n />));\n\nconst AllowedDomainsToggle = ({syncChecked, allAllowedChecked, allowedDomainsChecked, allowedDomains, onToggle, isDisabled}: Props) =>\n (syncChecked ? null : (\n <LineSwitch\n id='allowedDomainsToggleSwitch'\n disabled={isDisabled}\n toggled={allowedDomainsChecked}\n last={true}\n onToggle={() => onToggle(syncChecked, allAllowedChecked, !allowedDomainsChecked, allowedDomains)}\n singleLine={true}\n title={(\n <FormattedMessage\n id='admin.team_settings.team_details.specificDomains'\n defaultMessage='Only specific email domains can join this team'\n />\n )}\n subTitle={(\n <FormattedMessage\n id='admin.team_settings.team_details.specificDomainsDescr'\n defaultMessage='Users can only join the team if their email matches one of the specified domains'\n />\n )}\n >\n <>\n <div className='help-text csvDomains'>\n <FormattedMessage\n id='admin.team_settings.team_details.csvDomains'\n defaultMessage='Comma Separated Email Domain List'\n />\n </div>\n <input\n type='text'\n value={allowedDomains}\n placeholder='mattermost.com'\n className='form-control'\n onChange={(e) => onToggle(syncChecked, allAllowedChecked, allowedDomainsChecked, e.currentTarget.value)}\n disabled={isDisabled}\n />\n </>\n </LineSwitch>));\n\ntype TeamModesProps = Props & {\n isLicensedForLDAPGroups?: boolean;\n};\n\nexport const TeamModes = ({allAllowedChecked, syncChecked, allowedDomains, allowedDomainsChecked, onToggle, isDisabled, isLicensedForLDAPGroups}: TeamModesProps) => (\n <AdminPanel\n id='team_manage'\n title={defineMessage({id: 'admin.team_settings.team_detail.manageTitle', defaultMessage: 'Team Management'})}\n subtitle={defineMessage({id: 'admin.team_settings.team_detail.manageDescription', defaultMessage: 'Choose between inviting members manually or syncing members automatically from groups.'})}\n >\n <div className='group-teams-and-channels'>\n <div className='group-teams-and-channels--body'>\n {isLicensedForLDAPGroups &&\n <SyncGroupsToggle\n allAllowedChecked={allAllowedChecked}\n allowedDomainsChecked={allowedDomainsChecked}\n allowedDomains={allowedDomains}\n syncChecked={syncChecked}\n onToggle={onToggle}\n isDisabled={isDisabled}\n />\n }\n <AllowAllToggle\n allAllowedChecked={allAllowedChecked}\n allowedDomainsChecked={allowedDomainsChecked}\n allowedDomains={allowedDomains}\n syncChecked={syncChecked}\n onToggle={onToggle}\n isDisabled={isDisabled}\n />\n <AllowedDomainsToggle\n allAllowedChecked={allAllowedChecked}\n allowedDomainsChecked={allowedDomainsChecked}\n allowedDomains={allowedDomains}\n syncChecked={syncChecked}\n onToggle={onToggle}\n isDisabled={isDisabled}\n />\n </div>\n </div>\n </AdminPanel>);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport noop from 'lodash/noop';\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, defineMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {openModal} from 'actions/views/modals';\n\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport useGetUsageDeltas from 'components/common/hooks/useGetUsageDeltas';\nimport PricingModal from 'components/pricing_modal';\nimport AdminPanel from 'components/widgets/admin_console/admin_panel';\nimport TeamIcon from 'components/widgets/team_icon/team_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {imageURLForTeam} from 'utils/utils';\n\nimport './team_profile.scss';\n\ntype Props = {\n team: Team;\n isArchived: boolean;\n onToggleArchive: () => void;\n isDisabled?: boolean;\n saveNeeded?: boolean;\n}\n\nexport function TeamProfile({team, isArchived, onToggleArchive, isDisabled, saveNeeded}: Props) {\n const teamIconUrl = imageURLForTeam(team);\n const usageDeltas = useGetUsageDeltas();\n const dispatch = useDispatch();\n const usage = useGetUsage();\n const license = useSelector(getLicense);\n const intl = useIntl();\n\n const [overrideRestoreDisabled, setOverrideRestoreDisabled] = useState(false);\n const [restoreDisabled, setRestoreDisabled] = useState(usageDeltas.teams.teamsLoaded && usageDeltas.teams.active >= 0 && isArchived);\n\n useEffect(() => {\n setRestoreDisabled(license.Cloud === 'true' && usageDeltas.teams.teamsLoaded && usageDeltas.teams.active >= 0 && isArchived && !overrideRestoreDisabled && !saveNeeded);\n }, [usageDeltas, isArchived, overrideRestoreDisabled, saveNeeded, license]);\n\n // If in a cloud context and the teams usage hasn't loaded, don't render anything to prevent weird flashes on the screen\n if (license.Cloud === 'true' && !usage.teams.teamsLoaded) {\n return null;//\n }\n\n const archiveBtn = isArchived ?\n defineMessage({id: 'admin.team_settings.team_details.unarchiveTeam', defaultMessage: 'Unarchive Team'}) :\n defineMessage({id: 'admin.team_settings.team_details.archiveTeam', defaultMessage: 'Archive Team'});\n\n const toggleArchive = () => {\n setOverrideRestoreDisabled(true);\n onToggleArchive();\n };\n const button = () => {\n if (restoreDisabled) {\n return (\n <WithTooltip\n title={intl.formatMessage({id: 'workspace_limits.teams_limit_reached.upgrade_to_unarchive', defaultMessage: 'Upgrade to Unarchive'})}\n hint={intl.formatMessage({id: 'workspace_limits.teams_limit_reached.tool_tip', defaultMessage: 'You\\'ve reached the team limit for your current plan. Consider upgrading to unarchive this team or archive your other teams'})}\n >\n <div\n className={'disabled-overlay-wrapper'}\n >\n <button\n type='button'\n disabled={restoreDisabled}\n style={{pointerEvents: 'none'}}\n className={\n classNames(\n 'btn',\n 'btn-danger',\n 'ArchiveButton',\n {ArchiveButton___archived: isArchived},\n {ArchiveButton___unarchived: !isArchived},\n {disabled: isDisabled},\n 'cloud-limits-disabled',\n )\n }\n onClick={noop}\n >\n {isArchived ? (\n <i className='icon icon-archive-arrow-up-outline'/>\n ) : (\n <i className='icon icon-archive-outline'/>\n )}\n <FormattedMessage {...archiveBtn}/>\n </button>\n </div>\n </WithTooltip>\n );\n }\n return (\n <button\n type='button'\n disabled={restoreDisabled}\n className={\n classNames(\n 'btn',\n 'ArchiveButton',\n {ArchiveButton___archived: isArchived},\n {ArchiveButton___unarchived: !isArchived},\n {disabled: isDisabled},\n 'cloud-limits-disabled',\n )\n }\n onClick={toggleArchive}\n >\n {isArchived ? (\n <i className='icon icon-archive-arrow-up-outline'/>\n ) : (\n <i className='icon icon-archive-outline'/>\n )}\n <FormattedMessage {...archiveBtn}/>\n </button>\n );\n };\n\n return (\n <AdminPanel\n id='team_profile'\n title={defineMessage({id: 'admin.team_settings.team_detail.profileTitle', defaultMessage: 'Team Profile'})}\n subtitle={defineMessage({id: 'admin.team_settings.team_detail.profileDescription', defaultMessage: 'Summary of the team, including team name and description.'})}\n >\n\n <div className='group-teams-and-channels'>\n\n <div className='group-teams-and-channels--body'>\n <div className='d-flex'>\n <div className='large-team-image-col'>\n <TeamIcon\n content={team.display_name}\n size='lg'\n url={teamIconUrl}\n />\n </div>\n <div className='team-desc-col'>\n <div className='row row-bottom-padding'>\n <FormattedMessage\n id='admin.teamSettings.teamDetail.teamName'\n defaultMessage='<b>Team Name</b>:'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <br/>\n {team.display_name}\n </div>\n <div className='row'>\n <FormattedMessage\n id='admin.teamSettings.teamDetail.teamDescription'\n defaultMessage='<b>Team Description</b>:'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <br/>\n {team.description || <span className='greyed-out'>{intl.formatMessage({id: 'admin.team_settings.team_detail.profileNoDescription', defaultMessage: 'No team description added.'})}</span>}\n </div>\n </div>\n </div>\n <div className='AdminChannelDetails_archiveContainer'>\n {button()}\n {restoreDisabled &&\n <button\n onClick={() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.PRICING_MODAL,\n dialogType: PricingModal,\n }));\n }}\n type='button'\n className={\n classNames(\n 'btn',\n 'btn-secondary',\n 'upgrade-options-button',\n )\n }\n >\n <FormattedMessage\n id={'workspace_limits.teams_limit_reached.view_upgrade_options'}\n defaultMessage={'View upgrade options'}\n />\n </button>}\n </div>\n </div>\n </div>\n\n </AdminPanel>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport cloneDeep from 'lodash/cloneDeep';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {SyncableType} from '@mattermost/types/groups';\nimport type {Group, SyncablePatch} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport ConfirmModal from 'components/confirm_modal';\nimport FormError from 'components/form_error';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport {TeamGroups} from './team_groups';\nimport TeamMembers from './team_members/index';\nimport {TeamModes} from './team_modes';\nimport {TeamProfile} from './team_profile';\n\nimport SaveChangesPanel from '../../../save_changes_panel';\nimport {NeedDomainsError, NeedGroupsError, UsersWillBeRemovedError} from '../../errors';\nimport RemoveConfirmModal from '../../remove_confirm_modal';\n\nexport type Props = {\n teamID: string;\n team?: Team;\n totalGroups: number;\n groups: Group[];\n allGroups: Record<string, Group>;\n isDisabled?: boolean;\n isLicensedForLDAPGroups?: boolean;\n actions: {\n setNavigationBlocked: (blocked: boolean) => void;\n getTeam: (teamId: string) => Promise<ActionResult>;\n linkGroupSyncable: (groupId: string, syncableId: string, syncableType: SyncableType, patch: SyncablePatch) => Promise<ActionResult>;\n unlinkGroupSyncable: (groupId: string, syncableId: string, syncableType: SyncableType) => Promise<ActionResult>;\n membersMinusGroupMembers: (teamId: string, groupIds: string[], page?: number, perPage?: number) => Promise<ActionResult>;\n getGroups: (teamId: string, q?: string, page?: number, perPage?: number, filterAllowReference?: boolean) => Promise<ActionResult>;\n patchTeam: (team: Team) => Promise<ActionResult>;\n patchGroupSyncable: (groupId: string, syncableId: string, syncableType: SyncableType, patch: Partial<SyncablePatch>) => Promise<ActionResult>;\n addUserToTeam: (teamId: string, userId: string) => Promise<ActionResult>;\n removeUserFromTeam: (teamId: string, userId: string) => Promise<ActionResult>;\n updateTeamMemberSchemeRoles: (teamId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => Promise<ActionResult>;\n deleteTeam: (teamId: string) => Promise<ActionResult>;\n unarchiveTeam: (teamId: string) => Promise<ActionResult>;\n };\n};\n\ntype State = {\n groups: Group[];\n syncChecked: boolean;\n allAllowedChecked: boolean;\n allowedDomainsChecked: boolean;\n allowedDomains: string;\n saving: boolean;\n showRemoveConfirmation: boolean;\n usersToRemoveCount: number;\n usersToRemove: {[id: string]: UserProfile};\n usersToAdd: {[id: string]: UserProfile};\n rolesToUpdate: {\n [userId: string]: {\n schemeUser: boolean;\n schemeAdmin: boolean;\n };\n };\n totalGroups: number;\n saveNeeded: boolean;\n serverError: JSX.Element | undefined;\n previousServerError: JSX.Element | undefined;\n isLocalArchived: boolean;\n showArchiveConfirmModal: boolean;\n};\n\nexport default class TeamDetails extends React.PureComponent<Props, State> {\n static defaultProps = {\n team: {display_name: '', id: ''} as Team,\n };\n\n constructor(props: Props) {\n super(props);\n const team = props.team;\n this.state = {\n groups: props.groups,\n syncChecked: Boolean(team?.group_constrained),\n allAllowedChecked: Boolean(team?.allow_open_invite),\n allowedDomainsChecked: Boolean(team?.allowed_domains),\n allowedDomains: team?.allowed_domains || '',\n saving: false,\n showRemoveConfirmation: false,\n usersToRemoveCount: 0,\n usersToRemove: {},\n usersToAdd: {},\n rolesToUpdate: {},\n totalGroups: props.totalGroups,\n saveNeeded: false,\n serverError: undefined,\n previousServerError: undefined,\n isLocalArchived: team ? team.delete_at > 0 : true,\n showArchiveConfirmModal: false,\n };\n }\n\n componentDidUpdate(prevProps: Props) {\n const {totalGroups, team} = this.props;\n if (prevProps.team?.id !== team?.id || totalGroups !== prevProps.totalGroups) {\n this.setState({\n totalGroups,\n syncChecked: Boolean(team?.group_constrained),\n allAllowedChecked: Boolean(team?.allow_open_invite),\n allowedDomainsChecked: Boolean(team?.allowed_domains),\n allowedDomains: team?.allowed_domains || '',\n isLocalArchived: team ? team.delete_at > 0 : true,\n });\n }\n }\n\n componentDidMount() {\n const {teamID, actions} = this.props;\n actions.getTeam(teamID).\n then(() => actions.getGroups(teamID)).\n then(() => this.setState({groups: this.props.groups}));\n }\n\n setNewGroupRole = (gid: string) => {\n const groups = cloneDeep(this.state.groups).map((g) => {\n if (g.id === gid) {\n g.scheme_admin = !g.scheme_admin;\n }\n return g;\n });\n this.processGroupsChange(groups);\n };\n\n handleSubmit = async () => {\n const {team, groups: origGroups, teamID, actions} = this.props;\n if (!team) {\n return;\n }\n\n this.setState({showRemoveConfirmation: false, saving: true});\n const {groups, allAllowedChecked, allowedDomainsChecked, allowedDomains, syncChecked, usersToAdd, usersToRemove, rolesToUpdate} = this.state;\n\n let serverError: JSX.Element | undefined;\n\n if (this.teamToBeArchived()) {\n let saveNeeded = false;\n const result = await actions.deleteTeam(team.id);\n if ('error' in result) {\n serverError = <FormError error={result.error.message}/>;\n saveNeeded = true;\n }\n this.setState({serverError, saving: false, saveNeeded, usersToRemoveCount: 0, rolesToUpdate: {}, usersToAdd: {}, usersToRemove: {}});\n actions.setNavigationBlocked(saveNeeded);\n if (!saveNeeded) {\n getHistory().push('/admin_console/user_management/teams');\n }\n return;\n } else if (this.teamToBeRestored() && !this.state.serverError) {\n const result = await actions.unarchiveTeam(team.id);\n if ('error' in result) {\n serverError = <FormError error={result.error.message}/>;\n }\n this.setState({serverError, previousServerError: undefined});\n }\n\n let saveNeeded = false;\n if (allowedDomainsChecked && allowedDomains.trim().length === 0) {\n saveNeeded = true;\n serverError = <NeedDomainsError/>;\n } else if (this.state.groups.length === 0 && syncChecked) {\n serverError = <NeedGroupsError/>;\n saveNeeded = true;\n } else {\n const patchTeamPromise = actions.patchTeam({\n ...team,\n group_constrained: syncChecked,\n allowed_domains: allowedDomainsChecked ? allowedDomains : '',\n allow_open_invite: allAllowedChecked,\n });\n const patchTeamSyncable = groups.\n filter((g) => {\n return origGroups.some((group) => group.id === g.id && group.scheme_admin !== g.scheme_admin);\n }).\n map((g) => actions.patchGroupSyncable(g.id, teamID, SyncableType.Team, {scheme_admin: g.scheme_admin}));\n const unlink = origGroups.\n filter((g) => {\n return !groups.some((group) => group.id === g.id);\n }).\n map((g) => actions.unlinkGroupSyncable(g.id, teamID, SyncableType.Team));\n const link = groups.\n filter((g) => {\n return !origGroups.some((group) => group.id === g.id);\n }).\n map((g) => actions.linkGroupSyncable(g.id, teamID, SyncableType.Team, {auto_add: true, scheme_admin: g.scheme_admin}));\n const result = await Promise.all([patchTeamPromise, ...patchTeamSyncable, ...unlink, ...link]);\n const resultWithError = result.find((r) => r.error);\n if (resultWithError) {\n serverError = <FormError error={resultWithError.error?.message}/>;\n } else {\n if (unlink.length > 0) {\n trackEvent('admin_team_config_page', 'groups_removed_from_team', {count: unlink.length, team_id: teamID});\n }\n if (link.length > 0) {\n trackEvent('admin_team_config_page', 'groups_added_to_team', {count: link.length, team_id: teamID});\n }\n await actions.getGroups(teamID);\n }\n }\n\n const usersToAddList = Object.values(usersToAdd);\n const usersToRemoveList = Object.values(usersToRemove);\n const userRolesToUpdate = Object.keys(rolesToUpdate);\n const usersToUpdate = usersToAddList.length > 0 || usersToRemoveList.length > 0 || userRolesToUpdate.length > 0;\n if (usersToUpdate && !syncChecked) {\n const addUserActions: Array<Promise<ActionResult>> = [];\n const removeUserActions: Array<Promise<ActionResult>> = [];\n const {addUserToTeam, removeUserFromTeam, updateTeamMemberSchemeRoles} = this.props.actions;\n usersToAddList.forEach((user) => {\n addUserActions.push(addUserToTeam(teamID, user.id));\n });\n usersToRemoveList.forEach((user) => {\n removeUserActions.push(removeUserFromTeam(teamID, user.id));\n });\n\n if (addUserActions.length > 0) {\n const result = await Promise.all(addUserActions);\n const resultWithError = result.find((r) => r.error);\n const count = result.filter((r) => r.data).length;\n if (resultWithError) {\n serverError = <FormError error={resultWithError.error?.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_team_config_page', 'members_added_to_team', {count, team_id: teamID});\n }\n }\n\n if (removeUserActions.length > 0) {\n const result = await Promise.all(removeUserActions);\n const resultWithError = result.find((r) => r.error);\n const count = result.filter((r) => r.data).length;\n if (resultWithError) {\n serverError = <FormError error={resultWithError.error?.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_team_config_page', 'members_removed_from_team', {count, team_id: teamID});\n }\n }\n\n const rolesToPromote: Array<Promise<ActionResult>> = [];\n const rolesToDemote: Array<Promise<ActionResult>> = [];\n userRolesToUpdate.forEach((userId) => {\n const {schemeUser, schemeAdmin} = rolesToUpdate[userId];\n if (schemeAdmin) {\n rolesToPromote.push(updateTeamMemberSchemeRoles(teamID, userId, schemeUser, schemeAdmin));\n } else {\n rolesToDemote.push(updateTeamMemberSchemeRoles(teamID, userId, schemeUser, schemeAdmin));\n }\n });\n\n if (rolesToPromote.length > 0) {\n const result = await Promise.all(rolesToPromote);\n const resultWithError = result.find((r) => r.error);\n const count = result.filter((r) => r.data).length;\n if (resultWithError) {\n serverError = <FormError error={resultWithError.error?.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_team_config_page', 'members_elevated_to_team_admin', {count, team_id: teamID});\n }\n }\n\n if (rolesToDemote.length > 0) {\n const result = await Promise.all(rolesToDemote);\n const resultWithError = result.find((r) => r.error);\n const count = result.filter((r) => r.data).length;\n if (resultWithError) {\n serverError = <FormError error={resultWithError.error?.message}/>;\n }\n if (count > 0) {\n trackEvent('admin_team_config_page', 'admins_demoted_to_team_member', {count, team_id: teamID});\n }\n }\n }\n\n this.setState({usersToRemoveCount: 0, rolesToUpdate: {}, usersToAdd: {}, usersToRemove: {}, serverError, saving: false, saveNeeded}, () => {\n actions.setNavigationBlocked(saveNeeded);\n if (!saveNeeded && !serverError) {\n getHistory().push('/admin_console/user_management/teams');\n }\n });\n };\n\n setToggles = (syncChecked: boolean, allAllowedChecked: boolean, allowedDomainsChecked: boolean, allowedDomains: string) => {\n this.setState({\n saveNeeded: true,\n syncChecked,\n allAllowedChecked: !syncChecked && allAllowedChecked,\n allowedDomainsChecked: !syncChecked && allowedDomainsChecked,\n allowedDomains,\n }, () => this.processGroupsChange(this.state.groups));\n this.props.actions.setNavigationBlocked(true);\n };\n\n async processGroupsChange(groups: Group[]) {\n const {teamID, actions} = this.props;\n actions.setNavigationBlocked(true);\n\n let serverError: JSX.Element | undefined;\n let usersToRemoveCount = 0;\n if (this.state.syncChecked) {\n try {\n if (groups.length === 0) {\n serverError = <NeedGroupsError warning={true}/>;\n } else {\n const result = await actions.membersMinusGroupMembers(teamID, groups.map((g) => g.id));\n usersToRemoveCount = result.data ? result.data.total_count : 0;\n if (usersToRemoveCount > 0) {\n serverError = (\n <UsersWillBeRemovedError\n total={usersToRemoveCount}\n users={result.data.users}\n scope={'team'}\n scopeId={this.props.teamID}\n />\n );\n }\n }\n } catch (ex) {\n serverError = ex;\n }\n }\n this.setState({groups, usersToRemoveCount, saveNeeded: true, serverError});\n }\n\n addUsersToAdd = (users: UserProfile[]) => {\n let {usersToRemoveCount} = this.state;\n const {usersToAdd, usersToRemove} = this.state;\n const usersToAddCopy = cloneDeep(usersToAdd);\n users.forEach((user) => {\n if (usersToRemove[user.id]?.id === user.id) {\n delete usersToRemove[user.id];\n usersToRemoveCount -= 1;\n } else {\n usersToAddCopy[user.id] = user;\n }\n });\n this.setState({usersToAdd: {...usersToAddCopy}, usersToRemove: {...usersToRemove}, usersToRemoveCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n addUserToRemove = (user: UserProfile) => {\n let {usersToRemoveCount} = this.state;\n const {usersToAdd, usersToRemove, rolesToUpdate} = this.state;\n if (usersToAdd[user.id]?.id === user.id) {\n delete usersToAdd[user.id];\n } else if (usersToRemove[user.id]?.id !== user.id) {\n usersToRemoveCount += 1;\n usersToRemove[user.id] = user;\n }\n delete rolesToUpdate[user.id];\n this.setState({usersToRemove: {...usersToRemove}, usersToAdd: {...usersToAdd}, rolesToUpdate: {...rolesToUpdate}, usersToRemoveCount, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n addRolesToUpdate = (userId: string, schemeUser: boolean, schemeAdmin: boolean) => {\n const {rolesToUpdate} = this.state;\n rolesToUpdate[userId] = {schemeUser, schemeAdmin};\n this.setState({rolesToUpdate: {...rolesToUpdate}, saveNeeded: true});\n this.props.actions.setNavigationBlocked(true);\n };\n\n handleGroupRemoved = (gid: string) => {\n const groups = this.state.groups.filter((g) => g.id !== gid);\n this.setState({totalGroups: this.state.totalGroups - 1});\n this.processGroupsChange(groups);\n };\n\n handleGroupChange = (groupIDs: string[]) => {\n const groups = [...this.state.groups, ...groupIDs.map((gid) => this.props.allGroups[gid])];\n this.setState({totalGroups: this.state.totalGroups + groupIDs.length});\n this.processGroupsChange(groups);\n };\n\n hideRemoveUsersModal = () => this.setState({showRemoveConfirmation: false});\n\n hideArchiveConfirmModal = () => this.setState({showArchiveConfirmModal: false});\n\n onSave = () => {\n if (this.teamToBeArchived()) {\n this.setState({showArchiveConfirmModal: true});\n } else if (this.state.usersToRemoveCount > 0) {\n this.setState({showRemoveConfirmation: true});\n } else {\n this.handleSubmit();\n }\n };\n\n teamToBeArchived = () => {\n const {isLocalArchived} = this.state;\n const isServerArchived = this.props.team?.delete_at !== 0;\n return isLocalArchived && !isServerArchived;\n };\n\n teamToBeRestored = () => {\n const {isLocalArchived} = this.state;\n const isServerArchived = this.props.team?.delete_at !== 0;\n return !isLocalArchived && isServerArchived;\n };\n\n onToggleArchive = () => {\n const {isLocalArchived, serverError, previousServerError} = this.state;\n const {isDisabled} = this.props;\n if (isDisabled) {\n return;\n }\n\n const newState: Partial<State> = {\n saveNeeded: true,\n isLocalArchived: !isLocalArchived,\n previousServerError: undefined,\n serverError: undefined,\n };\n\n if (newState.isLocalArchived) {\n // if the channel is being archived then clear the other server\n // errors, they're no longer relevant.\n newState.previousServerError = serverError;\n newState.serverError = undefined;\n } else {\n // if the channel is being unarchived (maybe the user had toggled\n // and untoggled) the button, so reinstate any server errors that\n // were present.\n newState.serverError = previousServerError;\n newState.previousServerError = undefined;\n }\n this.props.actions.setNavigationBlocked(true);\n this.setState(newState as State);\n };\n\n render = () => {\n const {team, isLicensedForLDAPGroups} = this.props;\n\n if (!team) {\n return null;\n }\n\n const {totalGroups, saving, saveNeeded, serverError, groups, allAllowedChecked, allowedDomainsChecked, allowedDomains, syncChecked, showRemoveConfirmation, usersToRemoveCount, isLocalArchived, showArchiveConfirmModal} = this.state;\n const missingGroup = (og: {id: string}) => !groups.find((g) => g.id === og.id);\n const removedGroups = this.props.groups.filter(missingGroup);\n const nonArchivedContent = (\n <>\n <RemoveConfirmModal\n amount={usersToRemoveCount}\n inChannel={false}\n show={showRemoveConfirmation}\n onCancel={this.hideRemoveUsersModal}\n onConfirm={this.handleSubmit}\n />\n\n <TeamModes\n allAllowedChecked={allAllowedChecked}\n allowedDomainsChecked={allowedDomainsChecked}\n allowedDomains={allowedDomains}\n syncChecked={syncChecked}\n onToggle={this.setToggles}\n isDisabled={this.props.isDisabled}\n isLicensedForLDAPGroups={isLicensedForLDAPGroups}\n />\n\n {isLicensedForLDAPGroups &&\n <TeamGroups\n syncChecked={syncChecked}\n team={team}\n groups={groups}\n removedGroups={removedGroups}\n totalGroups={totalGroups}\n onAddCallback={this.handleGroupChange}\n onGroupRemoved={this.handleGroupRemoved}\n setNewGroupRole={this.setNewGroupRole}\n isDisabled={this.props.isDisabled}\n />\n }\n\n {!syncChecked &&\n <TeamMembers\n onRemoveCallback={this.addUserToRemove}\n onAddCallback={this.addUsersToAdd}\n usersToRemove={this.state.usersToRemove}\n usersToAdd={this.state.usersToAdd}\n updateRole={this.addRolesToUpdate}\n teamId={this.props.teamID}\n isDisabled={this.props.isDisabled}\n />\n }\n </>\n );\n\n return (\n <div className='wrapper--fixed'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/user_management/teams'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.team_settings.team_detail.group_configuration'\n defaultMessage='Team Configuration'\n />\n </div>\n </AdminHeader>\n\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <TeamProfile\n team={team}\n onToggleArchive={this.onToggleArchive}\n isArchived={isLocalArchived}\n isDisabled={this.props.isDisabled}\n saveNeeded={this.state.saveNeeded}\n />\n <ConfirmModal\n show={showArchiveConfirmModal}\n title={\n <FormattedMessage\n id='admin.team_settings.team_detail.archive_confirm.title'\n defaultMessage='Save and Archive Team'\n />\n }\n message={\n <FormattedMessage\n id='admin.team_settings.team_detail.archive_confirm.message'\n defaultMessage={'Archiving will remove the team from the user interface but it\\'s contents remain in the database and may still be accessible with the API. Are you sure you wish to save and archive this team?'}\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='admin.team_settings.team_detail.archive_confirm.button'\n defaultMessage='Archive'\n />\n }\n onConfirm={this.handleSubmit}\n onCancel={this.hideArchiveConfirmModal}\n />\n {!isLocalArchived && nonArchivedContent}\n </div>\n </div>\n\n <SaveChangesPanel\n saving={saving}\n cancelLink='/admin_console/user_management/teams'\n saveNeeded={saveNeeded}\n onClick={this.onSave}\n serverError={serverError}\n isDisabled={this.props.isDisabled}\n />\n </div>\n );\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {\n getGroupsAssociatedToTeam as fetchAssociatedGroups,\n linkGroupSyncable,\n unlinkGroupSyncable,\n patchGroupSyncable,\n} from 'mattermost-redux/actions/groups';\nimport {getTeam as fetchTeam, membersMinusGroupMembers, patchTeam, removeUserFromTeam, updateTeamMemberSchemeRoles, addUserToTeam, deleteTeam, unarchiveTeam} from 'mattermost-redux/actions/teams';\nimport {getAllGroups, getGroupsAssociatedToTeam} from 'mattermost-redux/selectors/entities/groups';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setNavigationBlocked} from 'actions/admin_actions';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamDetails from './team_details';\n\ntype Params = {\n team_id: string;\n}\n\nexport type OwnProps = RouteComponentProps<Params>;\n\nfunction mapStateToProps(state: GlobalState, props: OwnProps) {\n const teamID = props.match.params.team_id;\n const team = getTeam(state, teamID);\n const groups = getGroupsAssociatedToTeam(state, teamID);\n const allGroups = getAllGroups(state);\n const totalGroups = groups.length;\n const isLicensedForLDAPGroups = state.entities.general.license.LDAPGroups === 'true';\n return {\n team,\n groups,\n totalGroups,\n allGroups,\n teamID,\n isLicensedForLDAPGroups,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTeam: fetchTeam,\n getGroups: fetchAssociatedGroups,\n patchTeam,\n linkGroupSyncable,\n unlinkGroupSyncable,\n membersMinusGroupMembers,\n setNavigationBlocked,\n patchGroupSyncable,\n removeUserFromTeam,\n addUserToTeam,\n updateTeamMemberSchemeRoles,\n deleteTeam,\n unarchiveTeam,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamDetails);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\n\nexport default class ValidationResult {\n result: boolean;\n text: MessageDescriptor | string;\n\n constructor(result: boolean, text: MessageDescriptor | string) {\n this.result = result;\n this.text = text;\n }\n\n public isValid(): boolean {\n return this.result;\n }\n\n public error(intl: IntlShape): string|null {\n if (this.result) {\n return null;\n }\n if (typeof this.text === 'string') {\n return this.text;\n }\n return intl.formatMessage(this.text);\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useRef, useState} from 'react';\nimport type {RefObject} from 'react';\n\nimport type {AccordionItemType} from './accordion';\n\nimport './accordion.scss';\n\ntype Props = {\n data: AccordionItemType;\n isExpanded: boolean;\n onButtonClick: () => void;\n onHeaderClick?: <T>(ref: RefObject<HTMLLIElement>) => T | void;\n}\n\nconst AccordionCard = ({\n data,\n isExpanded,\n onButtonClick,\n onHeaderClick,\n}: Props): JSX.Element | null => {\n const contentRef = useRef<HTMLDivElement>(null);\n const itemRef = useRef<HTMLLIElement>(null);\n\n const [height, setHeight] = useState(0);\n const [open, setOpen] = useState(isExpanded);\n\n const toggle = () => {\n if (onButtonClick) {\n onButtonClick();\n }\n\n if (onHeaderClick) {\n onHeaderClick(itemRef);\n }\n };\n\n useEffect(() => {\n if (!contentRef?.current || data.items.length === 0) {\n return;\n }\n if (isExpanded) {\n const contentEl = contentRef.current;\n setHeight(contentEl.scrollHeight);\n } else {\n setHeight(0);\n }\n setOpen(isExpanded);\n }, [data.items.length, isExpanded]);\n\n const hasItems = data.items.length > 0;\n\n return (\n <li\n className={classNames('accordion-card', {active: open})}\n ref={itemRef}\n >\n <div\n className='accordion-card-header'\n onClick={hasItems ? toggle : undefined}\n role={hasItems ? 'button' : undefined}\n >\n {data.icon && (\n <div className='accordion-card-header__icon'>\n {data.icon}\n </div>\n )}\n <div className='accordion-card-header__body'>\n <div className='accordion-card-header__body__title'>\n {data.title}\n </div>\n {data.description && (\n <div className='accordion-card-header__body__description'>\n {data.description}\n </div>\n )}\n </div>\n {data.extraContent && (\n <div className='accordion-card-header__extraContent'>\n {data.extraContent}\n </div>\n )}\n {hasItems && (\n <div className='accordion-card-header__chevron'>\n <i className='icon-chevron-down'/>\n </div>\n )}\n </div>\n {hasItems && (\n <div\n className='accordion-card-container'\n style={{height}}\n >\n <div\n ref={contentRef}\n className='accordion-card-container__content'\n >\n {data.items}\n </div>\n </div>\n )}\n </li>\n );\n};\n\nexport default AccordionCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useState} from 'react';\nimport type {RefObject} from 'react';\n\nimport AccordionCard from './accordion_card';\n\nimport './accordion.scss';\n\nexport type AccordionItemType = {\n title: string;\n description?: string;\n extraContent?: React.ReactNode;\n icon?: React.ReactNode;\n items: React.ReactNode[];\n id?: string;\n};\n\ntype AccordionProps = {\n accordionItemsData: AccordionItemType[];\n expandMultiple?: boolean;\n openFirstElement?: boolean;\n onHeaderClick?: <T>(ref: RefObject<HTMLLIElement>) => T | void;\n className?: string;\n onItemOpened?: (index: number) => void;\n};\n\nconst Accordion = ({\n accordionItemsData,\n expandMultiple,\n openFirstElement,\n onHeaderClick,\n onItemOpened,\n className,\n}: AccordionProps): JSX.Element => {\n const [currentIndexes, setCurrentIndexes] = useState<number[]>(openFirstElement ? [0] : []);\n\n const onButtonClick = (index: number) => {\n if (currentIndexes.includes(index)) {\n const newIndexes = currentIndexes.filter((_index: number) => {\n return index !== _index;\n });\n setCurrentIndexes(newIndexes);\n } else {\n if (onItemOpened) {\n onItemOpened(index);\n }\n setCurrentIndexes(expandMultiple ? [...currentIndexes, index] : [index]);\n }\n };\n\n return (\n <ul className={classNames('Accordion', className)}>\n {accordionItemsData.map((accordionItem, index) => {\n return (\n <AccordionCard\n key={index.toString()}\n data={accordionItem}\n isExpanded={Boolean(currentIndexes.includes(index))}\n onButtonClick={() => onButtonClick(index)}\n onHeaderClick={onHeaderClick}\n />\n );\n })}\n </ul>\n );\n};\n\nexport default Accordion;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport type DataModel = {\n [key: string]: {\n title: string;\n description: string;\n descriptionOk: string;\n items: ItemModel[];\n icon: React.ReactNode;\n hide?: boolean;\n };\n}\n\nexport enum ItemStatus {\n\n /** Return NONE if it's not relevant, not configured, or not an option */\n NONE = 'none',\n\n /** Return OK if all checks for this have passed */\n OK = 'ok',\n\n /** Return info if it might not be relevant to them, but they could utilize it */\n INFO = 'info',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\nexport type ItemModel = {\n id: string;\n title: string;\n description: string;\n status: ItemStatus;\n scoreImpact: number;\n impactModifier: number;\n configUrl?: string;\n configText?: string;\n telemetryAction?: string;\n infoUrl?: string;\n infoText?: string;\n}\n\nexport type UpdatesParam = {\n serverVersion: {\n type: string;\n status: ItemStatus;\n description: string;\n };\n}\n\ntype Analytics = {\n DAILY_ACTIVE_USERS: number;\n MONTHLY_ACTIVE_USERS: number;\n TOTAL_INACTIVE_USERS: number;\n TOTAL_MASTER_DB_CONNECTIONS: number;\n TOTAL_POSTS: number;\n TOTAL_PRIVATE_GROUPS: number;\n TOTAL_PUBLIC_CHANNELS: number;\n TOTAL_READ_DB_CONNECTIONS: number;\n TOTAL_TEAMS: number;\n TOTAL_USERS: number;\n TOTAL_WEBSOCKET_CONNECTIONS: number;\n}\nexport type Options = {\n isLicensed: boolean;\n isEnterpriseLicense: boolean;\n trialOrEnterpriseCtaConfig: {\n configUrl: string;\n configText: string;\n };\n isCloud: boolean;\n isStarterLicense: boolean;\n analytics: Analytics | undefined;\n installedVersion: string;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Chip from 'components/common/chip/chip';\n\nimport {ItemStatus} from './dashboard.type';\n\nimport './dashboard.scss';\n\nexport type ChipsInfoType = Record<ItemStatus.INFO | ItemStatus.WARNING | ItemStatus.ERROR, number>;\n\ntype ChipsListProps = {\n chipsData: ChipsInfoType;\n hideCountZeroChips: boolean;\n};\n\nconst ChipsList = ({\n chipsData,\n hideCountZeroChips,\n}: ChipsListProps): JSX.Element | null => {\n const chipsList = Object.entries(chipsData).map(([chipKey, count]) => {\n if (hideCountZeroChips && count === 0) {\n return false;\n }\n let chipLegend;\n switch (chipKey) {\n case ItemStatus.INFO:\n chipLegend = (\n <FormattedMessage\n id={'admin.reporting.workspace_optimization.chip_suggestions'}\n defaultMessage={'Suggestions: {count}'}\n values={{count}}\n />\n );\n break;\n case ItemStatus.WARNING:\n chipLegend = (\n <FormattedMessage\n id={'admin.reporting.workspace_optimization.chip_warnings'}\n defaultMessage={'Warnings: {count}'}\n values={{count}}\n />\n );\n break;\n case ItemStatus.ERROR:\n default:\n chipLegend = (\n <FormattedMessage\n id={'admin.reporting.workspace_optimization.chip_problems'}\n defaultMessage={'Problems: {count}'}\n values={{count}}\n />\n );\n break;\n }\n\n return (\n <Chip\n key={chipKey}\n additionalMarkup={chipLegend}\n className={chipKey}\n />\n );\n });\n\n if (chipsList.length === 0) {\n return null;\n }\n\n return (\n <>\n {chipsList}\n </>\n );\n};\n\nexport default ChipsList;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport './dashboard.scss';\n\ntype CtaButtonsProps = {\n learnMoreLink?: string;\n learnMoreText?: string;\n actionLink?: string;\n actionText?: React.ReactNode;\n telemetryAction?: string;\n actionButtonCallback?: () => void;\n};\n\nconst CtaButtons = ({\n learnMoreLink,\n learnMoreText,\n actionLink,\n actionText,\n telemetryAction,\n actionButtonCallback,\n}: CtaButtonsProps): JSX.Element => {\n const history = useHistory();\n\n const getClickHandler = (id: string, link?: string) => () => {\n if (telemetryAction) {\n trackEvent(\n TELEMETRY_CATEGORIES.WORKSPACE_OPTIMIZATION_DASHBOARD,\n `workspace_dashboard_${telemetryAction}_${id}`,\n );\n }\n\n if (id === 'cta' && typeof actionButtonCallback === 'function') {\n actionButtonCallback();\n } else if (link?.startsWith('/')) {\n history.push(link);\n } else if (link?.startsWith('http')) {\n window.open(link, '_blank');\n }\n };\n\n return (\n <div className='ctaButtons'>\n {(actionLink || actionButtonCallback) && actionText && (\n <button\n className='actionButton annnouncementBar__purchaseNow'\n onClick={getClickHandler('cta', actionLink)}\n >\n {actionText}\n </button>\n )}\n {learnMoreLink && learnMoreText && (\n <button\n className='learnMoreButton light-blue-btn'\n onClick={getClickHandler('learn-more', learnMoreLink)}\n >\n {learnMoreText}\n </button>\n )}\n </div>\n );\n};\n\nexport default CtaButtons;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {testSiteURL} from 'actions/admin_actions';\n\nimport {ConsolePages, DocLinks} from 'utils/constants';\n\nimport {impactModifiers} from '../dashboard.data';\nimport {ItemStatus} from '../dashboard.type';\nimport type {ItemModel} from '../dashboard.type';\n\n/**\n *\n * @description Checking to see if the siteURL is configured correctly by running it through the same \"check siteURL\" button that exists on the webserver page.\n */\nconst siteURLCheck = async (config: Partial<AdminConfig>, formatMessage: ReturnType<typeof useIntl>['formatMessage']): Promise<ItemModel> => {\n let status = ItemStatus.OK;\n const testURL = async () => {\n if (!config.ServiceSettings?.SiteURL) {\n status = ItemStatus.ERROR;\n }\n\n const onSuccess = ({status: s}: any) => {\n if (s === 'OK') {\n status = ItemStatus.OK;\n }\n };\n const onError = () => {\n status = ItemStatus.ERROR;\n };\n await testSiteURL(onSuccess, onError, config.ServiceSettings?.SiteURL);\n };\n\n await testURL();\n return {\n id: 'site-url',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.access.site_url.title',\n defaultMessage: 'Misconfigured web server',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.access.site_url.description',\n defaultMessage: 'Your web server settings aren\\'t passing a live URL test which means your workspace may not be accessible to users. We recommend updating your web server settings.',\n }),\n configUrl: ConsolePages.WEB_SERVER,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.access.site_url.cta', defaultMessage: 'Configure web server'}),\n infoUrl: DocLinks.SITE_URL,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'site-url',\n status,\n scoreImpact: 12,\n impactModifier: impactModifiers[status],\n };\n};\n\nconst checks = [\n siteURLCheck,\n];\n\nexport const runAccessChecks = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n) => {\n const results = await Promise.all(checks.map((check) => check(config, formatMessage)));\n return results;\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport type {useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {ConsolePages, DocLinks} from 'utils/constants';\n\nimport {impactModifiers} from '../dashboard.data';\nimport {ItemStatus} from '../dashboard.type';\nimport type {ItemModel, Options} from '../dashboard.type';\n\n/**\n *\n * @description This checks to see if the user's active session is done over https. This does not check if the server is configured to use https.\n */\nconst ssl = (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n): ItemModel => {\n const status = document.location.protocol === 'https:' ? ItemStatus.OK : ItemStatus.ERROR;\n\n return {\n id: 'ssl',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.ssl.title',\n defaultMessage: 'Configure SSL to make your server more secure',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.ssl.description',\n defaultMessage: 'We strongly recommend securing your Mattermost workspace by configuring SSL in production environments.',\n }),\n infoUrl: DocLinks.SSL_CERTIFICATE,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'ssl',\n status,\n scoreImpact: 25,\n impactModifier: impactModifiers[status],\n };\n};\n\n/**\n *\n * @description This checks to see if the user has adjusted the default session lengths to something other than 720 hours.\n */\nconst sessionLength = (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n): ItemModel => {\n const status = config.ServiceSettings?.SessionLengthMobileInHours === 720 ? ItemStatus.INFO : ItemStatus.OK;\n return {\n id: 'session-length',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.session_length.title',\n defaultMessage: 'Session lengths is set to default',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.session_length.description',\n defaultMessage: 'Your session length is set to the default of 30 days. A longer session length provides convenience, and a shorter session provides tighter security. We recommend adjusting this based on your organization\\'s security policies.',\n }),\n configUrl: ConsolePages.SESSION_LENGTHS,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.configuration.session_length.cta', defaultMessage: 'Configure session length'}),\n infoUrl: DocLinks.SESSION_LENGTHS,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'session-length',\n status,\n scoreImpact: 8,\n impactModifier: impactModifiers[status],\n };\n};\n\n/**\n *\n * @description This checks to see if Mattermost is running as root.\n */\nconst rootUserCheck = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const fetchRootStatus = async () => {\n const result = await Client4.ping(true);\n return result.root_status ? ItemStatus.WARNING : ItemStatus.OK;\n };\n\n const status = await fetchRootStatus();\n\n return {\n id: 'root_status,',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.root_status.title',\n defaultMessage: 'Mattermost is running as root',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.root_status.description',\n defaultMessage: 'Running Mattermost as root is not recommended. Please use a non-root user.',\n }),\n telemetryAction: 'root_status',\n status,\n scoreImpact: 25,\n impactModifier: impactModifiers[status],\n };\n};\n\nconst fileStorage = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const testFileStorage = async () => {\n const pingResponse = await Client4.ping(true);\n\n return pingResponse.filestore_status === 'OK' ? ItemStatus.OK : ItemStatus.ERROR;\n };\n\n const status = await testFileStorage();\n\n return {\n id: 'file_storage,',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.file_storage.title',\n defaultMessage: 'File storage access is faulty.',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.file_storage.description',\n defaultMessage: 'Check your file storage settings to ensure your Mattermost workspace has access to the configured file storage.',\n }),\n configUrl: ConsolePages.FILE_STORAGE,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.configuration.file_storage.cta', defaultMessage: 'Config file storage'}),\n infoUrl: DocLinks.FILE_STORAGE,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'file_storage',\n status,\n scoreImpact: 50,\n impactModifier: impactModifiers[status],\n };\n};\n\nexport const runConfigChecks = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const checks = [\n ssl,\n sessionLength,\n fileStorage,\n rootUserCheck,\n ];\n const results = await Promise.all(checks.map((check) => check(config, formatMessage, options)));\n return results;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {ConsolePages, DocLinks} from 'utils/constants';\n\nimport {impactModifiers} from '../dashboard.data';\nimport {ItemStatus} from '../dashboard.type';\nimport type {Options} from '../dashboard.type';\n\n/**\n *\n * @description Checks if they they have a global policy deletion enabled, or if a custom policy has been created.\n */\nconst dataRetentionCheck = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const testDataRetention = async (\n config: Partial<AdminConfig>,\n options: Options,\n ) => {\n if (!options.isLicensed || !options.isEnterpriseLicense) {\n return ItemStatus.INFO;\n }\n\n if (config.DataRetentionSettings?.EnableMessageDeletion || config.DataRetentionSettings?.EnableFileDeletion) {\n return ItemStatus.OK;\n }\n\n const policyCount: {total_count: number} = await fetch(`${Client4.getBaseRoute()}/data_retention/policies_count`).then((result) => result.json());\n return policyCount.total_count > 0 ? ItemStatus.OK : ItemStatus.INFO;\n };\n\n const status = await testDataRetention(config, options);\n return {\n id: 'data-retention',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.data_privacy.retention.title',\n defaultMessage: 'Become more data aware',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.data_privacy.retention.description',\n defaultMessage: 'Organizations in highly regulated industries require more control and insight with their data. We recommend enabling Data Retention and Compliance features.',\n }),\n ...(options.isLicensed && options.isEnterpriseLicense ? {\n configUrl: ConsolePages.DATA_RETENTION,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.data_privacy.retention.cta', defaultMessage: 'Try data retention'}),\n } : options.trialOrEnterpriseCtaConfig),\n infoUrl: DocLinks.DATA_RETENTION_POLICY,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'data-retention',\n status,\n scoreImpact: 16,\n impactModifier: impactModifiers[status],\n };\n};\n\nexport const runDataPrivacyChecks = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const checks = [\n dataRetentionCheck,\n ];\n const results = await Promise.all(checks.map((check) => check(config, formatMessage, options)));\n return results;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {ldapTest} from 'actions/admin_actions';\n\nimport {ConsolePages, DocLinks} from 'utils/constants';\n\nimport {impactModifiers} from '../dashboard.data';\nimport {ItemStatus} from '../dashboard.type';\nimport type {ItemModel, Options} from '../dashboard.type';\n\n// import {Client4} from 'mattermost-redux/client';\n// import {AnalyticsRow} from '@mattermost/types/admin';\n\nconst usesLDAP = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n): Promise<ItemModel> => {\n const testLdap = async (\n config: Partial<AdminConfig>,\n options: Options,\n ): Promise<ItemStatus> => {\n let check = ItemStatus.INFO;\n\n if (!options.isLicensed || !config.LdapSettings?.Enable) {\n return check;\n }\n\n const onSuccess = ({status}: any) => {\n if (status === 'OK') {\n check = ItemStatus.OK;\n }\n };\n\n await ldapTest(onSuccess);\n\n return check;\n };\n\n // something feels flawed in this check.\n const status = options.analytics?.TOTAL_USERS as number > 100 ? await testLdap(config, options) : ItemStatus.OK;\n\n return {\n id: 'ad-ldap',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.title',\n defaultMessage: 'AD/LDAP integration recommended',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.description',\n defaultMessage: 'You\\'ve reached over 100 users! We recommend setting up AD/LDAP user authentication for easier onboarding as well as automated deactivations and role assignments.',\n }),\n ...(options.isLicensed && !options.isStarterLicense ? {\n configUrl: ConsolePages.AD_LDAP,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.cta', defaultMessage: 'Try AD/LDAP'}),\n } : options.trialOrEnterpriseCtaConfig),\n infoUrl: DocLinks.SETUP_LDAP,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'ad-ldap',\n status,\n scoreImpact: 22,\n impactModifier: impactModifiers[status],\n };\n};\n\n// // commented out for now.\n// // @see discussion here: https://github.com/mattermost/mattermost-webapp/pull/9822#discussion_r806879385\n// const fetchGuestAccounts = async (\n// config: Partial<AdminConfig>,\n// analytics: AnalyticsState | undefined,\n// ) => {\n// if (config.TeamSettings?.EnableOpenServer && config.GuestAccountsSettings?.Enable) {\n// let usersArray = await fetch(`${Client4.getBaseRoute()}/users/invalid_emails`).then((result) => result.json());\n\n// // this setting is just a string with a list of domains, or an empty string\n// if (config.GuestAccountsSettings?.RestrictCreationToDomains) {\n// const domainList = config.GuestAccountsSettings?.RestrictCreationToDomains;\n// usersArray = usersArray.filter(({email}: Record<string, unknown>) => domainList.includes((email as string).split('@')[1]));\n// }\n\n// // if guest accounts make up more than 5% of the user base show the info accordion\n// if (analytics && usersArray.length > (analytics.totalUsers as number * 0.05)) {\n// return ItemStatus.INFO;\n// }\n// }\n\n// return ItemStatus.OK;\n// };\n\n// const guestAccounts = async (\n// config: Partial<AdminConfig>,\n// formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n// options: Options,\n// ): Promise<ItemModel> => {\n// const status = await fetchGuestAccounts(config, options.analytics);\n// return {\n// id: 'guest-accounts',\n// title: formatMessage({\n// id: 'admin.reporting.workspace_optimization.ease_of_management.guests_accounts.title',\n// defaultMessage: 'Guest Accounts recommended',\n// }),\n// description: formatMessage({\n// id: 'admin.reporting.workspace_optimization.ease_of_management.guests_accounts.description',\n// defaultMessage: 'Several user accounts are using different domains than your Site URL. You can control user access to channels and teams with guest accounts. We recommend starting an Enterprise trial and enabling Guest Access.',\n// }),\n// ...options.trialOrEnterpriseCtaConfig,\n// infoUrl: 'https://docs.mattermost.com/onboard/guest-accounts.html',\n// infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n// telemetryAction: 'guest-accounts',\n// status,\n// scoreImpact: 6,\n// impactModifier: impactModifiers[status],\n// };\n// };\n\nexport const runEaseOfUseChecks = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n): Promise<ItemModel[]> => {\n const checks = [\n usesLDAP,\n\n // guestAccounts,\n ];\n\n const results = await Promise.all(checks.map((check) => check(config, formatMessage, options)));\n return results;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {elasticsearchTest} from 'actions/admin_actions';\n\nimport {ConsolePages, DocLinks} from 'utils/constants';\n\nimport {impactModifiers} from '../dashboard.data';\nimport {ItemStatus} from '../dashboard.type';\nimport type {ItemModel, Options} from '../dashboard.type';\n\nconst search = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n): Promise<ItemModel> => {\n const testElasticsearch = async (\n config: Partial<AdminConfig>,\n options: Options,\n ) => {\n let check = ItemStatus.INFO;\n\n if (!options.isLicensed || !options.isEnterpriseLicense || !(config.ElasticsearchSettings?.EnableIndexing && config.ElasticsearchSettings?.EnableSearching)) {\n return check;\n }\n\n const onSuccess = ({status}: any) => {\n if (status === 'OK') {\n check = ItemStatus.OK;\n }\n };\n await elasticsearchTest(config, onSuccess);\n return check;\n };\n\n const totalPosts = options.analytics?.TOTAL_POSTS as number;\n const totalUsers = options.analytics?.TOTAL_USERS as number;\n const status = totalPosts < 2_000_000 && totalUsers < 500 ? ItemStatus.OK : await testElasticsearch(config, options);\n return {\n id: 'search',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.performance.search.title',\n defaultMessage: 'Search performance',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.performance.search.description',\n defaultMessage: 'Your server has reached over 500 users and 2 million posts which can result in slow search performance. We recommend enabling Elasticsearch for better performance.',\n }),\n ...(options.isLicensed && options.isEnterpriseLicense ? {\n configUrl: ConsolePages.ELASTICSEARCH,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.search.cta', defaultMessage: 'Try Elasticsearch'}),\n } : options.trialOrEnterpriseCtaConfig),\n infoUrl: DocLinks.ELASTICSEARCH,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'search-optimization',\n status,\n scoreImpact: 20,\n impactModifier: impactModifiers[status],\n };\n};\n\nexport const runPerformanceChecks = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const checks = [\n search,\n ];\n\n const results = await Promise.all(checks.map((check) => check(config, formatMessage, options)));\n return results;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {useIntl} from 'react-intl';\n\nimport type {AdminConfig} from '@mattermost/types/config';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {CloudLinks, DocLinks} from 'utils/constants';\n\nimport {impactModifiers} from '../dashboard.data';\nimport {ItemStatus} from '../dashboard.type';\nimport type {Options} from '../dashboard.type';\n\nconst testServerVersion = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const serverVersion = await fetchAndCompareVersion(options.installedVersion, formatMessage);\n return {\n id: 'server_version',\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.server_version.status.title',\n defaultMessage: '{type} version update available.',\n }, {type: serverVersion.type}),\n description: serverVersion.description,\n configUrl: CloudLinks.DOWNLOAD_UPDATE,\n configText: formatMessage({id: 'admin.reporting.workspace_optimization.updates.server_version.cta', defaultMessage: 'Download update'}),\n infoUrl: DocLinks.UPGRADE_SERVER,\n infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}),\n telemetryAction: 'server-version',\n status: serverVersion.status,\n scoreImpact: 15,\n impactModifier: impactModifiers[serverVersion.status],\n };\n};\n\nexport const fetchAndCompareVersion = async (\n installedVersion: string,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n) => {\n const result = await fetch(`${Client4.getBaseRoute()}/latest_version`).then((result) => result.json());\n\n if (result.tag_name) {\n const sanitizedVersion = result.tag_name.startsWith('v') ? result.tag_name.slice(1) : result.tag_name;\n const newVersionParts = sanitizedVersion.split('.');\n const installedVersionParts = installedVersion.split('.').slice(0, 3);\n\n // quick general check if a newer version is available\n let type = '';\n let status: ItemStatus = ItemStatus.OK;\n\n if (sanitizedVersion.localeCompare(installedVersion, undefined, {numeric: true, sensitivity: 'base'}) > 0) {\n // get correct values to be inserted into the accordion item\n switch (true) {\n case Number(newVersionParts[0]) > Number(installedVersionParts[0]):\n type = formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.major',\n defaultMessage: 'Major',\n });\n status = ItemStatus.ERROR;\n break;\n case Number(newVersionParts[1]) > Number(installedVersionParts[1]):\n type = formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.minor',\n defaultMessage: 'Minor',\n });\n status = ItemStatus.WARNING;\n break;\n case Number(newVersionParts[2]) > Number(installedVersionParts[2]):\n type = formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.patch',\n defaultMessage: 'Patch',\n });\n status = ItemStatus.INFO;\n break;\n }\n }\n\n return {type, description: result.body, status};\n }\n\n return {type: '', description: '', status: ItemStatus.OK};\n};\n\nexport const runUpdateChecks = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => {\n const checks = [\n testServerVersion,\n ];\n\n const results = await Promise.all(checks.map((check) => check(config, formatMessage, options)));\n return results;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useMemo, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {\n ChartLineIcon,\n ServerVariantIcon,\n ArrowUpBoldCircleOutlineIcon,\n TuneIcon,\n LockOutlineIcon,\n AccountMultipleOutlineIcon,\n} from '@mattermost/compass-icons/components';\nimport type {AdminConfig} from '@mattermost/types/config';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getLicense, getServerVersion} from 'mattermost-redux/selectors/entities/general';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nimport {ConsolePages} from 'utils/constants';\n\nimport {ItemStatus} from './dashboard.type';\nimport type {DataModel, Options} from './dashboard.type';\nimport {runAccessChecks} from './dashboard_checks/access';\nimport {runConfigChecks} from './dashboard_checks/config';\nimport {runDataPrivacyChecks} from './dashboard_checks/data_privacy';\nimport {runEaseOfUseChecks} from './dashboard_checks/easy_management';\nimport {runPerformanceChecks} from './dashboard_checks/performance';\nimport {runUpdateChecks} from './dashboard_checks/updates';\n\nimport {daysToLicenseExpire, isEnterpriseOrE20License, getIsStarterLicense} from '../../../utils/license_utils';\n\nexport const impactModifiers: Record<ItemStatus, number> = {\n [ItemStatus.NONE]: 1,\n [ItemStatus.OK]: 1,\n [ItemStatus.INFO]: 0.5,\n [ItemStatus.WARNING]: 0.25,\n [ItemStatus.ERROR]: 0,\n};\n\nconst getUpdatesData = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => ({\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.title',\n defaultMessage: 'Server updates',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.description',\n defaultMessage: 'An update is available.',\n }),\n descriptionOk: formatMessage({\n id: 'admin.reporting.workspace_optimization.updates.descriptionOk',\n defaultMessage: 'Your workspace is completely up to date!',\n }),\n icon: (\n <div className='icon'>\n <ArrowUpBoldCircleOutlineIcon\n size={20}\n color={'var(--sys-center-channel-color)'}\n />\n </div>\n ),\n items: await runUpdateChecks(config, formatMessage, options),\n});\n\nconst getConfigurationData = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => ({\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.title',\n defaultMessage: 'Configuration',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.description',\n defaultMessage: 'You have configuration issues to resolve',\n }),\n hide: options.isCloud,\n descriptionOk: formatMessage({\n id: 'admin.reporting.workspace_optimization.configuration.descriptionOk',\n defaultMessage: 'You\\'ve successfully configured SSL and Session Lengths!',\n }),\n icon: (\n <div className='icon'>\n <TuneIcon\n size={20}\n color={'var(--sys-center-channel-color)'}\n />\n </div>\n ),\n items: await runConfigChecks(config, formatMessage, options),\n});\n\nconst getAccessData = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => ({\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.access.title',\n defaultMessage: 'Workspace access',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.access.description',\n defaultMessage: 'Web server configuration may be affecting access to your Mattermost workspace.',\n }),\n hide: options.isCloud,\n descriptionOk: formatMessage({\n id: 'admin.reporting.workspace_optimization.access.descriptionOk',\n defaultMessage: 'Your web server configuration is passing a live URL test!',\n }),\n icon: (\n <div className='icon'>\n <ServerVariantIcon\n size={20}\n color={'var(--sys-center-channel-color)'}\n />\n </div>\n ),\n items: await runAccessChecks(config, formatMessage),\n});\n\nconst getPerformanceData = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => ({\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.performance.title',\n defaultMessage: 'Performance',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.performance.description',\n defaultMessage: 'Your server would benefit from some performance tweaks.',\n }),\n hide: options.isCloud,\n descriptionOk: formatMessage({\n id: 'admin.reporting.workspace_optimization.performance.descriptionOk',\n defaultMessage: 'Your search performance suits your workspace usage!',\n }),\n icon: (\n <div className='icon'>\n <ChartLineIcon\n size={20}\n color={'var(--sys-center-channel-color)'}\n />\n </div>\n ),\n items: await runPerformanceChecks(config, formatMessage, options),\n});\n\nconst getDataPrivacyData = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => ({\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.data_privacy.title',\n defaultMessage: 'Data privacy',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.data_privacy.description',\n defaultMessage: 'Get better insight and control over your data.',\n }),\n descriptionOk: formatMessage({\n id: 'admin.reporting.workspace_optimization.data_privacy.descriptionOk',\n defaultMessage: 'You\\'ve enabled data retention and compliance features!',\n }),\n icon: (\n <div className='icon'>\n <LockOutlineIcon\n size={20}\n color={'var(--sys-center-channel-color)'}\n />\n </div>\n ),\n items: await runDataPrivacyChecks(config, formatMessage, options),\n});\n\nconst getEaseOfManagementData = async (\n config: Partial<AdminConfig>,\n formatMessage: ReturnType<typeof useIntl>['formatMessage'],\n options: Options,\n) => ({\n title: formatMessage({\n id: 'admin.reporting.workspace_optimization.ease_of_management.title',\n defaultMessage: 'Ease of management',\n }),\n description: formatMessage({\n id: 'admin.reporting.workspace_optimization.ease_of_management.description',\n defaultMessage: 'Make it easier to manage your Mattermost workspace.',\n }),\n descriptionOk: formatMessage({\n id: 'admin.reporting.workspace_optimization.ease_of_management.descriptionOk',\n defaultMessage: 'Your user authentication setup is appropriate based on your current usage!',\n }),\n icon: (\n <div className='icon'>\n <AccountMultipleOutlineIcon\n size={20}\n color={'var(--sys-center-channel-color)'}\n />\n </div>\n ),\n items: await runEaseOfUseChecks(config, formatMessage, options),\n});\n\nconst useMetricsData = (\n config: Partial<AdminConfig>,\n) => {\n const [loading, setLoading] = useState(true);\n const [data, setData] = useState<DataModel | undefined>(undefined);\n\n const {formatMessage} = useIntl();\n const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n const license = useSelector(getLicense);\n\n // get the currently installed server version\n const installedVersion = useSelector((state: GlobalState) => getServerVersion(state));\n const analytics = useSelector((state: GlobalState) => state.entities.admin.analytics) as unknown as Options['analytics'];\n\n const canStartTrial = license?.IsLicensed !== 'true' && prevTrialLicense?.IsLicensed !== 'true';\n const daysUntilExpiration = daysToLicenseExpire(license) || -1;\n\n const isLicensed = license?.IsLicensed === 'true' && daysUntilExpiration >= 0;\n\n const isCloud = license?.Cloud === 'true';\n const isEnterpriseLicense = isEnterpriseOrE20License(license);\n const isStarterLicense = getIsStarterLicense(license);\n\n const [, contactSalesLink] = useOpenSalesLink();\n\n const trialOrEnterpriseCtaConfig = useMemo(() => ({\n configUrl: canStartTrial ? ConsolePages.LICENSE : contactSalesLink,\n configText: canStartTrial ? formatMessage({id: 'admin.reporting.workspace_optimization.cta.startTrial', defaultMessage: 'Start trial'}) : formatMessage({id: 'admin.reporting.workspace_optimization.cta.upgradeLicense', defaultMessage: 'Contact sales'}),\n }), [canStartTrial, contactSalesLink, formatMessage]);\n\n const options: Options = useMemo(() => ({\n isLicensed,\n isEnterpriseLicense,\n trialOrEnterpriseCtaConfig,\n isStarterLicense,\n isCloud,\n analytics,\n installedVersion,\n }), [isLicensed, isEnterpriseLicense, trialOrEnterpriseCtaConfig, isStarterLicense, isCloud, analytics, installedVersion]);\n\n useEffect(() => {\n setLoading(true);\n const refreshData = async () => {\n const data = {\n updates: await getUpdatesData(config, formatMessage, options),\n configuration: await getConfigurationData(config, formatMessage, options),\n access: await getAccessData(config, formatMessage, options),\n performance: await getPerformanceData(config, formatMessage, options),\n dataPrivacy: await getDataPrivacyData(config, formatMessage, options),\n easyManagement: await getEaseOfManagementData(config, formatMessage, options),\n };\n\n return data;\n };\n\n refreshData().then((data) => {\n setData(data);\n setLoading(false);\n });\n }, [config, formatMessage, options]);\n\n return {\n data,\n loading,\n };\n};\n\nexport default useMetricsData;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './circular_chart.scss';\n\ntype CircularChartProps = {\n value: number;\n isPercentage: boolean;\n width: number;\n height: number;\n type: 'info' | 'warning' | 'error' | 'success';\n};\n\nconst CircularChart = ({\n value,\n isPercentage,\n width,\n height,\n type,\n}: CircularChartProps): JSX.Element => {\n return (\n <div className='CircularChart'>\n <svg\n viewBox='0 0 36 36'\n className={`circular-chart ${type}`}\n width={width >= 0 ? width.toString() : '36'}\n height={height >= 0 ? height.toString() : '36'}\n >\n <path\n className='circle-bg'\n d='M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831'\n />\n <path\n className='circle'\n strokeDasharray={`${value}, 100`}\n d='M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831'\n />\n <text\n x='18'\n y='20.70'\n className='percentageOrNumber'\n >\n {`${value}${isPercentage ? ' %' : ''}`}\n </text>\n </svg>\n </div>\n );\n};\n\nexport default CircularChart;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {CheckIcon, ExclamationThickIcon} from '@mattermost/compass-icons/components';\n\nimport CircularChart from 'components/common/circular_chart/circular_chart';\n\nimport './dashboard.scss';\n\ntype OverallScoreProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n chips: React.ReactNode;\n chartValue: number;\n};\n\nconst OverallScore = ({\n chips,\n title,\n description,\n chartValue,\n}: OverallScoreProps): JSX.Element | null => {\n const contentTitle = title || (\n <FormattedMessage\n id='admin.reporting.workspace_optimization.overall_workspace_score'\n defaultMessage='Overall Score'\n />\n );\n const contentDescription = description || (\n <FormattedMessage\n id='admin.reporting.workspace_optimization.overall_workspace_score_description'\n defaultMessage='Stay on top of optimizing your Mattermost workspace by reviewing your overall score below based on our recommended indicators of health and growth. Ensure your workspace is running smoothly so your users can get the most out of Mattermost.'\n />\n );\n\n let scoreGraph;\n\n switch (chartValue) {\n case 0:\n scoreGraph = (\n <div className='alertImageScore'>\n <ExclamationThickIcon\n size={48}\n color={'var(--sys-dnd-indicator)'}\n />\n </div>\n );\n break;\n case 100:\n scoreGraph = (\n <div className='successImageScore'>\n <CheckIcon\n size={48}\n color={'var(--sys-online-indicator)'}\n />\n </div>\n );\n break;\n default:\n scoreGraph = (\n <CircularChart\n value={chartValue}\n isPercentage={false}\n width={140}\n height={140}\n type={'success'}\n />\n );\n break;\n }\n return (\n <div className='OverallScore'>\n <div className='OverallScore__scoreEllipseSvg'>\n {scoreGraph}\n </div>\n <div className='OverallScore__content'>\n <div className='OverallScore__content__title'>\n {contentTitle}\n </div>\n <div className='OverallScore__content__description'>\n {contentDescription}\n </div>\n <div className='OverallScore__content__chips'>\n {chips}\n </div>\n </div>\n </div>\n );\n};\n\nexport default OverallScore;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {CheckIcon} from '@mattermost/compass-icons/components';\n\nimport Accordion from 'components/common/accordion/accordion';\nimport type {AccordionItemType} from 'components/common/accordion/accordion';\nimport LoadingScreen from 'components/loading_screen';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport ChipsList from './chips_list';\nimport type {ChipsInfoType} from './chips_list';\nimport CtaButtons from './cta_buttons';\nimport useMetricsData from './dashboard.data';\nimport {ItemStatus} from './dashboard.type';\nimport OverallScore from './overall-score';\n\nimport type {Props} from '../admin_console';\n\nimport './dashboard.scss';\n\nconst AccordionItem = styled.div`\n padding: 12px;\n &:last-child {\n border-bottom: none;\n }\n h5 {\n display: inline-flex;\n align-items: center;\n font-weight: bold;\n }\n`;\n\nconst successIcon = (\n <div className='success'>\n <CheckIcon\n size={20}\n color={'var(--sys-online-indicator)'}\n />\n </div>\n);\n\nconst WorkspaceOptimizationDashboard = (props: Props) => {\n const {data, loading} = useMetricsData(props.config);\n\n const overallScoreChips: ChipsInfoType = {\n [ItemStatus.INFO]: 0,\n [ItemStatus.WARNING]: 0,\n [ItemStatus.ERROR]: 0,\n };\n\n const overallScore = {\n max: 0,\n current: 0,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const accordionItemsData: AccordionItemType[] | undefined = data && Object.entries(data).filter(([_, y]) => !y.hide).map(([accordionKey, accordionData]) => {\n const accordionDataChips: ChipsInfoType = {\n [ItemStatus.INFO]: 0,\n [ItemStatus.WARNING]: 0,\n [ItemStatus.ERROR]: 0,\n };\n const items: React.ReactNode[] = [];\n accordionData.items.forEach((item) => {\n if (item.status === undefined) {\n return;\n }\n\n // add the items impact to the overall score here\n overallScore.max += item.scoreImpact;\n overallScore.current += item.scoreImpact * item.impactModifier;\n\n // chips will only be displayed for info aka Success, warning and error aka Problems\n if (item.status !== ItemStatus.OK && item.status !== ItemStatus.NONE) {\n items.push((\n <AccordionItem\n key={`${accordionKey}-item_${item.id}`}\n >\n <h5>\n <i\n className={classNames(`icon ${item.status}`, {\n 'icon-alert-outline': item.status === ItemStatus.WARNING,\n 'icon-alert-circle-outline': item.status === ItemStatus.ERROR,\n 'icon-information-outline': item.status === ItemStatus.INFO,\n })}\n />\n {item.title}\n </h5>\n <p>{item.description}</p>\n <CtaButtons\n learnMoreLink={item.infoUrl}\n learnMoreText={item.infoText}\n actionLink={item.configUrl}\n actionText={item.configText}\n />\n </AccordionItem>\n ));\n\n accordionDataChips[item.status] += 1;\n overallScoreChips[item.status] += 1;\n }\n });\n const {title, description, descriptionOk, icon} = accordionData;\n return {\n title,\n description: items.length === 0 ? descriptionOk : description,\n icon: items.length === 0 ? successIcon : icon,\n items,\n extraContent: (\n <ChipsList\n chipsData={accordionDataChips}\n hideCountZeroChips={true}\n />\n ),\n };\n });\n\n return loading || !accordionItemsData ? <LoadingScreen/> : (\n <div className='WorkspaceOptimizationDashboard wrapper--fixed'>\n <AdminHeader>\n <FormattedMessage\n id={'admin.reporting.workspace_optimization.title'}\n defaultMessage='Workspace Optimization'\n />\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <OverallScore\n chips={\n <ChipsList\n chipsData={overallScoreChips}\n hideCountZeroChips={false}\n />\n }\n chartValue={Math.floor((overallScore.current / overallScore.max) * 100)}\n />\n <Accordion\n accordionItemsData={accordionItemsData}\n expandMultiple={true}\n />\n </div>\n </div>\n );\n};\n\nexport default WorkspaceOptimizationDashboard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage, defineMessages} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport {AccountMultipleOutlineIcon, ChartBarIcon, CogOutlineIcon, CreditCardOutlineIcon, FlaskOutlineIcon, FormatListBulletedIcon, InformationOutlineIcon, PowerPlugOutlineIcon, ServerVariantIcon, ShieldOutlineIcon, SitemapIcon} from '@mattermost/compass-icons/components';\nimport type {CloudState, Product} from '@mattermost/types/cloud';\nimport type {AdminConfig, ClientLicense} from '@mattermost/types/config';\nimport type {Job} from '@mattermost/types/jobs';\n\nimport {RESOURCE_KEYS} from 'mattermost-redux/constants/permissions_sysconsole';\n\nimport {\n ldapTest, invalidateAllCaches, reloadConfig, testS3Connection,\n removeIdpSamlCertificate, uploadIdpSamlCertificate,\n removePrivateSamlCertificate, uploadPrivateSamlCertificate,\n removePublicSamlCertificate, uploadPublicSamlCertificate,\n removePrivateLdapCertificate, uploadPrivateLdapCertificate,\n removePublicLdapCertificate, uploadPublicLdapCertificate,\n invalidateAllEmailInvites, testSmtp, testSiteURL, getSamlMetadataFromIdp, setSamlIdpCertificateFromMetadata,\n} from 'actions/admin_actions';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport CustomPluginSettings from 'components/admin_console/custom_plugin_settings';\nimport PluginManagement from 'components/admin_console/plugin_management';\nimport SystemAnalytics from 'components/analytics/system_analytics';\nimport {searchableStrings as systemAnalyticsSearchableStrings} from 'components/analytics/system_analytics/system_analytics';\nimport TeamAnalytics from 'components/analytics/team_analytics';\nimport {searchableStrings as teamAnalyticsSearchableStrings} from 'components/analytics/team_analytics/team_analytics';\nimport ExternalLink from 'components/external_link';\nimport RestrictedIndicator from 'components/widgets/menu/menu_items/restricted_indicator';\n\nimport {Constants, CloudProducts, LicenseSkus, AboutLinks, DocLinks, DeveloperLinks, CacheTypes} from 'utils/constants';\nimport {isCloudLicense} from 'utils/license_utils';\nimport {ID_PATH_PATTERN} from 'utils/path';\nimport {getSiteURL} from 'utils/url';\n\nimport * as DefinitionConstants from './admin_definition_constants';\nimport Audits from './audits';\nimport {searchableStrings as auditSearchableStrings} from './audits/audits';\nimport BillingHistory, {searchableStrings as billingHistorySearchableStrings} from './billing/billing_history';\nimport BillingSubscriptions, {searchableStrings as billingSubscriptionSearchableStrings} from './billing/billing_subscriptions';\nimport CompanyInfo, {searchableStrings as billingCompanyInfoSearchableStrings} from './billing/company_info';\nimport CompanyInfoEdit from './billing/company_info_edit';\nimport BleveSettings, {searchableStrings as bleveSearchableStrings} from './bleve_settings';\nimport BrandImageSetting from './brand_image_setting/brand_image_setting';\nimport ClusterSettings, {searchableStrings as clusterSearchableStrings} from './cluster_settings';\nimport CustomEnableDisableGuestAccountsSetting from './custom_enable_disable_guest_accounts_setting';\nimport CustomTermsOfServiceSettings from './custom_terms_of_service_settings';\nimport {messages as customTermsOfServiceMessages, searchableStrings as customTermsOfServiceSearchableStrings} from './custom_terms_of_service_settings/custom_terms_of_service_settings';\nimport CustomURLSchemesSetting from './custom_url_schemes_setting';\nimport DataRetentionSettings from './data_retention_settings';\nimport CustomDataRetentionForm from './data_retention_settings/custom_policy_form';\nimport {searchableStrings as dataRetentionSearchableStrings} from './data_retention_settings/data_retention_settings';\nimport GlobalDataRetentionForm from './data_retention_settings/global_policy_form';\nimport DatabaseSettings, {searchableStrings as databaseSearchableStrings} from './database_settings';\nimport ElasticSearchSettings, {searchableStrings as elasticSearchSearchableStrings} from './elasticsearch_settings';\nimport {\n LDAPFeatureDiscovery,\n SAMLFeatureDiscovery,\n OpenIDFeatureDiscovery,\n OpenIDCustomFeatureDiscovery,\n AnnouncementBannerFeatureDiscovery,\n ComplianceExportFeatureDiscovery,\n CustomTermsOfServiceFeatureDiscovery,\n DataRetentionFeatureDiscovery,\n GuestAccessFeatureDiscovery,\n SystemRolesFeatureDiscovery,\n GroupsFeatureDiscovery,\n} from './feature_discovery/features';\nimport FeatureFlags, {messages as featureFlagsMessages} from './feature_flags';\nimport GroupDetails from './group_settings/group_details';\nimport GroupSettings from './group_settings/group_settings';\nimport IPFiltering from './ip_filtering';\nimport LicenseSettings from './license_settings';\nimport {searchableStrings as licenseSettingsSearchableStrings} from './license_settings/license_settings';\nimport MessageExportSettings, {searchableStrings as messageExportSearchableStrings} from './message_export_settings';\nimport OpenIdConvert from './openid_convert';\nimport PasswordSettings, {searchableStrings as passwordSearchableStrings} from './password_settings';\nimport PermissionSchemesSettings from './permission_schemes_settings';\nimport {searchableStrings as PermissionSchemeSearchableStrings} from './permission_schemes_settings/permission_schemes_settings';\nimport PermissionSystemSchemeSettings from './permission_schemes_settings/permission_system_scheme_settings';\nimport PermissionTeamSchemeSettings from './permission_schemes_settings/permission_team_scheme_settings';\nimport {searchableStrings as pluginManagementSearchableStrings} from './plugin_management/plugin_management';\nimport PushNotificationsSettings, {searchableStrings as pushSearchableStrings} from './push_settings';\nimport SecureConnections, {searchableStrings as secureConnectionsSearchableStrings} from './secure_connections';\nimport SecureConnectionDetail from './secure_connections/secure_connection_detail';\nimport ServerLogs from './server_logs';\nimport {searchableStrings as serverLogsSearchableStrings} from './server_logs/logs';\nimport SessionLengthSettings, {searchableStrings as sessionLengthSearchableStrings} from './session_length_settings';\nimport SystemProperties, {searchableStrings as systemPropertiesSearchableStrings} from './system_properties';\nimport SystemRoles from './system_roles';\nimport SystemRole from './system_roles/system_role';\nimport SystemUserDetail from './system_user_detail';\nimport SystemUsers from './system_users';\nimport {searchableStrings as systemUsersSearchableStrings} from './system_users/system_users';\nimport ChannelSettings from './team_channel_settings/channel';\nimport ChannelDetails from './team_channel_settings/channel/details';\nimport TeamSettings from './team_channel_settings/team';\nimport TeamDetails from './team_channel_settings/team/details';\nimport type {Check, AdminDefinition as AdminDefinitionType, ConsoleAccess} from './types';\nimport ValidationResult from './validation';\nimport WorkspaceOptimizationDashboard from './workspace-optimization/dashboard';\n\nconst FILE_STORAGE_DRIVER_LOCAL = 'local';\nconst FILE_STORAGE_DRIVER_S3 = 'amazons3';\nconst MEBIBYTE = Math.pow(1024, 2);\n\nconst SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA1 = 'RSAwithSHA1';\nconst SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA256 = 'RSAwithSHA256';\nconst SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA512 = 'RSAwithSHA512';\n\nconst SAML_SETTINGS_CANONICAL_ALGORITHM_C14N = 'Canonical1.0';\nconst SAML_SETTINGS_CANONICAL_ALGORITHM_C14N11 = 'Canonical1.1';\n\n// admin_definitions data structure define the autogenerated admin_console\n// section. It defines the structure of the menu based on sections, subsections\n// and pages. Each page contains an schema which defines a component to use for\n// render the entire section or the name of the section (name and\n// name_default), the section in the config file (id), and a list of options to\n// configure (settings).\n//\n// All text fields contains a translation key, and the <field>_default string are the\n// default text when the translation is still not available (the english version\n// of the text).\n//\n// We can define different types of settings configuration widgets:\n//\n// Widget:\n// - type: which define the widget type.\n// - label (and label_default): which define the main text of the setting.\n// - isDisabled: a function which receive current config, the state of the page and the license.\n// - isHidden: a function which receive current config, the state of the page and the license.\n//\n// Custom Widget (extends from Widget):\n// - component: The component used to render the widget\n//\n// JobsTable Widget (extends from Widget):\n// - job_type: The kind of job from Constants.JobTypes\n// - render_job: Function to convert a job object into a react component.\n//\n// Banner Widget (extends from Widget):\n// - banner_type: The type of banner (options: info or warning)\n//\n// Setting Widget (extends from Widget):\n// - key: The key to store the configuration in the config file.\n// - help_text (and help_text_default): Long description of the field.\n// - help_text_markdown: True if the translation text contains markdown.\n// - help_text_values: Values to fill the translation (if needed).\n//\n// Bool Widget (extends from Setting Widget)\n//\n// Number Widget (extends from Setting Widget)\n//\n// Color Widget (extends from Setting Widget)\n//\n// Text Widget (extends from Setting Widget)\n// - placeholder (and placeholder_default): Placeholder text to show in the input.\n// - dynamic_value: function that generate the value of the field based on the current value, the config, the state and the license.\n// - default_value: function that generate the default value of the field based on the config, the state and the license.\n// - max_length: The maximum length allowed\n//\n// Button Widget (extends from Setting Widget)\n// - action: A redux action to execute on click.\n// - error_message (and error_message_default): Error to show if action doesn't work.\n// - success_message (and success_message_default): Success message to show if action doesn't work.\n//\n// Language Widget (extends from Setting Widget)\n// - multiple: If you can select multiple languages.\n// - no_result (and no_result_default): Text to show on not results found (only for multiple = true).\n// - not_present (and not_present_default): Text to show when the default language is not present (only for multiple = true).\n//\n// Dropdown Widget (extends from Setting Widget)\n// - options: List of options of the dropdown (each options has value, display_name, display_name_default and optionally help_text, help_text_default, help_text_values, help_text_markdown fields).\n//\n// Permissions Flag (extends from Setting Widget)\n// - permissions_mapping_name: A permission name in the utils/policy_roles_adapter.js file.\n//\n// FileUpload (extends from Setting Widget)\n// - remove_help_text (and remove_help_text_default): Long description of the field when a file is uploaded.\n// - remove_help_text_markdown: True if the translation text contains markdown.\n// - remove_help_text_values: Values to fill the translation (if needed).\n// - remove_button_text (and remove_button_text_default): Button text for remove when the file is uploaded.\n// - removing_text (and removing_text_default): Text shown while the system is removing the file.\n// - uploading_text (and uploading_text_default): Text shown while the system is uploading the file.\n// - upload_action: An store action to upload the file.\n// - remove_action: An store action to remove the file.\n// - fileType: A list of extensions separated by \",\". E.g. \".jpg,.png,.gif\".\n\nexport const it = {\n not: (func: Check) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess, cloud?: CloudState, isSystemAdmin?: boolean) => {\n return typeof func === 'function' ? !func(config, state, license, enterpriseReady, consoleAccess, cloud, isSystemAdmin) : !func;\n },\n all: (...funcs: Check[]) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess, cloud?: CloudState, isSystemAdmin?: boolean) => {\n for (const func of funcs) {\n if (typeof func === 'function' ? !func(config, state, license, enterpriseReady, consoleAccess, cloud, isSystemAdmin) : !func) {\n return false;\n }\n }\n return true;\n },\n any: (...funcs: Check[]) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess, cloud?: CloudState, isSystemAdmin?: boolean) => {\n for (const func of funcs) {\n if (typeof func === 'function' ? func(config, state, license, enterpriseReady, consoleAccess, cloud, isSystemAdmin) : func) {\n return true;\n }\n }\n return false;\n },\n stateMatches: (key: string, regex: RegExp) => (config: Partial<AdminConfig>, state: any) => state[key].match(regex),\n stateEquals: (key: string, value: any) => (config: Partial<AdminConfig>, state: any) => state[key] === value,\n stateIsTrue: (key: string) => (config: Partial<AdminConfig>, state: any) => Boolean(state[key]),\n stateIsFalse: (key: string) => (config: Partial<AdminConfig>, state: any) => !state[key],\n configIsTrue: (group: keyof Partial<AdminConfig>, setting: string) => (config: Partial<AdminConfig>) => Boolean((config[group] as any)?.[setting]),\n configIsFalse: (group: keyof Partial<AdminConfig>, setting: string) => (config: Partial<AdminConfig>) => !(config[group] as any)?.[setting],\n configContains: (group: keyof Partial<AdminConfig>, setting: string, word: string) => (config: Partial<AdminConfig>) => Boolean((config[group] as any)?.[setting]?.includes(word)),\n enterpriseReady: (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean) => Boolean(enterpriseReady),\n licensed: (config: Partial<AdminConfig>, state: any, license?: ClientLicense) => license?.IsLicensed === 'true',\n cloudLicensed: (config: Partial<AdminConfig>, state: any, license?: ClientLicense) => Boolean(license?.IsLicensed && isCloudLicense(license)),\n licensedForFeature: (feature: string) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense) => Boolean(license?.IsLicensed && license[feature] === 'true'),\n licensedForSku: (skuName: string) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense) => Boolean(license?.IsLicensed && license.SkuShortName === skuName),\n licensedForCloudStarter: (config: Partial<AdminConfig>, state: any, license?: ClientLicense) => Boolean(license?.IsLicensed && isCloudLicense(license) && license.SkuShortName === LicenseSkus.Starter),\n hidePaymentInfo: (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess, cloud?: CloudState) => {\n if (!cloud) {\n return true;\n }\n const productId = cloud?.subscription?.product_id;\n if (!productId) {\n return false;\n }\n return cloud?.subscription?.is_free_trial === 'true';\n },\n userHasReadPermissionOnResource: (key: string) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess) => (consoleAccess?.read as any)?.[key],\n userHasReadPermissionOnSomeResources: (key: string | {[key: string]: string}) => Object.values(key).some((resource) => it.userHasReadPermissionOnResource(resource)),\n userHasWritePermissionOnResource: (key: string) => (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess) => (consoleAccess?.write as any)?.[key],\n isSystemAdmin: (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess, cloud?: CloudState, isSystemAdmin?: boolean) => Boolean(isSystemAdmin),\n};\n\nexport const validators = {\n isRequired: (text: MessageDescriptor | string) => (value: string) => new ValidationResult(Boolean(value), text),\n minValue: (min: number, text: MessageDescriptor | string) => (value: number) => new ValidationResult((value >= min), text),\n maxValue: (max: number, text: MessageDescriptor | string) => (value: number) => new ValidationResult((value <= max), text),\n};\n\nconst usesLegacyOauth = (config: Partial<AdminConfig>, state: any, license?: ClientLicense, enterpriseReady?: boolean, consoleAccess?: ConsoleAccess, cloud?: CloudState) => {\n if (!config.GitLabSettings || !config.GoogleSettings || !config.Office365Settings) {\n return false;\n }\n\n return it.any(\n it.all(\n it.not(it.configContains('GitLabSettings', 'Scope', 'openid')),\n it.any(\n it.configIsTrue('GitLabSettings', 'Id'),\n it.configIsTrue('GitLabSettings', 'Secret'),\n ),\n ),\n it.all(\n it.not(it.configContains('GoogleSettings', 'Scope', 'openid')),\n it.any(\n it.configIsTrue('GoogleSettings', 'Id'),\n it.configIsTrue('GoogleSettings', 'Secret'),\n ),\n ),\n it.all(\n it.not(it.configContains('Office365Settings', 'Scope', 'openid')),\n it.any(\n it.configIsTrue('Office365Settings', 'Id'),\n it.configIsTrue('Office365Settings', 'Secret'),\n ),\n ),\n )(config, state, license, enterpriseReady, consoleAccess, cloud);\n};\n\nconst getRestrictedIndicator = (displayBlocked = false, minimumPlanRequiredForFeature = LicenseSkus.Professional) => ({\n value: (cloud: CloudState) => (\n <RestrictedIndicator\n useModal={false}\n blocked={displayBlocked || !(cloud?.subscription?.is_free_trial === 'true')}\n minimumPlanRequiredForFeature={minimumPlanRequiredForFeature}\n tooltipMessageBlocked={defineMessage({\n id: 'admin.sidebar.restricted_indicator.tooltip.message.blocked',\n defaultMessage: 'This is {article} {minimumPlanRequiredForFeature} feature, available with an upgrade or free {trialLength}-day trial',\n })}\n />\n ),\n shouldDisplay: (license: ClientLicense, subscriptionProduct: Product|undefined) => displayBlocked || (isCloudLicense(license) && subscriptionProduct?.sku === CloudProducts.STARTER),\n});\n\nconst adminDefinitionMessages = defineMessages({\n data_retention_title: {id: 'admin.data_retention.title', defaultMessage: 'Data Retention Policy'},\n ip_filtering_title: {id: 'admin.sidebar.ip_filtering', defaultMessage: 'IP Filtering'},\n cache_settings_title: {id: 'admin.cacheSettings.title', defaultMessage: 'Cache Settings'},\n\n cache_type_title: {id: 'admin.cacheSettings.cacheTypeTitle', defaultMessage: 'Cache Type'},\n cache_type_desc: {id: 'admin.cacheSettings.cacheTypeDesc', defaultMessage: 'The type of the cache backend. E.g.: \"redis\" or \"lru\"'},\n\n redis_address_title: {id: 'admin.cacheSettings.redisAddress', defaultMessage: 'Redis Address'},\n redis_address_desc: {id: 'admin.cacheSettings.redisAddressDesc', defaultMessage: 'The hostname:port of the Redis server. E.g.: \"localhost:6379\"'},\n redis_address_placeholder: {id: 'admin.cacheSettings.redisAddressPlaceholder', defaultMessage: 'localhost:6379'},\n\n redis_password_title: {id: 'admin.cacheSettings.redisPassword', defaultMessage: 'Redis Password'},\n redis_password_desc: {id: 'admin.cacheSettings.redisPasswordDesc', defaultMessage: 'The password of the Redis server.'},\n\n redis_db_title: {id: 'admin.cacheSettings.redisDB', defaultMessage: 'Redis DB'},\n redis_db_desc: {id: 'admin.cacheSettings.redisDBDesc', defaultMessage: 'The database of the Redis server. E.g.: \"0\"'},\n redis_db_placeholder: {id: 'admin.cacheSettings.redisDBPlaceholder', defaultMessage: '0'},\n\n redis_clientcache_title: {id: 'admin.cacheSettings.redisClientCache', defaultMessage: 'Disable Client Cache'},\n redis_clientcache_desc: {id: 'admin.cacheSettings.redisClientCacheDesc', defaultMessage: 'When true, client-side caching is disabled.'},\n});\nconst AdminDefinition: AdminDefinitionType = {\n about: {\n icon: (\n <InformationOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.about', defaultMessage: 'About'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.ABOUT)),\n ),\n subsections: {\n license: {\n url: 'about/license',\n title: defineMessage({id: 'admin.sidebar.license', defaultMessage: 'Edition and License'}),\n searchableStrings: licenseSettingsSearchableStrings,\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n schema: {\n id: 'LicenseSettings',\n component: LicenseSettings,\n },\n },\n },\n },\n billing: {\n icon: (\n <CreditCardOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.billing', defaultMessage: 'Billing & Account'}),\n isHidden: it.not(it.licensedForFeature('Cloud')),\n subsections: {\n subscription: {\n url: 'billing/subscription',\n title: defineMessage({id: 'admin.sidebar.subscription', defaultMessage: 'Subscription'}),\n searchableStrings: billingSubscriptionSearchableStrings,\n schema: {\n id: 'BillingSubscriptions',\n component: BillingSubscriptions,\n },\n\n // cloud only view\n isHidden: it.not(it.licensedForFeature('Cloud')),\n isDisabled: it.not(it.userHasWritePermissionOnResource('billing')),\n },\n billing_history: {\n url: 'billing/billing_history',\n title: defineMessage({id: 'admin.sidebar.billing_history', defaultMessage: 'Billing History'}),\n searchableStrings: billingHistorySearchableStrings,\n schema: {\n id: 'BillingHistory',\n component: BillingHistory,\n },\n isHidden: it.not(it.licensedForFeature('Cloud')),\n isDisabled: it.not(it.userHasWritePermissionOnResource('billing')),\n },\n company_info: {\n url: 'billing/company_info',\n title: defineMessage({id: 'admin.sidebar.company_info', defaultMessage: 'Company Information'}),\n searchableStrings: billingCompanyInfoSearchableStrings,\n schema: {\n id: 'CompanyInfo',\n component: CompanyInfo,\n },\n\n // cloud only view\n isHidden: it.not(it.licensedForFeature('Cloud')),\n isDisabled: it.not(it.userHasWritePermissionOnResource('billing')),\n },\n company_info_edit: {\n url: 'billing/company_info_edit',\n schema: {\n id: 'CompanyInfoEdit',\n component: CompanyInfoEdit,\n },\n\n // cloud only view\n isHidden: it.not(it.licensedForFeature('Cloud')),\n isDisabled: it.not(it.userHasWritePermissionOnResource('billing')),\n },\n },\n },\n reporting: {\n icon: (\n <ChartBarIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.reporting', defaultMessage: 'Reporting'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.REPORTING)),\n subsections: {\n workspace_optimization: {\n url: 'reporting/workspace_optimization',\n title: defineMessage({id: 'admin.sidebar.workspaceOptimization', defaultMessage: 'Workspace Optimization'}),\n schema: {\n id: 'WorkspaceOptimizationDashboard',\n component: WorkspaceOptimizationDashboard,\n },\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.REPORTING.SITE_STATISTICS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.REPORTING.SITE_STATISTICS)),\n },\n system_analytics: {\n url: 'reporting/system_analytics',\n title: defineMessage({id: 'admin.sidebar.siteStatistics', defaultMessage: 'Site Statistics'}),\n searchableStrings: systemAnalyticsSearchableStrings,\n schema: {\n id: 'SystemAnalytics',\n component: SystemAnalytics,\n },\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.REPORTING.SITE_STATISTICS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.REPORTING.SITE_STATISTICS)),\n },\n team_statistics: {\n url: 'reporting/team_statistics',\n title: defineMessage({id: 'admin.sidebar.teamStatistics', defaultMessage: 'Team Statistics'}),\n searchableStrings: teamAnalyticsSearchableStrings,\n schema: {\n id: 'TeamAnalytics',\n component: TeamAnalytics,\n },\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.REPORTING.TEAM_STATISTICS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.REPORTING.TEAM_STATISTICS)),\n },\n server_logs: {\n url: 'reporting/server_logs',\n title: defineMessage({id: 'admin.sidebar.logs', defaultMessage: 'Server Logs'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.REPORTING.SERVER_LOGS)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.REPORTING.SERVER_LOGS)),\n searchableStrings: serverLogsSearchableStrings,\n schema: {\n id: 'ServerLogs',\n component: ServerLogs,\n },\n },\n },\n },\n user_management: {\n icon: (\n <AccountMultipleOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.userManagement', defaultMessage: 'User Management'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.USER_MANAGEMENT)),\n subsections: {\n system_users: {\n url: 'user_management/users',\n title: defineMessage({id: 'admin.sidebar.users', defaultMessage: 'Users'}),\n searchableStrings: systemUsersSearchableStrings,\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.USERS)),\n schema: {\n id: 'SystemUsers',\n component: SystemUsers,\n },\n },\n system_user_detail: {\n url: `user_management/user/:user_id(${ID_PATH_PATTERN})`,\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.USERS)),\n schema: {\n id: 'SystemUserDetail',\n component: SystemUserDetail,\n },\n },\n group_detail: {\n url: `user_management/groups/:group_id(${ID_PATH_PATTERN})`,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.GROUPS)),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.GROUPS)),\n schema: {\n id: 'GroupDetail',\n component: GroupDetails,\n },\n },\n groups: {\n url: 'user_management/groups',\n title: defineMessage({id: 'admin.sidebar.groups', defaultMessage: 'Groups'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('LDAPGroups')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.GROUPS)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.GROUPS)),\n schema: {\n id: 'Groups',\n component: GroupSettings,\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n groups_feature_discovery: {\n url: 'user_management/groups',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.groups', defaultMessage: 'Groups'}),\n isHidden: it.any(\n it.licensedForFeature('LDAPGroups'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'Groups',\n name: defineMessage({id: 'admin.group_settings.groupsPageTitle', defaultMessage: 'Groups'}),\n settings: [\n {\n type: 'custom',\n component: GroupsFeatureDiscovery,\n key: 'GroupsFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true, LicenseSkus.Enterprise),\n },\n team_detail: {\n url: `user_management/teams/:team_id(${ID_PATH_PATTERN})`,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.TEAMS)),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.TEAMS)),\n schema: {\n id: 'TeamDetail',\n component: TeamDetails,\n },\n },\n teams: {\n url: 'user_management/teams',\n title: defineMessage({id: 'admin.sidebar.teams', defaultMessage: 'Teams'}),\n isHidden: it.any(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.TEAMS)),\n ),\n schema: {\n id: 'Teams',\n component: TeamSettings,\n },\n },\n channel_detail: {\n url: `user_management/channels/:channel_id(${ID_PATH_PATTERN})`,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.CHANNELS)),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.CHANNELS)),\n schema: {\n id: 'ChannelDetail',\n component: ChannelDetails,\n },\n },\n channel: {\n url: 'user_management/channels',\n title: defineMessage({id: 'admin.sidebar.channels', defaultMessage: 'Channels'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.CHANNELS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.CHANNELS)),\n schema: {\n id: 'Channels',\n component: ChannelSettings,\n },\n },\n systemScheme: {\n url: 'user_management/permissions/system_scheme',\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n schema: {\n id: 'PermissionSystemScheme',\n component: PermissionSystemSchemeSettings,\n },\n },\n teamSchemeDetail: {\n url: `user_management/permissions/team_override_scheme/:scheme_id(${ID_PATH_PATTERN})`,\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n schema: {\n id: 'PermissionSystemScheme',\n component: PermissionTeamSchemeSettings,\n },\n },\n teamScheme: {\n url: 'user_management/permissions/team_override_scheme',\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n schema: {\n id: 'PermissionSystemScheme',\n component: PermissionTeamSchemeSettings,\n },\n },\n permissions: {\n url: 'user_management/permissions/',\n title: defineMessage({id: 'admin.sidebar.permissions', defaultMessage: 'Permissions'}),\n searchableStrings: PermissionSchemeSearchableStrings,\n isHidden: it.any(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS)),\n schema: {\n id: 'PermissionSchemes',\n component: PermissionSchemesSettings,\n },\n },\n system_role: {\n url: `user_management/system_roles/:role_id(${ID_PATH_PATTERN})`,\n isHidden: it.any(\n it.not(it.licensedForFeature('LDAPGroups')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.SYSTEM_ROLES)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.SYSTEM_ROLES)),\n schema: {\n id: 'SystemRole',\n component: SystemRole,\n },\n },\n system_roles: {\n url: 'user_management/system_roles',\n title: defineMessage({id: 'admin.sidebar.systemRoles', defaultMessage: 'Delegated Granular Administration'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('LDAPGroups')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.SYSTEM_ROLES)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.USER_MANAGEMENT.SYSTEM_ROLES)),\n schema: {\n id: 'SystemRoles',\n component: SystemRoles,\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n system_roles_feature_discovery: {\n url: 'user_management/system_roles',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.systemRoles', defaultMessage: 'Delegated Granular Administration'}),\n isHidden: it.any(\n it.licensedForFeature('LDAPGroups'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'SystemRoles',\n name: defineMessage({id: 'admin.permissions.systemRoles', defaultMessage: 'Delegated Granular Administration'}),\n settings: [\n {\n type: 'custom',\n component: SystemRolesFeatureDiscovery,\n key: 'SystemRolesFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true, LicenseSkus.Enterprise),\n },\n },\n },\n environment: {\n icon: (\n <ServerVariantIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.environment', defaultMessage: 'Environment'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.ENVIRONMENT)),\n subsections: {\n web_server: {\n url: 'environment/web_server',\n title: defineMessage({id: 'admin.sidebar.webServer', defaultMessage: 'Web Server'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n ),\n schema: {\n id: 'ServiceSettings',\n name: defineMessage({id: 'admin.environment.webServer', defaultMessage: 'Web Server'}),\n settings: [\n {\n type: 'banner',\n label: defineMessage({id: 'admin.rate.noteDescription', defaultMessage: 'Changing properties in this section will require a server restart before taking effect.'}),\n banner_type: 'info',\n },\n {\n type: 'text',\n key: 'ServiceSettings.SiteURL',\n label: defineMessage({id: 'admin.service.siteURL', defaultMessage: 'Site URL:'}),\n help_text: defineMessage({id: 'admin.service.siteURLDescription', defaultMessage: 'The URL that users will use to access Mattermost. Standard ports, such as 80 and 443, can be omitted, but non-standard ports are required. For example: http://example.com:8065. This setting is required. Mattermost may be hosted at a subpath. For example: http://example.com:8065/company/mattermost. A restart is required before the server will work correctly.'}),\n help_text_markdown: true,\n placeholder: defineMessage({id: 'admin.service.siteURLExample', defaultMessage: 'E.g.: \"http://example.com:8065\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'button',\n key: 'TestSiteURL',\n action: testSiteURL,\n label: defineMessage({id: 'admin.service.testSiteURL', defaultMessage: 'Test Live URL'}),\n loading: defineMessage({id: 'admin.service.testSiteURLTesting', defaultMessage: 'Testing...'}),\n error_message: defineMessage({id: 'admin.service.testSiteURLFail', defaultMessage: 'Test unsuccessful: {error}'}),\n success_message: defineMessage({id: 'admin.service.testSiteURLSuccess', defaultMessage: 'Test successful. This is a valid URL.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.ListenAddress',\n label: defineMessage({id: 'admin.service.listenAddress', defaultMessage: 'Listen Address:'}),\n placeholder: defineMessage({id: 'admin.service.listenExample', defaultMessage: 'E.g.: \":8065\"'}),\n help_text: defineMessage({id: 'admin.service.listenDescription', defaultMessage: 'The address and port to which to bind and listen. Specifying \":8065\" will bind to all network interfaces. Specifying \"127.0.0.1:8065\" will only bind to the network interface having that IP address. If you choose a port of a lower level (called \"system ports\" or \"well-known ports\", in the range of 0-1023), you must have permissions to bind to that port. On Linux you can use: \"sudo setcap cap_net_bind_service=+ep ./bin/mattermost\" to allow Mattermost to bind to well-known ports.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.Forward80To443',\n label: defineMessage({id: 'admin.service.forward80To443', defaultMessage: 'Forward port 80 to 443:'}),\n help_text: defineMessage({id: 'admin.service.forward80To443Description', defaultMessage: 'Forwards all insecure traffic from port 80 to secure port 443. Not recommended when using a proxy server.'}),\n disabled_help_text: defineMessage({id: 'admin.service.forward80To443Description.disabled', defaultMessage: 'Forwards all insecure traffic from port 80 to secure port 443. Not recommended when using a proxy server. This setting cannot be enabled until your server is [listening](#ServiceSettings.ListenAddress) on port 443.'}),\n disabled_help_text_markdown: true,\n isDisabled: it.any(\n it.cloudLicensed,\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n it.not(it.stateMatches('ServiceSettings.ListenAddress', /:443$/)),\n ),\n },\n {\n type: 'dropdown',\n key: 'ServiceSettings.ConnectionSecurity',\n label: defineMessage({id: 'admin.connectionSecurityTitle', defaultMessage: 'Connection Security:'}),\n help_text: DefinitionConstants.CONNECTION_SECURITY_HELP_TEXT_WEBSERVER,\n options: [\n {\n value: '',\n display_name: defineMessage({id: 'admin.connectionSecurityNone', defaultMessage: 'None'}),\n },\n {\n value: 'TLS',\n display_name: defineMessage({id: 'admin.connectionSecurityTls', defaultMessage: 'TLS (Recommended)'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.TLSCertFile',\n label: defineMessage({id: 'admin.service.tlsCertFile', defaultMessage: 'TLS Certificate File:'}),\n help_text: defineMessage({id: 'admin.service.tlsCertFileDescription', defaultMessage: 'The certificate file to use.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n it.stateIsTrue('ServiceSettings.UseLetsEncrypt'),\n ),\n },\n {\n type: 'text',\n key: 'ServiceSettings.TLSKeyFile',\n label: defineMessage({id: 'admin.service.tlsKeyFile', defaultMessage: 'TLS Key File:'}),\n help_text: defineMessage({id: 'admin.service.tlsKeyFileDescription', defaultMessage: 'The private key file to use.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n it.stateIsTrue('ServiceSettings.UseLetsEncrypt'),\n ),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.UseLetsEncrypt',\n label: defineMessage({id: 'admin.service.useLetsEncrypt', defaultMessage: 'Use Let\\'s Encrypt:'}),\n help_text: defineMessage({id: 'admin.service.useLetsEncryptDescription', defaultMessage: 'Enable the automatic retrieval of certificates from Let\\'s Encrypt. The certificate will be retrieved when a client attempts to connect from a new domain. This will work with multiple domains.'}),\n disabled_help_text: defineMessage({id: 'admin.service.useLetsEncryptDescription.disabled', defaultMessage: \"Enable the automatic retrieval of certificates from Let's Encrypt. The certificate will be retrieved when a client attempts to connect from a new domain. This will work with multiple domains. This setting cannot be enabled unless the [Forward port 80 to 443](#ServiceSettings.Forward80To443) setting is set to true.\"}),\n disabled_help_text_markdown: true,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n it.stateIsFalse('ServiceSettings.Forward80To443'),\n ),\n },\n {\n type: 'text',\n key: 'ServiceSettings.LetsEncryptCertificateCacheFile',\n label: defineMessage({id: 'admin.service.letsEncryptCertificateCacheFile', defaultMessage: 'Let\\'s Encrypt Certificate Cache File:'}),\n help_text: defineMessage({id: 'admin.service.letsEncryptCertificateCacheFileDescription', defaultMessage: 'Certificates retrieved and other data about the Let\\'s Encrypt service will be stored in this file.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n it.stateIsFalse('ServiceSettings.UseLetsEncrypt'),\n ),\n },\n {\n type: 'number',\n key: 'ServiceSettings.ReadTimeout',\n label: defineMessage({id: 'admin.service.readTimeout', defaultMessage: 'Read Timeout:'}),\n help_text: defineMessage({id: 'admin.service.readTimeoutDescription', defaultMessage: 'Maximum time allowed from when the connection is accepted to when the request body is fully read.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'number',\n key: 'ServiceSettings.WriteTimeout',\n label: defineMessage({id: 'admin.service.writeTimeout', defaultMessage: 'Write Timeout:'}),\n help_text: defineMessage({id: 'admin.service.writeTimeoutDescription', defaultMessage: 'If using HTTP (insecure), this is the maximum time allowed from the end of reading the request headers until the response is written. If using HTTPS, it is the total time from when the connection is accepted until the response is written.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'number',\n key: 'ServiceSettings.MaximumPayloadSizeBytes',\n label: defineMessage({id: 'admin.service.maximumPayloadSize', defaultMessage: 'Maximum Payload Size (Bytes):'}),\n help_text: defineMessage({id: 'admin.service.maximumPayloadSizeDescription', defaultMessage: 'The maximum number of bytes allowed in the payload of incoming HTTP calls'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'dropdown',\n key: 'ServiceSettings.WebserverMode',\n label: defineMessage({id: 'admin.webserverModeTitle', defaultMessage: 'Webserver Mode:'}),\n help_text: DefinitionConstants.WEBSERVER_MODE_HELP_TEXT,\n options: [\n {\n value: 'gzip',\n display_name: defineMessage({id: 'admin.webserverModeGzip', defaultMessage: 'gzip'}),\n },\n {\n value: 'uncompressed',\n display_name: defineMessage({id: 'admin.webserverModeUncompressed', defaultMessage: 'Uncompressed'}),\n },\n {\n value: 'disabled',\n display_name: defineMessage({id: 'admin.webserverModeDisabled', defaultMessage: 'Disabled'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableInsecureOutgoingConnections',\n label: defineMessage({id: 'admin.service.insecureTlsTitle', defaultMessage: 'Enable Insecure Outgoing Connections: '}),\n help_text: defineMessage({id: 'admin.service.insecureTlsDesc', defaultMessage: 'When true, any outgoing HTTPS requests will accept unverified, self-signed certificates. For example, outgoing webhooks to a server with a self-signed TLS certificate, using any domain, will be allowed. Note that this makes these connections susceptible to man-in-the-middle attacks.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.ManagedResourcePaths',\n label: defineMessage({id: 'admin.service.managedResourcePaths', defaultMessage: 'Managed Resource Paths:'}),\n help_text: defineMessage({id: 'admin.service.managedResourcePathsDescription', defaultMessage: 'A comma-separated list of paths on the Mattermost server that are managed by another service. See <link>here</link> for more information.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.DESKTOP_MANAGED_RESOURCES}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'button',\n action: reloadConfig,\n key: 'ReloadConfigButton',\n label: defineMessage({id: 'admin.reload.button', defaultMessage: 'Reload Configuration From Disk'}),\n help_text: defineMessage({id: 'admin.reload.reloadDescription', defaultMessage: 'Deployments using multiple databases can switch from one master database to another without restarting the Mattermost server by updating \"config.json\" to the new desired configuration and using the {featureName} feature to load the new settings while the server is running. The administrator should then use the {recycleDatabaseConnections} feature to recycle the database connections based on the new settings.'}),\n help_text_values: {\n featureName: (\n <b>\n <FormattedMessage\n id='admin.reload.reloadDescription.featureName'\n defaultMessage='Reload Configuration from Disk'\n />\n </b>\n ),\n recycleDatabaseConnections: (\n <a href='../environment/database'>\n <b>\n <FormattedMessage\n id='admin.reload.reloadDescription.recycleDatabaseConnections'\n defaultMessage='Environment > Database > Recycle Database Connections'\n />\n </b>\n </a>\n ),\n },\n error_message: defineMessage({id: 'admin.reload.reloadFail', defaultMessage: 'Reload unsuccessful: {error}'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n {\n type: 'button',\n key: 'PurgeButton',\n action: invalidateAllCaches,\n label: defineMessage({id: 'admin.purge.button', defaultMessage: 'Purge All Caches'}),\n help_text: defineMessage({id: 'admin.purge.purgeDescription', defaultMessage: 'This will purge all the in-memory caches for things like sessions, accounts, channels, etc. Deployments using High Availability will attempt to purge all the servers in the cluster. Purging the caches may adversely impact performance.'}),\n error_message: defineMessage({id: 'admin.purge.purgeFail', defaultMessage: 'Purging unsuccessful: {error}'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.WEB_SERVER)),\n },\n ],\n },\n },\n database: {\n url: 'environment/database',\n title: defineMessage({id: 'admin.sidebar.database', defaultMessage: 'Database'}),\n searchableStrings: databaseSearchableStrings,\n isHidden: it.any(\n it.cloudLicensed,\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DATABASE)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DATABASE)),\n schema: {\n id: 'DatabaseSettings',\n component: DatabaseSettings,\n },\n },\n elasticsearch: {\n url: 'environment/elasticsearch',\n title: defineMessage({id: 'admin.sidebar.elasticsearch', defaultMessage: 'Elasticsearch'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('Elasticsearch')),\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.ELASTICSEARCH)),\n ),\n searchableStrings: elasticSearchSearchableStrings,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.ELASTICSEARCH)),\n schema: {\n id: 'ElasticSearchSettings',\n component: ElasticSearchSettings,\n },\n },\n storage: {\n url: 'environment/file_storage',\n title: defineMessage({id: 'admin.sidebar.fileStorage', defaultMessage: 'File Storage'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n ),\n schema: {\n id: 'FileSettings',\n name: defineMessage({id: 'admin.environment.fileStorage', defaultMessage: 'File Storage'}),\n settings: [\n {\n type: 'dropdown',\n key: 'FileSettings.DriverName',\n label: defineMessage({id: 'admin.image.storeTitle', defaultMessage: 'File Storage System:'}),\n help_text: defineMessage({id: 'admin.image.storeDescription', defaultMessage: 'Storage system where files and image attachments are saved. Selecting \"Amazon S3\" enables fields to enter your Amazon credentials and bucket details. Selecting \"Local File System\" enables the field to specify a local file directory.'}),\n help_text_markdown: true,\n options: [\n {\n value: FILE_STORAGE_DRIVER_LOCAL,\n display_name: defineMessage({id: 'admin.image.storeLocal', defaultMessage: 'Local File System'}),\n },\n {\n value: FILE_STORAGE_DRIVER_S3,\n display_name: defineMessage({id: 'admin.image.storeAmazonS3', defaultMessage: 'Amazon S3'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n },\n {\n type: 'text',\n key: 'FileSettings.Directory',\n label: defineMessage({id: 'admin.image.localTitle', defaultMessage: 'Local Storage Directory:'}),\n help_text: defineMessage({id: 'admin.image.localDescription', defaultMessage: 'Directory to which files and images are written. If blank, defaults to ./data/.'}),\n placeholder: defineMessage({id: 'admin.image.localExample', defaultMessage: 'E.g.: \"./data/\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_LOCAL)),\n ),\n },\n {\n type: 'number',\n key: 'FileSettings.MaxFileSize',\n label: defineMessage({id: 'admin.image.maxFileSizeTitle', defaultMessage: 'Maximum File Size:'}),\n help_text: defineMessage({id: 'admin.image.maxFileSizeDescription', defaultMessage: 'Maximum file size for message attachments in megabytes. Caution: Verify server memory can support your setting choice. Large file sizes increase the risk of server crashes and failed uploads due to network interruptions.'}),\n placeholder: defineMessage({id: 'admin.image.maxFileSizeExample', defaultMessage: '50'}),\n onConfigLoad: (configVal) => configVal / MEBIBYTE,\n onConfigSave: (displayVal) => displayVal * MEBIBYTE,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n },\n {\n type: 'bool',\n key: 'FileSettings.ExtractContent',\n label: defineMessage({id: 'admin.image.extractContentTitle', defaultMessage: 'Enable document search by content:'}),\n help_text: defineMessage({id: 'admin.image.extractContentDescription', defaultMessage: 'When enabled, supported document types are searchable by their content. Search results for existing documents may be incomplete <link>until a data migration is executed</link>.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.CONFIGURE_DOCUMENT_CONTENT_SEARCH}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n ),\n },\n {\n type: 'bool',\n key: 'FileSettings.ArchiveRecursion',\n label: defineMessage({id: 'admin.image.archiveRecursionTitle', defaultMessage: 'Enable searching content of documents within ZIP files:'}),\n help_text: defineMessage({id: 'admin.image.archiveRecursionDescription', defaultMessage: 'When enabled, content of documents within ZIP files will be returned in search results. This may have an impact on server performance for large files. '}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.configIsFalse('FileSettings', 'ExtractContent'),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3Bucket',\n label: defineMessage({id: 'admin.image.amazonS3BucketTitle', defaultMessage: 'Amazon S3 Bucket:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3BucketDescription', defaultMessage: 'Name you selected for your S3 bucket in AWS.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3BucketExample', defaultMessage: 'E.g.: \"mattermost-media\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3PathPrefix',\n label: defineMessage({id: 'admin.image.amazonS3PathPrefixTitle', defaultMessage: 'Amazon S3 Path Prefix:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3PathPrefixDescription', defaultMessage: 'Prefix you selected for your S3 bucket in AWS.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3PathPrefixExample', defaultMessage: 'E.g.: \"subdir1/\" or you can leave it .'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3Region',\n label: defineMessage({id: 'admin.image.amazonS3RegionTitle', defaultMessage: 'Amazon S3 Region:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3RegionDescription', defaultMessage: 'AWS region you selected when creating your S3 bucket. If no region is set, Mattermost attempts to get the appropriate region from AWS, or sets it to \"us-east-1\" if none found.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3RegionExample', defaultMessage: 'E.g.: \"us-east-1\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3AccessKeyId',\n label: defineMessage({id: 'admin.image.amazonS3IdTitle', defaultMessage: 'Amazon S3 Access Key ID:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3IdDescription', defaultMessage: '(Optional) Only required if you do not want to authenticate to S3 using an <link>IAM role</link>. Enter the Access Key ID provided by your Amazon EC2 administrator.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.image.amazonS3IdExample', defaultMessage: 'E.g.: \"AKIADTOVBGERKLCBV\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3Endpoint',\n label: defineMessage({id: 'admin.image.amazonS3EndpointTitle', defaultMessage: 'Amazon S3 Endpoint:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3EndpointDescription', defaultMessage: 'Hostname of your S3 Compatible Storage provider. Defaults to \"s3.amazonaws.com\".'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3EndpointExample', defaultMessage: 'E.g.: \"s3.amazonaws.com\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3SecretAccessKey',\n label: defineMessage({id: 'admin.image.amazonS3SecretTitle', defaultMessage: 'Amazon S3 Secret Access Key:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SecretDescription', defaultMessage: '(Optional) The secret access key associated with your Amazon S3 Access Key ID.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3SecretExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'bool',\n key: 'FileSettings.AmazonS3SSL',\n label: defineMessage({id: 'admin.image.amazonS3SSLTitle', defaultMessage: 'Enable Secure Amazon S3 Connections:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SSLDescription', defaultMessage: 'When false, allow insecure connections to Amazon S3. Defaults to secure connections only.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'bool',\n key: 'FileSettings.AmazonS3SSE',\n label: defineMessage({id: 'admin.image.amazonS3SSETitle', defaultMessage: 'Enable Server-Side Encryption for Amazon S3:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SSEDescription', defaultMessage: 'When true, encrypt files in Amazon S3 using server-side encryption with Amazon S3-managed keys. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SESSION_LENGTHS}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('Compliance')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'bool',\n key: 'FileSettings.AmazonS3Trace',\n label: defineMessage({id: 'admin.image.amazonS3TraceTitle', defaultMessage: 'Enable Amazon S3 Debugging:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3TraceDescription', defaultMessage: '(Development Mode) When true, log additional debugging information to the system logs.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.AmazonS3StorageClass',\n label: defineMessage({id: 'admin.image.amazonS3StorageClassTitle', defaultMessage: 'Amazon S3 Storage Class:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3StorageClassDescription', defaultMessage: 'Storage class for your S3 Compatible Storage provider. Defaults to empty.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3StorageClassExample', defaultMessage: 'E.g.: \"STANDARD\" or \"STANDARD_IA\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'button',\n action: testS3Connection,\n key: 'TestS3Connection',\n label: defineMessage({id: 'admin.s3.connectionS3Test', defaultMessage: 'Test Connection'}),\n loading: defineMessage({id: 'admin.s3.testing', defaultMessage: 'Testing...'}),\n error_message: defineMessage({id: 'admin.s3.s3Fail', defaultMessage: 'Connection unsuccessful: {error}'}),\n success_message: defineMessage({id: 'admin.s3.s3Success', defaultMessage: 'Connection was successful'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n },\n ],\n },\n },\n export_storage: {\n url: 'environment/export_storage',\n title: defineMessage({id: 'admin.sidebar.exportStorage', defaultMessage: 'Export Storage'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('Cloud')),\n it.not(it.licensedForSku(LicenseSkus.Enterprise)),\n it.configIsFalse('FeatureFlags', 'CloudDedicatedExportUI'),\n ),\n schema: {\n id: 'ExportFileSettings',\n name: defineMessage({id: 'admin.sidebar.exportStorage', defaultMessage: 'Export Storage'}),\n settings: [\n {\n type: 'bool',\n key: 'FileSettings.DedicatedExportStore',\n label: defineMessage({id: 'admin.exportStorage.dedicatedExportStore', defaultMessage: 'Enable Dedicated Export Store:'}),\n help_text: defineMessage({id: 'admin.exportStorage.dedicatedExportStoreDescription', defaultMessage: 'When enabled, Mattermost will use a dedicated export storage bucket for all export operations. This is required for Mattermost Cloud deployments.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n },\n {\n type: 'dropdown',\n key: 'FileSettings.ExportDriverName',\n label: defineMessage({id: 'admin.exportStorage.exportDriverName', defaultMessage: 'Export Storage Driver:'}),\n isDisabled: true,\n isHidden: it.stateEquals('FileSettings.DedicatedExportStore', false),\n options: [\n {\n value: FILE_STORAGE_DRIVER_S3,\n display_name: defineMessage({id: 'admin.image.storeAmazonS3', defaultMessage: 'Amazon S3'}),\n },\n ],\n },\n {\n type: 'text',\n key: 'FileSettings.ExportDirectory',\n label: defineMessage({id: 'admin.exportStorage.exportDirectory', defaultMessage: 'Export Directory'}),\n help_text: defineMessage({id: 'admin.image.exportDirectoryDescription', defaultMessage: 'Directory to which files are written. If blank, defaults to ./data/.'}),\n placeholder: defineMessage({id: 'admin.image.localExample', defaultMessage: 'E.g.: \"./data/\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3AccessKeyId',\n label: defineMessage({id: 'admin.image.amazonS3IdTitle', defaultMessage: 'Amazon S3 Access Key ID:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3IdDescription', defaultMessage: '(Optional) Only required if you do not want to authenticate to S3 using an <link>IAM role</link>. Enter the Access Key ID provided by your Amazon EC2 administrator.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.image.amazonS3IdExample', defaultMessage: 'E.g.: \"AKIADTOVBGERKLCBV\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3SecretAccessKey',\n label: defineMessage({id: 'admin.image.amazonS3SecretTitle', defaultMessage: 'Amazon S3 Secret Access Key:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SecretDescription', defaultMessage: '(Optional) The secret access key associated with your Amazon S3 Access Key ID.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3SecretExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3Bucket',\n label: defineMessage({id: 'admin.image.amazonS3BucketTitle', defaultMessage: 'Amazon S3 Bucket:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3BucketDescription', defaultMessage: 'Name you selected for your S3 bucket in AWS.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3BucketExample', defaultMessage: 'E.g.: \"mattermost-export\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3PathPrefix',\n label: defineMessage({id: 'admin.image.amazonS3PathPrefixTitle', defaultMessage: 'Amazon S3 Path Prefix:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3PathPrefixDescription', defaultMessage: 'Prefix you selected for your S3 bucket in AWS.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3PathPrefixExample', defaultMessage: 'E.g.: \"subdir1/\" or you can leave it .'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3Region',\n label: defineMessage({id: 'admin.image.amazonS3RegionTitle', defaultMessage: 'Amazon S3 Region:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3RegionDescription', defaultMessage: 'AWS region you selected when creating your S3 bucket. If no region is set, Mattermost attempts to get the appropriate region from AWS, or sets it to \"us-east-1\" if none found.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3RegionExample', defaultMessage: 'E.g.: \"us-east-1\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3Endpoint',\n label: defineMessage({id: 'admin.image.amazonS3EndpointTitle', defaultMessage: 'Amazon S3 Endpoint:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3EndpointDescription', defaultMessage: 'Hostname of your S3 Compatible Storage provider. Defaults to \"s3.amazonaws.com\".'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3EndpointExample', defaultMessage: 'E.g.: \"s3.amazonaws.com\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'bool',\n key: 'FileSettings.ExportAmazonS3SSL',\n label: defineMessage({id: 'admin.image.amazonS3SSLTitle', defaultMessage: 'Enable Secure Amazon S3 Connections:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SSLDescription', defaultMessage: 'When false, allow insecure connections to Amazon S3. Defaults to secure connections only.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'bool',\n key: 'FileSettings.ExportAmazonSignV2',\n label: defineMessage({id: 'admin.image.amazonS3SignV2', defaultMessage: 'Enable Sign V2'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SignV2Description', defaultMessage: 'When true, use Sign V2 for Amazon S3 connections'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n {\n type: 'bool',\n key: 'FileSettings.ExportAmazonS3SSE',\n label: defineMessage({id: 'admin.image.amazonS3SSETitle', defaultMessage: 'Enable Server-Side Encryption for Amazon S3:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3SSEDescription', defaultMessage: 'When true, encrypt files in Amazon S3 using server-side encryption with Amazon S3-managed keys. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SESSION_LENGTHS}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.stateEquals('FileSettings.DedicatedExportStore', false),\n ),\n },\n {\n type: 'text',\n key: 'FileSettings.ExportAmazonS3StorageClass',\n label: defineMessage({id: 'admin.image.amazonS3StorageClassTitle', defaultMessage: 'Amazon S3 Storage Class:'}),\n help_text: defineMessage({id: 'admin.image.amazonS3StorageClassDescription', defaultMessage: 'Storage class for your S3 Compatible Storage provider. Defaults to empty.'}),\n placeholder: defineMessage({id: 'admin.image.amazonS3StorageClassExample', defaultMessage: 'E.g.: \"STANDARD\" or \"STANDARD_IA\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n it.not(it.stateEquals('FileSettings.DriverName', FILE_STORAGE_DRIVER_S3)),\n ),\n },\n {\n type: 'button',\n action: testS3Connection,\n key: 'TestS3Connection',\n label: defineMessage({id: 'admin.s3.connectionS3Test', defaultMessage: 'Test Connection'}),\n loading: defineMessage({id: 'admin.s3.testing', defaultMessage: 'Testing...'}),\n error_message: defineMessage({id: 'admin.s3.s3Fail', defaultMessage: 'Connection unsuccessful: {error}'}),\n success_message: defineMessage({id: 'admin.s3.s3Success', defaultMessage: 'Connection was successful'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.FILE_STORAGE)),\n isHidden: it.any(it.stateEquals('FileSettings.ExportDriverName', 'NONE'), it.stateEquals('FileSettings.DedicatedExportStore', false)),\n },\n ],\n },\n },\n image_proxy: {\n url: 'environment/image_proxy',\n title: defineMessage({id: 'admin.sidebar.imageProxy', defaultMessage: 'Image Proxy'}),\n isHidden: it.any(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.IMAGE_PROXY)),\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n ),\n schema: {\n id: 'ImageProxy',\n name: defineMessage({id: 'admin.environment.imageProxy', defaultMessage: 'Image Proxy'}),\n settings: [\n {\n type: 'bool',\n key: 'ImageProxySettings.Enable',\n label: defineMessage({id: 'admin.image.enableProxy', defaultMessage: 'Enable Image Proxy:'}),\n help_text: defineMessage({id: 'admin.image.enableProxyDescription', defaultMessage: 'When true, enables an image proxy for loading all Markdown images.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.IMAGE_PROXY)),\n },\n {\n type: 'dropdown',\n key: 'ImageProxySettings.ImageProxyType',\n label: defineMessage({id: 'admin.image.proxyType', defaultMessage: 'Image Proxy Type:'}),\n help_text: defineMessage({id: 'admin.image.proxyTypeDescription', defaultMessage: 'Configure an image proxy to load all Markdown images through a proxy. The image proxy prevents users from making insecure image requests, provides caching for increased performance, and automates image adjustments such as resizing. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SETUP_IMAGE_PROXY}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n options: [\n {\n value: 'atmos/camo',\n display_name: defineMessage({id: 'atmos/camo', defaultMessage: 'atmos/camo'}),\n },\n {\n value: 'local',\n display_name: defineMessage({id: 'local', defaultMessage: 'local'}),\n },\n ],\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.IMAGE_PROXY)),\n it.stateIsFalse('ImageProxySettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'ImageProxySettings.RemoteImageProxyURL',\n label: defineMessage({id: 'admin.image.proxyURL', defaultMessage: 'Remote Image Proxy URL:'}),\n help_text: defineMessage({id: 'admin.image.proxyURLDescription', defaultMessage: 'URL of your remote image proxy server.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.IMAGE_PROXY)),\n it.stateIsFalse('ImageProxySettings.Enable'),\n it.stateEquals('ImageProxySettings.ImageProxyType', 'local'),\n ),\n },\n {\n type: 'text',\n key: 'ImageProxySettings.RemoteImageProxyOptions',\n label: defineMessage({id: 'admin.image.proxyOptions', defaultMessage: 'Remote Image Proxy Options:'}),\n help_text: defineMessage({id: 'admin.image.proxyOptionsDescription', defaultMessage: 'Additional options such as the URL signing key. Refer to your image proxy documentation to learn more about what options are supported.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.IMAGE_PROXY)),\n it.stateIsFalse('ImageProxySettings.Enable'),\n it.stateEquals('ImageProxySettings.ImageProxyType', 'local'),\n ),\n },\n ],\n },\n },\n smtp: {\n url: 'environment/smtp',\n title: defineMessage({id: 'admin.sidebar.smtp', defaultMessage: 'SMTP'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n ),\n schema: {\n id: 'SMTP',\n name: defineMessage({id: 'admin.environment.smtp', defaultMessage: 'SMTP'}),\n settings: [\n {\n type: 'text',\n key: 'EmailSettings.SMTPServer',\n label: defineMessage({id: 'admin.environment.smtp.smtpServer.title', defaultMessage: 'SMTP Server:'}),\n placeholder: defineMessage({id: 'admin.environment.smtp.smtpServer.placeholder', defaultMessage: 'Ex: \"smtp.yourcompany.com\", \"email-smtp.us-east-1.amazonaws.com\"'}),\n help_text: defineMessage({id: 'admin.environment.smtp.smtpServer.description', defaultMessage: 'Location of SMTP email server.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n {\n type: 'text',\n key: 'EmailSettings.SMTPPort',\n label: defineMessage({id: 'admin.environment.smtp.smtpPort.title', defaultMessage: 'SMTP Server Port:'}),\n placeholder: defineMessage({id: 'admin.environment.smtp.smtpPort.placeholder', defaultMessage: 'Ex: \"25\", \"465\", \"587\"'}),\n help_text: defineMessage({id: 'admin.environment.smtp.smtpPort.description', defaultMessage: 'Port of SMTP email server.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n {\n type: 'bool',\n key: 'EmailSettings.EnableSMTPAuth',\n label: defineMessage({id: 'admin.environment.smtp.smtpAuth.title', defaultMessage: 'Enable SMTP Authentication:'}),\n help_text: defineMessage({id: 'admin.environment.smtp.smtpAuth.description', defaultMessage: 'When true, SMTP Authentication is enabled.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n {\n type: 'text',\n key: 'EmailSettings.SMTPUsername',\n label: defineMessage({id: 'admin.environment.smtp.smtpUsername.title', defaultMessage: 'SMTP Server Username:'}),\n placeholder: defineMessage({id: 'admin.environment.smtp.smtpUsername.placeholder', defaultMessage: 'Ex: \"admin@yourcompany.com\", \"AKIADTOVBGERKLCBV\"'}),\n help_text: defineMessage({id: 'admin.environment.smtp.smtpUsername.description', defaultMessage: 'Obtain this credential from administrator setting up your email server.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n it.stateIsFalse('EmailSettings.EnableSMTPAuth'),\n ),\n },\n {\n type: 'text',\n key: 'EmailSettings.SMTPPassword',\n label: defineMessage({id: 'admin.environment.smtp.smtpPassword.title', defaultMessage: 'SMTP Server Password:'}),\n placeholder: defineMessage({id: 'admin.environment.smtp.smtpPassword.placeholder', defaultMessage: 'Ex: \"yourpassword\", \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n help_text: defineMessage({id: 'admin.environment.smtp.smtpPassword.description', defaultMessage: 'Obtain this credential from administrator setting up your email server.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n it.stateIsFalse('EmailSettings.EnableSMTPAuth'),\n ),\n },\n {\n type: 'dropdown',\n key: 'EmailSettings.ConnectionSecurity',\n label: defineMessage({id: 'admin.environment.smtp.connectionSecurity.title', defaultMessage: 'Connection Security:'}),\n help_text: DefinitionConstants.CONNECTION_SECURITY_HELP_TEXT_EMAIL,\n options: [\n {\n value: '',\n display_name: defineMessage({id: 'admin.environment.smtp.connectionSecurity.option.none', defaultMessage: 'None'}),\n },\n {\n value: 'TLS',\n display_name: defineMessage({id: 'admin.environment.smtp.connectionSecurity.option.tls', defaultMessage: 'TLS (Recommended)'}),\n },\n {\n value: 'STARTTLS',\n display_name: defineMessage({id: 'admin.environment.smtp.connectionSecurity.option.starttls', defaultMessage: 'STARTTLS'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n {\n type: 'button',\n action: testSmtp,\n key: 'TestSmtpConnection',\n label: defineMessage({id: 'admin.environment.smtp.connectionSmtpTest', defaultMessage: 'Test Connection'}),\n loading: defineMessage({id: 'admin.environment.smtp.testing', defaultMessage: 'Testing...'}),\n error_message: defineMessage({id: 'admin.environment.smtp.smtpFail', defaultMessage: 'Connection unsuccessful: {error}'}),\n success_message: defineMessage({id: 'admin.environment.smtp.smtpSuccess', defaultMessage: 'No errors were reported while sending an email. Please check your inbox to make sure.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n {\n type: 'bool',\n key: 'EmailSettings.SkipServerCertificateVerification',\n label: defineMessage({id: 'admin.environment.smtp.skipServerCertificateVerification.title', defaultMessage: 'Skip Server Certificate Verification:'}),\n help_text: defineMessage({id: 'admin.environment.smtp.skipServerCertificateVerification.description', defaultMessage: 'When true, Mattermost will not verify the email server certificate.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableSecurityFixAlert',\n label: defineMessage({id: 'admin.environment.smtp.enableSecurityFixAlert.title', defaultMessage: 'Enable Security Alerts:'}),\n help_text: defineMessage({id: 'admin.environment.smtp.enableSecurityFixAlert.description', defaultMessage: 'When true, System Administrators are notified by email if a relevant security fix alert has been announced in the last 12 hours. Requires email to be enabled.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SMTP)),\n },\n ],\n },\n },\n push_notification_server: {\n url: 'environment/push_notification_server',\n title: defineMessage({id: 'admin.sidebar.pushNotificationServer', defaultMessage: 'Push Notification Server'}),\n searchableStrings: pushSearchableStrings,\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.PUSH_NOTIFICATION_SERVER)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.PUSH_NOTIFICATION_SERVER)),\n schema: {\n id: 'PushNotificationsSettings',\n component: PushNotificationsSettings,\n },\n },\n high_availability: {\n url: 'environment/high_availability',\n title: defineMessage({id: 'admin.sidebar.highAvailability', defaultMessage: 'High Availability'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('Cluster')),\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n ),\n searchableStrings: clusterSearchableStrings,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n schema: {\n id: 'ClusterSettings',\n component: ClusterSettings,\n },\n },\n cache_settings: {\n url: 'environment/cache_settings',\n title: adminDefinitionMessages.cache_settings_title,\n isHidden: it.any(\n it.not(it.licensedForFeature('Cluster')),\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n ),\n searchableStrings: [\n adminDefinitionMessages.cache_settings_title,\n adminDefinitionMessages.cache_type_title,\n adminDefinitionMessages.cache_type_desc,\n adminDefinitionMessages.redis_address_title,\n adminDefinitionMessages.redis_address_desc,\n adminDefinitionMessages.redis_password_title,\n adminDefinitionMessages.redis_password_desc,\n adminDefinitionMessages.redis_db_title,\n adminDefinitionMessages.redis_db_desc,\n adminDefinitionMessages.redis_clientcache_title,\n adminDefinitionMessages.redis_clientcache_desc,\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n schema: {\n id: 'CacheSettings',\n name: adminDefinitionMessages.cache_settings_title,\n settings: [\n {\n type: 'banner',\n label: defineMessage({id: 'admin.rate.noteDescription', defaultMessage: 'Changing properties in this section will require a server restart before taking effect.'}),\n banner_type: 'info',\n },\n {\n type: 'dropdown',\n key: 'CacheSettings.CacheType',\n label: adminDefinitionMessages.cache_type_title,\n help_text: adminDefinitionMessages.cache_type_desc,\n help_text_markdown: true,\n options: [\n {\n value: CacheTypes.LRU,\n display_name: defineMessage({id: 'admin.cacheSettings.cacheType.lru', defaultMessage: 'LRU'}),\n },\n {\n value: CacheTypes.REDIS,\n display_name: defineMessage({id: 'admin.cacheSettings.cacheType.redis', defaultMessage: 'Redis'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n },\n {\n type: 'text',\n key: 'CacheSettings.RedisAddress',\n label: adminDefinitionMessages.redis_address_title,\n help_text: adminDefinitionMessages.redis_address_desc,\n placeholder: adminDefinitionMessages.redis_address_placeholder,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)),\n ),\n },\n {\n type: 'text',\n key: 'CacheSettings.RedisPassword',\n label: adminDefinitionMessages.redis_password_title,\n help_text: adminDefinitionMessages.redis_password_desc,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)),\n ),\n },\n {\n type: 'number',\n key: 'CacheSettings.RedisDB',\n label: adminDefinitionMessages.redis_db_title,\n help_text: adminDefinitionMessages.redis_db_desc,\n placeholder: adminDefinitionMessages.redis_db_placeholder,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)),\n ),\n },\n {\n type: 'bool',\n key: 'CacheSettings.DisableClientCache',\n label: adminDefinitionMessages.redis_clientcache_title,\n help_text: adminDefinitionMessages.redis_clientcache_desc,\n help_text_markdown: false,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.HIGH_AVAILABILITY)),\n it.not(it.stateEquals('CacheSettings.CacheType', CacheTypes.REDIS)),\n ),\n },\n ],\n },\n },\n rate_limiting: {\n url: 'environment/rate_limiting',\n title: defineMessage({id: 'admin.sidebar.rateLimiting', defaultMessage: 'Rate Limiting'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n ),\n schema: {\n id: 'ServiceSettings',\n name: defineMessage({id: 'admin.rate.title', defaultMessage: 'Rate Limiting'}),\n settings: [\n {\n type: 'banner',\n label: defineMessage({id: 'admin.rate.noteDescription', defaultMessage: 'Changing properties other than Site URL in this section will require a server restart before taking effect.'}),\n banner_type: 'info',\n },\n {\n type: 'bool',\n key: 'RateLimitSettings.Enable',\n label: defineMessage({id: 'admin.rate.enableLimiterTitle', defaultMessage: 'Enable Rate Limiting:'}),\n help_text: defineMessage({id: 'admin.rate.enableLimiterDescription', defaultMessage: 'When true, APIs are throttled at rates specified below. Rate limiting prevents server overload from too many requests. This is useful to prevent third-party applications or malicous attacks from impacting your server.'}),\n help_text_markdown: true,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n },\n {\n type: 'number',\n key: 'RateLimitSettings.PerSec',\n label: defineMessage({id: 'admin.rate.queriesTitle', defaultMessage: 'Maximum Queries per Second:'}),\n placeholder: defineMessage({id: 'admin.rate.queriesExample', defaultMessage: 'E.g.: \"10\"'}),\n help_text: defineMessage({id: 'admin.rate.queriesDescription', defaultMessage: 'Throttles API at this number of requests per second.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n it.stateEquals('RateLimitSettings.Enable', false),\n ),\n },\n {\n type: 'number',\n key: 'RateLimitSettings.MaxBurst',\n label: defineMessage({id: 'admin.rate.maxBurst', defaultMessage: 'Maximum Burst Size:'}),\n placeholder: defineMessage({id: 'admin.rate.maxBurstExample', defaultMessage: 'E.g.: \"100\"'}),\n help_text: defineMessage({id: 'admin.rate.maxBurstDescription', defaultMessage: 'Maximum number of requests allowed beyond the per second query limit.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n it.stateEquals('RateLimitSettings.Enable', false),\n ),\n },\n {\n type: 'number',\n key: 'RateLimitSettings.MemoryStoreSize',\n label: defineMessage({id: 'admin.rate.memoryTitle', defaultMessage: 'Memory Store Size:'}),\n placeholder: defineMessage({id: 'admin.rate.memoryExample', defaultMessage: 'E.g.: \"10000\"'}),\n help_text: defineMessage({id: 'admin.rate.memoryDescription', defaultMessage: 'Maximum number of users sessions connected to the system as determined by \"Vary rate limit by remote address\" and \"Vary rate limit by HTTP header\".'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n it.stateEquals('RateLimitSettings.Enable', false),\n ),\n },\n {\n type: 'bool',\n key: 'RateLimitSettings.VaryByRemoteAddr',\n label: defineMessage({id: 'admin.rate.remoteTitle', defaultMessage: 'Vary rate limit by remote address:'}),\n help_text: defineMessage({id: 'admin.rate.remoteDescription', defaultMessage: 'When true, rate limit API access by IP address.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n it.stateEquals('RateLimitSettings.Enable', false),\n ),\n },\n {\n type: 'bool',\n key: 'RateLimitSettings.VaryByUser',\n label: defineMessage({id: 'admin.rate.varyByUser', defaultMessage: 'Vary rate limit by user:'}),\n help_text: defineMessage({id: 'admin.rate.varyByUserDescription', defaultMessage: 'When true, rate limit API access by user athentication token.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n it.stateEquals('RateLimitSettings.Enable', false),\n ),\n },\n {\n type: 'text',\n key: 'RateLimitSettings.VaryByHeader',\n label: defineMessage({id: 'admin.rate.httpHeaderTitle', defaultMessage: 'Vary rate limit by HTTP header:'}),\n placeholder: defineMessage({id: 'admin.rate.httpHeaderExample', defaultMessage: 'E.g.: \"X-Real-IP\", \"X-Forwarded-For\"'}),\n help_text: defineMessage({id: 'admin.rate.httpHeaderDescription', defaultMessage: 'When filled in, vary rate limiting by HTTP header field specified (e.g. when configuring NGINX set to \"X-Real-IP\", when configuring AmazonELB set to \"X-Forwarded-For\").'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.RATE_LIMITING)),\n it.stateEquals('RateLimitSettings.Enable', false),\n it.stateEquals('RateLimitSettings.VaryByRemoteAddr', true),\n ),\n },\n ],\n },\n },\n logging: {\n url: 'environment/logging',\n title: defineMessage({id: 'admin.sidebar.logging', defaultMessage: 'Logging'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n ),\n schema: {\n id: 'LogSettings',\n name: defineMessage({id: 'admin.general.log', defaultMessage: 'Logging'}),\n settings: [\n {\n type: 'bool',\n key: 'LogSettings.EnableConsole',\n label: defineMessage({id: 'admin.log.consoleTitle', defaultMessage: 'Output logs to console: '}),\n help_text: defineMessage({id: 'admin.log.consoleDescription', defaultMessage: 'Typically set to false in production. Developers may set this field to true to output log messages to console based on the console level option. If true, server writes messages to the standard output stream (stdout). Changing this setting requires a server restart before taking effect.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n },\n {\n type: 'dropdown',\n key: 'LogSettings.ConsoleLevel',\n label: defineMessage({id: 'admin.log.levelTitle', defaultMessage: 'Console Log Level:'}),\n help_text: defineMessage({id: 'admin.log.levelDescription', defaultMessage: 'This setting determines the level of detail at which log events are written to the console. ERROR: Outputs only error messages. INFO: Outputs error messages and information around startup and initialization. DEBUG: Prints high detail for developers working on debugging issues.'}),\n options: DefinitionConstants.LOG_LEVEL_OPTIONS,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n it.stateIsFalse('LogSettings.EnableConsole'),\n ),\n },\n {\n type: 'bool',\n key: 'LogSettings.ConsoleJson',\n label: defineMessage({id: 'admin.log.consoleJsonTitle', defaultMessage: 'Output console logs as JSON:'}),\n help_text: defineMessage({id: 'admin.log.jsonDescription', defaultMessage: 'When true, logged events are written in a machine readable JSON format. Otherwise they are printed as plain text. Changing this setting requires a server restart before taking effect.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n it.stateIsFalse('LogSettings.EnableConsole'),\n ),\n },\n {\n type: 'bool',\n key: 'LogSettings.EnableFile',\n label: defineMessage({id: 'admin.log.fileTitle', defaultMessage: 'Output logs to file: '}),\n help_text: defineMessage({id: 'admin.log.fileDescription', defaultMessage: 'Typically set to true in production. When true, logged events are written to the mattermost.log file in the directory specified in the File Log Directory field. The logs are rotated at 100 MB and archived to a file in the same directory, and given a name with a datestamp and serial number. For example, mattermost.2017-03-31.001. Changing this setting requires a server restart before taking effect.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n },\n {\n type: 'dropdown',\n key: 'LogSettings.FileLevel',\n label: defineMessage({id: 'admin.log.fileLevelTitle', defaultMessage: 'File Log Level:'}),\n help_text: defineMessage({id: 'admin.log.fileLevelDescription', defaultMessage: 'This setting determines the level of detail at which log events are written to the log file. ERROR: Outputs only error messages. INFO: Outputs error messages and information around startup and initialization. DEBUG: Prints high detail for developers working on debugging issues.'}),\n options: DefinitionConstants.LOG_LEVEL_OPTIONS,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n it.stateIsFalse('LogSettings.EnableFile'),\n ),\n },\n {\n type: 'bool',\n key: 'LogSettings.FileJson',\n label: defineMessage({id: 'admin.log.fileJsonTitle', defaultMessage: 'Output file logs as JSON:'}),\n help_text: defineMessage({id: 'admin.log.jsonDescription', defaultMessage: 'When true, logged events are written in a machine readable JSON format. Otherwise they are printed as plain text. Changing this setting requires a server restart before taking effect.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n it.stateIsFalse('LogSettings.EnableFile'),\n ),\n },\n {\n type: 'text',\n key: 'LogSettings.FileLocation',\n label: defineMessage({id: 'admin.log.locationTitle', defaultMessage: 'File Log Directory:'}),\n help_text: defineMessage({id: 'admin.log.locationDescription', defaultMessage: 'The location of the log files. If blank, they are stored in the ./logs directory. The path that you set must exist and Mattermost must have write permissions in it. Changing this setting requires a server restart before taking effect.'}),\n placeholder: defineMessage({id: 'admin.log.locationPlaceholder', defaultMessage: 'Enter your file location'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n it.stateIsFalse('LogSettings.EnableFile'),\n ),\n },\n {\n type: 'bool',\n key: 'LogSettings.EnableWebhookDebugging',\n label: defineMessage({id: 'admin.log.enableWebhookDebugging', defaultMessage: 'Enable Webhook Debugging:'}),\n help_text: defineMessage({id: 'admin.log.enableWebhookDebuggingDescription', defaultMessage: 'When true, sends webhook debug messages to the server logs. To also output the request body of incoming webhooks, set {boldedLogLevel} to \"DEBUG\".'}),\n help_text_values: {\n boldedLogLevel: (\n <strong>\n <FormattedMessage\n id='admin.log.logLevel'\n defaultMessage='Log Level'\n />\n </strong>\n ),\n },\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n },\n {\n type: 'bool',\n key: 'LogSettings.EnableDiagnostics',\n label: defineMessage({id: 'admin.log.enableDiagnostics', defaultMessage: 'Enable Diagnostics and Error Reporting:'}),\n help_text: defineMessage({id: 'admin.log.enableDiagnosticsDescription', defaultMessage: 'Enable this feature to improve the quality and performance of Mattermost by sending error reporting and diagnostic information to Mattermost, Inc. Read our <link>privacy policy</link> to learn more.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={AboutLinks.PRIVACY_POLICY}\n >\n {msg}\n </ExternalLink>\n ),\n },\n onConfigSave: (displayVal, previousVal) => {\n if (previousVal && previousVal !== displayVal) {\n trackEvent('ui', 'diagnostics_disabled');\n }\n return displayVal;\n },\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n },\n {\n type: 'longtext',\n key: 'LogSettings.AdvancedLoggingJSON',\n label: defineMessage({id: 'admin.log.AdvancedLoggingJSONTitle', defaultMessage: 'Advanced Logging:'}),\n help_text: defineMessage({id: 'admin.log.AdvancedLoggingJSONDescription', defaultMessage: 'The JSON configuration for Advanced Logging. Please see <link>documentation</link> to learn more about Advanced Logging and the JSON format it uses.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.ADVANCED_LOGGING}\n >\n {msg}\n </ExternalLink>\n ),\n },\n placeholder: defineMessage({id: 'admin.log.AdvancedLoggingJSONPlaceholder', defaultMessage: 'Enter your JSON configuration'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.LOGGING)),\n validate: (value) => {\n const valid = new ValidationResult(true, '');\n if (!value) {\n return valid;\n }\n try {\n JSON.parse(value);\n return valid;\n } catch (error) {\n return new ValidationResult(false, error.message);\n }\n },\n onConfigLoad: (configVal) => JSON.stringify(configVal, null, ' '),\n onConfigSave: (displayVal) => {\n // Handle case where field is empty\n if (!displayVal) {\n return {undefined};\n }\n\n return JSON.parse(displayVal);\n },\n },\n ],\n },\n },\n session_lengths: {\n url: 'environment/session_lengths',\n title: defineMessage({id: 'admin.sidebar.sessionLengths', defaultMessage: 'Session Lengths'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SESSION_LENGTHS)),\n ),\n searchableStrings: sessionLengthSearchableStrings,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.SESSION_LENGTHS)),\n schema: {\n id: 'SessionLengths',\n component: SessionLengthSettings,\n },\n },\n metrics: {\n url: 'environment/performance_monitoring',\n title: defineMessage({id: 'admin.sidebar.metrics', defaultMessage: 'Performance Monitoring'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.PERFORMANCE_MONITORING)),\n ),\n schema: {\n id: 'MetricsSettings',\n name: defineMessage({id: 'admin.advance.metrics', defaultMessage: 'Performance Monitoring'}),\n settings: [\n {\n type: 'bool',\n key: 'MetricsSettings.Enable',\n label: defineMessage({id: 'admin.metrics.enableTitle', defaultMessage: 'Enable Performance Monitoring:'}),\n help_text: defineMessage({id: 'admin.metrics.enableDescription', defaultMessage: 'When true, Mattermost will enable performance monitoring collection and profiling. Please see <link>documentation</link> to learn more about configuring performance monitoring for Mattermost.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SETUP_PERFORMANCE_MONITORING}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.PERFORMANCE_MONITORING)),\n },\n {\n type: 'bool',\n key: 'MetricsSettings.EnableClientMetrics',\n label: defineMessage({id: 'admin.metrics.enableClientMetricsTitle', defaultMessage: 'Enable Client Performance Monitoring:'}),\n help_text: defineMessage({id: 'admin.metrics.enableClientMetricsDescription', defaultMessage: 'When true, Mattermost will enable performance monitoring collection for web and desktop app users. Please see <link>documentation</link> to learn more about configuring performance monitoring for Mattermost.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SETUP_PERFORMANCE_MONITORING}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.PERFORMANCE_MONITORING)),\n it.configIsFalse('MetricsSettings', 'Enable'),\n ),\n },\n {\n type: 'text',\n key: 'MetricsSettings.ListenAddress',\n label: defineMessage({id: 'admin.metrics.listenAddressTitle', defaultMessage: 'Listen Address:'}),\n placeholder: defineMessage({id: 'admin.metrics.listenAddressEx', defaultMessage: 'E.g.: \":8067\"'}),\n help_text: defineMessage({id: 'admin.metrics.listenAddressDesc', defaultMessage: 'The address the server will listen on to expose performance metrics.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.PERFORMANCE_MONITORING)),\n },\n ],\n },\n },\n developer: {\n url: 'environment/developer',\n title: defineMessage({id: 'admin.sidebar.developer', defaultMessage: 'Developer'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DEVELOPER)),\n ),\n schema: {\n id: 'ServiceSettings',\n name: defineMessage({id: 'admin.developer.title', defaultMessage: 'Developer Settings'}),\n settings: [\n {\n type: 'bool',\n key: 'ServiceSettings.EnableTesting',\n label: defineMessage({id: 'admin.service.testingTitle', defaultMessage: 'Enable Testing Commands:'}),\n help_text: defineMessage({id: 'admin.service.testingDescription', defaultMessage: 'When true, /test slash command is enabled to load test accounts, data and text formatting. Changing this requires a server restart before taking effect.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DEVELOPER)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableDeveloper',\n label: defineMessage({id: 'admin.service.developerTitle', defaultMessage: 'Enable Developer Mode: '}),\n help_text: defineMessage({id: 'admin.service.developerDesc', defaultMessage: 'When true, JavaScript errors are shown in a purple bar at the top of the user interface. Not recommended for use in production. Changing this requires a server restart before taking effect.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DEVELOPER)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableClientPerformanceDebugging',\n label: defineMessage({id: 'admin.service.performanceDebuggingTitle', defaultMessage: 'Enable Client Performance Debugging: '}),\n help_text: defineMessage({id: 'admin.service.performanceDebuggingDescription', defaultMessage: 'When true, users can access debugging settings for their account in **Settings > Advanced > Performance Debugging** to assist in diagnosing performance issues. Changing this requires a server restart before taking effect.'}),\n help_text_markdown: true,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DEVELOPER)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.AllowedUntrustedInternalConnections',\n label: defineMessage({id: 'admin.service.internalConnectionsTitle', defaultMessage: 'Allow untrusted internal connections to: '}),\n placeholder: defineMessage({id: 'admin.service.internalConnectionsEx', defaultMessage: 'webhooks.internal.example.com 127.0.0.1 10.0.16.0/28'}),\n help_text: defineMessage({id: 'admin.service.internalConnectionsDesc', defaultMessage: 'A whitelist of local network addresses that can be requested by the Mattermost server on behalf of a client. Care should be used when configuring this setting to prevent unintended access to your local network. See <link>documentation</link> to learn more. Changing this requires a server restart before taking effect.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/default-allow-untrusted-internal-connections'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ENVIRONMENT.DEVELOPER)),\n },\n ],\n },\n },\n },\n },\n site: {\n icon: (\n <CogOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.site', defaultMessage: 'Site Configuration'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.SITE)),\n subsections: {\n customization: {\n url: 'site_config/customization',\n title: defineMessage({id: 'admin.sidebar.customization', defaultMessage: 'Customization'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n schema: {\n id: 'Customization',\n name: defineMessage({id: 'admin.site.customization', defaultMessage: 'Customization'}),\n settings: [\n {\n type: 'text',\n key: 'TeamSettings.SiteName',\n label: defineMessage({id: 'admin.team.siteNameTitle', defaultMessage: 'Site Name:'}),\n help_text: defineMessage({id: 'admin.team.siteNameDescription', defaultMessage: 'Name of service shown in login screens and UI. When not specified, it defaults to \"Mattermost\".'}),\n placeholder: defineMessage({id: 'admin.team.siteNameExample', defaultMessage: 'E.g.: \"Mattermost\"'}),\n max_length: Constants.MAX_SITENAME_LENGTH,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n },\n {\n type: 'text',\n key: 'TeamSettings.CustomDescriptionText',\n label: defineMessage({id: 'admin.team.brandDescriptionTitle', defaultMessage: 'Site Description: '}),\n help_text: defineMessage({id: 'admin.team.brandDescriptionHelp', defaultMessage: 'Displays as a title above the login form. When not specified, the phrase \"Log in\" is displayed.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.EnableCustomBrand',\n label: defineMessage({id: 'admin.team.brandTitle', defaultMessage: 'Enable Custom Branding: '}),\n help_text: defineMessage({id: 'admin.team.brandDesc', defaultMessage: 'Enable custom branding to show an image of your choice, uploaded below, and some help text, written below, on the login page.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n },\n {\n type: 'custom',\n component: BrandImageSetting,\n key: 'CustomBrandImage',\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n it.stateIsFalse('TeamSettings.EnableCustomBrand'),\n ),\n },\n {\n type: 'longtext',\n key: 'TeamSettings.CustomBrandText',\n label: defineMessage({id: 'admin.team.brandTextTitle', defaultMessage: 'Custom Brand Text:'}),\n help_text: defineMessage({id: 'admin.team.brandTextDescription', defaultMessage: 'Text that will appear below your custom brand image on your login screen. Supports Markdown-formatted text. Maximum 500 characters allowed.'}),\n max_length: Constants.MAX_CUSTOM_BRAND_TEXT_LENGTH,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n it.stateIsFalse('TeamSettings.EnableCustomBrand'),\n ),\n },\n {\n type: 'bool',\n key: 'SupportSettings.EnableAskCommunityLink',\n label: defineMessage({id: 'admin.support.enableAskCommunityTitle', defaultMessage: 'Enable Ask Community Link:'}),\n help_text: defineMessage({id: 'admin.support.enableAskCommunityDesc', defaultMessage: 'When true, \"Ask the community\" link appears on the Mattermost user interface and Help Menu, which allows users to join the Mattermost Community to ask questions and help others troubleshoot issues. When false, the link is hidden from users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n },\n {\n type: 'text',\n key: 'SupportSettings.HelpLink',\n label: defineMessage({id: 'admin.support.helpTitle', defaultMessage: 'Help Link:'}),\n help_text: defineMessage({id: 'admin.support.helpDesc', defaultMessage: 'The URL for the Help link on the Mattermost login page, sign-up pages, and Help Menu. If this field is empty, the Help link is hidden from users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n },\n {\n type: 'text',\n key: 'SupportSettings.TermsOfServiceLink',\n label: defineMessage({id: 'admin.support.termsTitle', defaultMessage: 'Terms of Use Link:'}),\n help_text: defineMessage({id: 'admin.support.termsDesc', defaultMessage: 'Link to the terms under which users may use your online service. By default, this includes the \"Mattermost Conditions of Use (End Users)\" explaining the terms under which Mattermost software is provided to end users. If you change the default link to add your own terms for using the service you provide, your new terms must include a link to the default terms so end users are aware of the Mattermost Conditions of Use (End User) for Mattermost software.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'SupportSettings.PrivacyPolicyLink',\n label: defineMessage({id: 'admin.support.privacyTitle', defaultMessage: 'Privacy Policy Link:'}),\n help_text: defineMessage({id: 'admin.support.privacyDesc', defaultMessage: 'The URL for the Privacy link on the login and sign-up pages. If this field is empty, the Privacy link is hidden from users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'SupportSettings.AboutLink',\n label: defineMessage({id: 'admin.support.aboutTitle', defaultMessage: 'About Link:'}),\n help_text: defineMessage({id: 'admin.support.aboutDesc', defaultMessage: 'The URL for the About link on the Mattermost login and sign-up pages. If this field is empty, the About link is hidden from users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'SupportSettings.ForgotPasswordLink',\n label: defineMessage({id: 'admin.support.forgotPasswordTitle', defaultMessage: 'Forgot Password Custom Link:'}),\n help_text: defineMessage({id: 'admin.support.forgotPasswordDesc', defaultMessage: 'The URL for the Forgot Password link on the Mattermost login page. If this field is empty the Forgot Password link takes users to the Password Reset page.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'SupportSettings.ReportAProblemLink',\n label: defineMessage({id: 'admin.support.problemTitle', defaultMessage: 'Report a Problem Link:'}),\n help_text: defineMessage({id: 'admin.support.problemDesc', defaultMessage: 'The URL for the Report a Problem link in the Help Menu. If this field is empty, the link is removed from the Help Menu.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'NativeAppSettings.AppDownloadLink',\n label: defineMessage({id: 'admin.customization.appDownloadLinkTitle', defaultMessage: 'Mattermost Apps Download Page Link:'}),\n help_text: defineMessage({id: 'admin.customization.appDownloadLinkDesc', defaultMessage: 'Add a link to a download page for the Mattermost apps. When a link is present, an option to \"Download Mattermost Apps\" will be added in the Product Menu so users can find the download page. Leave this field blank to hide the option from the Product Menu.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'NativeAppSettings.AndroidAppDownloadLink',\n label: defineMessage({id: 'admin.customization.androidAppDownloadLinkTitle', defaultMessage: 'Android App Download Link:'}),\n help_text: defineMessage({id: 'admin.customization.androidAppDownloadLinkDesc', defaultMessage: 'Add a link to download the Android app. Users who access the site on a mobile web browser will be prompted with a page giving them the option to download the app. Leave this field blank to prevent the page from appearing.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'text',\n key: 'NativeAppSettings.IosAppDownloadLink',\n label: defineMessage({id: 'admin.customization.iosAppDownloadLinkTitle', defaultMessage: 'iOS App Download Link:'}),\n help_text: defineMessage({id: 'admin.customization.iosAppDownloadLinkDesc', defaultMessage: 'Add a link to download the iOS app. Users who access the site on a mobile web browser will be prompted with a page giving them the option to download the app. Leave this field blank to prevent the page from appearing.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableDesktopLandingPage',\n label: defineMessage({id: 'admin.customization.enableDesktopLandingPageTitle', defaultMessage: 'Enable Desktop App Landing Page:'}),\n help_text: defineMessage({id: 'admin.customization.enableDesktopLandingPageDesc', defaultMessage: 'Whether or not to prompt a user to use the Desktop App when they first use Mattermost.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n },\n ],\n },\n },\n system_properties: {\n url: 'site_config/system_properties',\n title: defineMessage({id: 'admin.sidebar.system_properties', defaultMessage: 'System Properties'}),\n searchableStrings: systemPropertiesSearchableStrings,\n isHidden: it.not(it.all(\n it.licensedForSku(LicenseSkus.Enterprise),\n it.configIsTrue('FeatureFlags', 'CustomProfileAttributes'),\n )),\n schema: {\n id: 'SystemProperties',\n component: SystemProperties,\n },\n },\n localization: {\n url: 'site_config/localization',\n title: defineMessage({id: 'admin.sidebar.localization', defaultMessage: 'Localization'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.LOCALIZATION)),\n schema: {\n id: 'LocalizationSettings',\n name: defineMessage({id: 'admin.site.localization', defaultMessage: 'Localization'}),\n settings: [\n {\n type: 'language',\n key: 'LocalizationSettings.DefaultServerLocale',\n label: defineMessage({id: 'admin.general.localization.serverLocaleTitle', defaultMessage: 'Default Server Language:'}),\n help_text: defineMessage({id: 'admin.general.localization.serverLocaleDescription', defaultMessage: 'Default language for system messages.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.LOCALIZATION)),\n },\n {\n type: 'language',\n key: 'LocalizationSettings.DefaultClientLocale',\n label: defineMessage({id: 'admin.general.localization.clientLocaleTitle', defaultMessage: 'Default Client Language:'}),\n help_text: defineMessage({id: 'admin.general.localization.clientLocaleDescription', defaultMessage: 'Default language for newly created users and pages where the user hasn\\'t logged in.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.LOCALIZATION)),\n },\n {\n type: 'language',\n key: 'LocalizationSettings.AvailableLocales',\n label: defineMessage({id: 'admin.general.localization.availableLocalesTitle', defaultMessage: 'Available Languages:'}),\n help_text: defineMessage({id: 'admin.general.localization.availableLocalesDescription', defaultMessage: 'Set which languages are available for users in <strong>Settings > Display > Language</strong> (leave this field blank to have all supported languages available). If you\\'re manually adding new languages, the <strong>Default Client Language</strong> must be added before saving this setting.\\n \\nWould like to help with translations? Join the <link>Mattermost Translation Server</link> to contribute.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='http://translate.mattermost.com/'\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n multiple: true,\n no_result: defineMessage({id: 'admin.general.localization.availableLocalesNoResults', defaultMessage: 'No results found'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.LOCALIZATION)),\n },\n {\n type: 'bool',\n key: 'LocalizationSettings.EnableExperimentalLocales',\n label: defineMessage({id: 'admin.general.localization.enableExperimentalLocalesTitle', defaultMessage: 'Enable Experimental Locales:'}),\n help_text: defineMessage({id: 'admin.general.localization.enableExperimentalLocalesDescription', defaultMessage: 'When true, it allows users to select experimental (e.g., in progress) languages.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.LOCALIZATION)),\n },\n ],\n },\n },\n users_and_teams: {\n url: 'site_config/users_and_teams',\n title: defineMessage({id: 'admin.sidebar.usersAndTeams', defaultMessage: 'Users and Teams'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n schema: {\n id: 'UserAndTeamsSettings',\n name: defineMessage({id: 'admin.site.usersAndTeams', defaultMessage: 'Users and Teams'}),\n settings: [\n {\n type: 'number',\n key: 'TeamSettings.MaxUsersPerTeam',\n label: defineMessage({id: 'admin.team.maxUsersTitle', defaultMessage: 'Max Users Per Team:'}),\n help_text: defineMessage({id: 'admin.team.maxUsersDescription', defaultMessage: 'Maximum total number of users per team, including both active and inactive users.'}),\n placeholder: defineMessage({id: 'admin.team.maxUsersExample', defaultMessage: 'E.g.: \"25\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'number',\n key: 'TeamSettings.MaxChannelsPerTeam',\n label: defineMessage({id: 'admin.team.maxChannelsTitle', defaultMessage: 'Max Channels Per Team:'}),\n help_text: defineMessage({id: 'admin.team.maxChannelsDescription', defaultMessage: 'Maximum total number of channels per team, including both active and archived channels.'}),\n placeholder: defineMessage({id: 'admin.team.maxChannelsExample', defaultMessage: 'E.g.: \"100\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.EnableJoinLeaveMessageByDefault',\n label: defineMessage({id: 'admin.team.enableJoinLeaveMessageTitle', defaultMessage: 'Enable join/leave messages by default:'}),\n help_text: defineMessage({id: 'admin.team.enableJoinLeaveMessageDescription', defaultMessage: 'Choose the default configuration of system messages displayed when users join or leave channels. Users can override this default by configuring Join/Leave messages in Account Settings > Advanced.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'dropdown',\n key: 'TeamSettings.RestrictDirectMessage',\n label: defineMessage({id: 'admin.team.restrictDirectMessage', defaultMessage: 'Enable users to open Direct Message channels with:'}),\n help_text: defineMessage({id: 'admin.team.restrictDirectMessageDesc', defaultMessage: '\"Any user on the Mattermost server\" enables users to open a Direct Message channel with any user on the server, even if they are not on any teams together. \"Any member of the team\" limits the ability in the Direct Messages \"More\" menu to only open Direct Message channels with users who are in the same team. Note: This setting only affects the UI, not permissions on the server.'}),\n options: [\n {\n value: 'any',\n display_name: defineMessage({id: 'admin.team.restrict_direct_message_any', defaultMessage: 'Any user on the Mattermost server'}),\n },\n {\n value: 'team',\n display_name: defineMessage({id: 'admin.team.restrict_direct_message_team', defaultMessage: 'Any member of the team'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'dropdown',\n key: 'TeamSettings.TeammateNameDisplay',\n label: defineMessage({id: 'admin.team.teammateNameDisplay', defaultMessage: 'Teammate Name Display:'}),\n help_text: defineMessage({id: 'admin.team.teammateNameDisplayDesc', defaultMessage: 'Set how to display users\\' names in posts and the Direct Messages list.'}),\n options: [\n {\n value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_USERNAME,\n display_name: defineMessage({id: 'admin.team.showUsername', defaultMessage: 'Show username (default)'}),\n },\n {\n value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_FULLNAME,\n display_name: defineMessage({id: 'admin.team.showNickname', defaultMessage: 'Show nickname if one exists, otherwise show first and last name'}),\n },\n {\n value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_FULLNAME,\n display_name: defineMessage({id: 'admin.team.showFullname', defaultMessage: 'Show first and last name'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.LockTeammateNameDisplay',\n label: defineMessage({id: 'admin.lockTeammateNameDisplay', defaultMessage: 'Lock Teammate Name Display for all users: '}),\n help_text: defineMessage({id: 'admin.lockTeammateNameDisplayHelpText', defaultMessage: 'When true, disables users\\' ability to change settings under <strong>Account Menu > Account Settings > Display > Teammate Name Display</strong>.'}),\n help_text_values: {\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n isHidden: it.not(it.licensedForFeature('LockTeammateNameDisplay')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.ExperimentalViewArchivedChannels',\n label: defineMessage({id: 'admin.viewArchivedChannelsTitle', defaultMessage: 'Allow users to view archived channels: '}),\n help_text: defineMessage({id: 'admin.viewArchivedChannelsHelpText', defaultMessage: 'When true, allows users to view, share and search for content of channels that have been archived. Users can only view the content in channels of which they were a member before the channel was archived.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'bool',\n key: 'PrivacySettings.ShowEmailAddress',\n label: defineMessage({id: 'admin.privacy.showEmailTitle', defaultMessage: 'Show Email Address:'}),\n help_text: defineMessage({id: 'admin.privacy.showEmailDescription', defaultMessage: 'When false, hides the email address of members from everyone except System Administrators and the System Roles with read/write access to Compliance, Billing, or User Management.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'PrivacySettings.ShowFullName',\n label: defineMessage({id: 'admin.privacy.showFullNameTitle', defaultMessage: 'Show Full Name:'}),\n help_text: defineMessage({id: 'admin.privacy.showFullNameDescription', defaultMessage: 'When false, hides the full name of members from everyone except System Administrators. Username is shown in place of full name.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.EnableCustomUserStatuses',\n label: defineMessage({id: 'admin.team.customUserStatusesTitle', defaultMessage: 'Enable Custom Statuses: '}),\n help_text: defineMessage({id: 'admin.team.customUserStatusesDescription', defaultMessage: 'When true, users can set a descriptive status message and status emoji visible to all users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.EnableLastActiveTime',\n label: defineMessage({id: 'admin.team.lastActiveTimeTitle', defaultMessage: 'Enable last active time: '}),\n help_text: defineMessage({id: 'admin.team.lastActiveTimeDescription', defaultMessage: 'When enabled, last active time allows users to see when someone was last online.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableCustomGroups',\n label: defineMessage({id: 'admin.team.customUserGroupsTitle', defaultMessage: 'Enable Custom User Groups: '}),\n help_text: defineMessage({id: 'admin.team.customUserGroupsDescription', defaultMessage: 'When true, users with appropriate permissions can create custom user groups and enables at-mentions for those groups.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n isHidden: it.not(it.any(\n it.licensedForSku(LicenseSkus.Enterprise),\n it.licensedForSku(LicenseSkus.Professional),\n )),\n },\n {\n type: 'text',\n key: 'ServiceSettings.RefreshPostStatsRunTime',\n label: defineMessage({id: 'admin.team.refreshPostStatsRunTimeTitle', defaultMessage: 'User Statistics Update Time:'}),\n help_text: defineMessage({id: 'admin.team.refreshPostStatsRunTimeDescription', defaultMessage: \"Set the server time for updating the user post statistics, including each user's total post count and the timestamp of their most recent post. Must be a 24-hour time stamp in the form HH:MM based on the local time of the server.\"}),\n placeholder: defineMessage({id: 'admin.team.refreshPostStatsRunTimeExample', defaultMessage: 'E.g.: \"00:00\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.USERS_AND_TEAMS)),\n },\n ],\n },\n },\n notifications: {\n url: 'environment/notifications',\n title: defineMessage({id: 'admin.sidebar.notifications', defaultMessage: 'Notifications'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n schema: {\n id: 'notifications',\n name: defineMessage({id: 'admin.environment.notifications', defaultMessage: 'Notifications'}),\n settings: [\n {\n type: 'bool',\n key: 'TeamSettings.EnableConfirmNotificationsToChannel',\n label: defineMessage({id: 'admin.environment.notifications.enableConfirmNotificationsToChannel.label', defaultMessage: 'Show @channel, @all, @here and group mention confirmation dialog:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.enableConfirmNotificationsToChannel.help', defaultMessage: 'When true, users will be prompted to confirm when posting @channel, @all, @here and group mentions in channels with over five members. When false, no confirmation is required.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n },\n {\n type: 'bool',\n key: 'EmailSettings.SendEmailNotifications',\n label: defineMessage({id: 'admin.environment.notifications.enable.label', defaultMessage: 'Enable Email Notifications:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.enable.help', defaultMessage: 'Typically set to true in production. When true, Mattermost attempts to send email notifications. When false, email invitations and user account setting change emails are still sent as long as the SMTP server is configured. Developers may set this field to false to skip email setup for faster development.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'bool',\n key: 'EmailSettings.EnablePreviewModeBanner',\n label: defineMessage({id: 'admin.environment.notifications.enablePreviewModeBanner.label', defaultMessage: 'Enable Preview Mode Banner:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.enablePreviewModeBanner.help', defaultMessage: 'When true, the Preview Mode banner is displayed so users are aware that email notifications are disabled. When false, the Preview Mode banner is not displayed to users.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n it.stateIsTrue('EmailSettings.SendEmailNotifications'),\n ),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'bool',\n key: 'EmailSettings.EnableEmailBatching',\n label: defineMessage({id: 'admin.environment.notifications.enableEmailBatching.label', defaultMessage: 'Enable Email Batching:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.enableEmailBatching.help', defaultMessage: 'When true, users will have email notifications for multiple direct messages and mentions combined into a single email. Batching will occur at a default interval of 15 minutes, configurable in Settings > Notifications.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n it.stateIsFalse('EmailSettings.SendEmailNotifications'),\n it.configIsTrue('ClusterSettings', 'Enable'),\n it.configIsFalse('ServiceSettings', 'SiteURL'),\n ),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'dropdown',\n key: 'EmailSettings.EmailNotificationContentsType',\n label: defineMessage({id: 'admin.environment.notifications.contents.label', defaultMessage: 'Email Notification Contents:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.contents.help', defaultMessage: '**Send full message contents** - Sender name and channel are included in email notifications. **Send generic description with only sender name** - Only the name of the person who sent the message, with no information about channel name or message contents are included in email notifications. Typically used for compliance reasons if Mattermost contains confidential information and policy dictates it cannot be stored in email.'}),\n help_text_markdown: true,\n options: [\n {\n value: 'full',\n display_name: defineMessage({id: 'admin.environment.notifications.contents.full', defaultMessage: 'Send full message contents'}),\n },\n {\n value: 'generic',\n display_name: defineMessage({id: 'admin.environment.notifications.contents.generic', defaultMessage: 'Send generic description with only sender name'}),\n },\n ],\n isHidden: it.not(it.licensedForFeature('EmailNotificationContents')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n },\n {\n type: 'text',\n key: 'EmailSettings.FeedbackName',\n label: defineMessage({id: 'admin.environment.notifications.notificationDisplay.label', defaultMessage: 'Notification Display Name:'}),\n placeholder: defineMessage({id: 'admin.environment.notifications.notificationDisplay.placeholder', defaultMessage: 'Ex: \"Mattermost Notification\", \"System\", \"No-Reply\"'}),\n help_text: defineMessage({id: 'admin.environment.notifications.notificationDisplay.help', defaultMessage: 'Display name on email account used when sending notification emails from Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n it.stateIsFalse('EmailSettings.SendEmailNotifications'),\n ),\n validate: validators.isRequired(defineMessage({id: 'admin.environment.notifications.notificationDisplay.required', defaultMessage: '\"Notification Display Name\" is required'})),\n },\n {\n type: 'text',\n key: 'EmailSettings.FeedbackEmail',\n label: defineMessage({id: 'admin.environment.notifications.feedbackEmail.label', defaultMessage: 'Notification From Address:'}),\n placeholder: defineMessage({id: 'admin.environment.notifications.feedbackEmail.placeholder', defaultMessage: 'Ex: \"mattermost@yourcompany.com\", \"admin@yourcompany.com\"'}),\n help_text: defineMessage({id: 'admin.environment.notifications.feedbackEmail.help', defaultMessage: 'Email address displayed on email account used when sending notification emails from Mattermost.'}),\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n it.stateIsFalse('EmailSettings.SendEmailNotifications'),\n ),\n validate: validators.isRequired(defineMessage({id: 'admin.environment.notifications.feedbackEmail.required', defaultMessage: '\"Notification From Address\" is required'})),\n },\n {\n type: 'text',\n key: 'SupportSettings.SupportEmail',\n label: defineMessage({id: 'admin.environment.notifications.supportEmail.label', defaultMessage: 'Support Email Address:'}),\n placeholder: defineMessage({id: 'admin.environment.notifications.supportAddress.placeholder', defaultMessage: 'Ex: \"support@yourcompany.com\", \"admin@yourcompany.com\"'}),\n help_text: defineMessage({id: 'admin.environment.notifications.supportEmail.help', defaultMessage: 'Email address displayed on support emails.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.CUSTOMIZATION)),\n validate: validators.isRequired(defineMessage({id: 'admin.environment.notifications.supportEmail.required', defaultMessage: '\"Support Email Address\" is required'})),\n },\n {\n type: 'text',\n key: 'EmailSettings.ReplyToAddress',\n label: defineMessage({id: 'admin.environment.notifications.replyToAddress.label', defaultMessage: 'Notification Reply-To Address:'}),\n placeholder: defineMessage({id: 'admin.environment.notifications.replyToAddress.placeholder', defaultMessage: 'Ex: \"mattermost@yourcompany.com\", \"admin@yourcompany.com\"'}),\n help_text: defineMessage({id: 'admin.environment.notifications.replyToAddress.help', defaultMessage: 'Email address used in the Reply-To header when sending notification emails from Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n it.stateIsFalse('EmailSettings.SendEmailNotifications'),\n ),\n },\n {\n type: 'text',\n key: 'EmailSettings.FeedbackOrganization',\n label: defineMessage({id: 'admin.environment.notifications.feedbackOrganization.label', defaultMessage: 'Notification Footer Mailing Address:'}),\n placeholder: defineMessage({id: 'admin.environment.notifications.feedbackOrganization.placeholder', defaultMessage: 'Ex: \"© ABC Corporation, 565 Knight Way, Palo Alto, California, 94305, USA\"'}),\n help_text: defineMessage({id: 'admin.environment.notifications.feedbackOrganization.help', defaultMessage: 'Organization name and address displayed on email notifications from Mattermost, such as \"© ABC Corporation, 565 Knight Way, Palo Alto, California, 94305, USA\". If the field is left empty, the organization name and address will not be displayed.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n it.stateIsFalse('EmailSettings.SendEmailNotifications'),\n ),\n },\n {\n type: 'dropdown',\n key: 'EmailSettings.PushNotificationContents',\n label: defineMessage({id: 'admin.environment.notifications.pushContents.label', defaultMessage: 'Push Notification Contents:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.pushContents.help', defaultMessage: \"**Generic description with only sender name** - Includes only the name of the person who sent the message in push notifications, with no information about channel name or message contents. **Generic description with sender and channel names** - Includes the name of the person who sent the message and the channel it was sent in, but not the message contents. **Full message content sent in the notification payload** - Includes the message contents in the push notification payload that is relayed through Apple's Push Notification Service (APNS) or Google's Firebase Cloud Messaging (FCM). It is **highly recommended** this option only be used with an \\\"https\\\" protocol to encrypt the connection and protect confidential information sent in messages.\"}),\n help_text_markdown: true,\n options: [\n {\n value: 'generic_no_channel',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.genericNoChannel', defaultMessage: 'Generic description with only sender name'}),\n },\n {\n value: 'generic',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.generic', defaultMessage: 'Generic description with sender and channel names'}),\n },\n {\n value: 'full',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.full', defaultMessage: 'Full message content sent in the notification payload'}),\n },\n ],\n isHidden: it.licensedForFeature('IDLoadedPushNotifications'),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n },\n {\n type: 'dropdown',\n key: 'EmailSettings.PushNotificationContents',\n label: defineMessage({id: 'admin.environment.notifications.pushContents.label', defaultMessage: 'Push Notification Contents:'}),\n help_text: defineMessage({id: 'admin.environment.notifications.pushContents.withIdLoaded.help', defaultMessage: \"**Generic description with only sender name** - Includes only the name of the person who sent the message in push notifications, with no information about channel name or message contents. **Generic description with sender and channel names** - Includes the name of the person who sent the message and the channel it was sent in, but not the message contents. **Full message content sent in the notification payload** - Includes the message contents in the push notification payload that is relayed through Apple's Push Notification Service (APNS) or Google's Firebase Cloud Messaging (FCM). It is **highly recommended** this option only be used with an \\\"https\\\" protocol to encrypt the connection and protect confidential information sent in messages. **Full message content fetched from the server on receipt** - The notification payload relayed through APNS or FCM contains no message content, instead it contains a unique message ID used to fetch message content from the server when a push notification is received by a device. If the server cannot be reached, a generic notification will be displayed.\"}),\n help_text_markdown: true,\n options: [\n {\n value: 'generic_no_channel',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.genericNoChannel', defaultMessage: 'Generic description with only sender name'}),\n },\n {\n value: 'generic',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.generic', defaultMessage: 'Generic description with sender and channel names'}),\n },\n {\n value: 'full',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.full', defaultMessage: 'Full message content sent in the notification payload'}),\n },\n {\n value: 'id_loaded',\n display_name: defineMessage({id: 'admin.environment.notifications.pushContents.idLoaded', defaultMessage: 'Full message content fetched from the server on receipt'}),\n },\n ],\n isHidden: it.not(it.licensedForFeature('IDLoadedPushNotifications')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTIFICATIONS)),\n },\n {\n type: 'bool',\n key: 'MetricsSettings.EnableNotificationMetrics',\n label: defineMessage({id: 'admin.metrics.enableNotificationMetricsTitle', defaultMessage: 'Enable Notification Monitoring:'}),\n help_text: defineMessage({id: 'admin.metrics.enableNotificationMetricsDescription', defaultMessage: 'When true, Mattermost will enable notification data collection for web and Desktop App users.'}),\n isDisabled: it.any(\n it.configIsFalse('MetricsSettings', 'Enable'),\n ),\n isHidden: it.configIsFalse('FeatureFlags', 'NotificationMonitoring'),\n },\n ],\n },\n },\n announcement_banner: {\n url: 'site_config/announcement_banner',\n title: defineMessage({id: 'admin.sidebar.announcement', defaultMessage: 'System-wide Notifications'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('Announcement')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER)),\n ),\n schema: {\n id: 'AnnouncementSettings',\n name: defineMessage({id: 'admin.site.announcementBanner', defaultMessage: 'System-wide Notifications'}),\n settings: [\n {\n type: 'bool',\n key: 'AnnouncementSettings.EnableBanner',\n label: defineMessage({id: 'admin.customization.announcement.enableBannerTitle', defaultMessage: 'Enable System-wide Notifications:'}),\n help_text: defineMessage({id: 'admin.customization.announcement.enableBannerDesc', defaultMessage: 'Enable an announcement banner across all teams.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER)),\n },\n {\n type: 'text',\n key: 'AnnouncementSettings.BannerText',\n label: defineMessage({id: 'admin.customization.announcement.bannerTextTitle', defaultMessage: 'Banner Text:'}),\n help_text: defineMessage({id: 'admin.customization.announcement.bannerTextDesc', defaultMessage: 'Text that will appear in the announcement banner.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER)),\n it.stateIsFalse('AnnouncementSettings.EnableBanner'),\n ),\n },\n {\n type: 'color',\n key: 'AnnouncementSettings.BannerColor',\n label: defineMessage({id: 'admin.customization.announcement.bannerColorTitle', defaultMessage: 'Banner Color:'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER)),\n it.stateIsFalse('AnnouncementSettings.EnableBanner'),\n ),\n },\n {\n type: 'color',\n key: 'AnnouncementSettings.BannerTextColor',\n label: defineMessage({id: 'admin.customization.announcement.bannerTextColorTitle', defaultMessage: 'Banner Text Color:'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER)),\n it.stateIsFalse('AnnouncementSettings.EnableBanner'),\n ),\n },\n {\n type: 'bool',\n key: 'AnnouncementSettings.AllowBannerDismissal',\n label: defineMessage({id: 'admin.customization.announcement.allowBannerDismissalTitle', defaultMessage: 'Allow Banner Dismissal:'}),\n help_text: defineMessage({id: 'admin.customization.announcement.allowBannerDismissalDesc', defaultMessage: 'When true, users can dismiss the banner until its next update. When false, the banner is permanently visible until it is turned off by the System Admin.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.ANNOUNCEMENT_BANNER)),\n it.stateIsFalse('AnnouncementSettings.EnableBanner'),\n ),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n announcement_banner_feature_discovery: {\n url: 'site_config/announcement_banner',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.announcement', defaultMessage: 'System-wide Notifications'}),\n isHidden: it.any(\n it.licensedForFeature('Announcement'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'AnnouncementSettings',\n name: defineMessage({id: 'admin.site.announcementBanner', defaultMessage: 'System-wide Notifications'}),\n settings: [\n {\n type: 'custom',\n component: AnnouncementBannerFeatureDiscovery,\n key: 'AnnouncementBannerFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true),\n },\n emoji: {\n url: 'site_config/emoji',\n title: defineMessage({id: 'admin.sidebar.emoji', defaultMessage: 'Emoji'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.EMOJI)),\n schema: {\n id: 'EmojiSettings',\n name: defineMessage({id: 'admin.site.emoji', defaultMessage: 'Emoji'}),\n settings: [\n {\n type: 'bool',\n key: 'ServiceSettings.EnableEmojiPicker',\n label: defineMessage({id: 'admin.customization.enableEmojiPickerTitle', defaultMessage: 'Enable Emoji Picker:'}),\n help_text: defineMessage({id: 'admin.customization.enableEmojiPickerDesc', defaultMessage: 'The emoji picker allows users to select emoji to add as reactions or use in messages. Enabling the emoji picker with a large number of custom emoji may slow down performance.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.EMOJI)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableCustomEmoji',\n label: defineMessage({id: 'admin.customization.enableCustomEmojiTitle', defaultMessage: 'Enable Custom Emoji:'}),\n help_text: defineMessage({id: 'admin.customization.enableCustomEmojiDesc', defaultMessage: 'Enable users to create custom emoji for use in messages. When enabled, custom emoji settings can be accessed in Channels through the emoji picker.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.EMOJI)),\n },\n ],\n },\n },\n posts: {\n url: 'site_config/posts',\n title: defineMessage({id: 'admin.sidebar.posts', defaultMessage: 'Posts'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n schema: {\n id: 'PostSettings',\n name: defineMessage({id: 'admin.site.posts', defaultMessage: 'Posts'}),\n settings: [\n {\n type: 'bool',\n key: 'ServiceSettings.ThreadAutoFollow',\n label: defineMessage({id: 'admin.experimental.threadAutoFollow.title', defaultMessage: 'Automatically Follow Threads'}),\n help_text: defineMessage({id: 'admin.experimental.threadAutoFollow.desc', defaultMessage: 'This setting must be enabled in order to enable Threaded Discussions. When enabled, threads a user starts, participates in, or is mentioned in are automatically followed. A new `Threads` table is added in the database that tracks threads and thread participants, and a `ThreadMembership` table tracks followed threads for each user and the read or unread state of each followed thread. When false, all backend operations to support Threaded Discussions are disabled.'}),\n help_text_markdown: true,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'dropdown',\n key: 'ServiceSettings.CollapsedThreads',\n label: defineMessage({id: 'admin.experimental.collapsedThreads.title', defaultMessage: 'Threaded Discussions'}),\n help_text: defineMessage({id: 'admin.experimental.collapsedThreads.desc', defaultMessage: 'When enabled (default off), users must enable Threaded Discussions in Settings. When disabled, users cannot access Threaded Discussions. Please review our <linkKnownIssues>documentation for known issues</linkKnownIssues> and help provide feedback in our <linkCommunityChannel>Community Channel</linkCommunityChannel>.'}),\n help_text_values: {\n linkKnownIssues: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://support.mattermost.com/hc/en-us/articles/4413183568276'\n >\n {msg}\n </ExternalLink>\n ),\n linkCommunityChannel: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://community-daily.mattermost.com/core/channels/folded-reply-threads'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n options: [\n {\n value: 'disabled',\n display_name: defineMessage({id: 'admin.experimental.collapsedThreads.off', defaultMessage: 'Disabled'}),\n },\n {\n value: 'default_off',\n display_name: defineMessage({id: 'admin.experimental.collapsedThreads.default_off', defaultMessage: 'Enabled (Default Off)'}),\n },\n {\n value: 'default_on',\n display_name: defineMessage({id: 'admin.experimental.collapsedThreads.default_on', defaultMessage: 'Enabled (Default On)'}),\n },\n {\n value: 'always_on',\n display_name: defineMessage({id: 'admin.experimental.collapsedThreads.always_on', defaultMessage: 'Always On'}),\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.PostPriority',\n label: defineMessage({id: 'admin.posts.postPriority.title', defaultMessage: 'Message Priority'}),\n help_text: defineMessage({id: 'admin.posts.postPriority.desc', defaultMessage: 'When enabled, users can configure a visual indicator to communicate messages that are important or urgent. Learn more about message priority in our <link>documentation</link>.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/message-priority/'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.AllowPersistentNotifications',\n label: defineMessage({id: 'admin.posts.persistentNotifications.title', defaultMessage: 'Persistent Notifications'}),\n help_text: defineMessage({id: 'admin.posts.persistentNotifications.desc', defaultMessage: 'When enabled, users can trigger repeating notifications for the recipients of urgent messages. Learn more about message priority and persistent notifications in our <link>documentation</link>.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/message-priority/'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n isHidden: it.configIsFalse('ServiceSettings', 'PostPriority'),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.ScheduledPosts',\n label: defineMessage({id: 'admin.posts.scheduledPosts.title', defaultMessage: 'Scheduled Posts'}),\n help_text: defineMessage({id: 'admin.posts.scheduledPosts.description', defaultMessage: 'When enabled, users can schedule and send messages in the future.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n isHidden: it.not(it.licensed),\n },\n {\n type: 'number',\n key: 'ServiceSettings.PersistentNotificationMaxRecipients',\n label: defineMessage({id: 'admin.posts.persistentNotificationsMaxRecipients.title', defaultMessage: 'Maximum number of recipients for persistent notifications'}),\n help_text: defineMessage({id: 'admin.posts.persistentNotificationsMaxRecipients.desc', defaultMessage: 'Configure the maximum number of recipients to which users may send persistent notifications. Learn more about message priority and persistent notifications in our <link>documentation</link>.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/message-priority/'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n isHidden: it.any(\n it.configIsFalse('ServiceSettings', 'PostPriority'),\n it.configIsFalse('ServiceSettings', 'AllowPersistentNotifications'),\n ),\n },\n {\n type: 'number',\n key: 'ServiceSettings.PersistentNotificationIntervalMinutes',\n label: defineMessage({id: 'admin.posts.persistentNotificationsInterval.title', defaultMessage: 'Frequency of persistent notifications'}),\n help_text: defineMessage({id: 'admin.posts.persistentNotificationsInterval.desc', defaultMessage: 'Configure the number of minutes between repeated notifications for urgent messages send with persistent notifications. Learn more about message priority and persistent notifications in our <link>documentation</link>.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/message-priority/'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n isHidden: it.any(\n it.configIsFalse('ServiceSettings', 'PostPriority'),\n it.configIsFalse('ServiceSettings', 'AllowPersistentNotifications'),\n ),\n validate: validators.minValue(2, defineMessage({id: 'admin.posts.persistentNotificationsInterval.minValue', defaultMessage: 'Frequency cannot not be set to less than 2 minutes'})),\n },\n {\n type: 'number',\n key: 'ServiceSettings.PersistentNotificationMaxCount',\n label: defineMessage({id: 'admin.posts.persistentNotificationsMaxCount.title', defaultMessage: 'Total number of persistent notification per post'}),\n help_text: defineMessage({id: 'admin.posts.persistentNotificationsMaxCount.desc', defaultMessage: 'Configure the maximum number of times users may receive persistent notifications. Learn more about message priority and persistent notifications in our <link>documentation</link>.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/message-priority/'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n isHidden: it.any(\n it.configIsFalse('ServiceSettings', 'PostPriority'),\n it.configIsFalse('ServiceSettings', 'AllowPersistentNotifications'),\n ),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.AllowPersistentNotificationsForGuests',\n label: defineMessage({id: 'admin.posts.persistentNotificationsGuests.title', defaultMessage: 'Allow guests to send persistent notifications'}),\n help_text: defineMessage({id: 'admin.posts.persistentNotificationsGuests.desc', defaultMessage: 'Whether a guest is able to require persistent notifications. Learn more about message priority and persistent notifications in our <link>documentation</link>.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/message-priority/'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n isHidden: it.any(\n it.configIsFalse('GuestAccountsSettings', 'Enable'),\n it.configIsFalse('ServiceSettings', 'PostPriority'),\n it.configIsFalse('ServiceSettings', 'AllowPersistentNotifications'),\n ),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableLinkPreviews',\n label: defineMessage({id: 'admin.customization.enableLinkPreviewsTitle', defaultMessage: 'Enable website link previews:'}),\n help_text: defineMessage({id: 'admin.customization.enableLinkPreviewsDesc', defaultMessage: 'Display a preview of website content, image links and YouTube links below the message when available. The server must be connected to the internet and have access through the firewall (if applicable) to the websites from which previews are expected. Users can disable these previews from Settings > Display > Website Link Previews.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.RestrictLinkPreviews',\n label: defineMessage({id: 'admin.customization.restrictLinkPreviewsTitle', defaultMessage: 'Disable website link previews from these domains:'}),\n help_text: defineMessage({id: 'admin.customization.restrictLinkPreviewsDesc', defaultMessage: 'Link previews and image link previews will not be shown for the above list of comma-separated domains.'}),\n placeholder: defineMessage({id: 'admin.customization.restrictLinkPreviewsExample', defaultMessage: 'E.g.: \"internal.mycompany.com, images.example.com\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n it.configIsFalse('ServiceSettings', 'EnableLinkPreviews'),\n ),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnablePermalinkPreviews',\n label: defineMessage({id: 'admin.customization.enablePermalinkPreviewsTitle', defaultMessage: 'Enable message link previews:'}),\n help_text: defineMessage({id: 'admin.customization.enablePermalinkPreviewsDesc', defaultMessage: 'When enabled, links to Mattermost messages will generate a preview for any users that have access to the original message. Please review our <link>documentation</link> for details.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SHARE_LINKS_TO_MESSAGES}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableSVGs',\n label: defineMessage({id: 'admin.customization.enableSVGsTitle', defaultMessage: 'Enable SVGs:'}),\n help_text: defineMessage({id: 'admin.customization.enableSVGsDesc', defaultMessage: 'Enable previews for SVG file attachments and allow them to appear in messages. Enabling SVGs is not recommended in environments where not all users are trusted.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableLatex',\n label: defineMessage({id: 'admin.customization.enableLatexTitle', defaultMessage: 'Enable Latex Rendering:'}),\n help_text: defineMessage({id: 'admin.customization.enableLatexDesc', defaultMessage: 'Enable rendering of Latex in code blocks. If false, Latex code will be highlighted only. Enabling Latex is not recommended in environments where not all users are trusted.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableInlineLatex',\n label: defineMessage({id: 'admin.customization.enableInlineLatexTitle', defaultMessage: 'Enable Inline Latex Rendering:'}),\n help_text: defineMessage({id: 'admin.customization.enableInlineLatexDesc', defaultMessage: 'Enable rendering of inline Latex code. If false, Latex can only be rendered in a code block using syntax highlighting. Please review our <link>documentation</link> for details about text formatting.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.FORMAT_MESSAGES}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n it.stateIsFalse('ServiceSettings.EnableLatex'),\n ),\n },\n {\n type: 'custom',\n component: CustomURLSchemesSetting,\n key: 'DisplaySettings.CustomURLSchemes',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'number',\n key: 'DisplaySettings.MaxMarkdownNodes',\n label: defineMessage({id: 'admin.customization.maxMarkdownNodesTitle', defaultMessage: 'Max Markdown Nodes:'}),\n help_text: defineMessage({id: 'admin.customization.maxMarkdownNodesDesc', defaultMessage: 'When rendering Markdown text in the mobile app, controls the maximum number of Markdown elements (eg. emojis, links, table cells, etc) that can be in a single piece of text. If set to 0, a default limit will be used.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.GoogleDeveloperKey',\n label: defineMessage({id: 'admin.service.googleTitle', defaultMessage: 'Google API Key:'}),\n placeholder: defineMessage({id: 'admin.service.googleExample', defaultMessage: 'E.g.: \"7rAh6iwQCkV4cA1Gsg3fgGOXJAQ43QV\"'}),\n help_text: defineMessage({id: 'admin.service.googleDescription', defaultMessage: 'Set this key to enable the display of titles for embedded YouTube video previews. Without the key, YouTube previews will still be created based on hyperlinks appearing in messages or comments but they will not show the video title. View a <link>Google Developers Tutorial</link> for instructions on how to obtain a key and add YouTube Data API v3 as a service to your key.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://www.youtube.com/watch?v=Im69kzhpR3I'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isHidden: it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.POSTS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.AllowSyncedDrafts',\n label: defineMessage({id: 'admin.customization.allowSyncedDrafts', defaultMessage: 'Enable server syncing of message drafts:'}),\n help_text: defineMessage({id: 'admin.customization.allowSyncedDraftsDesc', defaultMessage: 'When enabled, users message drafts will sync with the server so they can be accessed from any device. Users may opt out of this behaviour in Account settings.'}),\n help_text_markdown: false,\n },\n {\n type: 'number',\n key: 'ServiceSettings.UniqueEmojiReactionLimitPerPost',\n label: defineMessage({id: 'admin.customization.uniqueEmojiReactionLimitPerPost', defaultMessage: 'Unique Emoji Reaction Limit:'}),\n placeholder: defineMessage({id: 'admin.customization.uniqueEmojiReactionLimitPerPostPlaceholder', defaultMessage: 'E.g.: 25'}),\n help_text: defineMessage({id: 'admin.customization.uniqueEmojiReactionLimitPerPostDesc', defaultMessage: 'The number of unique emoji reactions that can be added to a post. Increasing this limit could lead to poor client performance. Maximum is 500.'}),\n help_text_markdown: false,\n validate: (value) => {\n const maxResult = validators.maxValue(\n 500,\n defineMessage({id: 'admin.customization.uniqueEmojiReactionLimitPerPost.maxValue', defaultMessage: 'Cannot increase the limit to a value above 500.'}),\n )(value);\n if (!maxResult.isValid()) {\n return maxResult;\n }\n const minResult = validators.minValue(\n 0,\n defineMessage({id: 'admin.customization.uniqueEmojiReactionLimitPerPost.minValue', defaultMessage: 'Cannot decrease the limit below 0.'}),\n )(value);\n if (!minResult.isValid()) {\n return minResult;\n }\n\n return new ValidationResult(true, '');\n },\n },\n ],\n },\n },\n wrangler: {\n url: 'site_config/wrangler',\n title: defineMessage({id: 'admin.sidebar.move_thread', defaultMessage: 'Move Thread (Beta)'}),\n isHidden: it.any(it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.POSTS)), it.configIsFalse('FeatureFlags', 'MoveThreadsEnabled'), it.not(it.licensed)),\n schema: {\n id: 'WranglerSettings',\n name: defineMessage({id: 'admin.site.move_thread', defaultMessage: 'Move Thread (Beta)'}),\n settings: [\n {\n type: 'roles',\n multiple: true,\n key: 'WranglerSettings.PermittedWranglerRoles',\n label: defineMessage({id: 'admin.experimental.PermittedMoveThreadRoles.title', defaultMessage: 'Permitted Roles'}),\n help_text: defineMessage({id: 'admin.experimental.PermittedMoveThreadRoles.desc', defaultMessage: 'Choose who is allowed to move threads to other channels based on roles. (Other permissions below still apply).'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'text',\n key: 'WranglerSettings.AllowedEmailDomain',\n multiple: true,\n label: defineMessage({id: 'admin.experimental.allowedEmailDomain.title', defaultMessage: 'Allowed Email Domain'}),\n help_text: defineMessage({id: 'admin.experimental.allowedEmailDomain.desc', defaultMessage: '(Optional) When set, users must have an email ending in this domain to move threads. Multiple domains can be specified by separating them with commas.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'number',\n key: 'WranglerSettings.MoveThreadMaxCount',\n label: defineMessage({id: 'admin.experimental.moveThreadMaxCount.title', defaultMessage: 'Max Thread Count Move Size'}),\n help_text: defineMessage({id: 'admin.experimental.moveThreadMaxCount.desc', defaultMessage: 'The maximum number of messages in a thread that the plugin is allowed to move. Leave empty for unlimited messages.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'WranglerSettings.MoveThreadToAnotherTeamEnable',\n label: defineMessage({id: 'admin.experimental.moveThreadToAnotherTeamEnable.title', defaultMessage: 'Enable Moving Threads To Different Teams'}),\n help_text: defineMessage({id: 'admin.experimental.moveThreadToAnotherTeamEnable.desc', defaultMessage: 'Control whether Wrangler is permitted to move message threads from one team to another or not.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'WranglerSettings.MoveThreadFromPrivateChannelEnable',\n label: defineMessage({id: 'admin.experimental.moveThreadFromPrivateChannelEnable.title', defaultMessage: 'Enable Moving Threads From Private Channels'}),\n help_text: defineMessage({id: 'admin.experimental.moveThreadFromPrivateChannelEnable.desc', defaultMessage: 'Control whether Wrangler is permitted to move message threads from private channels or not.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'WranglerSettings.MoveThreadFromDirectMessageChannelEnable',\n label: defineMessage({id: 'admin.experimental.moveThreadFromDirectMessageChannelEnable.title', defaultMessage: 'Enable Moving Threads From Direct Message Channels'}),\n help_text: defineMessage({id: 'admin.experimental.moveThreadFromDirectMessageChannelEnable.desc', defaultMessage: 'Control whether Wrangler is permitted to move message threads from direct message channels or not.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'WranglerSettings.MoveThreadFromGroupMessageChannelEnable',\n label: defineMessage({id: 'admin.experimental.moveThreadFromGroupMessageChannelEnable.title', defaultMessage: 'Enable Moving Threads From Group Message Channels'}),\n help_text: defineMessage({id: 'admin.experimental.moveThreadFromGroupMessageChannelEnable.desc', defaultMessage: 'Control whether Wrangler is permitted to move message threads from group message channels or not.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n ],\n },\n },\n file_sharing_downloads: {\n url: 'site_config/file_sharing_downloads',\n title: defineMessage({id: 'admin.sidebar.fileSharingDownloads', defaultMessage: 'File Sharing and Downloads'}),\n isHidden: it.any(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.FILE_SHARING_AND_DOWNLOADS)),\n ),\n schema: {\n id: 'FileSharingDownloads',\n name: defineMessage({id: 'admin.site.fileSharingDownloads', defaultMessage: 'File Sharing and Downloads'}),\n settings: [\n {\n type: 'bool',\n key: 'FileSettings.EnableFileAttachments',\n label: defineMessage({id: 'admin.file.enableFileAttachments', defaultMessage: 'Allow File Sharing:'}),\n help_text: defineMessage({id: 'admin.file.enableFileAttachmentsDesc', defaultMessage: 'When false, disables file sharing on the server. All file and image uploads on messages are forbidden across clients and devices, including mobile.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.FILE_SHARING_AND_DOWNLOADS)),\n },\n {\n type: 'bool',\n key: 'FileSettings.EnableMobileUpload',\n label: defineMessage({id: 'admin.file.enableMobileUploadTitle', defaultMessage: 'Allow File Uploads on Mobile:'}),\n help_text: defineMessage({id: 'admin.file.enableMobileUploadDesc', defaultMessage: 'When false, disables file uploads on mobile apps. If Allow File Sharing is set to true, users can still upload files from a mobile web browser.'}),\n isHidden: it.not(it.licensedForFeature('Compliance')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.FILE_SHARING_AND_DOWNLOADS)),\n },\n {\n type: 'bool',\n key: 'FileSettings.EnableMobileDownload',\n label: defineMessage({id: 'admin.file.enableMobileDownloadTitle', defaultMessage: 'Allow File Downloads on Mobile:'}),\n help_text: defineMessage({id: 'admin.file.enableMobileDownloadDesc', defaultMessage: 'When false, disables file downloads on mobile apps. Users can still download files from a mobile web browser.'}),\n isHidden: it.not(it.licensedForFeature('Compliance')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.FILE_SHARING_AND_DOWNLOADS)),\n },\n ],\n },\n },\n public_links: {\n url: 'site_config/public_links',\n title: defineMessage({id: 'admin.sidebar.publicLinks', defaultMessage: 'Public Links'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.PUBLIC_LINKS)),\n ),\n schema: {\n id: 'PublicLinkSettings',\n name: defineMessage({id: 'admin.site.public_links', defaultMessage: 'Public Links'}),\n settings: [\n {\n type: 'bool',\n key: 'FileSettings.EnablePublicLink',\n label: defineMessage({id: 'admin.image.shareTitle', defaultMessage: 'Enable Public File Links: '}),\n help_text: defineMessage({id: 'admin.image.shareDescription', defaultMessage: 'Allow users to share public links to files and images.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.PUBLIC_LINKS)),\n },\n {\n type: 'generated',\n key: 'FileSettings.PublicLinkSalt',\n label: defineMessage({id: 'admin.image.publicLinkTitle', defaultMessage: 'Public Link Salt:'}),\n help_text: defineMessage({id: 'admin.image.publicLinkDescription', defaultMessage: '32-character salt added to signing of public links. Randomly generated on install. Select \"Regenerate\" to create new salt.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.PUBLIC_LINKS)),\n },\n ],\n },\n },\n notices: {\n url: 'site_config/notices',\n title: defineMessage({id: 'admin.sidebar.notices', defaultMessage: 'Notices'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.SITE.NOTICES)),\n schema: {\n id: 'NoticesSettings',\n name: defineMessage({id: 'admin.site.notices', defaultMessage: 'Notices'}),\n settings: [\n {\n type: 'bool',\n key: 'AnnouncementSettings.AdminNoticesEnabled',\n label: defineMessage({id: 'admin.notices.enableAdminNoticesTitle', defaultMessage: 'Enable Admin Notices: '}),\n help_text: defineMessage({id: 'admin.notices.enableAdminNoticesDescription', defaultMessage: 'When enabled, System Admins will receive notices about available server upgrades and relevant system administration features. <link>Learn more about notices</link> in our documentation.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.IN_PRODUCT_NOTICES}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTICES)),\n },\n {\n type: 'bool',\n key: 'AnnouncementSettings.UserNoticesEnabled',\n label: defineMessage({id: 'admin.notices.enableEndUserNoticesTitle', defaultMessage: 'Enable End User Notices: '}),\n help_text: defineMessage({id: 'admin.notices.enableEndUserNoticesDescription', defaultMessage: 'When enabled, all users will receive notices about available client upgrades and relevant end user features to improve user experience. <link>Learn more about notices</link> in our documentation.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.IN_PRODUCT_NOTICES}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.NOTICES)),\n },\n ],\n },\n },\n ip_filtering: {\n url: 'site_config/ip_filtering',\n title: adminDefinitionMessages.ip_filtering_title,\n isHidden: it.not(it.all(it.configIsTrue('FeatureFlags', 'CloudIPFiltering'), it.licensedForSku('enterprise'))),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.SITE.IP_FILTERING)),\n searchableStrings: [adminDefinitionMessages.ip_filtering_title],\n schema: {\n id: 'IPFiltering',\n component: IPFiltering,\n },\n },\n secure_connection_detail: {\n url: `site_config/secure_connections/:connection_id(create|${ID_PATH_PATTERN})`,\n isHidden: it.not(it.all(\n it.configIsTrue('ConnectedWorkspacesSettings', 'EnableSharedChannels'),\n it.configIsTrue('ConnectedWorkspacesSettings', 'EnableRemoteClusterService'),\n it.licensedForFeature('SharedChannels'),\n )),\n schema: {\n id: 'SecureConnectionDetail',\n component: SecureConnectionDetail,\n },\n },\n secure_connections: {\n url: 'site_config/secure_connections',\n title: defineMessage({id: 'admin.sidebar.secureConnections', defaultMessage: 'Connected Workspaces (Beta)'}),\n searchableStrings: secureConnectionsSearchableStrings,\n isHidden: it.not(it.all(\n it.configIsTrue('ConnectedWorkspacesSettings', 'EnableSharedChannels'),\n it.configIsTrue('ConnectedWorkspacesSettings', 'EnableRemoteClusterService'),\n it.licensedForFeature('SharedChannels'),\n )),\n schema: {\n id: 'SecureConnections',\n component: SecureConnections,\n },\n },\n },\n },\n authentication: {\n icon: (\n <ShieldOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.authentication', defaultMessage: 'Authentication'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.AUTHENTICATION)),\n subsections: {\n signup: {\n url: 'authentication/signup',\n title: defineMessage({id: 'admin.sidebar.signup', defaultMessage: 'Signup'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n schema: {\n id: 'SignupSettings',\n name: defineMessage({id: 'admin.authentication.signup', defaultMessage: 'Signup'}),\n settings: [\n {\n type: 'bool',\n key: 'TeamSettings.EnableUserCreation',\n label: defineMessage({id: 'admin.team.userCreationTitle', defaultMessage: 'Enable Account Creation: '}),\n help_text: defineMessage({id: 'admin.team.userCreationDescription', defaultMessage: 'When false, the ability to create accounts is disabled, and selecting Create Account displays an error. Applies to Email, OpenID Connect, and OAuth 2.0 user account authentication.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n },\n {\n type: 'text',\n key: 'TeamSettings.RestrictCreationToDomains',\n label: defineMessage({id: 'admin.team.restrictTitle', defaultMessage: 'Restrict new system and team members to specified email domains:'}),\n help_text: defineMessage({id: 'admin.team.restrictDescription', defaultMessage: 'New user accounts are restricted to the above specified email domain (e.g. \"mattermost.com\") or list of comma-separated domains (e.g. \"corp.mattermost.com, mattermost.com\"). New teams can only be created by users from the above domain(s). This setting only affects email login for users.'}),\n placeholder: defineMessage({id: 'admin.team.restrictExample', defaultMessage: 'E.g.: \"corp.mattermost.com, mattermost.com\"'}),\n isHidden: it.all(\n it.licensed,\n it.not(it.licensedForSku('starter')),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n },\n {\n type: 'text',\n key: 'TeamSettings.RestrictCreationToDomains',\n label: defineMessage({id: 'admin.team.restrictTitle', defaultMessage: 'Restrict new system and team members to specified email domains:'}),\n help_text: defineMessage({id: 'admin.team.restrictGuestDescription', defaultMessage: 'New user accounts are restricted to the above specified email domain (e.g. \"mattermost.com\") or list of comma-separated domains (e.g. \"corp.mattermost.com, mattermost.com\"). New teams can only be created by users from the above domain(s). This setting affects email login for users. For Guest users, please add domains under Signup > Guest Access.'}),\n placeholder: defineMessage({id: 'admin.team.restrictExample', defaultMessage: 'E.g.: \"corp.mattermost.com, mattermost.com\"'}),\n isHidden: it.any(\n it.not(it.licensed),\n it.licensedForSku('starter'),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.EnableOpenServer',\n label: defineMessage({id: 'admin.team.openServerTitle', defaultMessage: 'Enable Open Server: '}),\n help_text: defineMessage({id: 'admin.team.openServerDescription', defaultMessage: 'When true, anyone can sign up for a user account on this server without the need to be invited. Applies to Email-based signups only.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableEmailInvitations',\n label: defineMessage({id: 'admin.team.emailInvitationsTitle', defaultMessage: 'Enable Email Invitations: '}),\n help_text: defineMessage({id: 'admin.team.emailInvitationsDescription', defaultMessage: 'When true users can invite others to the system using email.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'button',\n key: 'InvalidateEmailInvitesButton',\n action: invalidateAllEmailInvites,\n label: defineMessage({id: 'admin.team.invalidateEmailInvitesTitle', defaultMessage: 'Invalidate pending email invites'}),\n help_text: defineMessage({id: 'admin.team.invalidateEmailInvitesDescription', defaultMessage: 'This will invalidate active email invitations that have not been accepted by the user. By default email invitations expire after 48 hours.'}),\n error_message: defineMessage({id: 'admin.team.invalidateEmailInvitesFail', defaultMessage: 'Unable to invalidate pending email invites: {error}'}),\n success_message: defineMessage({id: 'admin.team.invalidateEmailInvitesSuccess', defaultMessage: 'Pending email invitations invalidated successfully'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SIGNUP)),\n },\n ],\n },\n },\n email: {\n url: 'authentication/email',\n title: defineMessage({id: 'admin.sidebar.email', defaultMessage: 'Email'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.EMAIL)),\n schema: {\n id: 'EmailSettings',\n name: defineMessage({id: 'admin.authentication.email', defaultMessage: 'Email'}),\n settings: [\n {\n type: 'bool',\n key: 'EmailSettings.EnableSignUpWithEmail',\n label: defineMessage({id: 'admin.email.allowSignupTitle', defaultMessage: 'Enable account creation with email:'}),\n help_text: defineMessage({id: 'admin.email.allowSignupDescription', defaultMessage: 'When true, Mattermost allows account creation using email and password. This value should be false only when you want to limit sign up to a single sign-on service like AD/LDAP, SAML or GitLab.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.EMAIL)),\n },\n {\n type: 'bool',\n key: 'EmailSettings.RequireEmailVerification',\n label: defineMessage({id: 'admin.email.requireVerificationTitle', defaultMessage: 'Require Email Verification: '}),\n help_text: defineMessage({id: 'admin.email.requireVerificationDescription', defaultMessage: 'Typically set to true in production. When true, Mattermost requires email verification after account creation prior to allowing login. Developers may set this field to false to skip sending verification emails for faster development.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.EMAIL)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'bool',\n key: 'EmailSettings.EnableSignInWithEmail',\n label: defineMessage({id: 'admin.email.allowEmailSignInTitle', defaultMessage: 'Enable sign-in with email:'}),\n help_text: defineMessage({id: 'admin.email.allowEmailSignInDescription', defaultMessage: 'When true, Mattermost allows users to sign in using their email and password.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.EMAIL)),\n },\n {\n type: 'bool',\n key: 'EmailSettings.EnableSignInWithUsername',\n label: defineMessage({id: 'admin.email.allowUsernameSignInTitle', defaultMessage: 'Enable sign-in with username:'}),\n help_text: defineMessage({id: 'admin.email.allowUsernameSignInDescription', defaultMessage: 'When true, users with email login can sign in using their username and password. This setting does not affect AD/LDAP login.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.EMAIL)),\n },\n ],\n },\n },\n password: {\n url: 'authentication/password',\n title: defineMessage({id: 'admin.sidebar.password', defaultMessage: 'Password'}),\n searchableStrings: passwordSearchableStrings,\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.PASSWORD)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.PASSWORD)),\n schema: {\n id: 'PasswordSettings',\n component: PasswordSettings,\n },\n },\n mfa: {\n url: 'authentication/mfa',\n title: defineMessage({id: 'admin.sidebar.mfa', defaultMessage: 'MFA'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.MFA)),\n schema: {\n id: 'ServiceSettings',\n name: defineMessage({id: 'admin.authentication.mfa', defaultMessage: 'Multi-factor Authentication'}),\n settings: [\n {\n type: 'banner',\n label: defineMessage({id: 'admin.mfa.bannerDesc', defaultMessage: '<link>Multi-factor authentication</link> is available for accounts with AD/LDAP or email login. If other login methods are used, MFA should be configured with the authentication provider.'}),\n label_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.MULTI_FACTOR_AUTH}\n >\n {msg}\n </ExternalLink>\n ),\n },\n banner_type: 'info',\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableMultifactorAuthentication',\n label: defineMessage({id: 'admin.service.mfaTitle', defaultMessage: 'Enable Multi-factor Authentication:'}),\n help_text: defineMessage({id: 'admin.service.mfaDesc', defaultMessage: 'When true, users with AD/LDAP or email login can add multi-factor authentication to their account using Google Authenticator.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.MFA)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnforceMultifactorAuthentication',\n label: defineMessage({id: 'admin.service.enforceMfaTitle', defaultMessage: 'Enforce Multi-factor Authentication:'}),\n help_text: defineMessage({id: 'admin.service.enforceMfaDesc', defaultMessage: 'When true, <link>multi-factor authentication</link> is required for login. New users will be required to configure MFA on signup. Logged in users without MFA configured are redirected to the MFA setup page until configuration is complete.\\n \\nIf your system has users with login methods other than AD/LDAP and email, MFA must be enforced with the authentication provider outside of Mattermost.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.MULTI_FACTOR_AUTH}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isHidden: it.not(it.licensedForFeature('MFA')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.MFA)),\n it.stateIsFalse('ServiceSettings.EnableMultifactorAuthentication'),\n ),\n },\n ],\n },\n },\n ldap: {\n url: 'authentication/ldap',\n title: defineMessage({id: 'admin.sidebar.ldap', defaultMessage: 'AD/LDAP'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('LDAP')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n ),\n schema: {\n id: 'LdapSettings',\n name: defineMessage({id: 'admin.authentication.ldap', defaultMessage: 'AD/LDAP'}),\n sections: [\n {\n key: 'admin.authentication.ldap.connection',\n title: 'Connection',\n subtitle: 'Connection and security level to your AD/LDAP server.',\n settings: [\n {\n type: 'bool',\n key: 'LdapSettings.Enable',\n label: defineMessage({id: 'admin.ldap.enableTitle', defaultMessage: 'Enable sign-in with AD/LDAP:'}),\n help_text: defineMessage({id: 'admin.ldap.enableDesc', defaultMessage: 'When true, Mattermost allows login using AD/LDAP'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n },\n {\n type: 'bool',\n key: 'LdapSettings.EnableSync',\n label: defineMessage({id: 'admin.ldap.enableSyncTitle', defaultMessage: 'Enable Synchronization with AD/LDAP:'}),\n help_text: defineMessage({id: 'admin.ldap.enableSyncDesc', defaultMessage: 'When true, Mattermost periodically synchronizes users from AD/LDAP. When false, user attributes are updated from AD/LDAP during user login only.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n },\n {\n type: 'text',\n key: 'LdapSettings.LoginFieldName',\n label: defineMessage({id: 'admin.ldap.loginNameTitle', defaultMessage: 'Login Field Name:'}),\n placeholder: defineMessage({id: 'admin.ldap.loginNameEx', defaultMessage: 'E.g.: \"AD/LDAP Username\"'}),\n help_text: defineMessage({id: 'admin.ldap.loginNameDesc', defaultMessage: 'The placeholder text that appears in the login field on the login page. Defaults to \"AD/LDAP Username\".'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.LdapServer',\n label: defineMessage({id: 'admin.ldap.serverTitle', defaultMessage: 'AD/LDAP Server:'}),\n help_text: defineMessage({id: 'admin.ldap.serverDesc', defaultMessage: 'The domain or IP address of AD/LDAP server.'}),\n placeholder: defineMessage({id: 'admin.ldap.serverEx', defaultMessage: 'E.g.: \"10.0.0.23\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'number',\n key: 'LdapSettings.LdapPort',\n label: defineMessage({id: 'admin.ldap.portTitle', defaultMessage: 'AD/LDAP Port:'}),\n help_text: defineMessage({id: 'admin.ldap.portDesc', defaultMessage: 'The port Mattermost will use to connect to the AD/LDAP server. Default is 389.'}),\n placeholder: defineMessage({id: 'admin.ldap.portEx', defaultMessage: 'E.g.: \"389\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'dropdown',\n key: 'LdapSettings.ConnectionSecurity',\n label: defineMessage({id: 'admin.connectionSecurityTitle', defaultMessage: 'Connection Security:'}),\n help_text: DefinitionConstants.CONNECTION_SECURITY_HELP_TEXT_LDAP,\n options: [\n {\n value: '',\n display_name: defineMessage({id: 'admin.connectionSecurityNone', defaultMessage: 'None'}),\n },\n {\n value: 'TLS',\n display_name: defineMessage({id: 'admin.connectionSecurityTls', defaultMessage: 'TLS (Recommended)'}),\n },\n {\n value: 'STARTTLS',\n display_name: defineMessage({id: 'admin.connectionSecurityStart', defaultMessage: 'STARTTLS'}),\n },\n ],\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'bool',\n key: 'LdapSettings.SkipCertificateVerification',\n label: defineMessage({id: 'admin.ldap.skipCertificateVerification', defaultMessage: 'Skip Certificate Verification:'}),\n help_text: defineMessage({id: 'admin.ldap.skipCertificateVerificationDesc', defaultMessage: 'Skips the certificate verification step for TLS or STARTTLS connections. Skipping certificate verification is not recommended for production environments where TLS is required.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.stateIsFalse('LdapSettings.ConnectionSecurity'),\n ),\n },\n {\n type: 'fileupload',\n key: 'LdapSettings.PrivateKeyFile',\n label: defineMessage({id: 'admin.ldap.privateKeyFileTitle', defaultMessage: 'Private Key:'}),\n help_text: defineMessage({id: 'admin.ldap.privateKeyFileFileDesc', defaultMessage: 'The private key file for TLS Certificate. If using TLS client certificates as primary authentication mechanism. This will be provided by your LDAP Authentication Provider.'}),\n remove_help_text: defineMessage({id: 'admin.ldap.privateKeyFileFileRemoveDesc', defaultMessage: 'Remove the private key file for TLS Certificate.'}),\n remove_button_text: defineMessage({id: 'admin.ldap.remove.privKey', defaultMessage: 'Remove TLS Certificate Private Key'}),\n removing_text: defineMessage({id: 'admin.ldap.removing.privKey', defaultMessage: 'Removing Private Key...'}),\n uploading_text: defineMessage({id: 'admin.ldap.uploading.privateKey', defaultMessage: 'Uploading Private Key...'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n fileType: '.key',\n upload_action: uploadPrivateLdapCertificate,\n remove_action: removePrivateLdapCertificate,\n },\n {\n type: 'fileupload',\n key: 'LdapSettings.PublicCertificateFile',\n label: defineMessage({id: 'admin.ldap.publicCertificateFileTitle', defaultMessage: 'Public Certificate:'}),\n help_text: defineMessage({id: 'admin.ldap.publicCertificateFileDesc', defaultMessage: 'The public certificate file for TLS Certificate. If using TLS client certificates as primary authentication mechanism. This will be provided by your LDAP Authentication Provider.'}),\n remove_help_text: defineMessage({id: 'admin.ldap.publicCertificateFileRemoveDesc', defaultMessage: 'Remove the public certificate file for TLS Certificate.'}),\n remove_button_text: defineMessage({id: 'admin.ldap.remove.sp_certificate', defaultMessage: 'Remove Service Provider Certificate'}),\n removing_text: defineMessage({id: 'admin.ldap.removing.certificate', defaultMessage: 'Removing Certificate...'}),\n uploading_text: defineMessage({id: 'admin.ldap.uploading.certificate', defaultMessage: 'Uploading Certificate...'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n fileType: '.crt,.cer',\n upload_action: uploadPublicLdapCertificate,\n remove_action: removePublicLdapCertificate,\n },\n {\n type: 'text',\n key: 'LdapSettings.BindUsername',\n label: defineMessage({id: 'admin.ldap.bindUserTitle', defaultMessage: 'Bind Username:'}),\n help_text: defineMessage({id: 'admin.ldap.bindUserDesc', defaultMessage: 'The username used to perform the AD/LDAP search. This should typically be an account created specifically for use with Mattermost. It should have access limited to read the portion of the AD/LDAP tree specified in the Base DN field.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.BindPassword',\n label: defineMessage({id: 'admin.ldap.bindPwdTitle', defaultMessage: 'Bind Password:'}),\n help_text: defineMessage({id: 'admin.ldap.bindPwdDesc', defaultMessage: 'Password of the user given in \"Bind Username\".'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n ],\n },\n {\n key: 'admin.authentication.ldap.dn_and_filters',\n title: 'Base DN & Filters',\n settings: [\n {\n type: 'text',\n key: 'LdapSettings.BaseDN',\n label: defineMessage({id: 'admin.ldap.baseTitle', defaultMessage: 'Base DN:'}),\n help_text: defineMessage({id: 'admin.ldap.baseDesc', defaultMessage: 'The Base DN is the Distinguished Name of the location where Mattermost should start its search for user and group objects in the AD/LDAP tree.'}),\n placeholder: defineMessage({id: 'admin.ldap.baseEx', defaultMessage: 'E.g.: \"ou=Unit Name,dc=corp,dc=example,dc=com\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.UserFilter',\n label: defineMessage({id: 'admin.ldap.userFilterTitle', defaultMessage: 'User Filter:'}),\n help_text: defineMessage({id: 'admin.ldap.userFilterDisc', defaultMessage: '(Optional) Enter an AD/LDAP filter to use when searching for user objects. Only the users selected by the query will be able to access Mattermost. For Active Directory, the query to filter out disabled users is (&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))).'}),\n placeholder: defineMessage({id: 'admin.ldap.userFilterEx', defaultMessage: 'Ex. \"(objectClass=user)\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.GroupFilter',\n label: defineMessage({id: 'admin.ldap.groupFilterTitle', defaultMessage: 'Group Filter:'}),\n help_text: defineMessage({id: 'admin.ldap.groupFilterFilterDesc', defaultMessage: '(Optional) Enter an AD/LDAP filter to use when searching for group objects. Only the groups selected by the query will be available to Mattermost. From [User Management > Groups]({siteURL}/admin_console/user_management/groups), select which AD/LDAP groups should be linked and configured.'}),\n help_text_markdown: true,\n help_text_values: {siteURL: getSiteURL()},\n placeholder: defineMessage({id: 'admin.ldap.groupFilterEx', defaultMessage: 'E.g.: \"(objectClass=group)\"'}),\n isHidden: it.not(it.licensedForFeature('LDAPGroups')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n },\n {\n type: 'bool',\n key: 'LdapSettings.EnableAdminFilter',\n label: defineMessage({id: 'admin.ldap.enableAdminFilterTitle', defaultMessage: 'Enable Admin Filter:'}),\n isDisabled: it.any(\n it.not(it.isSystemAdmin),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.AdminFilter',\n label: defineMessage({id: 'admin.ldap.adminFilterTitle', defaultMessage: 'Admin Filter:'}),\n help_text: defineMessage({id: 'admin.ldap.adminFilterFilterDesc', defaultMessage: '(Optional) Enter an AD/LDAP filter to use for designating System Admins. The users selected by the query will have access to your Mattermost server as System Admins. By default, System Admins have complete access to the Mattermost System Console. Existing members that are identified by this attribute will be promoted from member to System Admin upon next login. The next login is based upon Session lengths set in **System Console > Session Lengths**. It is highly recommend to manually demote users to members in **System Console > User Management** to ensure access is restricted immediately. Note: If this filter is removed/changed, System Admins that were promoted via this filter will be demoted to members and will not retain access to the System Console. When this filter is not in use, System Admins can be manually promoted/demoted in **System Console > User Management**.'}),\n help_text_markdown: true,\n placeholder: defineMessage({id: 'admin.ldap.adminFilterEx', defaultMessage: 'E.g.: \"(objectClass=user)\"'}),\n isDisabled: it.any(\n it.not(it.isSystemAdmin),\n it.stateIsFalse('LdapSettings.EnableAdminFilter'),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.GuestFilter',\n label: defineMessage({id: 'admin.ldap.guestFilterTitle', defaultMessage: 'Guest Filter:'}),\n help_text: defineMessage({id: 'admin.ldap.guestFilterFilterDesc', defaultMessage: '(Optional) Requires Guest Access to be enabled before being applied. Enter an AD/LDAP filter to use when searching for guest objects. Only the users selected by the query will be able to access Mattermost as Guests. Guests are prevented from accessing teams or channels upon logging in until they are assigned a team and at least one channel. Note: If this filter is removed/changed, active guests will not be promoted to a member and will retain their Guest role. Guests can be promoted in **System Console > User Management**. Existing members that are identified by this attribute as a guest will be demoted from a member to a guest when they are asked to login next. The next login is based upon Session lengths set in **System Console > Session Lengths**. It is highly recommend to manually demote users to guests in **System Console > User Management ** to ensure access is restricted immediately.'}),\n help_text_markdown: true,\n placeholder: defineMessage({id: 'admin.ldap.guestFilterEx', defaultMessage: 'E.g.: \"(objectClass=user)\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.configIsFalse('GuestAccountsSettings', 'Enable'),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n ],\n },\n {\n key: 'admin.authentication.ldap.account_synchronization',\n title: 'Account Synchronization',\n settings: [\n {\n type: 'text',\n key: 'LdapSettings.IdAttribute',\n label: defineMessage({id: 'admin.ldap.idAttrTitle', defaultMessage: 'ID Attribute: '}),\n placeholder: defineMessage({id: 'admin.ldap.idAttrEx', defaultMessage: 'E.g.: \"objectGUID\" or \"uid\"'}),\n help_text: defineMessage({id: 'admin.ldap.idAttrDesc', defaultMessage: \"The attribute in the AD/LDAP server used as a unique identifier in Mattermost. It should be an AD/LDAP attribute with a value that does not change such as `uid` for LDAP or `objectGUID` for Active Directory. If a user's ID Attribute changes, it will create a new Mattermost account unassociated with their old one. If you need to change this field after users have already logged in, use the <link>mattermost ldap idmigrate</link> CLI tool.\"}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://docs.mattermost.com/manage/command-line-tools.html#mattermost-ldap-idmigrate'\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateEquals('LdapSettings.Enable', false),\n it.stateEquals('LdapSettings.EnableSync', false),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.LoginIdAttribute',\n label: defineMessage({id: 'admin.ldap.loginAttrTitle', defaultMessage: 'Login ID Attribute: '}),\n placeholder: defineMessage({id: 'admin.ldap.loginIdAttrEx', defaultMessage: 'E.g.: \"sAMAccountName\"'}),\n help_text: defineMessage({id: 'admin.ldap.loginAttrDesc', defaultMessage: 'The attribute in the AD/LDAP server used to log in to Mattermost. Normally this attribute is the same as the \"Username Attribute\" field above. If your team typically uses domain/username to log in to other services with AD/LDAP, you may enter domain/username in this field to maintain consistency between sites.'}),\n help_text_markdown: false,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.UsernameAttribute',\n label: defineMessage({id: 'admin.ldap.usernameAttrTitle', defaultMessage: 'Username Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.usernameAttrEx', defaultMessage: 'E.g.: \"sAMAccountName\"'}),\n help_text: defineMessage({id: 'admin.ldap.usernameAttrDesc', defaultMessage: 'The attribute in the AD/LDAP server used to populate the username field in Mattermost. This may be the same as the Login ID Attribute.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.EmailAttribute',\n label: defineMessage({id: 'admin.ldap.emailAttrTitle', defaultMessage: 'Email Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.emailAttrEx', defaultMessage: 'E.g.: \"mail\" or \"userPrincipalName\"'}),\n help_text: defineMessage({id: 'admin.ldap.emailAttrDesc', defaultMessage: 'The attribute in the AD/LDAP server used to populate the email address field in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.FirstNameAttribute',\n label: defineMessage({id: 'admin.ldap.firstnameAttrTitle', defaultMessage: 'First Name Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.firstnameAttrEx', defaultMessage: 'E.g.: \"givenName\"'}),\n help_text: defineMessage({id: 'admin.ldap.firstnameAttrDesc', defaultMessage: '(Optional) The attribute in the AD/LDAP server used to populate the first name of users in Mattermost. When set, users cannot edit their first name, since it is synchronized with the LDAP server. When left blank, users can set their first name in <strong>Account Menu > Account Settings > Profile</strong>.'}),\n help_text_values: {\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.LastNameAttribute',\n label: defineMessage({id: 'admin.ldap.lastnameAttrTitle', defaultMessage: 'Last Name Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.lastnameAttrEx', defaultMessage: 'E.g.: \"sn\"'}),\n help_text: defineMessage({id: 'admin.ldap.lastnameAttrDesc', defaultMessage: '(Optional) The attribute in the AD/LDAP server used to populate the last name of users in Mattermost. When set, users cannot edit their last name, since it is synchronized with the LDAP server. When left blank, users can set their last name in <strong>Account Menu > Account Settings > Profile</strong>.'}),\n help_text_values: {\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.NicknameAttribute',\n label: defineMessage({id: 'admin.ldap.nicknameAttrTitle', defaultMessage: 'Nickname Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.nicknameAttrEx', defaultMessage: 'E.g.: \"nickname\"'}),\n help_text: defineMessage({id: 'admin.ldap.nicknameAttrDesc', defaultMessage: '(Optional) The attribute in the AD/LDAP server used to populate the nickname of users in Mattermost. When set, users cannot edit their nickname, since it is synchronized with the LDAP server. When left blank, users can set their nickname in <strong>Account Menu > Account Settings > Profile</strong>.'}),\n help_text_values: {\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.PositionAttribute',\n label: defineMessage({id: 'admin.ldap.positionAttrTitle', defaultMessage: 'Position Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.positionAttrEx', defaultMessage: 'E.g.: \"title\"'}),\n help_text: defineMessage({id: 'admin.ldap.positionAttrDesc', defaultMessage: '(Optional) The attribute in the AD/LDAP server used to populate the position field in Mattermost. When set, users cannot edit their position, since it is synchronized with the LDAP server. When left blank, users can set their position in <strong>Account Menu > Account Settings > Profile</strong>.'}),\n help_text_values: {\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.PictureAttribute',\n label: defineMessage({id: 'admin.ldap.pictureAttrTitle', defaultMessage: 'Profile Picture Attribute:'}),\n placeholder: defineMessage({id: 'admin.ldap.pictureAttrEx', defaultMessage: 'E.g.: \"thumbnailPhoto\" or \"jpegPhoto\"'}),\n help_text: defineMessage({id: 'admin.ldap.pictureAttrDesc', defaultMessage: '(Optional) The attribute in the AD/LDAP server used to populate the profile picture in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n ],\n },\n {\n key: 'admin.authentication.ldap.group_synchronization',\n title: 'Group Synchronization',\n settings: [\n {\n type: 'text',\n key: 'LdapSettings.GroupDisplayNameAttribute',\n label: defineMessage({id: 'admin.ldap.groupDisplayNameAttributeTitle', defaultMessage: 'Group Display Name Attribute:'}),\n help_text: defineMessage({id: 'admin.ldap.groupDisplayNameAttributeDesc', defaultMessage: 'The attribute in the AD/LDAP server used to populate the group display names.'}),\n placeholder: defineMessage({id: 'admin.ldap.groupDisplayNameAttributeEx', defaultMessage: 'E.g.: \"cn\"'}),\n isHidden: it.not(it.licensedForFeature('LDAPGroups')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n },\n {\n type: 'text',\n key: 'LdapSettings.GroupIdAttribute',\n label: defineMessage({id: 'admin.ldap.groupIdAttributeTitle', defaultMessage: 'Group ID Attribute:'}),\n help_text: defineMessage({id: 'admin.ldap.groupIdAttributeDesc', defaultMessage: 'The attribute in the AD/LDAP server used as a unique identifier for Groups. This should be a AD/LDAP attribute with a value that does not change such as `entryUUID` for LDAP or `objectGUID` for Active Directory.'}),\n help_text_markdown: true,\n placeholder: defineMessage({id: 'admin.ldap.groupIdAttributeEx', defaultMessage: 'E.g.: \"objectGUID\" or \"entryUUID\"'}),\n isHidden: it.not(it.licensedForFeature('LDAPGroups')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n },\n ],\n },\n {\n key: 'admin.authentication.ldap.synchronization_performance',\n title: 'Synchronization Performance',\n settings: [\n {\n type: 'number',\n key: 'LdapSettings.SyncIntervalMinutes',\n label: defineMessage({id: 'admin.ldap.syncIntervalTitle', defaultMessage: 'Synchronization Interval (minutes):'}),\n help_text: defineMessage({id: 'admin.ldap.syncIntervalHelpText', defaultMessage: 'AD/LDAP Synchronization updates Mattermost user information to reflect updates on the AD/LDAP server. For example, when a user\\'s name changes on the AD/LDAP server, the change updates in Mattermost when synchronization is performed. Accounts removed from or disabled in the AD/LDAP server have their Mattermost accounts set to \"Inactive\" and have their account sessions revoked. Mattermost performs synchronization on the interval entered. For example, if 60 is entered, Mattermost synchronizes every 60 minutes.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'number',\n key: 'LdapSettings.MaxPageSize',\n label: defineMessage({id: 'admin.ldap.maxPageSizeTitle', defaultMessage: 'Maximum Page Size:'}),\n placeholder: defineMessage({id: 'admin.ldap.maxPageSizeEx', defaultMessage: 'E.g.: \"2000\"'}),\n help_text: defineMessage({id: 'admin.ldap.maxPageSizeHelpText', defaultMessage: 'The maximum number of users the Mattermost server will request from the AD/LDAP server at one time. 0 is unlimited.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'number',\n key: 'LdapSettings.QueryTimeout',\n label: defineMessage({id: 'admin.ldap.queryTitle', defaultMessage: 'Query Timeout (seconds):'}),\n placeholder: defineMessage({id: 'admin.ldap.queryEx', defaultMessage: 'E.g.: \"60\"'}),\n help_text: defineMessage({id: 'admin.ldap.queryDesc', defaultMessage: 'The timeout value for queries to the AD/LDAP server. Increase if you are getting timeout errors caused by a slow AD/LDAP server.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n {\n type: 'button',\n action: ldapTest,\n key: 'LdapSettings.LdapTest',\n label: defineMessage({id: 'admin.ldap.ldap_test_button', defaultMessage: 'AD/LDAP Test'}),\n help_text: defineMessage({id: 'admin.ldap.testHelpText', defaultMessage: 'Tests if the Mattermost server can connect to the AD/LDAP server specified. Please review \"System Console > Logs\" and <link>documentation</link> to troubleshoot errors.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.CONFIGURE_AD_LDAP_QUERY_TIMEOUT}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n error_message: defineMessage({id: 'admin.ldap.testFailure', defaultMessage: 'AD/LDAP Test Failure: {error}'}),\n success_message: defineMessage({id: 'admin.ldap.testSuccess', defaultMessage: 'AD/LDAP Test Successful'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.all(\n it.stateIsFalse('LdapSettings.Enable'),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n ),\n },\n ],\n },\n {\n key: 'admin.authentication.ldap.synchronization_history',\n title: 'Synchronization History',\n subtitle: 'See the table below for the status of each synchronization',\n settings: [\n {\n type: 'jobstable',\n job_type: Constants.JobTypes.LDAP_SYNC,\n label: defineMessage({id: 'admin.ldap.sync_button', defaultMessage: 'AD/LDAP Synchronize Now'}),\n help_text: defineMessage({id: 'admin.ldap.syncNowHelpText', defaultMessage: 'Initiates an AD/LDAP synchronization immediately. See the table below for status of each synchronization. Please review \"System Console > Logs\" and <link>documentation</link> to troubleshoot errors.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SETUP_LDAP}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.LDAP)),\n it.stateIsFalse('LdapSettings.EnableSync'),\n ),\n render_job: (job: Job) => {\n if (job.status === 'pending') {\n return <span>{'--'}</span>;\n }\n\n let ldapUsers = 0;\n let deleteCount = 0;\n let updateCount = 0;\n let linkedLdapGroupsCount; // Deprecated.\n let totalLdapGroupsCount = 0;\n let groupDeleteCount = 0;\n let groupMemberDeleteCount = 0;\n let groupMemberAddCount = 0;\n\n if (job && job.data) {\n if (job.data.ldap_users_count && job.data.ldap_users_count.length > 0) {\n ldapUsers = job.data.ldap_users_count;\n }\n\n if (job.data.delete_count && job.data.delete_count.length > 0) {\n deleteCount = job.data.delete_count;\n }\n\n if (job.data.update_count && job.data.update_count.length > 0) {\n updateCount = job.data.update_count;\n }\n\n // Deprecated groups count representing the number of linked LDAP groups.\n if (job.data.ldap_groups_count) {\n linkedLdapGroupsCount = job.data.ldap_groups_count;\n }\n\n // Groups count representing the total number of LDAP groups available based on\n // the configured based DN and groups filter.\n if (job.data.total_ldap_groups_count) {\n totalLdapGroupsCount = job.data.total_ldap_groups_count;\n }\n\n if (job.data.group_delete_count) {\n groupDeleteCount = job.data.group_delete_count;\n }\n\n if (job.data.group_member_delete_count) {\n groupMemberDeleteCount = job.data.group_member_delete_count;\n }\n\n if (job.data.group_member_add_count) {\n groupMemberAddCount = job.data.group_member_add_count;\n }\n }\n\n return (\n <span>\n <FormattedMessage\n id={linkedLdapGroupsCount ? 'admin.ldap.jobExtraInfo' : 'admin.ldap.jobExtraInfoTotal'}\n defaultMessage={linkedLdapGroupsCount ? 'Scanned {ldapUsers, number} LDAP users and {ldapGroups, number} linked groups.' : 'Scanned {ldapUsers, number} LDAP users and {ldapGroups, number} groups.'}\n values={{\n ldapUsers,\n ldapGroups: linkedLdapGroupsCount || totalLdapGroupsCount, // Show the old count for jobs records containing the old JSON key.\n }}\n />\n <ul>\n {updateCount > 0 &&\n <li>\n <FormattedMessage\n id='admin.ldap.jobExtraInfo.updatedUsers'\n defaultMessage='Updated {updateCount, number} users.'\n values={{\n updateCount,\n }}\n />\n </li>\n }\n {deleteCount > 0 &&\n <li>\n <FormattedMessage\n id='admin.ldap.jobExtraInfo.deactivatedUsers'\n defaultMessage='Deactivated {deleteCount, number} users.'\n values={{\n deleteCount,\n }}\n />\n </li>\n }\n {groupDeleteCount > 0 &&\n <li>\n <FormattedMessage\n id='admin.ldap.jobExtraInfo.deletedGroups'\n defaultMessage='Deleted {groupDeleteCount, number} groups.'\n values={{\n groupDeleteCount,\n }}\n />\n </li>\n }\n {groupMemberDeleteCount > 0 &&\n <li>\n <FormattedMessage\n id='admin.ldap.jobExtraInfo.deletedGroupMembers'\n defaultMessage='Deleted {groupMemberDeleteCount, number} group members.'\n values={{\n groupMemberDeleteCount,\n }}\n />\n </li>\n }\n {groupMemberAddCount > 0 &&\n <li>\n <FormattedMessage\n id='admin.ldap.jobExtraInfo.addedGroupMembers'\n defaultMessage='Added {groupMemberAddCount, number} group members.'\n values={{\n groupMemberAddCount,\n }}\n />\n </li>\n }\n </ul>\n </span>\n );\n },\n },\n ],\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n ldap_feature_discovery: {\n url: 'authentication/ldap',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.ldap', defaultMessage: 'AD/LDAP'}),\n isHidden: it.any(\n it.licensedForFeature('LDAP'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'LdapSettings',\n name: defineMessage({id: 'admin.authentication.ldap', defaultMessage: 'AD/LDAP'}),\n settings: [\n {\n type: 'custom',\n component: LDAPFeatureDiscovery,\n key: 'LDAPFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true),\n },\n saml: {\n url: 'authentication/saml',\n title: defineMessage({id: 'admin.sidebar.saml', defaultMessage: 'SAML 2.0'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('SAML')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n ),\n schema: {\n id: 'SamlSettings',\n name: defineMessage({id: 'admin.authentication.saml', defaultMessage: 'SAML 2.0'}),\n settings: [\n {\n type: 'bool',\n key: 'SamlSettings.Enable',\n label: defineMessage({id: 'admin.saml.enableTitle', defaultMessage: 'Enable Login With SAML 2.0:'}),\n help_text: defineMessage({id: 'admin.saml.enableDescription', defaultMessage: 'When true, Mattermost allows login using SAML 2.0. Please see <link>documentation</link> to learn more about configuring SAML for Mattermost.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='http://docs.mattermost.com/deployment/sso-saml.html'\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n },\n {\n type: 'bool',\n key: 'SamlSettings.EnableSyncWithLdap',\n label: defineMessage({id: 'admin.saml.enableSyncWithLdapTitle', defaultMessage: 'Enable Synchronizing SAML Accounts With AD/LDAP:'}),\n help_text: defineMessage({id: 'admin.saml.enableSyncWithLdapDescription', defaultMessage: 'When true, Mattermost periodically synchronizes SAML user attributes, including user deactivation and removal, from AD/LDAP. Enable and configure synchronization settings at <strong>Authentication > AD/LDAP</strong>. When false, user attributes are updated from SAML during user login. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.SETUP_LDAP}\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n help_text_markdown: false,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'bool',\n key: 'SamlSettings.IgnoreGuestsLdapSync',\n label: defineMessage({id: 'admin.saml.ignoreGuestsLdapSyncTitle', defaultMessage: 'Ignore Guest Users when Synchronizing with AD/LDAP'}),\n help_text: defineMessage({id: 'admin.saml.ignoreGuestsLdapSyncDesc', defaultMessage: 'When true, Mattermost will ignore Guest Users who are identified by the Guest Attribute, when synchronizing with AD/LDAP for user deactivation and removal and Guest deactivation will need to be managed manually via System Console > Users.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.configIsFalse('GuestAccountsSettings', 'Enable'),\n it.stateIsFalse('SamlSettings.EnableSyncWithLdap'),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'bool',\n key: 'SamlSettings.EnableSyncWithLdapIncludeAuth',\n label: defineMessage({id: 'admin.saml.enableSyncWithLdapIncludeAuthTitle', defaultMessage: 'Override SAML bind data with AD/LDAP information:'}),\n help_text: defineMessage({id: 'admin.saml.enableSyncWithLdapIncludeAuthDescription', defaultMessage: 'When true, Mattermost will override the SAML ID attribute with the AD/LDAP ID attribute if configured or override the SAML Email attribute with the AD/LDAP Email attribute if SAML ID attribute is not present. This will allow you automatically migrate users from Email binding to ID binding to prevent creation of new users when an email address changes for a user. Moving from true to false, will remove the override from happening. <strong>Note:</strong> SAML IDs must match the LDAP IDs to prevent disabling of user accounts. Please review <link>documentation</link> for more information.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.CONFIGURE_OVERRIDE_SAML_BIND_DATA_WITH_LDAP}\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n help_text_markdown: false,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n it.stateIsFalse('SamlSettings.EnableSyncWithLdap'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.IdpMetadataURL',\n label: defineMessage({id: 'admin.saml.idpMetadataUrlTitle', defaultMessage: 'Identity Provider Metadata URL:'}),\n help_text: defineMessage({id: 'admin.saml.idpMetadataUrlDesc', defaultMessage: 'The Metadata URL for the Identity Provider you use for SAML requests'}),\n placeholder: defineMessage({id: 'admin.saml.idpMetadataUrlEx', defaultMessage: 'E.g.: \"https://idp.example.org/SAML2/saml/metadata\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'button',\n key: 'getSamlMetadataFromIDPButton',\n action: getSamlMetadataFromIdp,\n label: defineMessage({id: 'admin.saml.getSamlMetadataFromIDPUrl', defaultMessage: 'Get SAML Metadata from IdP'}),\n loading: defineMessage({id: 'admin.saml.getSamlMetadataFromIDPFetching', defaultMessage: 'Fetching...'}),\n error_message: defineMessage({id: 'admin.saml.getSamlMetadataFromIDPFail', defaultMessage: 'SAML Metadata URL did not connect and pull data successfully'}),\n success_message: defineMessage({id: 'admin.saml.getSamlMetadataFromIDPSuccess', defaultMessage: 'SAML Metadata retrieved successfully. Two fields below have been updated'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n it.stateEquals('SamlSettings.IdpMetadataURL', ''),\n ),\n sourceUrlKey: 'SamlSettings.IdpMetadataURL',\n skipSaveNeeded: true,\n },\n {\n type: 'text',\n key: 'SamlSettings.IdpURL',\n label: defineMessage({id: 'admin.saml.idpUrlTitle', defaultMessage: 'SAML SSO URL:'}),\n help_text: defineMessage({id: 'admin.saml.idpUrlDesc', defaultMessage: 'The URL where Mattermost sends a SAML request to start login sequence.'}),\n placeholder: defineMessage({id: 'admin.saml.idpUrlEx', defaultMessage: 'E.g.: \"https://idp.example.org/SAML2/SSO/Login\"'}),\n setFromMetadataField: 'idp_url',\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.IdpDescriptorURL',\n label: defineMessage({id: 'admin.saml.idpDescriptorUrlTitle', defaultMessage: 'Identity Provider Issuer URL:'}),\n help_text: defineMessage({id: 'admin.saml.idpDescriptorUrlDesc', defaultMessage: 'The issuer URL for the Identity Provider you use for SAML requests.'}),\n placeholder: defineMessage({id: 'admin.saml.idpDescriptorUrlEx', defaultMessage: 'E.g.: \"https://idp.example.org/SAML2/issuer\"'}),\n setFromMetadataField: 'idp_descriptor_url',\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'fileupload',\n key: 'SamlSettings.IdpCertificateFile',\n label: defineMessage({id: 'admin.saml.idpCertificateFileTitle', defaultMessage: 'Identity Provider Public Certificate:'}),\n help_text: defineMessage({id: 'admin.saml.idpCertificateFileDesc', defaultMessage: 'The public authentication certificate issued by your Identity Provider.'}),\n remove_help_text: defineMessage({id: 'admin.saml.idpCertificateFileRemoveDesc', defaultMessage: 'Remove the public authentication certificate issued by your Identity Provider.'}),\n remove_button_text: defineMessage({id: 'admin.saml.remove.idp_certificate', defaultMessage: 'Remove Identity Provider Certificate'}),\n removing_text: defineMessage({id: 'admin.saml.removing.certificate', defaultMessage: 'Removing Certificate...'}),\n uploading_text: defineMessage({id: 'admin.saml.uploading.certificate', defaultMessage: 'Uploading Certificate...'}),\n fileType: '.crt,.cer,.cert,.pem',\n upload_action: uploadIdpSamlCertificate,\n set_action: setSamlIdpCertificateFromMetadata,\n remove_action: removeIdpSamlCertificate,\n setFromMetadataField: 'idp_public_certificate',\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'bool',\n key: 'SamlSettings.Verify',\n label: defineMessage({id: 'admin.saml.verifyTitle', defaultMessage: 'Verify Signature:'}),\n help_text: defineMessage({id: 'admin.saml.verifyDescription', defaultMessage: 'When false, Mattermost will not verify that the signature sent from a SAML Response matches the Service Provider Login URL. Disabling verification is not recommended for production environments.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.AssertionConsumerServiceURL',\n label: defineMessage({id: 'admin.saml.assertionConsumerServiceURLTitle', defaultMessage: 'Service Provider Login URL:'}),\n help_text: defineMessage({id: 'admin.saml.assertionConsumerServiceURLPopulatedDesc', defaultMessage: 'This field is also known as the Assertion Consumer Service URL.'}),\n placeholder: defineMessage({id: 'admin.saml.assertionConsumerServiceURLEx', defaultMessage: 'E.g.: \"<urlChunk>your-mattermost-url</urlChunk>\"'}),\n placeholder_values: {\n urlChunk: (chunk: string) => `https://'<${chunk}>'/login/sso/saml`,\n },\n onConfigLoad: (value, config) => {\n const siteUrl = config.ServiceSettings?.SiteURL || '';\n if (siteUrl.length > 0 && value.length === 0) {\n const addSlashIfNeeded = siteUrl[siteUrl.length - 1] === '/' ? '' : '/';\n return `${siteUrl}${addSlashIfNeeded}login/sso/saml`;\n }\n return value;\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.ServiceProviderIdentifier',\n label: defineMessage({id: 'admin.saml.serviceProviderIdentifierTitle', defaultMessage: 'Service Provider Identifier:'}),\n help_text: defineMessage({id: 'admin.saml.serviceProviderIdentifierDesc', defaultMessage: 'The unique identifier for the Service Provider, usually the same as Service Provider Login URL. In ADFS, this MUST match the Relying Party Identifier.'}),\n placeholder: defineMessage({id: 'admin.saml.serviceProviderIdentifierEx', defaultMessage: 'E.g.: \"<urlChunk>your-mattermost-url</urlChunk>\"'}),\n placeholder_values: {\n urlChunk: (chunk: string) => `https://'<${chunk}>'/login/sso/saml`,\n },\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'bool',\n key: 'SamlSettings.Encrypt',\n label: defineMessage({id: 'admin.saml.encryptTitle', defaultMessage: 'Enable Encryption:'}),\n help_text: defineMessage({id: 'admin.saml.encryptDescription', defaultMessage: 'When false, Mattermost will not decrypt SAML Assertions encrypted with your Service Provider Public Certificate. Disabling encryption is not recommended for production environments.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'fileupload',\n key: 'SamlSettings.PrivateKeyFile',\n label: defineMessage({id: 'admin.saml.privateKeyFileTitle', defaultMessage: 'Service Provider Private Key:'}),\n help_text: defineMessage({id: 'admin.saml.privateKeyFileFileDesc', defaultMessage: 'The private key used to decrypt SAML Assertions from the Identity Provider.'}),\n remove_help_text: defineMessage({id: 'admin.saml.privateKeyFileFileRemoveDesc', defaultMessage: 'Remove the private key used to decrypt SAML Assertions from the Identity Provider.'}),\n remove_button_text: defineMessage({id: 'admin.saml.remove.privKey', defaultMessage: 'Remove Service Provider Private Key'}),\n removing_text: defineMessage({id: 'admin.saml.removing.privKey', defaultMessage: 'Removing Private Key...'}),\n uploading_text: defineMessage({id: 'admin.saml.uploading.privateKey', defaultMessage: 'Uploading Private Key...'}),\n fileType: '.key',\n upload_action: uploadPrivateSamlCertificate,\n remove_action: removePrivateSamlCertificate,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n it.stateIsFalse('SamlSettings.Encrypt'),\n ),\n },\n {\n type: 'fileupload',\n key: 'SamlSettings.PublicCertificateFile',\n label: defineMessage({id: 'admin.saml.publicCertificateFileTitle', defaultMessage: 'Service Provider Public Certificate:'}),\n help_text: defineMessage({id: 'admin.saml.publicCertificateFileDesc', defaultMessage: 'The certificate used to generate the signature on a SAML request to the Identity Provider for a service provider initiated SAML login, when Mattermost is the Service Provider.'}),\n remove_help_text: defineMessage({id: 'admin.saml.publicCertificateFileRemoveDesc', defaultMessage: 'Remove the certificate used to generate the signature on a SAML request to the Identity Provider for a service provider initiated SAML login, when Mattermost is the Service Provider.'}),\n remove_button_text: defineMessage({id: 'admin.saml.remove.sp_certificate', defaultMessage: 'Remove Service Provider Certificate'}),\n removing_text: defineMessage({id: 'admin.saml.removing.certificate', defaultMessage: 'Removing Certificate...'}),\n uploading_text: defineMessage({id: 'admin.saml.uploading.certificate', defaultMessage: 'Uploading Certificate...'}),\n fileType: '.crt,.cer',\n upload_action: uploadPublicSamlCertificate,\n remove_action: removePublicSamlCertificate,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n it.stateIsFalse('SamlSettings.Encrypt'),\n ),\n },\n {\n type: 'bool',\n key: 'SamlSettings.SignRequest',\n label: defineMessage({id: 'admin.saml.signRequestTitle', defaultMessage: 'Sign Request:'}),\n help_text: defineMessage({id: 'admin.saml.signRequestDescription', defaultMessage: 'When true, Mattermost will sign the SAML request using your private key. When false, Mattermost will not sign the SAML request.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Encrypt'),\n it.stateIsFalse('SamlSettings.PrivateKeyFile'),\n it.stateIsFalse('SamlSettings.PublicCertificateFile'),\n ),\n },\n {\n type: 'dropdown',\n key: 'SamlSettings.SignatureAlgorithm',\n label: defineMessage({id: 'admin.saml.signatureAlgorithmTitle', defaultMessage: 'Signature Algorithm'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Encrypt'),\n it.stateIsFalse('SamlSettings.SignRequest'),\n ),\n options: [\n {\n value: SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA1,\n display_name: defineMessage({id: 'admin.saml.signatureAlgorithmDisplay.sha1', defaultMessage: 'RSAwithSHA1'}),\n help_text: defineMessage({id: 'admin.saml.signatureAlgorithmDescription.sha1', defaultMessage: 'Specify the Signature algorithm used to sign the request (RSAwithSHA1). Please see more information provided at http://www.w3.org/2000/09/xmldsig#rsa-sha1'}),\n },\n {\n value: SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA256,\n display_name: defineMessage({id: 'admin.saml.signatureAlgorithmDisplay.sha256', defaultMessage: 'RSAwithSHA256'}),\n help_text: defineMessage({id: 'admin.saml.signatureAlgorithmDescription.sha256', defaultMessage: 'Specify the Signature algorithm used to sign the request (RSAwithSHA256). Please see more information provided at http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 [section 6.4.2 RSA (PKCS#1 v1.5)]'}),\n },\n {\n value: SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA512,\n display_name: defineMessage({id: 'admin.saml.signatureAlgorithmDisplay.sha512', defaultMessage: 'RSAwithSHA512'}),\n help_text: defineMessage({id: 'admin.saml.signatureAlgorithmDescription.sha512', defaultMessage: 'Specify the Signature algorithm used to sign the request (RSAwithSHA512). Please see more information provided at http://www.w3.org/2001/04/xmldsig-more#rsa-sha512'}),\n },\n ],\n },\n {\n type: 'dropdown',\n key: 'SamlSettings.CanonicalAlgorithm',\n label: defineMessage({id: 'admin.saml.canonicalAlgorithmTitle', defaultMessage: 'Canonicalization Algorithm'}),\n options: [\n {\n value: SAML_SETTINGS_CANONICAL_ALGORITHM_C14N,\n display_name: defineMessage({id: 'admin.saml.canonicalAlgorithmDisplay.n10', defaultMessage: 'Exclusive XML Canonicalization 1.0 (omit comments)'}),\n help_text: defineMessage({id: 'admin.saml.canonicalAlgorithmDescription.exc', defaultMessage: 'Specify the Canonicalization algorithm (Exclusive XML Canonicalization 1.0). Please see more information provided at http://www.w3.org/2001/10/xml-exc-c14n#'}),\n },\n {\n value: SAML_SETTINGS_CANONICAL_ALGORITHM_C14N11,\n display_name: defineMessage({id: 'admin.saml.canonicalAlgorithmDisplay.n11', defaultMessage: 'Canonical XML 1.1 (omit comments)'}),\n help_text: defineMessage({id: 'admin.saml.canonicalAlgorithmDescription.c14', defaultMessage: 'Specify the Canonicalization algorithm (Canonical XML 1.1). Please see more information provided at http://www.w3.org/2006/12/xml-c14n11'}),\n },\n ],\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Encrypt'),\n it.stateIsFalse('SamlSettings.SignRequest'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.EmailAttribute',\n label: defineMessage({id: 'admin.saml.emailAttrTitle', defaultMessage: 'Email Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.emailAttrEx', defaultMessage: 'E.g.: \"Email\" or \"PrimaryEmail\"'}),\n help_text: defineMessage({id: 'admin.saml.emailAttrDesc', defaultMessage: 'The attribute in the SAML Assertion that will be used to populate the email addresses of users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.UsernameAttribute',\n label: defineMessage({id: 'admin.saml.usernameAttrTitle', defaultMessage: 'Username Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.usernameAttrEx', defaultMessage: 'E.g.: \"Username\"'}),\n help_text: defineMessage({id: 'admin.saml.usernameAttrDesc', defaultMessage: 'The attribute in the SAML Assertion that will be used to populate the username field in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.IdAttribute',\n label: defineMessage({id: 'admin.saml.idAttrTitle', defaultMessage: 'Id Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.idAttrEx', defaultMessage: 'E.g.: \"Id\"'}),\n help_text: defineMessage({id: 'admin.saml.idAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion that will be used to bind users from SAML to users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.GuestAttribute',\n label: defineMessage({id: 'admin.saml.guestAttrTitle', defaultMessage: 'Guest Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.guestAttrEx', defaultMessage: 'E.g.: \"usertype=Guest\" or \"isGuest=true\"'}),\n help_text: defineMessage({id: 'admin.saml.guestAttrDesc', defaultMessage: '(Optional) Requires Guest Access to be enabled before being applied. The attribute in the SAML Assertion that will be used to apply a guest role to users in Mattermost. Guests are prevented from accessing teams or channels upon logging in until they are assigned a team and at least one channel. Note: If this attribute is removed/changed from your guest user in SAML and the user is still active, they will not be promoted to a member and will retain their Guest role. Guests can be promoted in **System Console > User Management**. Existing members that are identified by this attribute as a guest will be demoted from a member to a guest when they are asked to login next. The next login is based upon Session lengths set in **System Console > Session Lengths**. It is highly recommend to manually demote users to guests in **System Console > User Management ** to ensure access is restricted immediately.'}),\n help_text_markdown: true,\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.configIsFalse('GuestAccountsSettings', 'Enable'),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'bool',\n key: 'SamlSettings.EnableAdminAttribute',\n label: defineMessage({id: 'admin.saml.enableAdminAttrTitle', defaultMessage: 'Enable Admin Attribute:'}),\n isDisabled: it.any(\n it.not(it.isSystemAdmin),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.AdminAttribute',\n label: defineMessage({id: 'admin.saml.adminAttrTitle', defaultMessage: 'Admin Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.adminAttrEx', defaultMessage: 'E.g.: \"usertype=Admin\" or \"isAdmin=true\"'}),\n help_text: defineMessage({id: 'admin.saml.adminAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion for designating System Admins. The users selected by the query will have access to your Mattermost server as System Admins. By default, System Admins have complete access to the Mattermost System Console. Existing members that are identified by this attribute will be promoted from member to System Admin upon next login. The next login is based upon Session lengths set in **System Console > Session Lengths.** It is highly recommend to manually demote users to members in **System Console > User Management** to ensure access is restricted immediately. Note: If this filter is removed/changed, System Admins that were promoted via this filter will be demoted to members and will not retain access to the System Console. When this filter is not in use, System Admins can be manually promoted/demoted in **System Console > User Management**.'}),\n help_text_markdown: true,\n isDisabled: it.any(\n it.not(it.isSystemAdmin),\n it.stateIsFalse('SamlSettings.EnableAdminAttribute'),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.FirstNameAttribute',\n label: defineMessage({id: 'admin.saml.firstnameAttrTitle', defaultMessage: 'First Name Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.firstnameAttrEx', defaultMessage: 'E.g.: \"FirstName\"'}),\n help_text: defineMessage({id: 'admin.saml.firstnameAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion that will be used to populate the first name of users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.LastNameAttribute',\n label: defineMessage({id: 'admin.saml.lastnameAttrTitle', defaultMessage: 'Last Name Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.lastnameAttrEx', defaultMessage: 'E.g.: \"LastName\"'}),\n help_text: defineMessage({id: 'admin.saml.lastnameAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion that will be used to populate the last name of users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.NicknameAttribute',\n label: defineMessage({id: 'admin.saml.nicknameAttrTitle', defaultMessage: 'Nickname Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.nicknameAttrEx', defaultMessage: 'E.g.: \"Nickname\"'}),\n help_text: defineMessage({id: 'admin.saml.nicknameAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion that will be used to populate the nickname of users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.PositionAttribute',\n label: defineMessage({id: 'admin.saml.positionAttrTitle', defaultMessage: 'Position Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.positionAttrEx', defaultMessage: 'E.g.: \"Role\"'}),\n help_text: defineMessage({id: 'admin.saml.positionAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion that will be used to populate the position of users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.LocaleAttribute',\n label: defineMessage({id: 'admin.saml.localeAttrTitle', defaultMessage: 'Preferred Language Attribute:'}),\n placeholder: defineMessage({id: 'admin.saml.localeAttrEx', defaultMessage: 'E.g.: \"Locale\" or \"PrimaryLanguage\"'}),\n help_text: defineMessage({id: 'admin.saml.localeAttrDesc', defaultMessage: '(Optional) The attribute in the SAML Assertion that will be used to populate the language of users in Mattermost.'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'SamlSettings.LoginButtonText',\n label: defineMessage({id: 'admin.saml.loginButtonTextTitle', defaultMessage: 'Login Button Text:'}),\n placeholder: defineMessage({id: 'admin.saml.loginButtonTextEx', defaultMessage: 'E.g.: \"OKTA\"'}),\n help_text: defineMessage({id: 'admin.saml.loginButtonTextDesc', defaultMessage: '(Optional) The text that appears in the login button on the login page. Defaults to \"SAML\".'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.SAML)),\n it.stateIsFalse('SamlSettings.Enable'),\n ),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n saml_feature_discovery: {\n url: 'authentication/saml',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.saml', defaultMessage: 'SAML 2.0'}),\n isHidden: it.any(\n it.licensedForFeature('SAML'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'SamlSettings',\n name: defineMessage({id: 'admin.authentication.saml', defaultMessage: 'SAML 2.0'}),\n settings: [\n {\n type: 'custom',\n component: SAMLFeatureDiscovery,\n key: 'SAMLFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true),\n },\n gitlab: {\n url: 'authentication/gitlab',\n title: defineMessage({id: 'admin.sidebar.gitlab', defaultMessage: 'GitLab'}),\n isHidden: it.any(\n it.licensed,\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n ),\n schema: {\n id: 'GitLabSettings',\n name: defineMessage({id: 'admin.authentication.gitlab', defaultMessage: 'GitLab'}),\n onConfigLoad: (config) => {\n const newState: {'GitLabSettings.Url'?: string} = {};\n newState['GitLabSettings.Url'] = config.GitLabSettings?.UserAPIEndpoint?.replace('/api/v4/user', '');\n return newState;\n },\n onConfigSave: (config) => {\n const newConfig = {...config};\n newConfig.GitLabSettings.UserAPIEndpoint = config.GitLabSettings.Url.replace(/\\/$/, '') + '/api/v4/user';\n return newConfig;\n },\n settings: [\n {\n type: 'bool',\n key: 'GitLabSettings.Enable',\n label: defineMessage({id: 'admin.gitlab.enableTitle', defaultMessage: 'Enable authentication with GitLab: '}),\n help_text: defineMessage({id: 'admin.gitlab.enableDescription', defaultMessage: 'When true, Mattermost allows team creation and account signup using GitLab OAuth.{lineBreak} {lineBreak}1. Log in to your GitLab account and go to Profile Settings -> Applications.{lineBreak}2. Enter Redirect URIs \"<loginUrlChunk>your-mattermost-url</loginUrlChunk>\" (example: http://localhost:8065/login/gitlab/complete) and \"<signupUrlChunk>your-mattermost-url</signupUrlChunk>\".\\n3. Then use \"Application Secret Key\" and \"Application ID\" fields from GitLab to complete the options below.\\n4. Complete the Endpoint URLs below.'}),\n help_text_values: {\n lineBreak: '\\n',\n loginUrlChunk: (chunk: string) => `<${chunk}>/login/gitlab/complete\"`,\n signupUrlChunk: (chunk: string) => `<${chunk}>/signup/gitlab/complete\"`,\n },\n help_text_markdown: true,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Id',\n label: defineMessage({id: 'admin.gitlab.clientIdTitle', defaultMessage: 'Application ID:'}),\n help_text: defineMessage({id: 'admin.gitlab.clientIdDescription', defaultMessage: 'Obtain this value via the instructions above for logging into GitLab.'}),\n placeholder: defineMessage({id: 'admin.gitlab.clientIdExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n it.stateIsFalse('GitLabSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Secret',\n label: defineMessage({id: 'admin.gitlab.clientSecretTitle', defaultMessage: 'Application Secret Key:'}),\n help_text: defineMessage({id: 'admin.gitlab.clientSecretDescription', defaultMessage: 'Obtain this value via the instructions above for logging into GitLab.'}),\n placeholder: defineMessage({id: 'admin.gitlab.clientSecretExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n it.stateIsFalse('GitLabSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Url',\n label: defineMessage({id: 'admin.gitlab.siteUrl', defaultMessage: 'GitLab Site URL:'}),\n help_text: defineMessage({id: 'admin.gitlab.siteUrlDescription', defaultMessage: 'Enter the URL of your GitLab instance, e.g. https://example.com:3000. If your GitLab instance is not set up with SSL, start the URL with http:// instead of https://.'}),\n placeholder: defineMessage({id: 'admin.gitlab.siteUrlExample', defaultMessage: 'E.g.: https://'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n it.stateIsFalse('GitLabSettings.Enable'),\n ),\n },\n {\n type: 'text',\n key: 'GitLabSettings.UserAPIEndpoint',\n label: defineMessage({id: 'admin.gitlab.userTitle', defaultMessage: 'User API Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/api/v4/user';\n }\n return '';\n },\n isDisabled: true,\n },\n {\n type: 'text',\n key: 'GitLabSettings.AuthEndpoint',\n label: defineMessage({id: 'admin.gitlab.authTitle', defaultMessage: 'Auth Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/oauth/authorize';\n }\n return '';\n },\n isDisabled: true,\n },\n {\n type: 'text',\n key: 'GitLabSettings.TokenEndpoint',\n label: defineMessage({id: 'admin.gitlab.tokenTitle', defaultMessage: 'Token Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/oauth/token';\n }\n return '';\n },\n isDisabled: true,\n },\n ],\n },\n },\n oauth: {\n url: 'authentication/oauth',\n title: defineMessage({id: 'admin.sidebar.oauth', defaultMessage: 'OAuth 2.0'}),\n isHidden: it.any(\n it.any(\n it.not(it.licensed),\n it.licensedForSku('starter'),\n ),\n it.all(\n it.licensedForFeature('OpenId'),\n it.not(usesLegacyOauth),\n ),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n ),\n schema: {\n id: 'OAuthSettings',\n name: defineMessage({id: 'admin.authentication.oauth', defaultMessage: 'OAuth 2.0'}),\n onConfigLoad: (config) => {\n const newState: {oauthType?: string; 'GitLabSettings.Url'?: string} = {};\n if (config.GitLabSettings?.Enable) {\n newState.oauthType = Constants.GITLAB_SERVICE;\n }\n if (config.Office365Settings?.Enable) {\n newState.oauthType = Constants.OFFICE365_SERVICE;\n }\n if (config.GoogleSettings?.Enable) {\n newState.oauthType = Constants.GOOGLE_SERVICE;\n }\n\n newState['GitLabSettings.Url'] = config.GitLabSettings?.UserAPIEndpoint?.replace('/api/v4/user', '');\n\n return newState;\n },\n onConfigSave: (config) => {\n const newConfig = {...config};\n newConfig.GitLabSettings = config.GitLabSettings || {};\n newConfig.Office365Settings = config.Office365Settings || {};\n newConfig.GoogleSettings = config.GoogleSettings || {};\n newConfig.OpenIdSettings = config.OpenIdSettings || {};\n\n newConfig.GitLabSettings.Enable = false;\n newConfig.Office365Settings.Enable = false;\n newConfig.GoogleSettings.Enable = false;\n newConfig.OpenIdSettings.Enable = false;\n newConfig.GitLabSettings.UserAPIEndpoint = config.GitLabSettings.Url.replace(/\\/$/, '') + '/api/v4/user';\n\n if (config.oauthType === Constants.GITLAB_SERVICE) {\n newConfig.GitLabSettings.Enable = true;\n }\n if (config.oauthType === Constants.OFFICE365_SERVICE) {\n newConfig.Office365Settings.Enable = true;\n }\n if (config.oauthType === Constants.GOOGLE_SERVICE) {\n newConfig.GoogleSettings.Enable = true;\n }\n delete newConfig.oauthType;\n return newConfig;\n },\n settings: [\n {\n type: 'custom',\n component: OpenIdConvert,\n key: 'OpenIdConvert',\n isHidden: it.any(\n it.all(it.not(it.licensedForFeature('OpenId')), it.not(it.cloudLicensed)),\n it.not(usesLegacyOauth),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'dropdown',\n key: 'oauthType',\n label: defineMessage({id: 'admin.openid.select', defaultMessage: 'Select service provider:'}),\n options: [\n {\n value: 'off',\n display_name: defineMessage({id: 'admin.oauth.off', defaultMessage: 'Do not allow sign-in via an OAuth 2.0 provider.'}),\n },\n {\n value: Constants.GITLAB_SERVICE,\n display_name: defineMessage({id: 'admin.oauth.gitlab', defaultMessage: 'GitLab'}),\n help_text: defineMessage({id: 'admin.gitlab.EnableMarkdownDesc', defaultMessage: '1. Log in to your GitLab account and go to Profile Settings -> Applications.\\n2. Enter Redirect URIs \"<loginUrlChunk>your-mattermost-url</loginUrlChunk>\" (example: http://localhost:8065/login/gitlab/complete) and \"<signupUrlChunk>your-mattermost-url</signupUrlChunk>\".\\n3. Then use \"Application Secret Key\" and \"Application ID\" fields from GitLab to complete the options below.\\n4. Complete the Endpoint URLs below.'}),\n help_text_values: {\n loginUrlChunk: (chunk: string) => `<${chunk}>/login/gitlab/complete`,\n signupUrlChunk: (chunk: string) => `<${chunk}>/signup/gitlab/complete`,\n },\n help_text_markdown: true,\n },\n {\n value: Constants.GOOGLE_SERVICE,\n display_name: defineMessage({id: 'admin.oauth.google', defaultMessage: 'Google Apps'}),\n isHidden: it.all(it.not(it.licensedForFeature('GoogleOAuth')), it.not(it.cloudLicensed)),\n help_text: defineMessage({id: 'admin.google.EnableMarkdownDesc', defaultMessage: '1. <linkLogin>Log in</linkLogin> to your Google account.\\n2. Go to <linkConsole>https://console.developers.google.com</linkConsole>, click <strong>Credentials</strong> in the left hand sidebar and enter \"Mattermost - your-company-name\" as the <strong>Project Name</strong>, then click <strong>Create</strong>.\\n3. Click the <strong>OAuth consent screen</strong> header and enter \"Mattermost\" as the <strong>Product name shown to users</strong>, then click <strong>Save</strong>.\\n4. Under the <strong>Credentials</strong> header, click <strong>Create credentials</strong>, choose <strong>OAuth client ID</strong> and select <strong>Web Application</strong>.\\n5. Under <strong>Restrictions</strong> and <strong>Authorized redirect URIs</strong> enter <strong>\"your-mattermost-url/signup/google/complete\"</strong> (example: http://localhost:8065/signup/google/complete). Click <strong>Create</strong>.\\n6. Paste the <strong>Client ID</strong> and <strong>Client Secret</strong> to the fields below, then click <strong>Save</strong>.\\n7. Go to the <linkAPI>Google People API</linkAPI> and click <strong>Enable</strong>.'}),\n help_text_markdown: false,\n help_text_values: {\n linkLogin: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://accounts.google.com/login'\n >\n {msg}\n </ExternalLink>\n ),\n linkConsole: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://console.developers.google.com'\n >\n {msg}\n </ExternalLink>\n ),\n linkAPI: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://console.developers.google.com/apis/library/people.googleapis.com'\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n },\n {\n value: Constants.OFFICE365_SERVICE,\n display_name: defineMessage({id: 'admin.oauth.office365', defaultMessage: 'Entra ID'}),\n isHidden: it.all(it.not(it.licensedForFeature('Office365OAuth')), it.not(it.cloudLicensed)),\n help_text: defineMessage({id: 'admin.office365.EnableMarkdownDesc', defaultMessage: '1. <linkLogin>Log in</linkLogin> to your Microsoft account. \\n2. In Microsoft, go to <strong>Applications</strong> and <strong>App Registrations</strong> in the left pane.\\n3. Select <strong>New registration</strong>, then enter \"Mattermost - your-company-name\" as the <strong>Application Name</strong>. \\n4. Under <strong>Redirect URI</strong>, select <strong>Web</strong>, and enter \"your-mattermost-url/signup/office365/complete\" as the <strong>Redirect URI</strong>. Select <strong>Register</strong>.\\n5. Copy the Microsoft <strong>Application (client) ID</strong> value, and paste it below as the <strong>Client ID</strong> value. \\n6. Copy the Microsoft <strong>Directory (tenant) ID</strong> value, and paste it below as the <strong>Directory (tenant) ID</strong> value. \\n7. In Microsoft, create a new client secret. Copy the resulting client secret value, and paste it below as the <strong>Client Secret</strong> value. Select <strong>Save</strong>.'}),\n help_text_markdown: false,\n help_text_values: {\n linkLogin: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://entra.microsoft.com'\n >\n {msg}\n </ExternalLink>\n ),\n linkTenant: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://msdn.microsoft.com/en-us/library/azure/jj573650.aspx#Anchor_0'\n >\n {msg}\n </ExternalLink>\n ),\n linkApps: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://entra.microsoft.com'\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Id',\n label: defineMessage({id: 'admin.gitlab.clientIdTitle', defaultMessage: 'Application ID:'}),\n help_text: defineMessage({id: 'admin.gitlab.clientIdDescription', defaultMessage: 'Obtain this value via the instructions above for logging into GitLab.'}),\n placeholder: defineMessage({id: 'admin.gitlab.clientIdExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'gitlab')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Secret',\n label: defineMessage({id: 'admin.gitlab.clientSecretTitle', defaultMessage: 'Application Secret Key:'}),\n help_text: defineMessage({id: 'admin.gitlab.clientSecretDescription', defaultMessage: 'Obtain this value via the instructions above for logging into GitLab.'}),\n placeholder: defineMessage({id: 'admin.gitlab.clientSecretExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'gitlab')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Url',\n label: defineMessage({id: 'admin.gitlab.siteUrl', defaultMessage: 'GitLab Site URL:'}),\n help_text: defineMessage({id: 'admin.gitlab.siteUrlDescription', defaultMessage: 'Enter the URL of your GitLab instance, e.g. https://example.com:3000. If your GitLab instance is not set up with SSL, start the URL with http:// instead of https://.'}),\n placeholder: defineMessage({id: 'admin.gitlab.siteUrlExample', defaultMessage: 'E.g.: https://'}),\n isHidden: it.not(it.stateEquals('oauthType', 'gitlab')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.UserAPIEndpoint',\n label: defineMessage({id: 'admin.gitlab.userTitle', defaultMessage: 'User API Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/api/v4/user';\n }\n return '';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'gitlab')),\n },\n {\n type: 'text',\n key: 'GitLabSettings.AuthEndpoint',\n label: defineMessage({id: 'admin.gitlab.authTitle', defaultMessage: 'Auth Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/oauth/authorize';\n }\n return '';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'gitlab')),\n },\n {\n type: 'text',\n key: 'GitLabSettings.TokenEndpoint',\n label: defineMessage({id: 'admin.gitlab.tokenTitle', defaultMessage: 'Token Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/oauth/token';\n }\n return '';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'gitlab')),\n },\n {\n type: 'text',\n key: 'GoogleSettings.Id',\n label: defineMessage({id: 'admin.google.clientIdTitle', defaultMessage: 'Client ID:'}),\n help_text: defineMessage({id: 'admin.google.clientIdDescription', defaultMessage: 'The Client ID you received when registering your application with Google.'}),\n placeholder: defineMessage({id: 'admin.google.clientIdExample', defaultMessage: 'E.g.: \"7602141235235-url0fhs1mayfasbmop5qlfns8dh4.apps.googleusercontent.com\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'google')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GoogleSettings.Secret',\n label: defineMessage({id: 'admin.google.clientSecretTitle', defaultMessage: 'Client Secret:'}),\n help_text: defineMessage({id: 'admin.google.clientSecretDescription', defaultMessage: 'The Client Secret you received when registering your application with Google.'}),\n placeholder: defineMessage({id: 'admin.google.clientSecretExample', defaultMessage: 'E.g.: \"H8sz0Az-dDs2p15-7QzD231\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'google')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GoogleSettings.UserAPIEndpoint',\n label: defineMessage({id: 'admin.google.userTitle', defaultMessage: 'User API Endpoint:'}),\n dynamic_value: () => 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata',\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'google')),\n },\n {\n type: 'text',\n key: 'GoogleSettings.AuthEndpoint',\n label: defineMessage({id: 'admin.google.authTitle', defaultMessage: 'Auth Endpoint:'}),\n dynamic_value: () => 'https://accounts.google.com/o/oauth2/v2/auth',\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'google')),\n },\n {\n type: 'text',\n key: 'GoogleSettings.TokenEndpoint',\n label: defineMessage({id: 'admin.google.tokenTitle', defaultMessage: 'Token Endpoint:'}),\n dynamic_value: () => 'https://www.googleapis.com/oauth2/v4/token',\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'google')),\n },\n {\n type: 'text',\n key: 'Office365Settings.Id',\n label: defineMessage({id: 'admin.office365.clientIdTitle', defaultMessage: 'Application ID:'}),\n help_text: defineMessage({id: 'admin.office365.clientIdDescription', defaultMessage: 'The Application/Client ID you received when registering your application with Microsoft.'}),\n placeholder: defineMessage({id: 'admin.office365.clientIdExample', defaultMessage: 'E.g.: \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'office365')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'Office365Settings.Secret',\n label: defineMessage({id: 'admin.office365.clientSecretTitle', defaultMessage: 'Application Secret Password:'}),\n help_text: defineMessage({id: 'admin.office365.clientSecretDescription', defaultMessage: 'The Application Secret Password you generated when registering your application with Microsoft.'}),\n placeholder: defineMessage({id: 'admin.office365.clientSecretExample', defaultMessage: 'E.g.: \"shAieM47sNBfgl20f8ci294\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'office365')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'Office365Settings.DirectoryId',\n label: defineMessage({id: 'admin.office365.directoryIdTitle', defaultMessage: 'Directory (tenant) ID:'}),\n help_text: defineMessage({id: 'admin.office365.directoryIdDescription', defaultMessage: 'The Directory (tenant) ID you received when registering your application with Microsoft.'}),\n placeholder: defineMessage({id: 'admin.office365.directoryIdExample', defaultMessage: 'E.g.: \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"'}),\n isHidden: it.not(it.stateEquals('oauthType', 'office365')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'Office365Settings.UserAPIEndpoint',\n label: defineMessage({id: 'admin.office365.userTitle', defaultMessage: 'User API Endpoint:'}),\n dynamic_value: () => 'https://graph.microsoft.com/v1.0/me',\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'office365')),\n },\n {\n type: 'text',\n key: 'Office365Settings.AuthEndpoint',\n label: defineMessage({id: 'admin.office365.authTitle', defaultMessage: 'Auth Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['Office365Settings.DirectoryId']) {\n return 'https://login.microsoftonline.com/' + state['Office365Settings.DirectoryId'] + '/oauth2/v2.0/authorize';\n }\n return 'https://login.microsoftonline.com/{directoryId}/oauth2/v2.0/authorize';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'office365')),\n },\n {\n type: 'text',\n key: 'Office365Settings.TokenEndpoint',\n label: defineMessage({id: 'admin.office365.tokenTitle', defaultMessage: 'Token Endpoint:'}),\n dynamic_value: (value, config, state) => {\n if (state['Office365Settings.DirectoryId']) {\n return 'https://login.microsoftonline.com/' + state['Office365Settings.DirectoryId'] + '/oauth2/v2.0/token';\n }\n return 'https://login.microsoftonline.com/{directoryId}/oauth2/v2.0/token';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('oauthType', 'office365')),\n },\n ],\n },\n },\n openid: {\n url: 'authentication/openid',\n title: defineMessage({id: 'admin.sidebar.openid', defaultMessage: 'OpenID Connect'}),\n isHidden: it.any(\n it.all(it.not(it.licensedForFeature('OpenId')), it.not(it.cloudLicensed)),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n ),\n schema: {\n id: 'OpenIdSettings',\n name: defineMessage({id: 'admin.authentication.openid', defaultMessage: 'OpenID Connect'}),\n onConfigLoad: (config) => {\n const newState: {openidType?: string; 'GitLabSettings.Url'?: string} = {};\n if (config.Office365Settings?.Enable) {\n newState.openidType = Constants.OFFICE365_SERVICE;\n }\n if (config.GoogleSettings?.Enable) {\n newState.openidType = Constants.GOOGLE_SERVICE;\n }\n if (config.GitLabSettings?.Enable) {\n newState.openidType = Constants.GITLAB_SERVICE;\n }\n if (config.OpenIdSettings?.Enable) {\n newState.openidType = Constants.OPENID_SERVICE;\n }\n if (config.GitLabSettings?.UserAPIEndpoint) {\n newState['GitLabSettings.Url'] = config.GitLabSettings.UserAPIEndpoint.replace('/api/v4/user', '');\n } else if (config.GitLabSettings?.DiscoveryEndpoint) {\n newState['GitLabSettings.Url'] = config.GitLabSettings.DiscoveryEndpoint.replace('/.well-known/openid-configuration', '');\n }\n\n return newState;\n },\n onConfigSave: (config) => {\n const newConfig = {...config};\n newConfig.Office365Settings = config.Office365Settings || {};\n newConfig.GoogleSettings = config.GoogleSettings || {};\n newConfig.GitLabSettings = config.GitLabSettings || {};\n newConfig.OpenIdSettings = config.OpenIdSettings || {};\n\n newConfig.Office365Settings.Enable = false;\n newConfig.GoogleSettings.Enable = false;\n newConfig.GitLabSettings.Enable = false;\n newConfig.OpenIdSettings.Enable = false;\n\n let configSetting = '';\n if (config.openidType === Constants.OFFICE365_SERVICE) {\n configSetting = 'Office365Settings';\n } else if (config.openidType === Constants.GOOGLE_SERVICE) {\n configSetting = 'GoogleSettings';\n } else if (config.openidType === Constants.GITLAB_SERVICE) {\n configSetting = 'GitLabSettings';\n } else if (config.openidType === Constants.OPENID_SERVICE) {\n configSetting = 'OpenIdSettings';\n }\n\n if (configSetting !== '') {\n newConfig[configSetting].Enable = true;\n newConfig[configSetting].Scope = Constants.OPENID_SCOPES;\n newConfig[configSetting].UserAPIEndpoint = '';\n newConfig[configSetting].AuthEndpoint = '';\n newConfig[configSetting].TokenEndpoint = '';\n }\n\n delete newConfig.openidType;\n return newConfig;\n },\n settings: [\n {\n type: 'custom',\n component: OpenIdConvert,\n key: 'OpenIdConvert',\n isHidden: it.any(\n it.not(usesLegacyOauth),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'dropdown',\n key: 'openidType',\n label: defineMessage({id: 'admin.openid.select', defaultMessage: 'Select service provider:'}),\n isHelpHidden: it.all(it.stateEquals('openidType', Constants.OPENID_SERVICE), it.licensedForCloudStarter),\n options: [\n {\n value: 'off',\n display_name: defineMessage({id: 'admin.openid.off', defaultMessage: 'Do not allow sign-in via an OpenID provider.'}),\n },\n {\n value: Constants.GITLAB_SERVICE,\n display_name: defineMessage({id: 'admin.openid.gitlab', defaultMessage: 'GitLab'}),\n help_text: defineMessage({id: 'admin.gitlab.EnableMarkdownDesc', defaultMessage: '1. Log in to your GitLab account and go to Profile Settings -> Applications.\\n2. Enter Redirect URIs \"<loginUrlChunk>your-mattermost-url</loginUrlChunk>\" (example: http://localhost:8065/login/gitlab/complete) and \"<signupUrlChunk>your-mattermost-url</signupUrlChunk>\".\\n3. Then use \"Application Secret Key\" and \"Application ID\" fields from GitLab to complete the options below.\\n4. Complete the Endpoint URLs below.'}),\n help_text_values: {\n loginUrlChunk: (chunk: string) => `<${chunk}>/login/gitlab/complete`,\n signupUrlChunk: (chunk: string) => `<${chunk}>/signup/gitlab/complete`,\n },\n help_text_markdown: false,\n },\n {\n value: Constants.GOOGLE_SERVICE,\n display_name: defineMessage({id: 'admin.openid.google', defaultMessage: 'Google Apps'}),\n help_text: defineMessage({id: 'admin.google.EnableMarkdownDesc', defaultMessage: '1. <linkLogin>Log in</linkLogin> to your Google account.\\n2. Go to <linkConsole>https://console.developers.google.com]</linkConsole>, click <strong>Credentials</strong> in the left hand side.\\n 3. Under the <strong>Credentials</strong> header, click <strong>Create credentials</strong>, choose <strong>OAuth client ID</strong> and select <strong>Web Application</strong>.\\n 4. Enter \"Mattermost - your-company-name\" as the <strong>Name</strong>.\\n 5. Under <strong>Authorized redirect URIs</strong> enter <strong>\"your-mattermost-url/signup/google/complete\"</strong> (example: http://localhost:8065/signup/google/complete). Click <strong>Create</strong>.\\n 6. Paste the <strong>Client ID</strong> and <strong>Client Secret</strong> to the fields below, then click <strong>Save</strong>.\\n 7. Go to the <linkAPI>Google People API</linkAPI> and click <strong>Enable</strong>.'}),\n help_text_markdown: false,\n help_text_values: {\n linkLogin: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://accounts.google.com/login'\n >\n {msg}\n </ExternalLink>\n ),\n linkConsole: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://console.developers.google.com'\n >\n {msg}\n </ExternalLink>\n ),\n linkAPI: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://console.developers.google.com/apis/library/people.googleapis.com'\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n },\n {\n value: Constants.OFFICE365_SERVICE,\n display_name: defineMessage({id: 'admin.openid.office365', defaultMessage: 'Entra ID'}),\n help_text: defineMessage({id: 'admin.office365.EnableMarkdownDesc', defaultMessage: '1. <linkLogin>Log in</linkLogin> to your Microsoft account. \\n2. In Microsoft, go to <strong>Applications</strong> and <strong>App Registrations</strong> in the left pane.\\n3. Select <strong>New registration</strong>, then enter \"Mattermost - your-company-name\" as the <strong>Application Name</strong>. \\n4. Under <strong>Redirect URI</strong>, select <strong>Web</strong>, and enter \"your-mattermost-url/signup/office365/complete\" as the <strong>Redirect URI</strong>. Select <strong>Register</strong>.\\n5. Copy the Microsoft <strong>Application (client) ID</strong> value, and paste it below as the <strong>Client ID</strong> value. \\n6. Copy the Microsoft <strong>Directory (tenant) ID</strong> value, and paste it below as the <strong>Directory (tenant) ID</strong> value. \\n7. In Microsoft, create a new client secret. Copy the resulting client secret value, and paste it below as the <strong>Client Secret</strong> value. Select <strong>Save</strong>.'}),\n help_text_markdown: false,\n help_text_values: {\n linkLogin: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://entra.microsoft.com'\n >\n {msg}\n </ExternalLink>\n ),\n linkTenant: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://msdn.microsoft.com/en-us/library/azure/jj573650.aspx#Anchor_0'\n >\n {msg}\n </ExternalLink>\n ),\n linkApps: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://entra.microsoft.com'\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n },\n {\n value: Constants.OPENID_SERVICE,\n display_name: defineMessage({id: 'admin.oauth.openid', defaultMessage: 'OpenID Connect (Other)'}),\n help_text: defineMessage({id: 'admin.openid.EnableMarkdownDesc', defaultMessage: 'Follow provider directions for creating an OpenID Application. Most OpenID Connect providers require authorization of all redirect URIs. In the appropriate field, enter \"your-mattermost-url/signup/openid/complete\" (example: http://domain.com/signup/openid/complete)'}),\n help_text_markdown: false,\n },\n ],\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Url',\n label: defineMessage({id: 'admin.gitlab.siteUrl', defaultMessage: 'GitLab Site URL:'}),\n help_text: defineMessage({id: 'admin.gitlab.siteUrlDescription', defaultMessage: 'Enter the URL of your GitLab instance, e.g. https://example.com:3000. If your GitLab instance is not set up with SSL, start the URL with http:// instead of https://.'}),\n placeholder: defineMessage({id: 'admin.gitlab.siteUrlExample', defaultMessage: 'E.g.: https://'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.GITLAB_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.DiscoveryEndpoint',\n label: defineMessage({id: 'admin.openid.discoveryEndpointTitle', defaultMessage: 'Discovery Endpoint:'}),\n help_text: defineMessage({id: 'admin.gitlab.discoveryEndpointDesc', defaultMessage: 'The URL of the discovery document for OpenID Connect with GitLab.'}),\n help_text_markdown: false,\n dynamic_value: (value, config, state) => {\n if (state['GitLabSettings.Url']) {\n return state['GitLabSettings.Url'].replace(/\\/$/, '') + '/.well-known/openid-configuration';\n }\n return '';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('openidType', Constants.GITLAB_SERVICE)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Id',\n label: defineMessage({id: 'admin.openid.clientIdTitle', defaultMessage: 'Client ID:'}),\n help_text: defineMessage({id: 'admin.openid.clientIdDescription', defaultMessage: 'Obtaining the Client ID differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.gitlab.clientIdExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.GITLAB_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GitLabSettings.Secret',\n label: defineMessage({id: 'admin.openid.clientSecretTitle', defaultMessage: 'Client Secret:'}),\n help_text: defineMessage({id: 'admin.openid.clientSecretDescription', defaultMessage: 'Obtaining the Client Secret differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.gitlab.clientSecretExample', defaultMessage: 'E.g.: \"jcuS8PuvcpGhpgHhlcpT1Mx442pnqMxQY\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.GITLAB_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GoogleSettings.DiscoveryEndpoint',\n label: defineMessage({id: 'admin.openid.discoveryEndpointTitle', defaultMessage: 'Discovery Endpoint:'}),\n help_text: defineMessage({id: 'admin.google.discoveryEndpointDesc', defaultMessage: 'The URL of the discovery document for OpenID Connect with Google.'}),\n help_text_markdown: false,\n dynamic_value: () => 'https://accounts.google.com/.well-known/openid-configuration',\n isDisabled: true,\n isHidden: it.not(it.stateEquals('openidType', Constants.GOOGLE_SERVICE)),\n },\n {\n type: 'text',\n key: 'GoogleSettings.Id',\n label: defineMessage({id: 'admin.openid.clientIdTitle', defaultMessage: 'Client ID:'}),\n help_text: defineMessage({id: 'admin.openid.clientIdDescription', defaultMessage: 'Obtaining the Client ID differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.google.clientIdExample', defaultMessage: 'E.g.: \"7602141235235-url0fhs1mayfasbmop5qlfns8dh4.apps.googleusercontent.com\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.GOOGLE_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'GoogleSettings.Secret',\n label: defineMessage({id: 'admin.openid.clientSecretTitle', defaultMessage: 'Client Secret:'}),\n help_text: defineMessage({id: 'admin.openid.clientSecretDescription', defaultMessage: 'Obtaining the Client Secret differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.google.clientSecretExample', defaultMessage: 'E.g.: \"H8sz0Az-dDs2p15-7QzD231\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.GOOGLE_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'Office365Settings.DirectoryId',\n label: defineMessage({id: 'admin.office365.directoryIdTitle', defaultMessage: 'Directory (tenant) ID:'}),\n help_text: defineMessage({id: 'admin.office365.directoryIdDescription', defaultMessage: 'The Directory (tenant) ID you received when registering your application with Microsoft.'}),\n placeholder: defineMessage({id: 'admin.office365.directoryIdExample', defaultMessage: 'E.g.: \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.OFFICE365_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'Office365Settings.DiscoveryEndpoint',\n label: defineMessage({id: 'admin.openid.discoveryEndpointTitle', defaultMessage: 'Discovery Endpoint:'}),\n help_text: defineMessage({id: 'admin.office365.discoveryEndpointDesc', defaultMessage: 'The URL of the discovery document for OpenID Connect with Entra ID.'}),\n help_text_markdown: false,\n dynamic_value: (value, config, state) => {\n if (state['Office365Settings.DirectoryId']) {\n return 'https://login.microsoftonline.com/' + state['Office365Settings.DirectoryId'] + '/v2.0/.well-known/openid-configuration';\n }\n return 'https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration';\n },\n isDisabled: true,\n isHidden: it.not(it.stateEquals('openidType', Constants.OFFICE365_SERVICE)),\n },\n {\n type: 'text',\n key: 'Office365Settings.Id',\n label: defineMessage({id: 'admin.openid.clientIdTitle', defaultMessage: 'Client ID:'}),\n help_text: defineMessage({id: 'admin.openid.clientIdDescription', defaultMessage: 'Obtaining the Client ID differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.office365.clientIdExample', defaultMessage: 'E.g.: \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.OFFICE365_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'Office365Settings.Secret',\n label: defineMessage({id: 'admin.openid.clientSecretTitle', defaultMessage: 'Client Secret:'}),\n help_text: defineMessage({id: 'admin.openid.clientSecretDescription', defaultMessage: 'Obtaining the Client Secret differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.office365.clientSecretExample', defaultMessage: 'E.g.: \"shAieM47sNBfgl20f8ci294\"'}),\n isHidden: it.not(it.stateEquals('openidType', Constants.OFFICE365_SERVICE)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n\n {\n type: 'text',\n key: 'OpenIdSettings.ButtonText',\n label: defineMessage({id: 'admin.openid.buttonTextTitle', defaultMessage: 'Button Name:'}),\n placeholder: defineMessage({id: 'admin.openid.buttonTextEx', defaultMessage: 'Custom Button Name'}),\n help_text: defineMessage({id: 'admin.openid.buttonTextDesc', defaultMessage: 'The text that will show on the login button.'}),\n isHidden: it.any(it.not(it.stateEquals('openidType', Constants.OPENID_SERVICE)), it.licensedForCloudStarter),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'color',\n key: 'OpenIdSettings.ButtonColor',\n label: defineMessage({id: 'admin.openid.buttonColorTitle', defaultMessage: 'Button Color:'}),\n help_text: defineMessage({id: 'admin.openid.buttonColorDesc', defaultMessage: 'Specify the color of the OpenID login button for white labeling purposes. Use a hex code with a #-sign before the code.'}),\n help_text_markdown: false,\n isHidden: it.any(it.not(it.stateEquals('openidType', Constants.OPENID_SERVICE)), it.licensedForCloudStarter),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'OpenIdSettings.DiscoveryEndpoint',\n label: defineMessage({id: 'admin.openid.discoveryEndpointTitle', defaultMessage: 'Discovery Endpoint:'}),\n placeholder: defineMessage({id: 'admin.openid.discovery.placeholder', defaultMessage: 'https://id.mydomain.com/.well-known/openid-configuration'}),\n help_text: defineMessage({id: 'admin.openid.discoveryEndpointDesc', defaultMessage: 'Enter the URL of the discovery document of the OpenID Connect provider you want to connect with.'}),\n help_text_markdown: false,\n isHidden: it.any(it.not(it.stateEquals('openidType', Constants.OPENID_SERVICE)), it.licensedForCloudStarter),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'OpenIdSettings.Id',\n label: defineMessage({id: 'admin.openid.clientIdTitle', defaultMessage: 'Client ID:'}),\n help_text: defineMessage({id: 'admin.openid.clientIdDescription', defaultMessage: 'Obtaining the Client ID differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.openid.clientIdExample', defaultMessage: 'E.g.: \"adf3sfa2-ag3f-sn4n-ids0-sh1hdax192qq\"'}),\n isHidden: it.any(it.not(it.stateEquals('openidType', Constants.OPENID_SERVICE)), it.licensedForCloudStarter),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'text',\n key: 'OpenIdSettings.Secret',\n label: defineMessage({id: 'admin.openid.clientSecretTitle', defaultMessage: 'Client Secret:'}),\n help_text: defineMessage({id: 'admin.openid.clientSecretDescription', defaultMessage: 'Obtaining the Client Secret differs across providers. Please check you provider\\'s documentation'}),\n placeholder: defineMessage({id: 'admin.openid.clientSecretExample', defaultMessage: 'E.g.: \"H8sz0Az-dDs2p15-7QzD231\"'}),\n isHidden: it.any(it.not(it.stateEquals('openidType', Constants.OPENID_SERVICE)), it.licensedForCloudStarter),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n {\n type: 'custom',\n key: 'OpenIDCustomFeatureDiscovery',\n component: OpenIDCustomFeatureDiscovery,\n isHidden: it.not(it.all(it.stateEquals('openidType', Constants.OPENID_SERVICE), it.licensedForCloudStarter)),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.OPENID)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n openid_feature_discovery: {\n url: 'authentication/openid',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.openid', defaultMessage: 'OpenID Connect'}),\n isHidden: it.any(\n it.any(it.licensedForFeature('OpenId'), it.cloudLicensed),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'OpenIdSettings',\n name: defineMessage({id: 'admin.authentication.openid', defaultMessage: 'OpenID Connect'}),\n settings: [\n {\n type: 'custom',\n component: OpenIDFeatureDiscovery,\n key: 'OpenIDFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true),\n },\n guest_access: {\n url: 'authentication/guest_access',\n title: defineMessage({id: 'admin.sidebar.guest_access', defaultMessage: 'Guest Access'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('GuestAccounts')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.GUEST_ACCESS)),\n ),\n schema: {\n id: 'GuestAccountsSettings',\n name: defineMessage({id: 'admin.authentication.guest_access', defaultMessage: 'Guest Access'}),\n settings: [\n {\n type: 'custom',\n component: CustomEnableDisableGuestAccountsSetting,\n key: 'GuestAccountsSettings.Enable',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.GUEST_ACCESS)),\n },\n {\n type: 'bool',\n key: 'GuestAccountsSettings.HideTags',\n label: defineMessage({id: 'admin.guest_access.hideTags', defaultMessage: 'Hide guest tag'}),\n help_text: defineMessage({id: 'admin.guest_access.hideTagsDescription', defaultMessage: 'When true, the \"guest\" tag will not be shown next to the name of all guest users in the Mattermost chat interface.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.GUEST_ACCESS)),\n },\n {\n type: 'text',\n key: 'GuestAccountsSettings.RestrictCreationToDomains',\n label: defineMessage({id: 'admin.guest_access.whitelistedDomainsTitle', defaultMessage: 'Whitelisted Guest Domains:'}),\n help_text: defineMessage({id: 'admin.guest_access.whitelistedDomainsDescription', defaultMessage: '(Optional) Guest accounts can be created at the system level from this list of allowed guest domains.'}),\n help_text_markdown: true,\n placeholder: defineMessage({id: 'admin.guest_access.whitelistedDomainsExample', defaultMessage: 'E.g.: \"company.com, othercorp.org\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.GUEST_ACCESS)),\n },\n {\n type: 'bool',\n key: 'GuestAccountsSettings.EnforceMultifactorAuthentication',\n label: defineMessage({id: 'admin.guest_access.mfaTitle', defaultMessage: 'Enforce Multi-factor Authentication: '}),\n help_text: defineMessage({id: 'admin.guest_access.mfaDescriptionMFANotEnabled', defaultMessage: '[Multi-factor authentication](./mfa) is currently not enabled.'}),\n help_text_markdown: true,\n isHidden: it.configIsTrue('ServiceSettings', 'EnableMultifactorAuthentication'),\n isDisabled: () => true,\n },\n {\n type: 'bool',\n key: 'GuestAccountsSettings.EnforceMultifactorAuthentication',\n label: defineMessage({id: 'admin.guest_access.mfaTitle', defaultMessage: 'Enforce Multi-factor Authentication: '}),\n help_text: defineMessage({id: 'admin.guest_access.mfaDescriptionMFANotEnforced', defaultMessage: '[Multi-factor authentication](./mfa) is currently not enforced.'}),\n help_text_markdown: true,\n isHidden: it.any(\n it.configIsFalse('ServiceSettings', 'EnableMultifactorAuthentication'),\n it.configIsTrue('ServiceSettings', 'EnforceMultifactorAuthentication'),\n ),\n isDisabled: () => true,\n },\n {\n type: 'bool',\n key: 'GuestAccountsSettings.EnforceMultifactorAuthentication',\n label: defineMessage({id: 'admin.guest_access.mfaTitle', defaultMessage: 'Enforce Multi-factor Authentication: '}),\n help_text: defineMessage({id: 'admin.guest_access.mfaDescription', defaultMessage: 'When true, <link>multi-factor authentication</link> for guests is required for login. New guest users will be required to configure MFA on signup. Logged in guest users without MFA configured are redirected to the MFA setup page until configuration is complete.\\n \\nIf your system has guest users with login methods other than AD/LDAP and email, MFA must be enforced with the authentication provider outside of Mattermost.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.MULTI_FACTOR_AUTH}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isHidden: it.any(\n it.configIsFalse('ServiceSettings', 'EnableMultifactorAuthentication'),\n it.configIsFalse('ServiceSettings', 'EnforceMultifactorAuthentication'),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.AUTHENTICATION.GUEST_ACCESS)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n guest_access_feature_discovery: {\n isDiscovery: true,\n url: 'authentication/guest_access',\n title: defineMessage({id: 'admin.sidebar.guest_access', defaultMessage: 'Guest Access'}),\n isHidden: it.any(\n it.licensedForFeature('GuestAccounts'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'GuestAccountsSettings',\n name: defineMessage({id: 'admin.authentication.guest_access', defaultMessage: 'Guest Access'}),\n settings: [\n {\n type: 'custom',\n component: GuestAccessFeatureDiscovery,\n key: 'GuestAccessFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true),\n },\n },\n },\n plugins: {\n icon: (\n <PowerPlugOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.plugins', defaultMessage: 'Plugins'}),\n id: 'plugins',\n isHidden: it.not(it.userHasReadPermissionOnResource('plugins')),\n subsections: {\n plugin_management: {\n url: 'plugins/plugin_management',\n title: defineMessage({id: 'admin.plugins.pluginManagement', defaultMessage: 'Plugin Management'}),\n searchableStrings: pluginManagementSearchableStrings,\n isDisabled: it.not(it.userHasWritePermissionOnResource('plugins')),\n schema: {\n id: 'PluginManagementSettings',\n component: PluginManagement,\n },\n },\n custom: {\n url: 'plugins/plugin_:plugin_id',\n isDisabled: it.not(it.userHasWritePermissionOnResource('plugins')),\n schema: {\n id: 'CustomPluginSettings',\n component: CustomPluginSettings,\n },\n },\n },\n },\n integrations: {\n icon: (\n <SitemapIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.integrations', defaultMessage: 'Integrations'}),\n id: 'integrations',\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.INTEGRATIONS)),\n subsections: {\n integration_management: {\n url: 'integrations/integration_management',\n title: defineMessage({id: 'admin.integrations.integrationManagement', defaultMessage: 'Integration Management'}),\n isHidden: it.all(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n ),\n schema: {\n id: 'CustomIntegrationSettings',\n name: defineMessage({id: 'admin.integrations.integrationManagement.title', defaultMessage: 'Integration Management'}),\n settings: [\n {\n type: 'bool',\n key: 'ServiceSettings.EnableIncomingWebhooks',\n label: defineMessage({id: 'admin.service.webhooksTitle', defaultMessage: 'Enable Incoming Webhooks: '}),\n help_text: defineMessage({id: 'admin.service.webhooksDescription', defaultMessage: 'When true, incoming webhooks will be allowed. To help combat phishing attacks, all posts from webhooks will be labelled by a BOT tag. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n href={DeveloperLinks.INCOMING_WEBHOOKS}\n location='admin_console'\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableOutgoingWebhooks',\n label: defineMessage({id: 'admin.service.outWebhooksTitle', defaultMessage: 'Enable Outgoing Webhooks: '}),\n help_text: defineMessage({id: 'admin.service.outWebhooksDesc', defaultMessage: 'When true, outgoing webhooks will be allowed. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.OUTGOING_WEBHOOKS}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableOutgoingOAuthConnections',\n label: defineMessage({id: 'admin.service.outgoingOAuthConnectionsTitle', defaultMessage: 'Enable Outgoing OAuth Connections: '}),\n help_text: defineMessage({id: 'admin.service.outgoingOAuthConnectionsDesc', defaultMessage: 'When true, outgoing webhooks and slash commands will use set up oauth connections to authenticate with third party services. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (text: string) => (\n <a href='https://mattermost.com/pl/outgoing-oauth-connections'>{text}</a>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableCommands',\n label: defineMessage({id: 'admin.service.cmdsTitle', defaultMessage: 'Enable Custom Slash Commands: '}),\n help_text: defineMessage({id: 'admin.service.cmdsDesc', defaultMessage: 'When true, custom slash commands will be allowed. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.SETUP_CUSTOM_SLASH_COMMANDS}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableOAuthServiceProvider',\n label: defineMessage({id: 'admin.oauth.providerTitle', defaultMessage: 'Enable OAuth 2.0 Service Provider: '}),\n help_text: defineMessage({id: 'admin.oauth.providerDescription', defaultMessage: 'When true, Mattermost can act as an OAuth 2.0 service provider allowing Mattermost to authorize API requests from external applications. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.ENABLE_OAUTH2}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'number',\n key: 'ServiceSettings.OutgoingIntegrationRequestsTimeout',\n label: defineMessage({id: 'admin.service.integrationRequestTitle', defaultMessage: 'Integration request timeout: '}),\n help_text: defineMessage({id: 'admin.service.integrationRequestDesc', defaultMessage: 'The number of seconds to wait for Integration requests. That includes <slashCommands>Slash Commands</slashCommands>, <outgoingWebhooks>Outgoing Webhooks</outgoingWebhooks>, <interactiveMessages>Interactive Messages</interactiveMessages> and <interactiveDialogs>Interactive Dialogs</interactiveDialogs>.'}),\n help_text_values: {\n slashCommands: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.CUSTOM_SLASH_COMMANDS}\n >\n {msg}\n </ExternalLink>\n ),\n outgoingWebhooks: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.OUTGOING_WEBHOOKS}\n >\n {msg}\n </ExternalLink>\n ),\n interactiveMessages: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.INTERACTIVE_MESSAGES}\n >\n {msg}\n </ExternalLink>\n ),\n interactiveDialogs: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.INTERACTIVE_DIALOGS}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnablePostUsernameOverride',\n label: defineMessage({id: 'admin.service.overrideTitle', defaultMessage: 'Enable integrations to override usernames:'}),\n help_text: defineMessage({id: 'admin.service.overrideDescription', defaultMessage: 'When true, webhooks, slash commands and other integrations will be allowed to change the username they are posting as. Note: Combined with allowing integrations to override profile picture icons, users may be able to perform phishing attacks by attempting to impersonate other users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnablePostIconOverride',\n label: defineMessage({id: 'admin.service.iconTitle', defaultMessage: 'Enable integrations to override profile picture icons:'}),\n help_text: defineMessage({id: 'admin.service.iconDescription', defaultMessage: 'When true, webhooks, slash commands and other integrations will be allowed to change the profile picture they post with. Note: Combined with allowing integrations to override usernames, users may be able to perform phishing attacks by attempting to impersonate other users.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableUserAccessTokens',\n label: defineMessage({id: 'admin.service.userAccessTokensTitle', defaultMessage: 'Enable User Access Tokens: '}),\n help_text: defineMessage({id: 'admin.service.userAccessTokensDescription', defaultMessage: 'When true, users can create <link>user access tokens</link> for integrations in <strong>Account Menu > Account Settings > Security</strong>. They can be used to authenticate against the API and give full access to the account.\\n\\n To manage who can create personal access tokens or to search users by token ID, go to the <strong>User Management > Users</strong> page.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DeveloperLinks.PERSONAL_ACCESS_TOKENS}\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.INTEGRATION_MANAGEMENT)),\n },\n ],\n },\n },\n bot_accounts: {\n url: 'integrations/bot_accounts',\n title: defineMessage({id: 'admin.integrations.botAccounts', defaultMessage: 'Bot Accounts'}),\n isHidden: it.all(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.BOT_ACCOUNTS)),\n ),\n schema: {\n id: 'BotAccountSettings',\n name: defineMessage({id: 'admin.integrations.botAccounts.title', defaultMessage: 'Bot Accounts'}),\n settings: [\n {\n type: 'bool',\n key: 'ServiceSettings.EnableBotAccountCreation',\n label: defineMessage({id: 'admin.service.enableBotTitle', defaultMessage: 'Enable Bot Account Creation: '}),\n help_text: defineMessage({id: 'admin.service.enableBotAccountCreation', defaultMessage: 'When true, System Admins can create bot accounts for integrations in <linkBots>Integrations > Bot Accounts</linkBots>. Bot accounts are similar to user accounts except they cannot be used to log in. See <linkDocumentation>documentation</linkDocumentation> to learn more.'}),\n help_text_markdown: false,\n help_text_values: {\n siteURL: getSiteURL(),\n linkDocumentation: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href='https://mattermost.com/pl/default-bot-accounts'\n >\n {msg}\n </ExternalLink>\n ),\n linkBots: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={`${getSiteURL()}/_redirect/integrations/bots`}\n >\n {msg}\n </ExternalLink>\n ),\n },\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.BOT_ACCOUNTS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.DisableBotsWhenOwnerIsDeactivated',\n label: defineMessage({id: 'admin.service.disableBotOwnerDeactivatedTitle', defaultMessage: 'Disable bot accounts when owner is deactivated:'}),\n help_text: defineMessage({id: 'admin.service.disableBotWhenOwnerIsDeactivated', defaultMessage: 'When a user is deactivated, disables all bot accounts managed by the user. To re-enable bot accounts, go to [Integrations > Bot Accounts]({siteURL}/_redirect/integrations/bots).'}),\n help_text_markdown: true,\n help_text_values: {siteURL: getSiteURL()},\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.BOT_ACCOUNTS)),\n },\n ],\n },\n },\n gif: {\n url: 'integrations/gif',\n title: defineMessage({id: 'admin.sidebar.gif', defaultMessage: 'GIF'}),\n isHidden: it.all(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.GIF)),\n ),\n schema: {\n id: 'GifSettings',\n name: defineMessage({id: 'admin.integrations.gif', defaultMessage: 'GIF'}),\n settings: [\n {\n type: 'bool',\n key: 'ServiceSettings.EnableGifPicker',\n label: defineMessage({id: 'admin.customization.enableGifPickerTitle', defaultMessage: 'Enable GIF Picker:'}),\n help_text: defineMessage({id: 'admin.customization.enableGifPickerDesc', defaultMessage: 'Allows users to select GIFs from the emoji picker.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.GIF)),\n },\n ],\n },\n },\n cors: {\n url: 'integrations/cors',\n title: defineMessage({id: 'admin.sidebar.cors', defaultMessage: 'CORS'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.CORS)),\n ),\n schema: {\n id: 'CORS',\n name: defineMessage({id: 'admin.integrations.cors', defaultMessage: 'CORS'}),\n settings: [\n {\n type: 'text',\n key: 'ServiceSettings.AllowCorsFrom',\n label: defineMessage({id: 'admin.service.corsTitle', defaultMessage: 'Enable cross-origin requests from:'}),\n placeholder: defineMessage({id: 'admin.service.corsEx', defaultMessage: 'http://example.com'}),\n help_text: defineMessage({id: 'admin.service.corsDescription', defaultMessage: 'Enable HTTP Cross origin request from a specific domain. Use \"*\" if you want to allow CORS from any domain or leave it blank to disable it. Should not be set to \"*\" in production.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.CORS)),\n },\n {\n type: 'text',\n key: 'ServiceSettings.CorsExposedHeaders',\n label: defineMessage({id: 'admin.service.corsExposedHeadersTitle', defaultMessage: 'CORS Exposed Headers:'}),\n placeholder: defineMessage({id: 'admin.service.corsHeadersEx', defaultMessage: 'X-My-Header'}),\n help_text: defineMessage({id: 'admin.service.corsExposedHeadersDescription', defaultMessage: 'Whitelist of headers that will be accessible to the requester.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.CORS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.CorsAllowCredentials',\n label: defineMessage({id: 'admin.service.corsAllowCredentialsLabel', defaultMessage: 'CORS Allow Credentials:'}),\n help_text: defineMessage({id: 'admin.service.corsAllowCredentialsDescription', defaultMessage: 'When true, requests that pass validation will include the Access-Control-Allow-Credentials header.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.CORS)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.CorsDebug',\n label: defineMessage({id: 'admin.service.CorsDebugLabel', defaultMessage: 'CORS Debug:'}),\n help_text: defineMessage({id: 'admin.service.corsDebugDescription', defaultMessage: 'When true, prints messages to the logs to help when developing an integration that uses CORS. These messages will include the structured key value pair \"source\":\"cors\".'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.INTEGRATIONS.CORS)),\n },\n ],\n },\n },\n },\n },\n compliance: {\n icon: (\n <FormatListBulletedIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.compliance', defaultMessage: 'Compliance'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.COMPLIANCE)),\n subsections: {\n custom_policy_form_edit: {\n url: `compliance/data_retention_settings/custom_policy/:policy_id(${ID_PATH_PATTERN})`,\n isHidden: it.any(\n it.not(it.licensedForFeature('DataRetention')),\n it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n schema: {\n id: 'CustomDataRetentionForm',\n component: CustomDataRetentionForm,\n },\n\n },\n custom_policy_form: {\n url: 'compliance/data_retention_settings/custom_policy',\n isHidden: it.any(\n it.not(it.licensedForFeature('DataRetention')),\n it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n schema: {\n id: 'CustomDataRetentionForm',\n component: CustomDataRetentionForm,\n },\n\n },\n global_policy_form: {\n url: 'compliance/data_retention_settings/global_policy',\n isHidden: it.any(\n it.not(it.licensedForFeature('DataRetention')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n schema: {\n id: 'GlobalDataRetentionForm',\n component: GlobalDataRetentionForm,\n },\n },\n data_retention: {\n url: 'compliance/data_retention_settings',\n title: defineMessage({id: 'admin.sidebar.dataRetentionSettingsPolicies', defaultMessage: 'Data Retention Policies'}),\n searchableStrings: [\n adminDefinitionMessages.data_retention_title,\n ...dataRetentionSearchableStrings,\n ],\n isHidden: it.any(\n it.not(it.licensedForFeature('DataRetention')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.DATA_RETENTION_POLICY)),\n schema: {\n id: 'DataRetentionSettings',\n component: DataRetentionSettings,\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n data_retention_feature_discovery: {\n url: 'compliance/data_retention',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.dataRetentionPolicy', defaultMessage: 'Data Retention Policy'}),\n isHidden: it.any(\n it.licensedForFeature('DataRetention'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'DataRetentionSettings',\n name: adminDefinitionMessages.data_retention_title,\n settings: [\n {\n type: 'custom',\n component: DataRetentionFeatureDiscovery,\n key: 'DataRetentionFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true, LicenseSkus.Enterprise),\n },\n message_export: {\n url: 'compliance/export',\n title: defineMessage({id: 'admin.sidebar.complianceExport', defaultMessage: 'Compliance Export'}),\n searchableStrings: messageExportSearchableStrings,\n isHidden: it.any(\n it.not(it.licensedForFeature('MessageExport')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_EXPORT)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_EXPORT)),\n schema: {\n id: 'MessageExportSettings',\n component: MessageExportSettings,\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n compliance_export_feature_discovery: {\n isDiscovery: true,\n url: 'compliance/export',\n title: defineMessage({id: 'admin.sidebar.complianceExport', defaultMessage: 'Compliance Export'}),\n isHidden: it.any(\n it.licensedForFeature('MessageExport'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'MessageExportSettings',\n name: defineMessage({id: 'admin.complianceExport.title', defaultMessage: 'Compliance Export'}),\n settings: [\n {\n type: 'custom',\n component: ComplianceExportFeatureDiscovery,\n key: 'ComplianceExportFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true, LicenseSkus.Enterprise),\n },\n audits: {\n url: 'compliance/monitoring',\n title: defineMessage({id: 'admin.sidebar.complianceMonitoring', defaultMessage: 'Compliance Monitoring'}),\n isHidden: it.any(\n it.not(it.licensedForFeature('Compliance')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_MONITORING)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_MONITORING)),\n searchableStrings: auditSearchableStrings,\n schema: {\n id: 'Audits',\n name: defineMessage({id: 'admin.compliance.complianceMonitoring', defaultMessage: 'Compliance Monitoring'}),\n component: Audits,\n isHidden: it.not(it.licensedForFeature('Compliance')),\n settings: [\n {\n type: 'banner',\n label: defineMessage({id: 'admin.compliance.newComplianceExportBanner', defaultMessage: 'This feature is replaced by a new <link>Compliance Export</link> feature, and will be removed in a future release. We recommend migrating to the new system.'}),\n label_values: {\n link: (msg: string) => (\n <Link to='/admin_console/compliance/export'>\n {msg}\n </Link>\n ),\n },\n banner_type: 'info',\n isHidden: it.not(it.licensedForFeature('Compliance')),\n },\n {\n type: 'bool',\n key: 'ComplianceSettings.Enable',\n label: defineMessage({id: 'admin.compliance.enableTitle', defaultMessage: 'Enable Compliance Reporting:'}),\n help_text: defineMessage({id: 'admin.compliance.enableDesc', defaultMessage: 'When true, Mattermost allows compliance reporting from the <strong>Compliance and Auditing</strong> tab. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.COMPILANCE_MONITORING}\n >\n {msg}\n </ExternalLink>\n ),\n strong: (msg: string) => <strong>{msg}</strong>,\n },\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('Compliance')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_MONITORING)),\n },\n {\n type: 'text',\n key: 'ComplianceSettings.Directory',\n label: defineMessage({id: 'admin.compliance.directoryTitle', defaultMessage: 'Compliance Report Directory:'}),\n help_text: defineMessage({id: 'admin.compliance.directoryDescription', defaultMessage: 'Directory to which compliance reports are written. If blank, will be set to ./data/.'}),\n placeholder: defineMessage({id: 'admin.compliance.directoryExample', defaultMessage: 'E.g.: \"./data/\"'}),\n isHidden: it.not(it.licensedForFeature('Compliance')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_MONITORING)),\n it.stateIsFalse('ComplianceSettings.Enable'),\n ),\n },\n {\n type: 'bool',\n key: 'ComplianceSettings.EnableDaily',\n label: defineMessage({id: 'admin.compliance.enableDailyTitle', defaultMessage: 'Enable Daily Report:'}),\n help_text: defineMessage({id: 'admin.compliance.enableDailyDesc', defaultMessage: 'When true, Mattermost will generate a daily compliance report.'}),\n isHidden: it.not(it.licensedForFeature('Compliance')),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.COMPLIANCE_MONITORING)),\n it.stateIsFalse('ComplianceSettings.Enable'),\n ),\n },\n ],\n },\n },\n custom_terms_of_service: {\n url: 'compliance/custom_terms_of_service',\n title: defineMessage({id: 'admin.sidebar.customTermsOfService', defaultMessage: 'Custom Terms of Service'}),\n searchableStrings: customTermsOfServiceSearchableStrings,\n isHidden: it.any(\n it.not(it.licensedForFeature('CustomTermsOfService')),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.COMPLIANCE.CUSTOM_TERMS_OF_SERVICE)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.COMPLIANCE.CUSTOM_TERMS_OF_SERVICE)),\n schema: {\n id: 'TermsOfServiceSettings',\n component: CustomTermsOfServiceSettings,\n },\n restrictedIndicator: getRestrictedIndicator(),\n },\n custom_terms_of_service_feature_discovery: {\n url: 'compliance/custom_terms_of_service',\n isDiscovery: true,\n title: defineMessage({id: 'admin.sidebar.customTermsOfService', defaultMessage: 'Custom Terms of Service'}),\n isHidden: it.any(\n it.licensedForFeature('CustomTermsOfService'),\n it.not(it.enterpriseReady),\n ),\n schema: {\n id: 'TermsOfServiceSettings',\n name: customTermsOfServiceMessages.termsOfServiceTitle,\n settings: [\n {\n type: 'custom',\n component: CustomTermsOfServiceFeatureDiscovery,\n key: 'CustomTermsOfServiceFeatureDiscovery',\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.ABOUT.EDITION_AND_LICENSE)),\n },\n ],\n },\n restrictedIndicator: getRestrictedIndicator(true, LicenseSkus.Enterprise),\n },\n },\n },\n experimental: {\n icon: (\n <FlaskOutlineIcon\n size={16}\n color={'currentColor'}\n />\n ),\n sectionTitle: defineMessage({id: 'admin.sidebar.experimental', defaultMessage: 'Experimental'}),\n isHidden: it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.EXPERIMENTAL)),\n subsections: {\n experimental_features: {\n url: 'experimental/features',\n title: defineMessage({id: 'admin.sidebar.experimentalFeatures', defaultMessage: 'Features'}),\n isHidden: it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n schema: {\n id: 'ExperimentalSettings',\n name: defineMessage({id: 'admin.experimental.experimentalFeatures', defaultMessage: 'Experimental Features'}),\n settings: [\n {\n type: 'color',\n key: 'LdapSettings.LoginButtonColor',\n label: defineMessage({id: 'admin.experimental.ldapSettingsLoginButtonColor.title', defaultMessage: 'AD/LDAP Login Button Color:'}),\n help_text: defineMessage({id: 'admin.experimental.ldapSettingsLoginButtonColor.desc', defaultMessage: 'Specify the color of the AD/LDAP login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('LDAP')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'LdapSettings.LoginButtonBorderColor',\n label: defineMessage({id: 'admin.experimental.ldapSettingsLoginButtonBorderColor.title', defaultMessage: 'AD/LDAP Login Button Border Color:'}),\n help_text: defineMessage({id: 'admin.experimental.ldapSettingsLoginButtonBorderColor.desc', defaultMessage: 'Specify the color of the AD/LDAP login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('LDAP')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'LdapSettings.LoginButtonTextColor',\n label: defineMessage({id: 'admin.experimental.ldapSettingsLoginButtonTextColor.title', defaultMessage: 'AD/LDAP Login Button Text Color:'}),\n help_text: defineMessage({id: 'admin.experimental.ldapSettingsLoginButtonTextColor.desc', defaultMessage: 'Specify the color of the AD/LDAP login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('LDAP')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.ExperimentalEnableAuthenticationTransfer',\n label: defineMessage({id: 'admin.experimental.experimentalEnableAuthenticationTransfer.title', defaultMessage: 'Allow Authentication Transfer:'}),\n help_text: defineMessage({id: 'admin.experimental.experimentalEnableAuthenticationTransfer.desc', defaultMessage: 'When true, users can change their sign-in method to any that is enabled on the server, any via Account Settings or the APIs. When false, Users cannot change their sign-in method, regardless of which authentication options are enabled.'}),\n help_text_markdown: false,\n isHidden: it.any( // documented as E20 and higher, but only E10 in the code\n it.not(it.licensed),\n it.licensedForSku('starter'),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'number',\n key: 'ExperimentalSettings.LinkMetadataTimeoutMilliseconds',\n label: defineMessage({id: 'admin.experimental.linkMetadataTimeoutMilliseconds.title', defaultMessage: 'Link Metadata Timeout:'}),\n help_text: defineMessage({id: 'admin.experimental.linkMetadataTimeoutMilliseconds.desc', defaultMessage: 'The number of milliseconds to wait for metadata from a third-party link. Used with Post Metadata.'}),\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.experimental.linkMetadataTimeoutMilliseconds.example', defaultMessage: 'E.g.: \"5000\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'number',\n key: 'EmailSettings.EmailBatchingBufferSize',\n label: defineMessage({id: 'admin.experimental.emailBatchingBufferSize.title', defaultMessage: 'Email Batching Buffer Size:'}),\n help_text: defineMessage({id: 'admin.experimental.emailBatchingBufferSize.desc', defaultMessage: 'Specify the maximum number of notifications batched into a single email.'}),\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.experimental.emailBatchingBufferSize.example', defaultMessage: 'E.g.: \"256\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'number',\n key: 'EmailSettings.EmailBatchingInterval',\n label: defineMessage({id: 'admin.experimental.emailBatchingInterval.title', defaultMessage: 'Email Batching Interval:'}),\n help_text: defineMessage({id: 'admin.experimental.emailBatchingInterval.desc', defaultMessage: 'Specify the maximum frequency, in seconds, which the batching job checks for new notifications. Longer batching intervals will increase performance.'}),\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.experimental.emailBatchingInterval.example', defaultMessage: 'E.g.: \"30\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'EmailSettings.LoginButtonColor',\n label: defineMessage({id: 'admin.experimental.emailSettingsLoginButtonColor.title', defaultMessage: 'Email Login Button Color:'}),\n help_text: defineMessage({id: 'admin.experimental.emailSettingsLoginButtonColor.desc', defaultMessage: 'Specify the color of the email login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'EmailSettings.LoginButtonBorderColor',\n label: defineMessage({id: 'admin.experimental.emailSettingsLoginButtonBorderColor.title', defaultMessage: 'Email Login Button Border Color:'}),\n help_text: defineMessage({id: 'admin.experimental.emailSettingsLoginButtonBorderColor.desc', defaultMessage: 'Specify the color of the email login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'EmailSettings.LoginButtonTextColor',\n label: defineMessage({id: 'admin.experimental.emailSettingsLoginButtonTextColor.title', defaultMessage: 'Email Login Button Text Color:'}),\n help_text: defineMessage({id: 'admin.experimental.emailSettingsLoginButtonTextColor.desc', defaultMessage: 'Specify the color of the email login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.EnableUserDeactivation',\n label: defineMessage({id: 'admin.experimental.enableUserDeactivation.title', defaultMessage: 'Enable Account Deactivation:'}),\n help_text: defineMessage({id: 'admin.experimental.enableUserDeactivation.desc', defaultMessage: 'When true, users may deactivate their own account from **Settings > Advanced**. If a user deactivates their own account, they will get an email notification confirming they were deactivated. When false, users may not deactivate their own account.'}),\n help_text_markdown: true,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'TeamSettings.ExperimentalEnableAutomaticReplies',\n label: defineMessage({id: 'admin.experimental.experimentalEnableAutomaticReplies.title', defaultMessage: 'Enable Automatic Replies:'}),\n help_text: defineMessage({id: 'admin.experimental.experimentalEnableAutomaticReplies.desc', defaultMessage: 'When true, users can enable Automatic Replies in **Settings > Notifications**. Users set a custom message that will be automatically sent in response to Direct Messages. When false, disables the Automatic Direct Message Replies feature and hides it from Settings.'}),\n help_text_markdown: true,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableChannelViewedMessages',\n label: defineMessage({id: 'admin.experimental.enableChannelViewedMessages.title', defaultMessage: 'Enable Channel Viewed WebSocket Messages:'}),\n help_text: defineMessage({id: 'admin.experimental.enableChannelViewedMessages.desc', defaultMessage: 'This setting determines whether `channel_viewed` WebSocket events are sent, which synchronize unread notifications across clients and devices. Disabling the setting in larger deployments may improve server performance.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ExperimentalSettings.ClientSideCertEnable',\n label: defineMessage({id: 'admin.experimental.clientSideCertEnable.title', defaultMessage: 'Enable Client-Side Certification:'}),\n help_text: defineMessage({id: 'admin.experimental.clientSideCertEnable.desc', defaultMessage: 'Enables client-side certification for your Mattermost server. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.ENABLE_CLIENT_SIDE_CERTIFICATION}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isHidden: it.not(it.any(\n it.licensedForSku(LicenseSkus.Enterprise),\n it.licensedForSku(LicenseSkus.E20))),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'dropdown',\n key: 'ExperimentalSettings.ClientSideCertCheck',\n label: defineMessage({id: 'admin.experimental.clientSideCertCheck.title', defaultMessage: 'Client-Side Certification Login Method:'}),\n help_text: defineMessage({id: 'admin.experimental.clientSideCertCheck.desc', defaultMessage: 'When **primary**, after the client side certificate is verified, user’s email is retrieved from the certificate and is used to log in without a password. When **secondary**, after the client side certificate is verified, user’s email is retrieved from the certificate and matched against the one supplied by the user. If they match, the user logs in with regular email/password credentials.'}),\n help_text_markdown: true,\n options: [\n {\n value: 'primary',\n display_name: defineMessage({id: 'admin.experimental.clientSideCertCheck.options.primary', defaultMessage: 'primary'}),\n },\n {\n value: 'secondary',\n display_name: defineMessage({id: 'admin.experimental.clientSideCertCheck.options.secondary', defaultMessage: 'secondary'}),\n },\n ],\n isHidden: it.not(it.any(\n it.licensedForSku(LicenseSkus.Enterprise),\n it.licensedForSku(LicenseSkus.E20))),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n it.stateIsFalse('ExperimentalSettings.ClientSideCertEnable'),\n ),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.ExperimentalEnableDefaultChannelLeaveJoinMessages',\n label: defineMessage({id: 'admin.experimental.experimentalEnableDefaultChannelLeaveJoinMessages.title', defaultMessage: 'Enable Default Channel Leave/Join System Messages:'}),\n help_text: defineMessage({id: 'admin.experimental.experimentalEnableDefaultChannelLeaveJoinMessages.desc', defaultMessage: 'This setting determines whether team leave/join system messages are posted in the default town-square channel.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.ExperimentalEnableHardenedMode',\n label: defineMessage({id: 'admin.experimental.experimentalEnableHardenedMode.title', defaultMessage: 'Enable Hardened Mode:'}),\n help_text: defineMessage({id: 'admin.experimental.experimentalEnableHardenedMode.desc', defaultMessage: 'Enables a hardened mode for Mattermost that makes user experience trade-offs in the interest of security. See <link>documentation</link> to learn more.'}),\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console'\n href={DocLinks.ENABLE_HARDENED_MODE}\n >\n {msg}\n </ExternalLink>\n ),\n },\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ThemeSettings.EnableThemeSelection',\n label: defineMessage({id: 'admin.experimental.enableThemeSelection.title', defaultMessage: 'Enable Theme Selection:'}),\n help_text: defineMessage({id: 'admin.experimental.enableThemeSelection.desc', defaultMessage: 'Enables the **Display > Theme** tab in Settings so users can select their theme.'}),\n help_text_markdown: true,\n isHidden: it.any(\n it.not(it.licensed),\n it.licensedForSku('starter'),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ThemeSettings.AllowCustomThemes',\n label: defineMessage({id: 'admin.experimental.allowCustomThemes.title', defaultMessage: 'Allow Custom Themes:'}),\n help_text: defineMessage({id: 'admin.experimental.allowCustomThemes.desc', defaultMessage: 'Enables the **Display > Theme > Custom Theme** section in Settings.'}),\n help_text_markdown: true,\n isHidden: it.any(\n it.not(it.licensed),\n it.licensedForSku('starter'),\n ),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n it.stateIsFalse('ThemeSettings.EnableThemeSelection'),\n ),\n },\n {\n type: 'dropdown',\n key: 'ThemeSettings.DefaultTheme',\n label: defineMessage({id: 'admin.experimental.defaultTheme.title', defaultMessage: 'Default Theme:'}),\n help_text: defineMessage({id: 'admin.experimental.defaultTheme.desc', defaultMessage: 'Set a default theme that applies to all new users on the system.'}),\n help_text_markdown: true,\n options: [\n {\n value: 'denim',\n display_name: defineMessage({id: 'admin.experimental.defaultTheme.options.denim', defaultMessage: 'Denim'}),\n },\n {\n value: 'sapphire',\n display_name: defineMessage({id: 'admin.experimental.defaultTheme.options.sapphire', defaultMessage: 'Sapphire'}),\n },\n {\n value: 'quartz',\n display_name: defineMessage({id: 'admin.experimental.defaultTheme.options.quartz', defaultMessage: 'Quartz'}),\n },\n {\n value: 'indigo',\n display_name: defineMessage({id: 'admin.experimental.defaultTheme.options.indigo', defaultMessage: 'Indigo'}),\n },\n {\n value: 'onyx',\n display_name: defineMessage({id: 'admin.experimental.defaultTheme.options.onyx', defaultMessage: 'Onyx'}),\n },\n ],\n isHidden: it.any(\n it.not(it.licensed),\n it.licensedForSku('starter'),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableTutorial',\n label: defineMessage({id: 'admin.experimental.enableTutorial.title', defaultMessage: 'Enable Tutorial:'}),\n help_text: defineMessage({id: 'admin.experimental.enableTutorial.desc', defaultMessage: 'When true, users are prompted with a tutorial when they open Mattermost for the first time after account creation. When false, the tutorial is disabled, and users are placed in Town Square when they open Mattermost for the first time after account creation.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableOnboardingFlow',\n label: defineMessage({id: 'admin.experimental.enableOnboardingFlow.title', defaultMessage: 'Enable Onboarding:'}),\n help_text: defineMessage({id: 'admin.experimental.enableOnboardingFlow.desc', defaultMessage: 'When true, new users are shown steps to complete as part of an onboarding process'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ServiceSettings.EnableUserTypingMessages',\n label: defineMessage({id: 'admin.experimental.enableUserTypingMessages.title', defaultMessage: 'Enable User Typing Messages:'}),\n help_text: defineMessage({id: 'admin.experimental.enableUserTypingMessages.desc', defaultMessage: 'This setting determines whether \"user is typing...\" messages are displayed below the message box. Disabling the setting in larger deployments may improve server performance.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'number',\n key: 'ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds',\n label: defineMessage({id: 'admin.experimental.timeBetweenUserTypingUpdatesMilliseconds.title', defaultMessage: 'User Typing Timeout:'}),\n help_text: defineMessage({id: 'admin.experimental.timeBetweenUserTypingUpdatesMilliseconds.desc', defaultMessage: 'The number of milliseconds to wait between emitting user typing websocket events.'}),\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.experimental.timeBetweenUserTypingUpdatesMilliseconds.example', defaultMessage: 'E.g.: \"5000\"'}),\n isDisabled: it.any(\n it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n it.stateIsFalse('ServiceSettings.EnableUserTypingMessages'),\n ),\n },\n {\n type: 'number',\n key: 'ExperimentalSettings.UsersStatusAndProfileFetchingPollIntervalMilliseconds',\n label: defineMessage({id: 'admin.experimental.UsersStatusAndProfileFetchingPollIntervalMilliseconds.title', defaultMessage: 'User\\'s Status and Profile Fetching Poll Interval:'}),\n help_text: defineMessage({id: 'admin.experimental.UsersStatusAndProfileFetchingPollIntervalMilliseconds.desc', defaultMessage: 'The number of milliseconds to wait between fetching user statuses and profiles periodically.'}),\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.experimental.timeBetweenUserTypingUpdatesMilliseconds.example', defaultMessage: 'E.g.: \"5000\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'text',\n key: 'TeamSettings.ExperimentalPrimaryTeam',\n label: defineMessage({id: 'admin.experimental.experimentalPrimaryTeam.title', defaultMessage: 'Primary Team:'}),\n help_text: defineMessage({id: 'admin.experimental.experimentalPrimaryTeam.desc', defaultMessage: 'The primary team of which users on the server are members. When a primary team is set, the options to join other teams or leave the primary team are disabled.'}),\n help_text_markdown: true,\n placeholder: defineMessage({id: 'admin.experimental.experimentalPrimaryTeam.example', defaultMessage: 'E.g.: \"teamname\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'SamlSettings.LoginButtonColor',\n label: defineMessage({id: 'admin.experimental.samlSettingsLoginButtonColor.title', defaultMessage: 'SAML Login Button Color:'}),\n help_text: defineMessage({id: 'admin.experimental.samlSettingsLoginButtonColor.desc', defaultMessage: 'Specify the color of the SAML login button for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('SAML')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'SamlSettings.LoginButtonBorderColor',\n label: defineMessage({id: 'admin.experimental.samlSettingsLoginButtonBorderColor.title', defaultMessage: 'SAML Login Button Border Color:'}),\n help_text: defineMessage({id: 'admin.experimental.samlSettingsLoginButtonBorderColor.desc', defaultMessage: 'Specify the color of the SAML login button border for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('SAML')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'color',\n key: 'SamlSettings.LoginButtonTextColor',\n label: defineMessage({id: 'admin.experimental.samlSettingsLoginButtonTextColor.title', defaultMessage: 'SAML Login Button Text Color:'}),\n help_text: defineMessage({id: 'admin.experimental.samlSettingsLoginButtonTextColor.desc', defaultMessage: 'Specify the color of the SAML login button text for white labeling purposes. Use a hex code with a #-sign before the code. This setting only applies to the mobile apps.'}),\n help_text_markdown: false,\n isHidden: it.not(it.licensedForFeature('SAML')),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'EmailSettings.UseChannelInEmailNotifications',\n label: defineMessage({id: 'admin.experimental.useChannelInEmailNotifications.title', defaultMessage: 'Use Channel Name in Email Notifications:'}),\n help_text: defineMessage({id: 'admin.experimental.useChannelInEmailNotifications.desc', defaultMessage: 'When true, channel and team name appears in email notification subject lines. Useful for servers using only one team. When false, only team name appears in email notification subject line.'}),\n help_text_markdown: false,\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'number',\n key: 'TeamSettings.UserStatusAwayTimeout',\n label: defineMessage({id: 'admin.experimental.userStatusAwayTimeout.title', defaultMessage: 'User Status Away Timeout:'}),\n help_text: defineMessage({id: 'admin.experimental.userStatusAwayTimeout.desc', defaultMessage: 'This setting defines the number of seconds after which the user’s status indicator changes to \"Away\", when they are away from Mattermost.'}),\n help_text_markdown: false,\n placeholder: defineMessage({id: 'admin.experimental.userStatusAwayTimeout.example', defaultMessage: 'E.g.: \"300\"'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ExperimentalSettings.DisableAppBar',\n label: defineMessage({id: 'admin.experimental.disableAppBar.title', defaultMessage: 'Disable Apps Bar:'}),\n help_text: defineMessage({id: 'admin.experimental.disableAppBar.desc', defaultMessage: 'When false, all integrations move from the channel header to the Apps Bar. Channel header plugin icons that haven\\'t explicitly registered an Apps Bar icon will be moved to the Apps Bar which may result in rendering issues.'}),\n help_text_markdown: true,\n isHidden: it.licensedForFeature('Cloud'),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ExperimentalSettings.DisableRefetchingOnBrowserFocus',\n label: defineMessage({id: 'admin.experimental.disableRefetchingOnBrowserFocus.title', defaultMessage: 'Disable data refetching on browser refocus:'}),\n help_text: defineMessage({id: 'admin.experimental.disableRefetchingOnBrowserFocus.desc', defaultMessage: 'When true, Mattermost will not refetch channels and channel members when the browser regains focus. This may result in improved performance for users with many channels and channel members.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ExperimentalSettings.DisableWakeUpReconnectHandler',\n label: defineMessage({id: 'admin.experimental.disableWakeUpReconnectHandler.title', defaultMessage: 'Disable Wake Up Reconnect Handler:'}),\n help_text: defineMessage({id: 'admin.experimental.disableWakeUpReconnectHandler.desc', defaultMessage: 'When true, Mattermost will not attempt to detect when the computer has woken up and refetch data. This might reduce the amount of regular network traffic the app is sending.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ExperimentalSettings.DelayChannelAutocomplete',\n label: defineMessage({id: 'admin.experimental.delayChannelAutocomplete.title', defaultMessage: 'Delay Channel Autocomplete:'}),\n help_text: defineMessage({id: 'admin.experimental.delayChannelAutocomplete.desc', defaultMessage: 'When true, the autocomplete for channel links (such as ~town-square) will only trigger after typing a tilde followed by a couple letters. When false, the autocomplete will appear as soon as the user types a tilde.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n {\n type: 'bool',\n key: 'ExperimentalSettings.YoutubeReferrerPolicy',\n label: defineMessage({id: 'admin.experimental.youtubeReferrerPolicy.title', defaultMessage: 'YouTube Referrer Policy:'}),\n help_text: defineMessage({id: 'admin.experimental.youtubeReferrerPolicy.desc', defaultMessage: 'When true, the referrer policy for embedded YouTube videos will be set to \"strict-origin-when-cross-origin\" which resolves issues where YouTube video previews display as unavailable, while balancing the need to protect user privacy with some degree of referral data to support web functionalities, like analytics, logging, and third-party integrations. When false, the referrer policy will be set to \"no-referrer\" which enhances user privacy by not disclosing the source URL, but limits the ability to track user engagement and traffic sources in analytics tools.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n },\n ],\n },\n },\n feature_flags: {\n url: 'experimental/feature_flags',\n title: featureFlagsMessages.title,\n isHidden: it.any(\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURE_FLAGS)),\n ),\n isDisabled: true,\n searchableStrings: [\n featureFlagsMessages.title,\n ],\n schema: {\n id: 'Feature Flags',\n component: FeatureFlags,\n },\n },\n bleve: {\n url: 'experimental/blevesearch',\n title: defineMessage({id: 'admin.sidebar.blevesearch', defaultMessage: 'Bleve'}),\n isHidden: it.any(\n it.configIsTrue('ExperimentalSettings', 'RestrictSystemAdmin'),\n it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.BLEVE)),\n ),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.BLEVE)),\n searchableStrings: bleveSearchableStrings,\n schema: {\n id: 'BleveSettings',\n component: BleveSettings,\n },\n },\n audit_logging: {\n url: 'experimental/audit_logging',\n title: defineMessage({id: 'admin.sidebar.audit_logging_experimental', defaultMessage: 'Audit Logging'}),\n isHidden: it.any(it.not(it.userHasReadPermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)), it.configIsFalse('FeatureFlags', 'ExperimentalAuditSettingsSystemConsoleUI'), it.not(it.licensedForSku('enterprise'))),\n schema: {\n id: 'ExperimentalAuditSettings',\n name: 'Audit Log Settings (Experimental)',\n settings: [\n {\n type: 'bool',\n key: 'ExperimentalAuditSettings.FileEnabled',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_enabled.title', defaultMessage: 'File Enabled'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_enabled.help_text', defaultMessage: 'Choose whether audit logs are written locally to a file or not.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'text',\n key: 'ExperimentalAuditSettings.FileName',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_name.title', defaultMessage: 'File Name'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_name.help_text', defaultMessage: 'The name of the file to write to. NOTE: If ExperimentalAuditSettings.FileEnabled is set to TRUE, this field is required.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'number',\n key: 'ExperimentalAuditSettings.FileMaxSizeMB',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_max_size.title', defaultMessage: 'Max File Size (MB)'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_max_size.help_text', defaultMessage: 'The maximum size of a single exported file, in MB.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'number',\n key: 'ExperimentalAuditSettings.FileMaxAgeDays',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_max_age.title', defaultMessage: 'Max File Age (Days)'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_max_age.help_text', defaultMessage: 'The maximum age of an exported file, in days.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'number',\n key: 'ExperimentalAuditSettings.FileMaxBackups',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_max_backups.title', defaultMessage: 'Maximum File Backups'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_max_backups.help_text', defaultMessage: 'The maximum number of backup files to retain'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'bool',\n key: 'ExperimentalAuditSettings.FileCompress',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_compress.title', defaultMessage: 'File Compression'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_compress.help_text', defaultMessage: 'Choose whether enable or disable file compression.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'number',\n key: 'ExperimentalAuditSettings.FileMaxQueueSize',\n label: defineMessage({id: 'admin.audit_logging_experimental.file_max_queue_size.title', defaultMessage: 'Maximum File Queue'}),\n help_text: defineMessage({id: 'admin.audit_logging_experimental.file_max_queue_size.help_text', defaultMessage: 'The maximum number of files to be retained in the queue.'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n isHidden: it.licensedForFeature('Cloud'),\n },\n {\n type: 'longtext',\n key: 'ExperimentalAuditSettings.AdvancedLoggingJSON',\n label: defineMessage({id: 'admin.log.AdvancedLoggingJSONTitle', defaultMessage: 'Advanced Logging:'}),\n help_text: defineMessage({id: 'admin.log.AdvancedLoggingJSONDescription', defaultMessage: 'The JSON configuration for Advanced Audit Logging. Please see <link>documentation</link> to learn more about Advanced Logging and the JSON format it uses.'}),\n help_text_markdown: false,\n help_text_values: {\n link: (msg: string) => (\n <ExternalLink\n location='admin_console.experimental_audit_settings'\n href={DocLinks.ADVANCED_LOGGING}\n >\n {msg}\n </ExternalLink>\n ),\n },\n placeholder: defineMessage({id: 'admin.log.AdvancedLoggingJSONPlaceholder', defaultMessage: 'Enter your JSON configuration'}),\n isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)),\n validate: (value) => {\n const valid = new ValidationResult(true, '');\n if (!value) {\n return valid;\n }\n try {\n JSON.parse(value);\n return valid;\n } catch (error) {\n return new ValidationResult(false, error.message);\n }\n },\n onConfigLoad: (configVal) => JSON.stringify(configVal, null, ' '),\n onConfigSave: (displayVal) => {\n // Handle case where field is empty\n if (!displayVal) {\n return {undefined};\n }\n\n return JSON.parse(displayVal);\n },\n },\n ],\n },\n },\n },\n },\n};\n\nexport default AdminDefinition;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getName} from 'country-list';\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useHistory} from 'react-router-dom';\n\nimport {getCloudCustomer, updateCloudCustomer, updateCloudCustomerAddress} from 'mattermost-redux/actions/cloud';\n\nimport {setNavigationBlocked} from 'actions/admin_actions.jsx';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport CountrySelector from 'components/payment_form/country_selector';\nimport StateSelector from 'components/payment_form/state_selector';\nimport SaveButton from 'components/save_button';\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport type {GlobalState} from 'types/store';\n\nimport './company_info_edit.scss';\n\ntype Props = Record<string, never>;\n\nconst CompanyInfoEdit: React.FC<Props> = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const companyInfo = useSelector((state: GlobalState) => state.entities.cloud.customer);\n\n const [companyName, setCompanyName] = useState(companyInfo?.name);\n const [numEmployees, setNumEmployees] = useState<number | undefined>(companyInfo?.num_employees || undefined);\n\n const [address, setAddress] = useState(companyInfo?.company_address?.line1);\n const [address2, setAddress2] = useState(companyInfo?.company_address?.line2);\n const [city, setCity] = useState(companyInfo?.company_address?.city);\n const [postalCode, setPostalCode] = useState(companyInfo?.company_address?.postal_code);\n const [country, setCountry] = useState(companyInfo?.company_address?.country || getName('US'));\n const [state, setState] = useState(companyInfo?.company_address?.state);\n const [contentChanged, setContentChanged] = useState(false);\n\n const [sameAsBillingAddress, setSameAsBillingAddress] = useState(Boolean(!companyInfo?.company_address?.line1 && companyInfo?.billing_address?.line1));\n const [isValid, setIsValid] = useState<boolean | undefined>(undefined);\n const [isSaving, setIsSaving] = useState(false);\n\n const setValidation = useCallback(() => {\n if (sameAsBillingAddress) {\n setIsValid(Boolean(companyName));\n } else {\n setIsValid(Boolean(companyName && address && city && postalCode && country && state));\n }\n }, [sameAsBillingAddress, companyName, address, city, postalCode, country, state]);\n\n const updateState = (setStateFunc: (value: any) => void) => {\n return (event: React.ChangeEvent<HTMLInputElement>) => {\n setStateFunc(event.target.value);\n setValidation();\n setContentChanged(true);\n };\n };\n\n const updateNumEmployees = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.value) {\n setNumEmployees(parseInt(event.target.value, 10));\n } else {\n setNumEmployees(undefined);\n }\n setContentChanged(true);\n };\n\n useEffect(() => {\n dispatch(getCloudCustomer());\n }, [dispatch]);\n\n useEffect(() => {\n setValidation();\n }, [setValidation]);\n\n useEffect(() => {\n if (contentChanged) {\n dispatch(setNavigationBlocked(true));\n }\n }, [contentChanged]);\n\n if (!companyInfo) {\n return null;\n }\n\n const handleSubmit = async () => {\n setIsSaving(true);\n await dispatch(updateCloudCustomer({name: companyName, num_employees: numEmployees || 0}));\n\n if (sameAsBillingAddress) {\n await dispatch(updateCloudCustomerAddress({\n city: '',\n country: '',\n line1: '',\n line2: '',\n postal_code: '',\n state: '',\n }));\n } else {\n await dispatch(updateCloudCustomerAddress({\n city: city || '',\n country: country || '',\n line1: address || '',\n line2: address2 || '',\n postal_code: postalCode || '',\n state: state || '',\n }));\n }\n\n setIsSaving(false);\n history.push('/admin_console/billing/company_info');\n };\n\n const billingAddressDisplay = (\n <>\n <div className='CompanyInfoEdit__companyInfo-addressTitle'>\n <FormattedMessage\n id='admin.billing.company_info.billingAddress'\n defaultMessage='Billing Address'\n />\n </div>\n <div className='CompanyInfoEdit__companyInfo-address'>\n <div>{companyInfo?.billing_address?.line1}</div>\n {companyInfo?.billing_address?.line2 && <div>{companyInfo?.billing_address?.line2}</div>}\n <div>{`${companyInfo?.billing_address?.city}, ${companyInfo?.billing_address?.state}, ${companyInfo?.billing_address?.postal_code}`}</div>\n <div>{companyInfo?.billing_address?.country}</div>\n </div>\n </>\n );\n\n const companyAddressInput = (\n <>\n <CountrySelector\n onChange={(option) => {\n setCountry(option.value);\n setContentChanged(true);\n }}\n value={country || undefined}\n />\n <div className='form-row'>\n <Input\n name='address'\n type='text'\n value={address}\n onChange={updateState(setAddress)}\n placeholder={defineMessage({id: 'admin.billing.company_info.address', defaultMessage: 'Address'})}\n required={true}\n />\n </div>\n <div className='form-row'>\n <Input\n name='address2'\n type='text'\n value={address2}\n onChange={updateState(setAddress2)}\n placeholder={defineMessage({id: 'admin.billing.company_info.address_2', defaultMessage: 'Address 2'})}\n />\n </div>\n <div className='form-row'>\n <Input\n name='city'\n type='text'\n value={city}\n onChange={updateState(setCity)}\n placeholder={defineMessage({id: 'admin.billing.company_info.city', defaultMessage: 'City'})}\n required={true}\n />\n </div>\n <div className='form-row'>\n <div className='form-row-third-1 selector'>\n <StateSelector\n country={country!}\n state={state!}\n onChange={(stateValue) => {\n setState(stateValue);\n setContentChanged(true);\n }}\n />\n </div>\n <div className='form-row-third-2'>\n <Input\n name='postalCode'\n type='text'\n value={postalCode}\n onChange={updateState(setPostalCode)}\n placeholder={defineMessage({\n id: 'admin.billing.company_info.zipcode',\n defaultMessage: 'Zip/Postal Code',\n })}\n required={true}\n />\n </div>\n </div>\n </>\n );\n\n return (\n <div className='wrapper--fixed CompanyInfoEdit'>\n <AdminHeader withBackButton={true}>\n <div>\n <BlockableLink\n to='/admin_console/billing/company_info'\n className='fa fa-angle-left back'\n />\n <FormattedMessage\n id='admin.billing.company_info_edit.title'\n defaultMessage='Edit Company Information'\n />\n </div>\n </AdminHeader>\n <div className='admin-console__wrapper'>\n <div className='admin-console__content'>\n <div className='CompanyInfoEdit__card'>\n <div className='CompanyInfoEdit__form'>\n <div className='section-title'>\n <FormattedMessage\n id='admin.billing.company_info_edit.companyDetails'\n defaultMessage='Company Details'\n />\n </div>\n <div className='form-row'>\n <Input\n name='companyName'\n type='text'\n value={companyName}\n onChange={updateState(setCompanyName)}\n placeholder={defineMessage({id: 'admin.billing.company_info.companyName', defaultMessage: 'Company name'})}\n required={true}\n />\n </div>\n <div className='form-row'>\n <Input\n name='numEmployees'\n type='number'\n value={numEmployees}\n onChange={updateNumEmployees}\n placeholder={defineMessage({id: 'admin.billing.company_info.numEmployees', defaultMessage: 'Number of employees (optional)'})}\n />\n </div>\n <div className='section-title'>\n <FormattedMessage\n id='admin.billing.company_info_edit.company_address'\n defaultMessage='Company Address'\n />\n </div>\n {companyInfo?.billing_address?.line1 &&\n <div className='checkbox'>\n <label>\n <input\n type='checkbox'\n checked={sameAsBillingAddress}\n onChange={(event) => {\n setSameAsBillingAddress(event.target.checked);\n setContentChanged(true);\n }}\n />\n <FormattedMessage\n id='admin.billing.company_info_edit.sameAsBillingAddress'\n defaultMessage='Same as Billing Address'\n />\n </label>\n </div>\n }\n {sameAsBillingAddress && companyInfo?.billing_address?.line1 ? billingAddressDisplay : companyAddressInput}\n </div>\n </div>\n </div>\n </div>\n <div className='admin-console-save'>\n <SaveButton\n saving={isSaving}\n disabled={!isValid}\n onClick={handleSubmit}\n defaultMessage={(\n <FormattedMessage\n id='admin.billing.company_info_edit.save'\n defaultMessage='Save info'\n />\n )}\n />\n <BlockableLink\n className='cancel-button'\n to='/admin_console/billing/company_info'\n >\n <FormattedMessage\n id='admin.billing.company_info_edit.cancel'\n defaultMessage='Cancel'\n />\n </BlockableLink>\n </div>\n </div>\n );\n};\n\nexport default CompanyInfoEdit;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport GroupsSVG from './images/groups_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst GroupsFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='groups'\n minimumSKURequiredForFeature={LicenseSkus.Enterprise}\n title={defineMessage({\n id: 'admin.groups_feature_discovery.title',\n defaultMessage: 'Synchronize your Active Directory/LDAP groups with Mattermost Enterprise',\n })}\n copy={defineMessage({\n id: 'admin.groups_feature_discovery.copy',\n defaultMessage: 'Use AD/LDAP groups to organize and apply actions to multiple users at once. Manage team and channel memberships, permissions, and more.',\n })}\n learnMoreURL='https://docs.mattermost.com/deployment/ldap-group-sync.html'\n featureDiscoveryImage={\n <GroupsSVG\n width={276}\n height={170}\n />\n }\n />\n );\n};\n\nexport default GroupsFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport AnnouncementBannerSVG from './images/announcement_banner_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst AnnouncementBannerFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='announcement_banner'\n minimumSKURequiredForFeature={LicenseSkus.Professional}\n title={defineMessage({\n id: 'admin.announcement_banner_feature_discovery.title',\n defaultMessage: 'Create custom announcement banners with Mattermost Professional',\n })}\n copy={defineMessage({\n id: 'admin.announcement_banner_feature_discovery.copy',\n defaultMessage: 'Create announcement banners to notify all members of important information.',\n })}\n learnMoreURL='https://docs.mattermost.com/administration/announcement-banner.html'\n featureDiscoveryImage={\n <AnnouncementBannerSVG\n width={294}\n height={170}\n />}\n />\n );\n};\n\nexport default AnnouncementBannerFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {AlertOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {AllowedIPRange, FetchIPResponse} from '@mattermost/types/config';\n\nimport {applyIPFilters, getCurrentIP, getIPFilters} from 'actions/admin_actions';\nimport {getInstallation} from 'actions/cloud';\nimport {closeModal, openModal} from 'actions/views/modals';\n\nimport AdminHeader from 'components/widgets/admin_console/admin_header';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport IPFilteringAddOrEditModal from './add_edit_ip_filter_modal';\nimport DeleteConfirmationModal from './delete_confirmation';\nimport EditSection from './edit_section';\nimport EnableSectionContent from './enable_section';\nimport {isIPAddressInRanges} from './ip_filtering_utils';\nimport SaveConfirmationModal from './save_confirmation_modal';\n\nimport SaveChangesPanel from '../save_changes_panel';\n\nimport './ip_filtering.scss';\n\nconst IPFiltering = () => {\n const dispatch = useDispatch();\n const {formatMessage} = useIntl();\n const [ipFilters, setIpFilters] = useState<AllowedIPRange[] | null>(null);\n const [originalIpFilters, setOriginalIpFilters] = useState<AllowedIPRange[] | null>(null);\n const [saveNeeded, setSaveNeeded] = useState(false);\n const [currentUsersIP, setCurrentUsersIP] = useState<string | null>(null);\n const [saving, setSaving] = useState<boolean>(false);\n const [filterToggle, setFilterToggle] = useState<boolean>(false);\n const [installationStatus, setInstallationStatus] = useState<string>('');\n\n // savingMessage allows the component to change the label on the Save button in the SaveChangesPanel\n const [savingMessage, setSavingMessage] = useState<string>('');\n\n // savingDescription is a JSX element that will be displayed in the serverError bar on the SaveChangesPanel. This allows us to provide more information on loading while previous changes are applied\n const [savingDescription, setSavingDescription] = useState<JSX.Element | null>(null);\n\n const savingButtonMessages = {\n SAVING_PREVIOUS_CHANGE: formatMessage({id: 'admin.ip_filtering.saving_previous_change', defaultMessage: 'Other changes being applied...'}),\n SAVING_CHANGES: formatMessage({id: 'admin.ip_filtering.saving_changes', defaultMessage: 'Applying changes...'}),\n };\n\n const savingDescriptionMessages = {\n SAVING_PREVIOUS_CHANGE: formatMessage({id: 'admin.ip_filtering.saving_previous_change_description', defaultMessage: 'Please wait while changes from another admin are applied.'}),\n SAVING_CHANGES: formatMessage({id: 'admin.ip_filtering.saving_changes_description', defaultMessage: 'Please wait while your changes are applied.'}),\n };\n\n useEffect(() => {\n getInstallationStatus();\n\n getIPFilters((data: AllowedIPRange[]) => {\n setIpFilters(data);\n setOriginalIpFilters(data);\n });\n\n getCurrentIP((res: FetchIPResponse) => {\n setCurrentUsersIP(res.ip);\n });\n }, []);\n\n useEffect(() => {\n if (ipFilters === null || originalIpFilters === null) {\n return;\n }\n\n // Check if the ipFilters list differs from the originalIpFilters list\n const haveFiltersChanged = JSON.stringify(ipFilters) !== JSON.stringify(originalIpFilters);\n setSaveNeeded(haveFiltersChanged);\n }, [ipFilters, originalIpFilters]);\n\n const currentIPIsInRange = (): boolean => {\n if (!filterToggle) {\n return true;\n }\n if (!ipFilters?.length) {\n return true;\n }\n return ipFilters !== null && currentUsersIP !== null && isIPAddressInRanges(currentUsersIP, ipFilters);\n };\n\n useEffect(() => {\n if (!ipFilters?.length) {\n return;\n }\n setFilterToggle(ipFilters?.some((filter: AllowedIPRange) => filter.enabled === true) ?? false);\n }, [ipFilters]);\n\n useEffect(() => {\n if (filterToggle === false) {\n setIpFilters(ipFilters?.map((filter: AllowedIPRange): AllowedIPRange => {\n return {\n ...filter,\n enabled: false,\n };\n }) || []);\n } else {\n setIpFilters(ipFilters?.map((filter: AllowedIPRange): AllowedIPRange => {\n return {\n ...filter,\n enabled: true,\n };\n }) || []);\n }\n }, [filterToggle]);\n\n function pollInstallationStatus() {\n let installationFetchAttempts = 0;\n const interval = setInterval(async () => {\n if (installationFetchAttempts > 15) {\n // Average time for provisioner to update is around 30 seconds. This allows up to 75 seconds before it will stop fetching, displaying an error\n setSavingDescription((\n <>\n <AlertOutlineIcon size={16}/> {formatMessage({id: 'admin.ip_filtering.failed_to_fetch_installation_state', defaultMessage: 'Failed to fetch your workspace\\'s status. Please try again later or contact support.'})}\n </>\n ));\n clearInterval(interval);\n return;\n }\n const result = await dispatch(getInstallation());\n installationFetchAttempts++;\n if (result.data) {\n const {data} = result;\n if (data.state === 'stable') {\n setSaving(false);\n setSavingDescription(null);\n clearInterval(interval);\n }\n setInstallationStatus(data.state);\n }\n }, 5000);\n }\n\n async function getInstallationStatus() {\n const result = await dispatch(getInstallation());\n if (result.data) {\n const {data} = result;\n setInstallationStatus(data.state);\n if (installationStatus === '' && data.state !== 'stable') {\n // This is the first load of the page, and the installation is not stable, so we must lock saving until it becomes stable\n setSaving(true);\n\n // Override the default messages for the save button and the error message to be communicative of the current state to the user\n setSavingMessage(savingButtonMessages.SAVING_PREVIOUS_CHANGE);\n changeSavingDescription(savingDescriptionMessages.SAVING_PREVIOUS_CHANGE);\n }\n if (data.state !== 'stable') {\n pollInstallationStatus();\n }\n }\n }\n\n function changeSavingDescription(text: string) {\n setSavingDescription((\n <div className='saving-message-description'>\n {text}\n </div>\n ),\n );\n }\n\n function handleEditFilter(filter: AllowedIPRange, existingRange?: AllowedIPRange) {\n setIpFilters((prevIpFilters) => {\n if (!prevIpFilters) {\n return [filter];\n }\n const index = prevIpFilters.findIndex((f) => f.cidr_block === existingRange?.cidr_block);\n if (index === -1) {\n return null;\n }\n const updatedFilters = [...prevIpFilters];\n updatedFilters[index] = filter;\n return updatedFilters;\n });\n setSaveNeeded(true);\n }\n\n function showAddModal() {\n dispatch(openModal({\n modalId: ModalIdentifiers.IP_FILTERING_ADD_EDIT_MODAL,\n dialogType: IPFilteringAddOrEditModal,\n dialogProps: {\n currentIP: currentUsersIP!,\n onSave: handleAddFilter,\n },\n }));\n }\n\n function showEditModal(editFilter: AllowedIPRange) {\n dispatch(openModal({\n modalId: ModalIdentifiers.IP_FILTERING_ADD_EDIT_MODAL,\n dialogType: IPFilteringAddOrEditModal,\n dialogProps: {\n currentIP: currentUsersIP!,\n onSave: handleEditFilter,\n existingRange: editFilter!,\n },\n }));\n }\n\n function showConfirmDeleteFilterModal(filter: AllowedIPRange) {\n dispatch(openModal({\n modalId: ModalIdentifiers.IP_FILTERING_DELETE_CONFIRMATION_MODAL,\n dialogType: DeleteConfirmationModal,\n dialogProps: {\n onConfirm: handleDeleteFilter,\n filterToDelete: filter,\n },\n }));\n }\n\n function handleDeleteFilter(filter: AllowedIPRange) {\n dispatch(closeModal(ModalIdentifiers.IP_FILTERING_DELETE_CONFIRMATION_MODAL));\n setIpFilters((prevIpFilters) => prevIpFilters?.filter((f) => f.cidr_block !== filter.cidr_block) ?? null);\n setSaveNeeded(true);\n }\n\n function handleAddFilter(filter: AllowedIPRange) {\n dispatch(closeModal(ModalIdentifiers.IP_FILTERING_ADD_EDIT_MODAL));\n setIpFilters((prevIpFilters) => [...(prevIpFilters ?? []), filter]);\n setSaveNeeded(true);\n }\n\n function handleSave() {\n setInstallationStatus('update-requested');\n setSaving(true);\n setSavingMessage(savingButtonMessages.SAVING_CHANGES);\n changeSavingDescription(savingDescriptionMessages.SAVING_CHANGES);\n dispatch(closeModal(ModalIdentifiers.IP_FILTERING_SAVE_CONFIRMATION_MODAL));\n\n const success = (data: AllowedIPRange[]) => {\n setIpFilters(data);\n setOriginalIpFilters(data);\n getInstallationStatus();\n };\n\n applyIPFilters(ipFilters ?? [], success);\n }\n\n function handleSaveClick() {\n const saveConfirmModalProps = {\n onConfirm: handleSave,\n } as any;\n if (!ipFilters?.length && filterToggle) {\n saveConfirmModalProps.title = formatMessage({id: 'admin.ip_filtering.apply_ip_filter_changes', defaultMessage: 'Apply IP Filter Changes'});\n saveConfirmModalProps.subtitle = (\n <FormattedMessage\n id={'admin.ip_filtering.no_filters_added'}\n defaultMessage={'Are you sure you want to apply these IP filter changes? There are currently no filters added, so <strong>all IP addresses will have access to the workspace.</strong>'}\n values={{\n strong: (content: string) => <strong>{content}</strong>,\n }}\n />\n );\n saveConfirmModalProps.buttonText = formatMessage({id: 'admin.ip_filtering.apply_changes', defaultMessage: 'Yes, apply changes'});\n saveConfirmModalProps.includeDisclaimer = false;\n } else if ((ipFilters?.length && !filterToggle) || (!ipFilters?.length && !filterToggle)) {\n saveConfirmModalProps.title = formatMessage({id: 'admin.ip_filtering.disable_ip_filtering', defaultMessage: 'Disable IP Filtering'});\n saveConfirmModalProps.subtitle = (\n <FormattedMessage\n id={'admin.ip_filtering.turn_off_ip_filtering'}\n defaultMessage={'Are you sure you want to turn off IP Filtering? <strong>All IP addresses will have access to the workspace.</strong>'}\n values={{\n strong: (content: string) => <strong>{content}</strong>,\n }}\n />\n );\n saveConfirmModalProps.buttonText = formatMessage({id: 'admin.ip_filtering.yes_disable_ip_filtering', defaultMessage: 'Yes, disable IP Filtering'});\n saveConfirmModalProps.includeDisclaimer = false;\n } else {\n saveConfirmModalProps.title = formatMessage({id: 'admin.ip_filtering.apply_ip_filter_changes', defaultMessage: 'Apply IP Filter Changes'});\n saveConfirmModalProps.subtitle = (\n <FormattedMessage\n id={'admin.ip_filtering.apply_ip_filter_changes_are_you_sure'}\n defaultMessage={'Are you sure you want to apply these IP Filter changes? <strong>Users with IP addresses outside of the IP ranges provided will no longer have access to the workspace.</strong>'}\n values={{\n strong: (content: string) => <strong>{content}</strong>,\n }}\n />\n );\n saveConfirmModalProps.buttonText = formatMessage({id: 'admin.ip_filtering.apply_changes', defaultMessage: 'Yes, apply changes'});\n saveConfirmModalProps.includeDisclaimer = true;\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.IP_FILTERING_SAVE_CONFIRMATION_MODAL,\n dialogType: SaveConfirmationModal,\n dialogProps: saveConfirmModalProps,\n }));\n }\n\n const saveBarError = () => {\n if (savingDescription !== null) {\n return savingDescription;\n }\n\n if (currentIPIsInRange()) {\n return undefined;\n }\n\n return (\n <>\n <AlertOutlineIcon size={16}/> {formatMessage({id: 'admin.ip_filtering.error_on_page', defaultMessage: 'Your IP address is not included in your filters'})}\n </>\n );\n };\n\n return (\n <div className='IPFiltering wrapper--fixed'>\n <AdminHeader>\n {formatMessage({id: 'admin.ip_filtering.ip_filtering', defaultMessage: 'IP Filtering'})}\n </AdminHeader>\n <div className='MainPanel admin-console__wrapper'>\n <>\n <EnableSectionContent\n filterToggle={filterToggle}\n setFilterToggle={setFilterToggle}\n />\n {ipFilters !== null && currentUsersIP !== null && filterToggle &&\n <EditSection\n ipFilters={ipFilters}\n currentUsersIP={currentUsersIP}\n setShowAddModal={showAddModal}\n setEditFilter={showEditModal}\n handleConfirmDeleteFilter={showConfirmDeleteFilterModal}\n currentIPIsInRange={currentIPIsInRange()}\n />\n }\n </>\n </div>\n <SaveChangesPanel\n saving={saving}\n saveNeeded={saveNeeded || installationStatus !== 'stable'}\n isDisabled={!currentIPIsInRange() || installationStatus !== 'stable'}\n onClick={handleSaveClick}\n serverError={saveBarError()}\n savingMessage={savingMessage}\n cancelLink=''\n />\n </div>\n );\n};\n\nexport default IPFiltering;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport GroupsSVG from './images/groups_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst LDAPFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='ldap'\n minimumSKURequiredForFeature={LicenseSkus.Professional}\n title={defineMessage({\n id: 'admin.ldap_feature_discovery.title',\n defaultMessage: 'Integrate Active Directory/LDAP with Mattermost Professional',\n })}\n copy={defineMessage({\n id: 'admin.ldap_feature_discovery.copy',\n defaultMessage: 'When you connect Mattermost with your organization\\'s Active Directory/LDAP, users can log in without having to create new usernames and passwords.',\n })}\n learnMoreURL='https://www.mattermost.com/docs-adldap/?utm_medium=product&utm_source=product-feature-discovery&utm_content=adldap'\n featureDiscoveryImage={\n <GroupsSVG\n width={276}\n height={170}\n />}\n />\n );\n};\n\nexport default LDAPFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport GroupsSVG from './images/groups_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst SAMLFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='saml'\n minimumSKURequiredForFeature={LicenseSkus.Professional}\n title={defineMessage({\n id: 'admin.saml_feature_discovery.title',\n defaultMessage: 'Integrate SAML 2.0 with Mattermost Professional',\n })}\n copy={defineMessage({\n id: 'admin.saml_feature_discovery.copy',\n defaultMessage: 'When you connect Mattermost with your organization\\'s single sign-on provider, users can access Mattermost without having to re-enter their credentials.',\n })}\n learnMoreURL='https://www.mattermost.com/docs-saml/?utm_medium=product&utm_source=product-feature-discovery&utm_content=saml'\n featureDiscoveryImage={\n <GroupsSVG\n width={276}\n height={170}\n />\n }\n />\n );\n};\n\nexport default SAMLFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport GroupsSVG from './images/groups_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst OpenIDCustomFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='openid'\n minimumSKURequiredForFeature={LicenseSkus.Professional}\n title={defineMessage({\n id: 'admin.openid_custom_feature_discovery.title',\n defaultMessage: 'Integrate OpenID Connect with Mattermost Professional',\n })}\n copy={defineMessage({\n id: 'admin.openid_custom_feature_discovery.copy',\n defaultMessage: 'Use OpenID Connect for authentication and single sign-on (SSO) with any service that supports the OIDC specification such as Apple, Okta, OneLogin, and more.',\n })}\n learnMoreURL='https://docs.mattermost.com/cloud/cloud-administration/sso-openid-connect.html'\n featureDiscoveryImage={\n <GroupsSVG\n width={276}\n height={170}\n />}\n />\n );\n};\n\nexport default OpenIDCustomFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport GroupsSVG from './images/groups_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst OpenIDFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='openid'\n minimumSKURequiredForFeature={LicenseSkus.Professional}\n title={defineMessage({\n id: 'admin.openid_feature_discovery.title',\n defaultMessage: 'Integrate OpenID Connect with Mattermost Professional',\n })}\n copy={defineMessage({\n id: 'admin.openid_feature_discovery.copy',\n defaultMessage: 'Use OpenID Connect for authentication and single sign-on (SSO) with any service that supports the OIDC specification such as Google, Entra ID, Apple, Okta, OneLogin, and more.',\n })}\n learnMoreURL='https://docs.mattermost.com/cloud/cloud-administration/sso-openid-connect.html'\n featureDiscoveryImage={\n <GroupsSVG\n width={276}\n height={170}\n />}\n />\n );\n};\n\nexport default OpenIDFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport GuestAccessSVG from './images/guest_access_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst GuestAccessFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='guest_access'\n minimumSKURequiredForFeature={LicenseSkus.Professional}\n title={defineMessage({\n id: 'admin.guest_access_feature_discovery.title',\n defaultMessage: 'Enable guest accounts with Mattermost Professional',\n })}\n copy={defineMessage({\n id: 'admin.guest_access_feature_discovery.copy',\n defaultMessage: 'Collaborate with users outside of your organization while tightly controlling their access channels and team members.',\n })}\n learnMoreURL='https://docs.mattermost.com/deployment/guest-accounts.html'\n featureDiscoveryImage={<GuestAccessSVG/>}\n />\n );\n};\n\nexport default GuestAccessFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport DataRetentionSVG from './images/data_retention_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst DataRetentionFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='data_retention'\n minimumSKURequiredForFeature={LicenseSkus.Enterprise}\n title={defineMessage({\n id: 'admin.data_retention_feature_discovery.title',\n defaultMessage: 'Create data retention schedules with Mattermost Enterprise',\n })}\n copy={defineMessage({\n id: 'admin.data_retention_feature_discovery.copy',\n defaultMessage: 'Hold on to your data only as long as you need to. Create data retention jobs for select channels and teams to automatically delete disposable data.',\n })}\n learnMoreURL='https://docs.mattermost.com/administration/data-retention.html'\n featureDiscoveryImage={\n <DataRetentionSVG\n width={213}\n height={156}\n />}\n />\n );\n};\n\nexport default DataRetentionFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {DocLinks, LicenseSkus} from 'utils/constants';\n\nimport ComplianceExportSVG from './images/compliance_export_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst ComplianceExportFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='compliance_export'\n minimumSKURequiredForFeature={LicenseSkus.Enterprise}\n title={defineMessage({\n id: 'admin.compliance_export_feature_discovery.title',\n defaultMessage: 'Run compliance exports with Mattermost Enterprise',\n })}\n copy={defineMessage({\n id: 'admin.compliance_export_feature_discovery.copy',\n defaultMessage: 'Run daily compliance reports and export them to a variety of formats consumable by third-party integration tools such as Smarsh (Actiance).',\n })}\n learnMoreURL={DocLinks.COMPILANCE_EXPORT}\n featureDiscoveryImage={\n <ComplianceExportSVG\n width={283}\n height={174}\n />}\n />\n );\n};\n\nexport default ComplianceExportFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport {LicenseSkus} from 'utils/constants';\n\nimport CustomTermsOfServiceSVG from './images/custom_terms_of_service_svg';\n\nimport FeatureDiscovery from '../index';\n\nconst CustomTermsOfServiceFeatureDiscovery: React.FC = () => {\n return (\n <FeatureDiscovery\n featureName='custom_terms_of_service'\n minimumSKURequiredForFeature={LicenseSkus.Enterprise}\n title={defineMessage({\n id: 'admin.custom_terms_of_service_feature_discovery.title',\n defaultMessage: 'Create custom terms of service with Mattermost Enterprise',\n })}\n copy={defineMessage({\n id: 'admin.custom_terms_of_service_feature_discovery.copy',\n defaultMessage: 'Create your own terms of service that new users must accept before accessing your Mattermost instance on desktop, web, or mobile.',\n })}\n learnMoreURL='https://docs.mattermost.com/cloud/cloud-administration/custom-terms-of-service.html'\n featureDiscoveryImage={\n <CustomTermsOfServiceSVG\n width={289}\n height={166}\n />}\n />\n );\n};\n\nexport default CustomTermsOfServiceFeatureDiscovery;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {ResourceToSysConsolePermissionsTable, RESOURCE_KEYS} from 'mattermost-redux/constants/permissions_sysconsole';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getMySystemPermissions, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles_helpers';\n\nimport AdminDefinition from 'components/admin_console/admin_definition';\n\nimport {isEnterpriseOrE20License} from '../utils/license_utils';\n\nexport const getAdminDefinition = createSelector(\n 'getAdminDefinition',\n () => AdminDefinition,\n (state) => state.plugins.adminConsoleReducers,\n (adminDefinition, reducers) => {\n let result = cloneDeep(AdminDefinition);\n for (const reducer of Object.values(reducers)) {\n result = reducer(result);\n }\n return result;\n },\n);\n\nexport const getAdminConsoleCustomComponents = (state, pluginId) =>\n state.plugins.adminConsoleCustomComponents[pluginId] || {};\n\nexport const getAdminConsoleCustomSections = (state, pluginId) =>\n state.plugins.adminConsoleCustomSections[pluginId] || {};\n\nexport const getConsoleAccess = createSelector(\n 'getConsoleAccess',\n getAdminDefinition,\n getMySystemPermissions,\n (adminDefinition, mySystemPermissions) => {\n const consoleAccess = {read: {}, write: {}};\n const addEntriesForKey = (entryKey) => {\n const permissions = ResourceToSysConsolePermissionsTable[entryKey].filter((x) => mySystemPermissions.has(x));\n consoleAccess.read[entryKey] = permissions.length !== 0;\n consoleAccess.write[entryKey] = permissions.some((permission) => permission.startsWith('sysconsole_write_'));\n };\n const mapAccessValuesForKey = ([key]) => {\n if (typeof RESOURCE_KEYS[key.toUpperCase()] === 'object') {\n Object.values(RESOURCE_KEYS[key.toUpperCase()]).forEach((entry) => {\n addEntriesForKey(entry);\n });\n } else {\n addEntriesForKey(key);\n }\n };\n Object.entries(adminDefinition).forEach(mapAccessValuesForKey);\n return consoleAccess;\n },\n);\n\nexport const getShowManageUserSettings = createSelector(\n 'showManageUserSettings',\n getLicense,\n (state) => state,\n (license, state) => {\n const hasWriteUserManagementPermission = haveISystemPermission(state, {permission: Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_USERS});\n\n const isEnterprise = isEnterpriseOrE20License(license);\n\n return hasWriteUserManagementPermission && isEnterprise;\n },\n);\n\nexport const getShowLockedManageUserSettings = createSelector(\n 'showLockedManageUserSettings',\n getLicense,\n (state) => state,\n (license, state) => {\n const hasWriteUserManagementPermission = haveISystemPermission(state, {permission: Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_USERS});\n\n const isEnterprise = isEnterpriseOrE20License(license);\n\n return hasWriteUserManagementPermission && !isEnterprise;\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport Mark from 'mark.js';\nimport React, {useEffect, useMemo, useRef} from 'react';\nimport type {ReactNode} from 'react';\n\ntype Props = {\n keyword?: string;\n pathname?: string;\n children: ReactNode;\n}\n\nconst DEBOUNCE_WAIT_TIME = 200;\n\nexport default function SearchKeywordMarking({\n keyword = '',\n pathname,\n children,\n}: Props) {\n const containerRef = useRef<HTMLDivElement>(null);\n const markJsRef = useRef<Mark>();\n\n function doMark(keyword: string, container: HTMLDivElement) {\n markJsRef.current = new Mark(container);\n markJsRef.current.mark(keyword, {\n accuracy: 'complementary',\n exclude: ['.ignore-marking *'],\n });\n }\n\n const debouncedDoMark = useMemo(() => debounce((keywordToMark?: string, markJs?: Mark, container?: HTMLDivElement | null) => {\n if (!keywordToMark || !container) {\n return;\n }\n\n if (markJs) {\n // We need to mark again only after its 'done' callback is called\n // if we dont then there is a possiblity of creating multiple marks in the same container\n markJs.unmark({done: () => doMark(keywordToMark, container)});\n } else {\n // If there's no previous instance, just create a new one\n doMark(keywordToMark, container);\n }\n }, DEBOUNCE_WAIT_TIME), []);\n\n useEffect(() => {\n debouncedDoMark(keyword, markJsRef.current, containerRef.current);\n\n return (() => {\n debouncedDoMark.cancel();\n\n if (markJsRef.current) {\n markJsRef.current.unmark();\n }\n });\n }, [keyword, pathname]);\n\n return (\n <div ref={containerRef}>\n {children}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ConfirmModal from 'components/confirm_modal';\n\ntype Props = {\n show: boolean;\n onConfirm: (checked: boolean) => void;\n onCancel: (checked: boolean) => void;\n}\n\nconst DiscardChangesModal = ({\n show,\n onConfirm,\n onCancel,\n}: Props) => {\n const title = (\n <FormattedMessage\n id='discard_changes_modal.title'\n defaultMessage='Discard Changes?'\n />\n );\n\n const message = (\n <FormattedMessage\n id='discard_changes_modal.message'\n defaultMessage='You have unsaved changes, are you sure you want to discard them?'\n />\n );\n\n const buttonClass = 'btn btn-primary';\n const button = (\n <FormattedMessage\n id='discard_changes_modal.leave'\n defaultMessage='Yes, Discard'\n />\n );\n\n const modalClass = 'discard-changes-modal';\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n modalClass={modalClass}\n confirmButtonClass={buttonClass}\n confirmButtonText={button}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n );\n};\n\nexport default React.memo(DiscardChangesModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {isValidElement} from 'react';\nimport {NavLink, Route} from 'react-router-dom';\n\ntype Props = {\n icon: JSX.Element;\n title: string | JSX.Element;\n action?: JSX.Element;\n children?: JSX.Element[];\n definitionKey?: string;\n name?: string;\n parentLink?: string;\n sectionClass?: string;\n}\n\nconst AdminSidebarCategory = ({icon, title, action, children, definitionKey, name, parentLink = '', sectionClass}: Props) => {\n let link = parentLink;\n let titleDiv = (\n <div className='category-title category-title--active'>\n <span className='category-icon'>{icon}</span>\n <span className='category-title__text'>\n {title}\n </span>\n {action}\n </div>\n );\n\n if (name) {\n link += '/' + name;\n titleDiv = (\n <NavLink\n to={link}\n className='category-title'\n activeClassName='category-title category-title--active'\n >\n {title}\n </NavLink>\n );\n }\n\n let clonedChildren = null;\n const sectionsClassName = classNames('sections', sectionClass);\n if (children) {\n const renderedChildren = () => (\n <ul className={sectionsClassName}>\n {\n React.Children.map(children, (child) => {\n if (!isValidElement(child)) {\n return null;\n }\n\n return React.cloneElement(child as JSX.Element, {\n parentLink: link,\n });\n })\n }\n </ul>\n );\n clonedChildren = (\n <Route\n path={link}\n render={renderedChildren}\n />\n );\n }\n\n return (\n <li\n className='sidebar-category'\n data-testid={definitionKey}\n >\n {titleDiv}\n {clonedChildren}\n </li>\n );\n};\n\nexport default AdminSidebarCategory;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\n\nimport {createSafeId} from 'utils/utils';\n\ntype Props = {\n name: string;\n title: string | JSX.Element;\n action?: JSX.Element;\n children?: JSX.Element | JSX.Element[];\n definitionKey?: string;\n type?: string;\n parentLink?: string;\n subsection?: boolean;\n tag?: string | JSX.Element;\n restrictedIndicator?: string | JSX.Element;\n}\n\nconst AdminSidebarSection = ({name, title, action, children = [], definitionKey, type, parentLink = '', subsection = false, tag, restrictedIndicator}: Props) => {\n const getLink = () => parentLink + '/' + name;\n\n const link = getLink();\n\n let clonedChildren = null;\n if (children) {\n clonedChildren = (\n <ul className='nav nav__sub-menu subsections'>\n {\n React.Children.map(children, (child) => {\n if (child === null) {\n return null;\n }\n\n return React.cloneElement(child, {\n parentLink: link,\n subsection: true,\n });\n })\n }\n </ul>\n );\n }\n\n const className = classNames('sidebar-section', {'sidebar-subsection': subsection});\n const tagDiv = tag ? (\n <span className={`${className}-tag`}>\n {tag}\n </span>\n ) : null;\n const indicatorElem = restrictedIndicator && (\n <span className={`${className}-indicator`}>\n {restrictedIndicator}\n </span>\n );\n const sidebarItemSafeId = createSafeId(name);\n const sidebarItemClickHandler = () => trackEvent('admin', sidebarItemSafeId);\n let sidebarItem = (\n <BlockableLink\n id={sidebarItemSafeId}\n className={`${className}-title`}\n activeClassName={`${className}-title ${className}-title--active`}\n to={link}\n onClick={sidebarItemClickHandler}\n >\n <span className={`${className}-title__text`}>\n {title}{tagDiv}\n </span>\n {indicatorElem}\n {action}\n </BlockableLink>\n );\n\n if (type === 'text') {\n sidebarItem = (\n <div className={`${className}-title`}>\n <span className={`${className}-title__text`}>\n {title}\n </span>\n {action}\n </div>\n );\n }\n\n return (\n <li\n className={className}\n data-testid={definitionKey}\n >\n {sidebarItem}\n {clonedChildren}\n </li>\n );\n};\n\nexport default AdminSidebarSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {SupportPacketContent} from '@mattermost/types/admin';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport AlertBanner from 'components/alert_banner';\nimport ExternalLink from 'components/external_link';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport './commercial_support_modal.scss';\n\ntype Props = {\n\n /**\n * Function called after the modal has been hidden\n */\n onExited: () => void;\n\n showBannerWarning: boolean;\n\n isCloud: boolean;\n\n currentUser: UserProfile;\n\n packetContents: SupportPacketContent[];\n};\n\ntype State = {\n show: boolean;\n showBannerWarning: boolean;\n packetContents: SupportPacketContent[];\n loading: boolean;\n};\n\nexport default class CommercialSupportModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n show: true,\n showBannerWarning: props.showBannerWarning,\n packetContents: props.packetContents,\n loading: false,\n };\n }\n\n componentDidUpdate = (prevProps: Props) => {\n if (this.props.showBannerWarning !== prevProps.showBannerWarning) {\n this.updateBannerWarning(this.props.showBannerWarning);\n }\n };\n\n doHide = () => {\n this.setState({show: false});\n };\n\n updateBannerWarning = (showBannerWarning: boolean) => {\n this.setState({showBannerWarning});\n };\n\n hideBannerWarning = () => {\n this.updateBannerWarning(false);\n };\n\n updateCheckStatus = (index: number) => {\n this.setState({\n packetContents: this.state.packetContents.map((content, currentIndex) => (\n (currentIndex === index && !content.mandatory) ? {...content, selected: !content.selected} : content\n )),\n });\n };\n\n genereateDownloadURLWithParams = (): string => {\n const url = new URL(Client4.getSystemRoute() + '/support_packet');\n this.state.packetContents.forEach((content) => {\n if (content.id === 'basic.server.logs') {\n url.searchParams.set('basic_server_logs', String(content.selected));\n } else if (!content.mandatory && content.selected) {\n url.searchParams.append('plugin_packets', content.id);\n }\n });\n return url.toString();\n };\n\n extractFilename = (input: string | null): string => {\n // construct the expected filename in case of an error in the header\n const formattedDate = (moment(new Date())).format('YYYY-MM-DDTHH-mm');\n const presumedFileName = `mm_support_packet_${formattedDate}.zip`;\n\n if (input === null) {\n return presumedFileName;\n }\n\n const regex = /filename\\*?=[\"']?((?:\\\\.|[^\"'\\s])+)(?=[\"']?)/g;\n const matches = regex.exec(input!);\n\n return matches ? matches[1] : presumedFileName;\n };\n\n downloadSupportPacket = async () => {\n this.setState({loading: true});\n const res = await fetch(this.genereateDownloadURLWithParams(), {\n method: 'GET',\n headers: {'Content-Type': 'application/zip'},\n });\n const blob = await res.blob();\n this.setState({loading: false});\n\n const href = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = href;\n link.setAttribute('download', this.extractFilename(res.headers.get('content-disposition')));\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n render() {\n const {showBannerWarning} = this.state;\n const {isCloud, currentUser} = this.props;\n\n const supportLink = isCloud ? `https://customers.mattermost.com/cloud/contact-us?name=${currentUser.first_name} ${currentUser.last_name}&email=${currentUser.email}&inquiry=technical` : 'https://support.mattermost.com/hc/en-us/requests/new';\n return (\n <Modal\n id='commercialSupportModal'\n dialogClassName='a11y__modal more-modal more-direct-channels'\n show={this.state.show}\n onHide={this.doHide}\n onExited={this.props.onExited}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title>\n <FormattedMessage\n id='commercial_support.title'\n defaultMessage='Commercial Support'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className='CommercialSupportModal'>\n <FormattedMessage\n id='commercial_support_modal.description'\n defaultMessage={'If you\\'re experiencing issues, <supportLink>submit a support ticket</supportLink>. To help with troubleshooting, it\\'s recommended to download the Support Packet below that includes more details about your Mattermost environment.'}\n values={{\n supportLink: (chunks: string) => (\n <ExternalLink\n href={supportLink}\n location='commercialSupportModal'\n >\n {chunks}\n </ExternalLink>\n ),\n }}\n />\n {showBannerWarning &&\n <AlertBanner\n mode='info'\n message={\n <FormattedMessage\n id='commercial_support_modal.warning.banner'\n defaultMessage='Before downloading the Support Packet, set <strong>Output Logs to File</strong> to <strong>true</strong> and set <strong>File Log Level</strong> to <strong>DEBUG</strong> <debugLink>here</debugLink>.'\n values={{\n strong: (chunks: string) => <strong>{chunks}</strong>,\n debugLink: (chunks: string) => <Link to='/admin_console/environment/logging'>{chunks}</Link>,\n }}\n />\n }\n onDismiss={this.hideBannerWarning}\n />\n }\n <div className='CommercialSupportModal__packet_contents_download'>\n <strong>\n <FormattedMessage\n id='commercial_support_modal.download_contents'\n defaultMessage={'Select your Support Packet contents to download'}\n />\n </strong>\n </div>\n {this.state.packetContents.map((item, index) => (\n <div\n className='CommercialSupportModal__option'\n key={item.id}\n >\n <input\n className='CommercialSupportModal__options__checkbox'\n id={item.id}\n name={item.id}\n type='checkbox'\n checked={item.selected}\n disabled={item.mandatory}\n onChange={() => this.updateCheckStatus(index)}\n />\n <FormattedMessage\n id='mettormost.plugin.metrics.support.packet'\n defaultMessage={item.label}\n >\n {(text) => (\n <label\n className='CommercialSupportModal__options_checkbox_label'\n htmlFor={item.id}\n >\n {text}\n </label>)\n }\n </FormattedMessage>\n </div>\n ))}\n <div className='CommercialSupportModal__download'>\n <a\n className='btn btn-primary DownloadSupportPacket'\n onClick={this.downloadSupportPacket}\n rel='noopener noreferrer'\n >\n { this.state.loading ? <LoadingSpinner/> : <i className='icon icon-download-outline'/> }\n <FormattedMessage\n id='commercial_support.download_support_packet'\n defaultMessage='Download Support Packet'\n />\n </a>\n </div>\n </div>\n </Modal.Body>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport CommercialSupportModal from './commercial_support_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const license = getLicense(state);\n const isCloud = license.Cloud === 'true';\n const currentUser = getCurrentUser(state);\n const showBannerWarning = (config.EnableFile !== 'true' || config.FileLevel !== 'DEBUG') && !(isCloud);\n const packetContents = [\n {id: 'basic.contents', label: 'Basic contents', selected: true, mandatory: true},\n {id: 'basic.server.logs', label: 'Server logs', selected: true, mandatory: false},\n ];\n\n for (const [key, value] of Object.entries(state.entities.admin.plugins!)) {\n if (value.active && value.props !== undefined && value.props.support_packet !== undefined) {\n packetContents.push({\n id: key,\n label: value.props.support_packet,\n selected: false,\n mandatory: false,\n });\n }\n }\n\n return {\n isCloud,\n currentUser,\n showBannerWarning,\n packetContents,\n };\n}\n\nexport default connect(mapStateToProps)(CommercialSupportModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport menuItem from 'components/widgets/menu/menu_items/menu_item';\n\ntype Props = {\n to: string;\n text: string | React.ReactNode;\n};\n\nexport const MenuItemBlockableLinkImpl: React.SFC<Props> = (props: Props): JSX.Element => {\n const {to, text} = props;\n return (\n <BlockableLink to={to}>{text}</BlockableLink>\n );\n};\n\nconst MenuItemBlockableLink = menuItem(MenuItemBlockableLinkImpl);\nMenuItemBlockableLink.displayName = 'MenuItemBlockableLinkImpl';\n\nexport default MenuItemBlockableLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport AboutBuildModal from 'components/about_build_modal';\nimport CommercialSupportModal from 'components/commercial_support_modal';\nimport Menu from 'components/widgets/menu/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {filterAndSortTeamsByDisplayName} from 'utils/team_utils';\n\nimport MenuItemBlockableLink from './menu_item_blockable_link';\n\ntype Props = {\n intl: IntlShape;\n locale: string;\n siteName?: string;\n navigationBlocked?: boolean;\n teams: Team[];\n actions: {\n deferNavigation: (onNavigationConfirmed: any) => any;\n };\n isLicensed: boolean;\n isCloud: boolean;\n};\n\nclass AdminNavbarDropdown extends React.PureComponent<Props> {\n private handleLogout = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (this.props.navigationBlocked) {\n e.preventDefault();\n this.props.actions.deferNavigation(GlobalActions.emitUserLoggedOutEvent);\n } else {\n GlobalActions.emitUserLoggedOutEvent();\n }\n };\n\n render(): JSX.Element {\n const {locale, teams, siteName, isLicensed, isCloud} = this.props;\n const {formatMessage} = this.props.intl;\n const teamToRender = []; // Array of team components\n let switchTeams;\n if (teams && teams.length > 0) {\n const teamsArray = filterAndSortTeamsByDisplayName(teams, locale);\n\n for (const team of teamsArray) {\n teamToRender.push(\n <MenuItemBlockableLink\n key={'team_' + team.name}\n to={'/' + team.name}\n text={formatMessage({id: 'navbar_dropdown.switchTo', defaultMessage: 'Switch to '}) + ' ' + team.display_name}\n />,\n );\n }\n } else {\n switchTeams = (\n <MenuItemBlockableLink\n to={'/select_team'}\n icon={\n <i\n className='fa fa-exchange'\n title={formatMessage({\n id: 'select_team.icon',\n defaultMessage: 'Select Team Icon',\n })}\n />\n }\n text={formatMessage({id: 'admin.nav.switch', defaultMessage: 'Team Selection'})}\n />\n );\n }\n\n let commercialSupport = (\n <Menu.ItemExternalLink\n onClick={() => trackEvent('admin', 'click_administrators_support')}\n url='https://mattermost.com/support/'\n text={formatMessage({id: 'admin.nav.commercialSupport', defaultMessage: 'Commercial Support'})}\n />\n );\n\n if (isLicensed) {\n commercialSupport = (\n <Menu.ItemToggleModalRedux\n modalId={ModalIdentifiers.COMMERCIAL_SUPPORT}\n dialogType={CommercialSupportModal}\n text={formatMessage({id: 'admin.nav.commercialSupport', defaultMessage: 'Commercial Support'})}\n />\n );\n }\n\n let adminGuideLink = 'https://docs.mattermost.com/guides/administration.html';\n if (isCloud) {\n adminGuideLink = 'https://docs.mattermost.com/guides/administration.html#cloud-workspace-management';\n }\n\n return (\n <Menu ariaLabel={formatMessage({id: 'admin.nav.menuAriaLabel', defaultMessage: 'Admin Console Menu'})}>\n <Menu.Group>\n {teamToRender}\n {switchTeams}\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemExternalLink\n onClick={() => trackEvent('admin', 'click_administrators_guide')}\n url={adminGuideLink}\n text={formatMessage({id: 'admin.nav.administratorsGuide', defaultMessage: 'Administrator Guide'})}\n />\n <Menu.ItemExternalLink\n onClick={() => trackEvent('admin', 'click_administrators_forum')}\n url={'https://forum.mattermost.com/t/how-to-use-the-troubleshooting-forum/150'}\n text={formatMessage({id: 'admin.nav.troubleshootingForum', defaultMessage: 'Troubleshooting Forum'})}\n />\n {commercialSupport}\n <Menu.ItemToggleModalRedux\n onClick={() => trackEvent('admin', 'click_administrators_about')}\n modalId={ModalIdentifiers.ABOUT}\n dialogType={AboutBuildModal}\n text={formatMessage({id: 'navbar_dropdown.about', defaultMessage: 'About {appTitle}'}, {appTitle: siteName || 'Mattermost'})}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemAction\n onClick={this.handleLogout}\n text={formatMessage({id: 'navbar_dropdown.logout', defaultMessage: 'Log Out'})}\n />\n </Menu.Group>\n </Menu>\n );\n }\n}\n\nexport default injectIntl(AdminNavbarDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getMyTeams} from 'mattermost-redux/selectors/entities/teams';\n\nimport {deferNavigation} from 'actions/admin_actions.jsx';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getNavigationBlocked} from 'selectors/views/admin';\n\nimport type {GlobalState} from 'types/store';\n\nimport AdminNavbarDropdown from './admin_navbar_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n const isLicensed = license.IsLicensed === 'true';\n const isCloud = license.Cloud === 'true';\n\n return {\n locale: getCurrentLocale(state),\n teams: getMyTeams(state),\n siteName: getConfig(state).SiteName,\n navigationBlocked: getNavigationBlocked(state),\n isLicensed,\n isCloud,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n deferNavigation,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AdminNavbarDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport AdminNavbarDropdown from 'components/admin_console/admin_navbar_dropdown';\nimport MenuIcon from 'components/widgets/icons/menu_icon';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Avatar from 'components/widgets/users/avatar';\n\ntype Props = {\n currentUser: UserProfile;\n}\n\nconst SidebarHeader = ({currentUser: me}: Props) => {\n const intl = useIntl();\n let profilePicture = null;\n\n if (!me) {\n return null;\n }\n\n if (me.last_picture_update) {\n profilePicture = (\n <Avatar\n username={me.username}\n url={Client4.getProfilePictureUrl(me.id, me.last_picture_update)}\n size='lg'\n />\n );\n }\n\n return (\n <MenuWrapper className='AdminSidebarHeader'>\n <div>\n {profilePicture}\n <div className='header__info'>\n <div className='team__name'>\n <FormattedMessage\n id='admin.sidebarHeader.systemConsole'\n defaultMessage='System Console'\n />\n </div>\n <div className='user__name overflow--ellipsis whitespace--nowrap'>{'@' + me.username}</div>\n </div>\n <button\n type='button'\n className='style--none'\n aria-label={intl.formatMessage({id: 'generic_icons.menu', defaultMessage: 'Menu Icon'})}\n >\n <MenuIcon className='menu-icon'/>\n </button>\n </div>\n <AdminNavbarDropdown/>\n </MenuWrapper>\n );\n};\n\nexport default memo(SidebarHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport AdminSidebarHeader from './admin_sidebar_header';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentUser: getCurrentUser(state),\n };\n}\n\nexport default connect(mapStateToProps)(AdminSidebarHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\n\nimport type {PluginRedux, PluginSetting} from '@mattermost/types/plugins';\n\nimport getEnablePluginSetting from 'components/admin_console/custom_plugin_settings/enable_plugin_setting';\nimport type {AdminDefinitionSetting} from 'components/admin_console/types';\n\nimport {stripMarkdown} from 'utils/markdown';\n\nfunction extractTextsFromPlugin(plugin: PluginRedux, intl: IntlShape) {\n const texts = extractTextFromSetting(getEnablePluginSetting(plugin), intl);\n if (plugin.name) {\n texts.push(plugin.name);\n }\n if (plugin.id) {\n texts.push(plugin.id);\n }\n if (plugin.settings_schema) {\n if (plugin.settings_schema.footer) {\n texts.push(stripMarkdown(plugin.settings_schema.footer));\n }\n if (plugin.settings_schema.header) {\n texts.push(stripMarkdown(plugin.settings_schema.header));\n }\n\n if (plugin.settings_schema.settings) {\n const settings = Object.values(plugin.settings_schema.settings);\n\n for (const setting of settings) {\n const settingsTexts = extractTextFromSetting(setting as Partial<AdminDefinitionSetting & PluginSetting>, intl);\n texts.push(...settingsTexts);\n }\n }\n }\n return texts;\n}\n\nfunction pushString(texts: string[], value: string | MessageDescriptor | undefined, intl: IntlShape, shouldStripMarkdown?: boolean) {\n let newValue;\n if (value) {\n if (typeof value === 'string') {\n newValue = value;\n } else {\n newValue = intl.formatMessage(value);\n }\n }\n\n if (newValue && shouldStripMarkdown) {\n newValue = stripMarkdown(newValue);\n }\n\n if (newValue) {\n texts.push(newValue);\n }\n}\n\nfunction extractTextFromSetting(setting: Partial<AdminDefinitionSetting & PluginSetting>, intl: IntlShape) {\n const texts: string[] = [];\n pushString(texts, setting.label, intl);\n pushString(texts, setting.display_name, intl);\n pushString(texts, setting.help_text, intl, true);\n pushString(texts, setting.key, intl);\n return texts;\n}\n\nexport function getPluginEntries(pluginsObj: Record<string, PluginRedux> | undefined, intl: IntlShape) {\n const entries: Record<string, string[]> = {};\n const plugins = pluginsObj || {};\n for (const pluginId of Object.keys(plugins)) {\n const url = `plugin_${pluginId}`;\n entries[url] = extractTextsFromPlugin(plugins[pluginId], intl);\n }\n return entries;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport FlexSearch from 'flexsearch/dist/flexsearch.es5';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\n\nimport type {PluginRedux} from '@mattermost/types/plugins';\n\nimport type AdminDefinition from 'components/admin_console/admin_definition';\nimport type {AdminDefinitionSetting, AdminDefinitionSubSection} from 'components/admin_console/types';\n\nimport {getPluginEntries} from './admin_console_plugin_index';\n\nexport type Index = {\n\n /**\n * Adds an element to the index.\n *\n * @param id if of element to be added\n * @param element string to be added\n */\n add(id: string, element: string): void;\n\n /**\n * Searches for a list of elements matching the query.\n *\n * @param query string to be used for search.\n */\n search(query: string): string[];\n}\n\nfunction pushText(texts: string[], value: string | MessageDescriptor | JSX.Element, intl: IntlShape, values?: Record<string, any>) {\n if (typeof value === 'string') {\n texts.push(value);\n } else if ('id' in value) {\n texts.push(intl.formatMessage(value, values));\n }\n}\n\nfunction extractTextsFromSection(section: AdminDefinitionSubSection, intl: IntlShape) {\n const texts: string[] = [];\n if (section.title) {\n pushText(texts, section.title, intl);\n }\n if ('name' in section.schema && section.schema.name) {\n pushText(texts, section.schema.name, intl);\n }\n if (section.searchableStrings) {\n for (const searchableString of section.searchableStrings) {\n if (Array.isArray(searchableString)) {\n texts.push(intl.formatMessage(searchableString[0], searchableString[1]));\n } else {\n pushText(texts, searchableString, intl);\n }\n }\n }\n\n if (section.schema) {\n if ('settings' in section.schema && section.schema.settings) {\n texts.push(...extractTextFromSettings(section.schema.settings, intl));\n } else if ('sections' in section.schema && section.schema.sections) {\n section.schema.sections.forEach((schemaSection) => {\n texts.push(...extractTextFromSettings(schemaSection.settings, intl));\n });\n }\n }\n\n return texts;\n}\n\nfunction extractTextFromSettings(settings: AdminDefinitionSetting[], intl: IntlShape) {\n const texts: string[] = [];\n\n for (const setting of Object.values(settings)) {\n if (setting.label) {\n pushText(texts, setting.label, intl, setting.label_values);\n }\n if (setting.help_text) {\n pushText(texts, setting.help_text, intl, setting.help_text_values);\n }\n if ('remove_help_text' in setting && setting.remove_help_text) {\n pushText(texts, setting.remove_help_text, intl);\n }\n if ('remove_button_text' in setting && setting.remove_button_text) {\n pushText(texts, setting.remove_button_text, intl);\n }\n }\n\n return texts;\n}\n\nexport function adminDefinitionsToUrlsAndTexts(adminDefinition: typeof AdminDefinition, intl: IntlShape) {\n const entries: Record<string, Array<string | string[]>> = {};\n const sections = [\n adminDefinition.about,\n adminDefinition.reporting,\n adminDefinition.user_management,\n adminDefinition.environment,\n adminDefinition.site,\n adminDefinition.authentication,\n adminDefinition.plugins,\n adminDefinition.integrations,\n adminDefinition.compliance,\n adminDefinition.experimental,\n adminDefinition.billing,\n ];\n for (const section of sections) {\n for (const item of Object.values(section.subsections)) {\n if (!item.isDiscovery) {\n entries[item.url] = extractTextsFromSection(item, intl);\n }\n }\n }\n return entries;\n}\n\nexport function generateIndex(adminDefinition: typeof AdminDefinition, intl: IntlShape, plugins?: Record<string, PluginRedux>) {\n const idx: Index = new FlexSearch();\n\n addToIndex(adminDefinitionsToUrlsAndTexts(adminDefinition, intl), idx);\n\n addToIndex(getPluginEntries(plugins, intl), idx);\n\n return idx;\n}\n\nfunction addToIndex(entries: Record<string, Array<string | string[]>>, idx: Index) {\n for (const key of Object.keys(entries)) {\n let text = '';\n for (const str of entries[key]) {\n text += ' ' + str;\n }\n idx.add(key, text);\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport isEqual from 'lodash/isEqual';\nimport React from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {PluginRedux} from '@mattermost/types/plugins';\n\nimport AdminSidebarCategory from 'components/admin_console/admin_sidebar/admin_sidebar_category';\nimport AdminSidebarSection from 'components/admin_console/admin_sidebar/admin_sidebar_section';\nimport AdminSidebarHeader from 'components/admin_console/admin_sidebar_header';\nimport SearchKeywordMarking from 'components/admin_console/search_keyword_marking';\nimport QuickInput from 'components/quick_input';\nimport SearchIcon from 'components/widgets/icons/search_icon';\n\nimport {generateIndex} from 'utils/admin_console_index';\nimport type {Index} from 'utils/admin_console_index';\nimport {getHistory} from 'utils/browser_history';\n\nimport type AdminDefinition from '../admin_definition';\n\nimport type {PropsFromRedux} from './index';\n\nexport interface Props extends PropsFromRedux {\n intl: IntlShape;\n onSearchChange: (term: string) => void;\n}\n\ntype State = {\n sections: string[] | null;\n filter: string;\n}\n\nconst renderScrollView = (props: Props) => (\n <div\n {...props}\n className='scrollbar--view'\n />\n);\n\nconst renderScrollThumbHorizontal = (props: Props) => (\n <div\n {...props}\n className='scrollbar--horizontal'\n />\n);\n\nconst renderScrollThumbVertical = (props: Props) => (\n <div\n {...props}\n className='scrollbar--vertical'\n />\n);\n\nclass AdminSidebar extends React.PureComponent<Props, State> {\n searchRef: React.RefObject<HTMLInputElement>;\n idx: Index | null;\n\n static defaultProps = {\n plugins: {},\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n sections: null,\n filter: '',\n };\n this.idx = null;\n this.searchRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.config.PluginSettings?.Enable) {\n this.props.actions.getPlugins();\n }\n\n if (this.searchRef.current) {\n this.searchRef.current.focus();\n }\n\n this.updateTitle();\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.idx !== null &&\n (!isEqual(this.props.plugins, prevProps.plugins) ||\n !isEqual(this.props.adminDefinition, prevProps.adminDefinition))) {\n this.idx = generateIndex(this.props.adminDefinition, this.props.intl, this.props.plugins);\n }\n }\n\n handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const filter = e.target.value;\n if (filter === '') {\n this.setState({sections: null, filter});\n this.props.onSearchChange(filter);\n return;\n }\n\n if (this.idx === null) {\n this.idx = generateIndex(this.props.adminDefinition, this.props.intl, this.props.plugins);\n }\n let query = '';\n for (const term of filter.split(' ')) {\n term.trim();\n if (term !== '') {\n query += term + ' ';\n query += term + '* ';\n }\n }\n const sections = this.idx.search(query);\n this.setState({sections, filter});\n this.props.onSearchChange(filter);\n\n if (this.props.navigationBlocked) {\n return;\n }\n\n const validSection = sections.indexOf(getHistory().location.pathname.replace('/admin_console/', '')) !== -1;\n if (!validSection) {\n const visibleSections = this.visibleSections();\n for (const section of sections) {\n if (visibleSections.has(section)) {\n getHistory().replace('/admin_console/' + section);\n break;\n }\n }\n }\n };\n\n updateTitle = () => {\n let currentSiteName = '';\n if (this.props.siteName) {\n currentSiteName = ' - ' + this.props.siteName;\n }\n\n document.title = this.props.intl.formatMessage({id: 'sidebar_right_menu.console', defaultMessage: 'System Console'}) + currentSiteName;\n };\n\n visibleSections = () => {\n const {config, license, buildEnterpriseReady, consoleAccess, adminDefinition, cloud} = this.props;\n const isVisible = (item: any) => {\n if (!item.schema) {\n return false;\n }\n\n if (!item.title) {\n return false;\n }\n\n if (item.isHidden && item.isHidden(config, this.state, license, buildEnterpriseReady, consoleAccess, cloud)) {\n return false;\n }\n return true;\n };\n const result = new Set();\n for (const section of Object.values(adminDefinition)) {\n for (const item of Object.values(section.subsections)) {\n if (isVisible(item)) {\n result.add(item.url);\n }\n }\n }\n return result;\n };\n\n renderRootMenu = (definition: typeof AdminDefinition) => {\n const {config, license, buildEnterpriseReady, consoleAccess, cloud, subscriptionProduct} = this.props;\n const sidebarSections: JSX.Element[] = [];\n Object.entries(definition).forEach(([key, section]) => {\n let isSectionHidden = false;\n if (section.isHidden) {\n isSectionHidden = typeof section.isHidden === 'function' ? section.isHidden(config, this.state, license, buildEnterpriseReady, consoleAccess, cloud) : Boolean(section.isHidden);\n }\n if (!isSectionHidden) {\n const sidebarItems: JSX.Element[] = [];\n Object.entries(section.subsections).forEach(([subKey, item]) => {\n if (!item.title) {\n return;\n }\n\n if (item.isHidden) {\n if (typeof item.isHidden === 'function' ? item.isHidden(config, this.state, license, buildEnterpriseReady, consoleAccess, cloud) : Boolean(item.isHidden)) {\n return;\n }\n }\n\n if (this.state.sections !== null) {\n let active = false;\n for (const url of this.state.sections) {\n if (url === item.url) {\n active = true;\n }\n }\n if (!active) {\n return;\n }\n }\n const subDefinitionKey = `${key}.${subKey}`;\n sidebarItems.push((\n <AdminSidebarSection\n key={subDefinitionKey}\n definitionKey={subDefinitionKey}\n name={item.url}\n restrictedIndicator={item.restrictedIndicator?.shouldDisplay(license, subscriptionProduct) ? item.restrictedIndicator.value(cloud) : undefined}\n title={\n typeof item.title === 'string' ?\n item.title :\n <FormattedMessage\n {...item.title}\n />\n }\n />\n ));\n });\n\n // Special case for plugins entries\n if ((section as typeof AdminDefinition['plugins']).id === 'plugins') {\n const sidebarPluginItems = this.renderPluginsMenu();\n sidebarItems.push(...sidebarPluginItems);\n }\n\n // If no visible items, don't display this section\n if (sidebarItems.length === 0) {\n return null;\n }\n\n sidebarSections.push((\n <AdminSidebarCategory\n key={key}\n definitionKey={key}\n parentLink='/admin_console'\n icon={section.icon}\n sectionClass=''\n title={\n typeof section.sectionTitle === 'string' ?\n section.sectionTitle :\n <FormattedMessage\n {...section.sectionTitle}\n />\n }\n >\n {sidebarItems}\n </AdminSidebarCategory>\n ));\n }\n return null;\n });\n return sidebarSections;\n };\n\n isPluginPresentInSections = (plugin: PluginRedux) => {\n return this.state.sections && this.state.sections.indexOf(`plugin_${plugin.id}`) >= 0;\n };\n\n renderPluginsMenu = () => {\n const {config, plugins} = this.props;\n if (config.PluginSettings?.Enable && plugins) {\n return Object.values(plugins).sort((a, b) => {\n const nameCompare = a.name.localeCompare(b.name);\n if (nameCompare !== 0) {\n return nameCompare;\n }\n\n return a.id.localeCompare(b.id);\n }).\n filter((plugin) => this.state.sections === null || this.isPluginPresentInSections(plugin)).\n map((plugin) => {\n return (\n <AdminSidebarSection\n key={'customplugin' + plugin.id}\n name={'plugins/plugin_' + plugin.id}\n title={plugin.name}\n />\n );\n });\n }\n\n return [];\n };\n\n handleClearFilter = () => {\n this.setState({sections: null, filter: ''});\n this.props.onSearchChange('');\n };\n\n render() {\n const {showTaskList} = this.props;\n return (\n <div className='admin-sidebar'>\n <AdminSidebarHeader/>\n <div className='filter-container'>\n <SearchIcon\n className='search__icon'\n aria-hidden='true'\n />\n <QuickInput\n className={'filter ' + (this.state.filter ? 'active' : '')}\n type='text'\n onChange={this.handleSearchChange}\n value={this.state.filter}\n placeholder={this.props.intl.formatMessage({id: 'admin.sidebar.filter', defaultMessage: 'Find settings'})}\n ref={this.searchRef}\n id='adminSidebarFilter'\n clearable={true}\n onClear={this.handleClearFilter}\n />\n </div>\n <Scrollbars\n autoHide={true}\n autoHideTimeout={500}\n autoHideDuration={500}\n renderThumbHorizontal={renderScrollThumbHorizontal}\n renderThumbVertical={renderScrollThumbVertical}\n renderView={renderScrollView}\n >\n <div className='nav-pills__container'>\n <SearchKeywordMarking keyword={this.state.filter}>\n <ul className={classNames('nav nav-pills nav-stacked', {'task-list-shown': showTaskList})}>\n {this.renderRootMenu(this.props.adminDefinition)}\n </ul>\n </SearchKeywordMarking>\n </div>\n </Scrollbars>\n </div>\n );\n }\n}\n\nexport default injectIntl(AdminSidebar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getPlugins} from 'mattermost-redux/actions/admin';\nimport {getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {getAdminDefinition, getConsoleAccess} from 'selectors/admin_console';\nimport {getNavigationBlocked} from 'selectors/views/admin';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {OnboardingTaskCategory, OnboardingTaskList} from 'components/onboarding_tasks';\n\nimport type {GlobalState} from 'types/store';\n\nimport AdminSidebar from './admin_sidebar';\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n const config = getConfig(state);\n const buildEnterpriseReady = config.BuildEnterpriseReady === 'true';\n const siteName = config.SiteName;\n const adminDefinition = getAdminDefinition(state);\n const consoleAccess = getConsoleAccess(state);\n const taskListStatus = getBool(state, OnboardingTaskCategory, OnboardingTaskList.ONBOARDING_TASK_LIST_SHOW);\n const isUserFirstAdmin = isFirstAdmin(state);\n const isMobileView = getIsMobileView(state);\n const showTaskList = isUserFirstAdmin && taskListStatus && !isMobileView;\n const subscriptionProduct = getSubscriptionProduct(state);\n\n return {\n license,\n config: state.entities.admin.config,\n plugins: state.entities.admin.plugins,\n navigationBlocked: getNavigationBlocked(state),\n buildEnterpriseReady,\n siteName,\n adminDefinition,\n consoleAccess,\n cloud: state.entities.cloud,\n showTaskList,\n subscriptionProduct,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getPlugins,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps, null, {pure: false});\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(AdminSidebar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Route, Switch, Redirect} from 'react-router-dom';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport type {CloudState} from '@mattermost/types/cloud';\nimport type {AdminConfig, ClientLicense, EnvironmentConfig} from '@mattermost/types/config';\nimport type {Role} from '@mattermost/types/roles';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport SchemaAdminSettings from 'components/admin_console/schema_admin_settings';\nimport SearchKeywordMarking from 'components/admin_console/search_keyword_marking';\nimport AnnouncementBarController from 'components/announcement_bar';\nimport BackstageNavbar from 'components/backstage/components/backstage_navbar';\nimport DiscardChangesModal from 'components/discard_changes_modal';\nimport ModalController from 'components/modal_controller';\nimport SystemNotice from 'components/system_notice';\n\nimport {applyTheme, resetTheme} from 'utils/utils';\n\nimport {LhsItemType} from 'types/store/lhs';\n\nimport AdminSidebar from './admin_sidebar';\nimport type {AdminDefinitionSubSection, AdminDefinitionSection} from './types';\n\nimport type {PropsFromRedux} from './index';\n\nexport type Props = PropsFromRedux & RouteComponentProps;\n\ntype State = {\n search: string;\n}\n\n// not every page in the system console will need the license and config, but the vast majority will\ntype ExtraProps = {\n enterpriseReady: boolean;\n license: ClientLicense;\n config: Partial<AdminConfig>;\n environmentConfig: Partial<EnvironmentConfig>;\n setNavigationBlocked: (blocked: boolean) => void;\n roles: Record<string, Role>;\n editRole: (role: Role) => void;\n patchConfig: (config: DeepPartial<AdminConfig>) => Promise<ActionResult>;\n cloud: CloudState;\n isCurrentUserSystemAdmin: boolean;\n}\n\nclass AdminConsole extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n this.state = {\n search: '',\n };\n }\n\n public componentDidMount(): void {\n this.props.actions.getConfig();\n this.props.actions.getEnvironmentConfig();\n this.props.actions.loadRolesIfNeeded(['channel_user', 'team_user', 'system_user', 'channel_admin', 'team_admin', 'system_admin', 'system_user_manager', 'system_custom_group_admin', 'system_read_only_admin', 'system_manager']);\n this.props.actions.selectLhsItem(LhsItemType.None);\n this.props.actions.selectTeam('');\n document.body.classList.add('console__body');\n document.getElementById('root')?.classList.add('console__root');\n resetTheme();\n }\n\n public componentWillUnmount(): void {\n document.body.classList.remove('console__body');\n document.getElementById('root')?.classList.remove('console__root');\n applyTheme(this.props.currentTheme);\n\n // Reset the admin console users management table properties\n this.props.actions.setAdminConsoleUsersManagementTableProperties();\n }\n\n private handleSearchChange = (search: string) => {\n this.setState({search});\n };\n\n private mainRolesLoaded(roles: Record<string, Role>) {\n return (\n roles &&\n roles.channel_admin &&\n roles.channel_user &&\n roles.team_admin &&\n roles.team_user &&\n roles.system_admin &&\n roles.system_user &&\n roles.system_user_manager &&\n roles.system_read_only_admin &&\n roles.system_custom_group_admin &&\n roles.system_manager\n );\n }\n\n private renderRoutes = (extraProps: ExtraProps) => {\n const {adminDefinition, config, license, buildEnterpriseReady, consoleAccess, cloud, isCurrentUserSystemAdmin} = this.props;\n\n const schemas: AdminDefinitionSubSection[] = Object.values(adminDefinition).flatMap((section: AdminDefinitionSection) => {\n let isSectionHidden = false;\n if (typeof section.isHidden === 'function') {\n isSectionHidden = section.isHidden(config, this.state, license, buildEnterpriseReady, consoleAccess, cloud, isCurrentUserSystemAdmin);\n } else {\n isSectionHidden = Boolean(section.isHidden);\n }\n if (isSectionHidden) {\n return [];\n }\n return Object.values(section.subsections);\n });\n\n let defaultUrl = '';\n\n const schemaRoutes = schemas.map((item: AdminDefinitionSubSection, index: number) => {\n if (typeof item.isHidden !== 'undefined') {\n const isHidden = (typeof item.isHidden === 'function') ? item.isHidden(config, this.state, license, buildEnterpriseReady, consoleAccess, cloud, isCurrentUserSystemAdmin) : Boolean(item.isHidden);\n if (isHidden) {\n return false;\n }\n }\n\n let isItemDisabled: boolean;\n\n if (typeof item.isDisabled === 'function') {\n isItemDisabled = item.isDisabled(config, this.state, license, buildEnterpriseReady, consoleAccess, cloud, isCurrentUserSystemAdmin);\n } else {\n isItemDisabled = Boolean(item.isDisabled);\n }\n\n if (!isItemDisabled && defaultUrl === '') {\n const {url} = schemas[index];\n\n // Don't use a url as default if it requires an additional ID\n // in the path.\n if (!url.includes(':')) {\n defaultUrl = url;\n }\n }\n\n return (\n <Route\n key={item.url}\n path={`${this.props.match.url}/${item.url}`}\n render={(props) => (\n <SchemaAdminSettings\n {...extraProps}\n {...props}\n consoleAccess={this.props.consoleAccess}\n schema={item.schema}\n isDisabled={isItemDisabled}\n />\n )}\n />\n );\n });\n\n return (\n <Switch>\n {schemaRoutes}\n {<Redirect to={`${this.props.match.url}/${defaultUrl}`}/>}\n </Switch>\n );\n };\n\n public render(): JSX.Element | null {\n const {\n license,\n config,\n environmentConfig,\n showNavigationPrompt,\n roles,\n } = this.props;\n const {setNavigationBlocked, cancelNavigation, confirmNavigation, editRole, patchConfig} = this.props.actions;\n\n if (!this.props.currentUserHasAnAdminRole) {\n return (\n <Redirect to={this.props.unauthorizedRoute}/>\n );\n }\n\n if (!this.mainRolesLoaded(this.props.roles)) {\n return null;\n }\n\n if (Object.keys(config).length === 0) {\n return <div/>;\n }\n\n if (config && Object.keys(config).length === 0 && config.constructor === Object) {\n return (\n <div className='admin-console__wrapper admin-console'/>\n );\n }\n\n const extraProps: ExtraProps = {\n enterpriseReady: this.props.buildEnterpriseReady,\n license,\n config,\n environmentConfig,\n setNavigationBlocked,\n roles,\n editRole,\n patchConfig,\n cloud: this.props.cloud,\n isCurrentUserSystemAdmin: this.props.isCurrentUserSystemAdmin,\n };\n\n return (\n <>\n <AnnouncementBarController/>\n <SystemNotice/>\n <BackstageNavbar team={this.props.team}/>\n <AdminSidebar onSearchChange={this.handleSearchChange}/>\n <div\n className='admin-console__wrapper admin-console'\n id='adminConsoleWrapper'\n >\n <SearchKeywordMarking\n keyword={this.state.search}\n pathname={this.props.location.pathname}\n >\n {this.renderRoutes(extraProps)}\n </SearchKeywordMarking>\n </div>\n <DiscardChangesModal\n show={showNavigationPrompt}\n onConfirm={confirmNavigation}\n onCancel={cancelNavigation}\n />\n <ModalController/>\n </>\n );\n }\n}\n\nexport default AdminConsole;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getConfig, getEnvironmentConfig, patchConfig} from 'mattermost-redux/actions/admin';\nimport {loadRolesIfNeeded, editRole} from 'mattermost-redux/actions/roles';\nimport {selectTeam} from 'mattermost-redux/actions/teams';\nimport {General} from 'mattermost-redux/constants';\nimport * as Selectors from 'mattermost-redux/selectors/entities/admin';\nimport {getConfig as getGeneralConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {isCurrentUserSystemAdmin, currentUserHasAnAdminRole, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {setNavigationBlocked, deferNavigation, cancelNavigation, confirmNavigation} from 'actions/admin_actions.jsx';\nimport {setAdminConsoleUsersManagementTableProperties} from 'actions/views/admin';\nimport {selectLhsItem} from 'actions/views/lhs';\nimport {getAdminDefinition, getConsoleAccess} from 'selectors/admin_console';\nimport {showNavigationPrompt} from 'selectors/views/admin';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport type {GlobalState} from 'types/store';\n\nimport AdminConsole from './admin_console';\n\nfunction mapStateToProps(state: GlobalState) {\n const generalConfig = getGeneralConfig(state);\n const buildEnterpriseReady = generalConfig.BuildEnterpriseReady === 'true';\n const adminDefinition = getAdminDefinition(state);\n const teamId = LocalStorageStore.getPreviousTeamId(getCurrentUserId(state));\n const team = getTeam(state, teamId || '');\n const unauthorizedRoute = team ? `/${team.name}/channels/${General.DEFAULT_CHANNEL}` : '/';\n const consoleAccess = getConsoleAccess(state);\n\n return {\n config: Selectors.getConfig(state),\n environmentConfig: Selectors.getEnvironmentConfig(state),\n license: getLicense(state),\n buildEnterpriseReady,\n unauthorizedRoute,\n showNavigationPrompt: showNavigationPrompt(state),\n isCurrentUserSystemAdmin: isCurrentUserSystemAdmin(state),\n currentUserHasAnAdminRole: currentUserHasAnAdminRole(state),\n roles: getRoles(state),\n adminDefinition,\n consoleAccess,\n cloud: state.entities.cloud,\n team,\n currentTheme: getTheme(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getConfig,\n getEnvironmentConfig,\n patchConfig,\n setNavigationBlocked,\n deferNavigation,\n cancelNavigation,\n confirmNavigation,\n loadRolesIfNeeded,\n editRole,\n selectLhsItem,\n selectTeam,\n setAdminConsoleUsersManagementTableProperties,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(AdminConsole);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function BackIcon() {\n const {formatMessage} = useIntl();\n return (\n <i\n className='fa fa-angle-left'\n title={formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n />\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackIcon from 'components/widgets/icons/fa_back_icon';\n\ntype Props = {\n team?: Team;\n siteName?: string;\n}\n\nconst BackstageNavbar = ({team, siteName}: Props) => {\n const teamExists = team?.delete_at === 0;\n\n return (\n <div className='backstage-navbar'>\n <Link\n className='backstage-navbar__back'\n to={`/${teamExists ? team?.name : ''}`}\n >\n <BackIcon/>\n <span>\n {teamExists ? (\n <FormattedMessage\n id='backstage_navbar.backToMattermost'\n defaultMessage='Back to {siteName}'\n values={{siteName: siteName ?? team?.name}}\n />\n ) : (\n <FormattedMessage\n id='backstage_navbar.back'\n defaultMessage='Back'\n />\n )}\n </span>\n </Link>\n </div>\n );\n};\n\nexport default BackstageNavbar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useRef, useCallback, useState} from 'react';\nimport {defineMessages} from 'react-intl';\n\ntype CopyOptions = {\n successCopyTimeout?: number;\n text: string;\n trackCallback?: () => void;\n};\n\ntype CopyResponse = {\n copiedRecently: boolean;\n copyError: boolean;\n onClick: () => void;\n};\n\nconst DEFAULT_COPY_TIMEOUT = 4000;\n\nexport default function useCopyText({\n text,\n successCopyTimeout: successCopyTimeoutReceived,\n trackCallback,\n}: CopyOptions): CopyResponse {\n const [copiedRecently, setCopiedRecently] = useState(false);\n const [copyError, setCopyError] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n let successCopyTimeout = DEFAULT_COPY_TIMEOUT;\n if (successCopyTimeoutReceived || successCopyTimeoutReceived === 0) {\n successCopyTimeout = successCopyTimeoutReceived;\n }\n\n const onClick = useCallback(() => {\n trackCallback?.();\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n const clipboard = navigator.clipboard;\n if (clipboard) {\n clipboard.writeText(text).\n then(() => {\n setCopiedRecently(true);\n setCopyError(false);\n }).\n catch(() => {\n setCopiedRecently(false);\n setCopyError(true);\n });\n } else {\n const textField = document.createElement('textarea');\n textField.innerText = text;\n textField.style.position = 'fixed';\n textField.style.opacity = '0';\n\n document.body.appendChild(textField);\n textField.select();\n\n try {\n const success = document.execCommand('copy');\n setCopiedRecently(success);\n setCopyError(!success);\n } catch (err) {\n setCopiedRecently(false);\n setCopyError(true);\n }\n textField.remove();\n }\n\n timerRef.current = setTimeout(() => {\n setCopiedRecently(false);\n setCopyError(false);\n }, successCopyTimeout);\n }, [successCopyTimeout, text, trackCallback]);\n\n return {\n copiedRecently,\n copyError,\n onClick,\n };\n}\n\nexport const messages = defineMessages({\n copy: {id: 'copy_text.copy', defaultMessage: 'Copy'},\n copied: {id: 'copy_text.copied', defaultMessage: 'Copied'},\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useMemo} from 'react';\n\nimport type {CloudUsage} from '@mattermost/types/cloud';\n\nimport useGetLimits from './useGetLimits';\nimport useGetUsage from './useGetUsage';\n\n// Returns an object of type CloudUsage with the values being the delta between the limit, and the actual usage of this installation.\n// A value < 0 means that they are NOT over the limit. A value > 0 means they've exceeded that limit\n// 2 teams used, minus 1 team limit = value > 0, limit exceeded\n// 10MB files used, minus 1000MB limit = value < 0, limit not exceeded.\n// etc.\n// withBackupValue will set the limit arbitrarily high in the event that the limit isn't set\nexport const withBackupValue = (maybeLimit: number | undefined, limitsLoaded: boolean) => (limitsLoaded ? (maybeLimit ?? Number.MAX_VALUE) : Number.MAX_VALUE);\n\nexport default function useGetUsageDeltas(): CloudUsage {\n const usage = useGetUsage();\n const [limits, limitsLoaded] = useGetLimits();\n\n const usageDelta = useMemo(() => {\n return (\n {\n files: {\n totalStorage: usage.files.totalStorage - withBackupValue(limits.files?.total_storage, limitsLoaded),\n totalStorageLoaded: usage.files.totalStorageLoaded,\n },\n messages: {\n history: usage.messages.history - withBackupValue(limits.messages?.history, limitsLoaded),\n historyLoaded: usage.messages.historyLoaded,\n },\n teams: {\n active: usage.teams.active - withBackupValue(limits.teams?.active, limitsLoaded),\n\n // cloudArchived doesn't count against usage, but we pass the value along for convenience\n cloudArchived: usage.teams.cloudArchived,\n teamsLoaded: usage.teams.teamsLoaded,\n },\n }\n );\n }, [usage, limits, limitsLoaded]);\n\n return usageDelta;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n};\n\nconst AlertSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '87'}\n height={props.height ? props.height.toString() : '70'}\n viewBox='0 0 87 70'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x='8.00098'\n y='7'\n width='72'\n height='24'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <rect\n x='0.000976562'\n y='34'\n width='87'\n height='25'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <path\n d='M38.3214 2.31098C39.4303 0.112261 42.5697 0.112256 43.6786 2.31098L71.7146 57.899C72.7209 59.8943 71.2707 62.25 69.0359 62.25H12.9641C10.7294 62.25 9.27912 59.8943 10.2854 57.899L38.3214 2.31098Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M40.3214 4.31098C41.4303 2.11226 44.5697 2.11226 45.6786 4.31098L73.7146 59.899C74.7209 61.8943 73.2707 64.25 71.0359 64.25H14.9641C12.7294 64.25 11.2791 61.8943 12.2854 59.899L40.3214 4.31098Z'\n fill='#FFBC1F'\n />\n <path\n d='M43.2322 2.53614L71.2681 58.1242C72.1067 59.7869 70.8982 61.75 69.0359 61.75H12.9641C11.1018 61.75 9.89327 59.7869 10.7319 58.1242L38.7678 2.53614C39.6919 0.703873 42.3081 0.703871 43.2322 2.53614Z'\n stroke='var(--center-channel-color)'\n />\n <path\n d='M49.542 4.23999L52.8888 10.72M74.922 53.38L68.5073 40.96L66.8339 37.72L64.6027 33.4L61.5348 27.46M59.3036 23.14L55.12 15.04'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeWidth='1.08'\n strokeLinecap='round'\n />\n <path\n d='M38.0164 25.2833L40.2971 39.9301C40.3191 40.2208 40.4554 40.4927 40.6786 40.6912C40.9018 40.8897 41.1954 41 41.5002 41C41.8051 41 42.0986 40.8897 42.3219 40.6912C42.5451 40.4927 42.6814 40.2208 42.7034 39.9301L44.984 25.2833C45.3987 19.5722 37.5955 19.5722 38.0164 25.2833Z'\n fill='#3F4350'\n />\n <path\n d='M41.0072 47C41.798 47.0014 42.5706 47.2372 43.2275 47.6776C43.8843 48.118 44.396 48.7432 44.6976 49.4742C44.9993 50.2053 45.0774 51.0093 44.9222 51.7848C44.7671 52.5602 44.3856 53.2723 43.8259 53.831C43.2662 54.3897 42.5535 54.7699 41.7777 54.9237C41.002 55.0774 40.1981 54.9978 39.4676 54.6948C38.7371 54.3919 38.1128 53.8792 37.6736 53.2215C37.2344 52.5639 37 51.7908 37 51C37 50.4741 37.1036 49.9534 37.3051 49.4676C37.5066 48.9818 37.8019 48.5406 38.1741 48.169C38.5463 47.7975 38.9881 47.503 39.4743 47.3024C39.9604 47.1018 40.4813 46.9991 41.0072 47Z'\n fill='#3F4350'\n />\n <path\n d='M48.4619 68.5H70.0619'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeWidth='1.08'\n strokeLinecap='round'\n />\n <path\n d='M10.001 50L26.001 19'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeWidth='1.08'\n strokeLinecap='round'\n />\n </svg>\n\n);\n\nexport default AlertSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport * as Utils from 'utils/utils';\n\ntype Props = {\n fileInfo: FileInfo;\n fileUrl: string;\n canDownloadFiles: boolean;\n};\n\nconst FileInfoPreview = ({\n fileInfo,\n fileUrl,\n canDownloadFiles,\n}: Props) => {\n const intl = useIntl();\n\n // non-image files include a section providing details about the file\n const infoParts = [];\n\n if (fileInfo.extension !== '') {\n infoParts.push(\n intl.formatMessage({id: 'file_info_preview.type', defaultMessage: 'File type '}) +\n fileInfo.extension.toUpperCase(),\n );\n }\n\n if (fileInfo.size) {\n infoParts.push(\n intl.formatMessage({id: 'file_info_preview.size', defaultMessage: 'Size '}) +\n Utils.fileSizeToString(fileInfo.size),\n );\n }\n\n const infoString = infoParts.join(', ');\n\n let preview = null;\n if (canDownloadFiles) {\n preview = (\n <a\n className='file-details__preview'\n href={fileUrl}\n >\n <span className='file-details__preview-helper'/>\n <img\n alt={'file preview'}\n src={Utils.getFileIconPath(fileInfo)}\n />\n </a>\n );\n } else {\n preview = (\n <span className='file-details__preview'>\n <span className='file-details__preview-helper'/>\n <img\n alt={'file preview'}\n src={Utils.getFileIconPath(fileInfo)}\n />\n </span>\n );\n }\n\n return (\n <div className='file-details__container'>\n {preview}\n <div className='file-details'>\n <div className='file-details__name'>{fileInfo.name}</div>\n <div className='file-details__info'>{infoString}</div>\n </div>\n </div>\n );\n};\n\nexport default React.memo(FileInfoPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {canDownloadFiles} from 'utils/file_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport FileInfoPreview from './file_info_preview';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n return {\n canDownloadFiles: canDownloadFiles(config),\n };\n}\n\nexport default connect(mapStateToProps)(FileInfoPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl, type MessageDescriptor} from 'react-intl';\n\ntype Props = {\n placeholder: MessageDescriptor;\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'placeholder'>;\n\nconst LocalizedPlaceholderInput = React.forwardRef<HTMLInputElement, Props>(({placeholder, ...otherProps}, ref) => {\n const intl = useIntl();\n\n return (\n <input\n ref={ref}\n placeholder={intl.formatMessage(placeholder)}\n {...otherProps}\n />\n );\n});\n\nLocalizedPlaceholderInput.displayName = 'LocalizedPlaceholderInput';\n\nexport default LocalizedPlaceholderInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Modal = {\n open: boolean;\n dialogType: React.ComponentType;\n dialogProps?: Record<string, any>;\n}\n\ntype Props = {\n\n /*\n * Object that has map of modal's id and element\n */\n modals: {\n modalState: {\n [modalId: string]: Modal;\n };\n };\n\n /*\n * Object with action creators\n */\n actions: {\n\n /*\n * Action creator to close modal\n */\n closeModal: (modalId: string) => void;\n };\n}\n\nconst ModalController = ({\n modals,\n actions,\n}: Props) => {\n if (!modals) {\n return null;\n }\n\n const {modalState} = modals;\n const modalOutput = [];\n\n for (const modalId in modalState) {\n if (Object.hasOwn(modalState, modalId)) {\n const modal = modalState[modalId];\n if (modal.open) {\n const modalComponent = React.createElement(modal.dialogType, Object.assign({}, modal.dialogProps, {\n onExited: () => {\n actions.closeModal(modalId);\n\n // Call any onExited prop provided by whoever opened the modal, if one was provided\n modal.dialogProps?.onExited?.();\n },\n onHide: actions.closeModal.bind(this, modalId),\n key: `${modalId}_modal`,\n }));\n\n modalOutput.push(modalComponent);\n }\n }\n }\n\n return <>{modalOutput}</>;\n};\n\nexport default ModalController;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {closeModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store/index.js';\n\nimport ModalController from './modal_controller';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n modals: state.views.modals,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n closeModal,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ModalController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport type {PDFDocumentProxy, PDFPageProxy} from 'pdfjs-dist';\nimport * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.mjs';\nimport 'pdfjs-dist/build/pdf.worker.min.mjs';\nimport type {RenderParameters} from 'pdfjs-dist/types/src/display/api';\nimport React from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport FileInfoPreview from 'components/file_info_preview';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {getSiteURL} from 'utils/url';\n\nconst INITIAL_RENDERED_PAGES = 3;\n\nexport type Props = {\n\n /**\n * Compare file types\n */\n fileInfo: FileInfo;\n\n /**\n * URL of pdf file to output and compare to update props url\n */\n fileUrl: string;\n scale: number;\n handleBgClose: (e: React.MouseEvent<Element, MouseEvent>) => void;\n}\n\ntype State = {\n pdf: PDFDocumentProxy | null;\n pdfPages: Record<number, PDFPageProxy>;\n pdfPagesLoaded: Record<number, boolean>;\n numPages: number;\n loading: boolean;\n success: boolean;\n prevFileUrl: string;\n}\n\nexport default class PDFPreview extends React.PureComponent<Props, State> {\n public pdfPagesRendered: Record<number, boolean>;\n public container: React.RefObject<HTMLDivElement>;\n public parentNode: HTMLElement|null = null;\n public pdfCanvasRef: {[key: string]: React.RefObject<HTMLCanvasElement>} = {};\n\n constructor(props: Props) {\n super(props);\n\n this.pdfPagesRendered = {};\n this.container = React.createRef();\n\n this.state = {\n pdf: null,\n pdfPages: [],\n pdfPagesLoaded: {},\n numPages: 0,\n loading: true,\n success: false,\n prevFileUrl: '',\n };\n }\n\n componentDidMount() {\n this.getPdfDocument();\n if (this.container.current) {\n this.parentNode = this.container.current.parentElement;\n this.parentNode?.addEventListener('scroll', this.handleScroll);\n }\n }\n\n componentWillUnmount() {\n if (this.parentNode) {\n this.parentNode.removeEventListener('scroll', this.handleScroll);\n }\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.fileUrl !== state.prevFileUrl) {\n return {\n pdf: null,\n pdfPages: {},\n pdfPagesLoaded: {},\n numPages: 0,\n loading: true,\n success: false,\n prevFileUrl: props.fileUrl,\n };\n }\n return null;\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (this.props.fileUrl !== prevProps.fileUrl) {\n this.getPdfDocument();\n this.pdfPagesRendered = {};\n }\n if (this.props.scale !== prevProps.scale) {\n this.pdfPagesRendered = {};\n if (this.state.success) {\n for (let i = 0; i < this.state.numPages; i++) {\n this.renderPDFPage(i);\n }\n }\n }\n\n if (!prevState.success && this.state.success) {\n for (let i = 0; i < this.state.numPages; i++) {\n this.renderPDFPage(i);\n }\n }\n }\n\n downloadFile = (e: React.FormEvent) => {\n const fileDownloadUrl = this.props.fileInfo.link || getFileDownloadUrl(this.props.fileInfo.id);\n e.preventDefault();\n window.location.href = fileDownloadUrl;\n };\n\n isInViewport = (page: Element) => {\n const bounding = page.getBoundingClientRect();\n const viewportTop = this.container.current?.scrollTop ?? 0;\n const viewportBottom = viewportTop + (this.parentNode?.clientHeight ?? 0);\n return (\n (bounding.top >= viewportTop && bounding.top <= viewportBottom) ||\n (bounding.bottom >= viewportTop && bounding.bottom <= viewportBottom) ||\n (bounding.top <= viewportTop && bounding.bottom >= viewportBottom)\n );\n };\n\n renderPDFPage = async (pageIndex: number) => {\n const canvas = this.pdfCanvasRef[`pdfCanvasRef-${pageIndex}`].current;\n if (!canvas) {\n // Refs are undefined when testing\n return;\n }\n\n // Always render the first INITIAL_RENDERED_PAGES pages to avoid\n // problems detecting isInViewport during the open animation\n if (pageIndex >= INITIAL_RENDERED_PAGES && !this.isInViewport(canvas)) {\n return;\n }\n\n if (this.pdfPagesRendered[pageIndex]) {\n return;\n }\n\n const page = await this.loadPage(this.state.pdf!, pageIndex);\n const context = canvas.getContext('2d');\n const viewport = page.getViewport({scale: this.props.scale});\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n\n const renderContext = {\n canvasContext: context as object,\n viewport,\n } as RenderParameters;\n\n await page.render(renderContext).promise;\n this.pdfPagesRendered[pageIndex] = true;\n };\n\n getPdfDocument = async () => {\n try {\n const pdf = await pdfjsLib.getDocument({\n url: this.props.fileUrl,\n cMapUrl: getSiteURL() + '/static/cmaps/',\n cMapPacked: true,\n }).promise;\n this.onDocumentLoad(pdf);\n } catch (err) {\n this.onDocumentLoadError(err);\n }\n };\n\n onDocumentLoad = (pdf: PDFDocumentProxy) => {\n this.setState({pdf, numPages: pdf.numPages});\n for (let i = 0; i < pdf.numPages; i++) {\n this.pdfCanvasRef[`pdfCanvasRef-${i}`] = React.createRef();\n }\n this.setState({loading: false, success: true});\n };\n\n onDocumentLoadError = (reason: string) => {\n console.log('Unable to load PDF preview: ' + reason); //eslint-disable-line no-console\n this.setState({loading: false, success: false});\n };\n\n loadPage = async (pdf: PDFDocumentProxy, pageIndex: number) => {\n if (this.state.pdfPagesLoaded[pageIndex]) {\n return this.state.pdfPages[pageIndex];\n }\n\n const page = await pdf.getPage(pageIndex + 1);\n\n const pdfPages = Object.assign({}, this.state.pdfPages);\n pdfPages[pageIndex] = page;\n\n const pdfPagesLoaded = Object.assign({}, this.state.pdfPagesLoaded);\n pdfPagesLoaded[pageIndex] = true;\n this.setState({pdfPages, pdfPagesLoaded});\n\n return page;\n };\n\n handleScroll = debounce(() => {\n if (this.state.success) {\n for (let i = 0; i < this.state.numPages; i++) {\n this.renderPDFPage(i);\n }\n }\n }, 100);\n\n render() {\n if (this.state.loading) {\n return (\n <div\n ref={this.container}\n className='view-image__loading'\n >\n <LoadingSpinner/>\n </div>\n );\n }\n\n if (!this.state.success) {\n return (\n <FileInfoPreview\n fileInfo={this.props.fileInfo}\n fileUrl={this.props.fileUrl}\n />\n );\n }\n\n const pdfCanvases = [];\n for (let i = 0; i < this.state.numPages; i++) {\n pdfCanvases.push(\n <canvas\n ref={this.pdfCanvasRef[`pdfCanvasRef-${i}`]}\n key={'previewpdfcanvas' + i}\n />,\n );\n\n if (i < this.state.numPages - 1 && this.state.numPages > 1) {\n pdfCanvases.push(\n <div\n key={'previewpdfspacer' + i}\n className='pdf-preview-spacer'\n />,\n );\n }\n }\n\n return (\n <div\n ref={this.container}\n className='post-code'\n onClick={this.props.handleBgClose}\n >\n {pdfCanvases}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {InformationOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport ExternalLink from 'components/external_link';\nimport type {Notice} from 'components/system_notice/types';\n\nimport {DocLinks} from 'utils/constants';\nimport * as ServerVersion from 'utils/server_version';\nimport * as UserAgent from 'utils/user_agent';\n\n// Notices are objects with the following fields:\n// - name - string identifier\n// - adminOnly - set to true if only system admins should see this message\n// - icon - the image to display for the notice icon\n// - title - JSX node to display for the notice title\n// - body - JSX node to display for the notice body\n// - allowForget - boolean to allow forget the notice\n// - show - function that check if we need to show the notice\n//\n// Order is important! The notices at the top are shown first.\n\nconst notices: Notice[] = [\n {\n name: 'apiv3_deprecation',\n adminOnly: true,\n title: (\n <FormattedMessage\n id='system_notice.title'\n defaultMessage='Notice from Mattermost'\n />\n ),\n body: (\n <FormattedMessage\n id='system_notice.body.api3'\n defaultMessage='If you’ve created or installed integrations in the last two years, find out how <link>recent changes</link> may have affected them.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://api.mattermost.com/#tag/APIv3-Deprecation'\n location='system_notices'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n ),\n allowForget: true,\n show: (serverVersion, config) => {\n if (config.InstallationDate >= new Date(2018, 5, 16, 0, 0, 0, 0).getTime()) {\n return false;\n }\n return true;\n },\n },\n {\n name: 'advanced_permissions',\n adminOnly: true,\n title: (\n <FormattedMessage\n id='system_notice.title'\n defaultMessage='Notice from Mattermost'\n />\n ),\n body: (\n <FormattedMessage\n id='system_notice.body.permissions'\n defaultMessage='Some policy and permission System Console settings have moved with the release of <link>advanced permissions</link> into Mattermost Free and Professional.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DocLinks.ONBOARD_ADVANCED_PERMISSIONS}\n location='system_notices'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n ),\n allowForget: true,\n show: (serverVersion, config, license) => {\n if (license.IsLicensed === 'false') {\n return false;\n }\n if (config.InstallationDate > new Date(2018, 5, 16, 0, 0, 0, 0).getTime()) {\n return false;\n }\n if (license.IsLicensed === 'true' && license.IssuedAt > new Date(2018, 5, 16, 0, 0, 0, 0).getTime()) {\n return false;\n }\n return true;\n },\n },\n {\n name: 'ee_upgrade_advice',\n adminOnly: true,\n title: (\n <FormattedMessage\n id='system_notice.title'\n defaultMessage='Notice from Mattermost'\n />\n ),\n body: (\n <FormattedMessage\n id='system_notice.body.ee_upgrade_advice'\n defaultMessage='Enterprise Edition is recommended to ensure optimal operation and reliability. <link>Learn more</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://mattermost.com/performance'\n location='system_notices'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n ),\n allowForget: false,\n show: (serverVersion, config, license, analytics) => {\n const USERS_THRESHOLD = 10000;\n\n // If we don't have the analytics yet, don't show\n if (!analytics || Object.hasOwn(analytics, 'TOTAL_USERS')) {\n return false;\n }\n\n if (analytics.TOTAL_USERS && analytics.TOTAL_USERS < USERS_THRESHOLD) {\n return false;\n }\n\n if (license.IsLicensed === 'true' && license.Cluster === 'true') {\n return false;\n }\n\n return true;\n },\n },\n {\n name: 'ie11_deprecation',\n title: (\n <FormattedMessage\n id='system_notice.title'\n defaultMessage='Notice from Mattermost'\n />\n ),\n allowForget: false,\n body: (\n <FormattedMessage\n id='system_notice.body.ie11_deprecation'\n defaultMessage='Your browser, IE11, will no longer be supported in an upcoming release. <link>Find out how to move to another browser in one simple step</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://forum.mattermost.com/t/mattermost-is-dropping-support-for-internet-explorer-ie11-in-v5-16/7575'\n location='system_notices'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n ),\n show: (serverVersion) => {\n // Don't show the notice after v5.16, show a different notice\n if (ServerVersion.isServerVersionGreaterThanOrEqualTo(serverVersion, '5.16.0')) {\n return false;\n }\n\n // Only show if they're using IE\n if (!UserAgent.isInternetExplorer()) {\n return false;\n }\n\n return true;\n },\n },\n {\n\n // This notice is marked as viewed by default for new users on the server.\n // Any change on this notice should be handled also in the server side.\n name: 'GMasDM',\n allowForget: true,\n title: (\n <FormattedMessage\n id='system_notice.title.gm_as_dm'\n defaultMessage='Updates to Group Messages'\n />\n ),\n icon: (<InformationOutlineIcon/>),\n body: (\n <FormattedMessage\n id='system_noticy.body.gm_as_dm'\n defaultMessage='You will now be notified for all activity in your group messages along with a notification badge for every new message.{br}{br}You can configure this in notification preferences for each group message.'\n values={{br: (<br/>)}}\n />\n ),\n show: (serverVersion, config, license, analytics, currentChannel) => {\n return currentChannel?.type === 'G';\n },\n },\n];\n\nexport default notices;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl, type WrappedComponentProps} from 'react-intl';\n\nimport type {AnalyticsState} from '@mattermost/types/admin';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ClientConfig, ClientLicense} from '@mattermost/types/config';\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport type {Notice} from 'components/system_notice/types';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\n\nimport {Preferences} from 'utils/constants';\n\nexport interface Props extends WrappedComponentProps {\n currentUserId: string;\n notices: Notice[];\n preferences: {[key: string]: any};\n dismissedNotices: any;\n isSystemAdmin?: boolean;\n serverVersion: string;\n config: Partial<ClientConfig>;\n license: ClientLicense;\n analytics?: AnalyticsState;\n currentChannel?: Channel;\n actions: {\n savePreferences(userId: string, preferences: PreferenceType[]): void;\n dismissNotice(type: string): void;\n getStandardAnalytics(teamId?: string): void;\n };\n}\nexport class SystemNotice extends React.PureComponent<Props> {\n componentDidMount() {\n if (this.props.isSystemAdmin) {\n this.props.actions.getStandardAnalytics();\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.isSystemAdmin !== this.props.isSystemAdmin && this.props.isSystemAdmin) {\n this.props.actions.getStandardAnalytics();\n }\n }\n\n getCurrentNotice = () => {\n for (const notice of this.props.notices) {\n // Skip if dismissed previously this session\n if (this.props.dismissedNotices[notice.name]) {\n continue;\n }\n\n // Skip if dismissed forever\n if (this.props.preferences[notice.name]) {\n continue;\n }\n\n if (notice.adminOnly && !this.props.isSystemAdmin) {\n continue;\n }\n\n if (!notice.show?.(\n this.props.serverVersion,\n this.props.config,\n this.props.license,\n this.props.analytics,\n this.props.currentChannel,\n )) {\n continue;\n }\n\n return notice;\n }\n return null;\n };\n\n hide = (remind = false) => {\n const notice = this.getCurrentNotice();\n if (!notice) {\n return;\n }\n\n if (!remind) {\n this.props.actions.savePreferences(this.props.currentUserId, [{\n user_id: this.props.currentUserId,\n category: Preferences.CATEGORY_SYSTEM_NOTICE,\n name: notice.name,\n value: 'dismissed',\n }]);\n }\n\n this.props.actions.dismissNotice(notice.name);\n };\n\n hideAndRemind = () => {\n this.hide(true);\n };\n\n hideAndForget = () => {\n this.hide(false);\n };\n\n render() {\n const notice = this.getCurrentNotice();\n\n if (notice == null) {\n return null;\n }\n\n let visibleMessage;\n if (notice.adminOnly) {\n visibleMessage = (\n <div className='system-notice__info'>\n <i\n className='fa fa-eye'\n title={this.props.intl.formatMessage({id: 'system_notice.adminVisible.icon', defaultMessage: 'Only visible to System Admins Icon'})}\n />\n <FormattedMessage\n id='system_notice.adminVisible'\n defaultMessage='Only visible to System Admins'\n />\n </div>\n );\n }\n\n const icon = notice.icon || <MattermostLogo/>;\n\n return (\n <div\n className='system-notice bg--white'\n >\n <div className='system-notice__logo'>\n {icon}\n </div>\n <div className='system-notice__body'>\n <div className='system-notice__title'>\n {notice.title}\n </div>\n {notice.body}\n {visibleMessage}\n <div className='system-notice__footer'>\n <button\n id='systemnotice_remindme'\n className='btn btn-sm btn-primary'\n onClick={this.hideAndRemind}\n >\n <FormattedMessage\n id='system_notice.remind_me'\n defaultMessage='Remind Me Later'\n />\n </button>\n {notice.allowForget &&\n <button\n id='systemnotice_dontshow'\n className='btn btn-sm btn-tertiary'\n onClick={this.hideAndForget}\n >\n <FormattedMessage\n id='system_notice.dont_show'\n defaultMessage=\"Don't Show Again\"\n />\n </button>}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default injectIntl(SystemNotice);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {dismissNotice} from 'actions/views/notice';\n\nimport Notices from 'components/system_notice/notices';\nimport SystemNotice from 'components/system_notice/system_notice';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst getSystemNoticePreferences = makeGetCategory('getSystemNoticePreferences', Preferences.CATEGORY_SYSTEM_NOTICE);\nconst getPreferenceNameMap = createSelector(\n 'getPreferenceNameMap',\n getSystemNoticePreferences,\n (preferences) => {\n const nameMap: {[key: string]: PreferenceType} = {};\n preferences.forEach((p) => {\n nameMap[p.name] = p;\n });\n return nameMap;\n },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n const license = getLicense(state);\n const config = getConfig(state);\n const serverVersion = state.entities.general.serverVersion;\n const analytics = state.entities.admin.analytics;\n\n return {\n currentUserId: state.entities.users.currentUserId,\n preferences: getPreferenceNameMap(state),\n dismissedNotices: state.views.notice.hasBeenDismissed,\n isSystemAdmin: haveISystemPermission(state, {permission: Permissions.MANAGE_SYSTEM}),\n notices: Notices,\n config,\n license,\n serverVersion,\n analytics,\n currentChannel: getCurrentChannel(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n savePreferences,\n dismissNotice,\n getStandardAnalytics,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SystemNotice);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nconst CheckboxCheckedIcon = () => (\n <svg\n width='18px'\n height='18px'\n viewBox='0 0 18 18'\n >\n <g\n id='Developer-Export'\n stroke='none'\n strokeWidth='1'\n fillRule='evenodd'\n >\n <g\n transform='translate(-285.000000, -933.000000)'\n id='All-Team-Members'\n >\n <g transform='translate(245.000000, 698.000000)'>\n <g\n id='Channel-Administrators'\n transform='translate(0.000000, 106.000000)'\n >\n <g\n id='data-table/column-1'\n transform='translate(11.000000, 86.000000)'\n >\n <g\n id='row-checkbox---Public-Channels'\n transform='translate(12.000000, 35.000000)'\n >\n <g\n id='Stacked-Group'\n transform='translate(0.000000, 5.000000)'\n >\n <g id='data-table/1st/row-checkbox-label-base'>\n <g\n id='check-on-copy-11'\n transform='translate(14.000000, 0.000000)'\n >\n <path\n d='M19,3 L5,3 C3.9,3 3,3.9 3,5 L3,19 C3,20.1 3.9,21 5,21 L19,21 C20.1,21 21,20.1 21,19 L21,5 C21,3.9 20.1,3 19,3 L19,3 Z M10,17 L5,12.1923077 L6.4,10.8461538 L10,14.3076923 L17.6,7 L19,8.34615385 L10,17 L10,17 Z'\n id='checkbox---checked'\n />\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n);\n\nexport default memo(CheckboxCheckedIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n additionalClassName?: string;\n}\n\nconst NextIcon = ({additionalClassName}: Props) => {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className={classNames('icon icon-chevron-right', additionalClassName)}\n title={formatMessage({\n id: 'generic_icons.next',\n defaultMessage: 'Next Icon',\n })}\n />\n );\n};\n\nexport default React.memo(NextIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n additionalClassName?: string;\n}\n\nconst PreviousIcon = ({additionalClassName}: Props) => {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className={classNames('icon icon-chevron-left', additionalClassName)}\n title={formatMessage({id: 'generic_icons.previous', defaultMessage: 'Previous Icon'})}\n />\n );\n};\n\nexport default React.memo(PreviousIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function SearchIcon() {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className='fa fa-search'\n title={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function GlobeIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='13px'\n height='13px'\n viewBox='0 0 16 16'\n role='presentation'\n aria-label={formatMessage({id: 'generic_icons.channel.public', defaultMessage: 'Public Channel Icon'})}\n >\n <path d='M8 -2.47955e-05C6.56 -2.47955e-05 5.216 0.367975 3.968 1.10398C2.76267 1.80798 1.808 2.76264 1.104 3.96797C0.368 5.21598 0 6.55998 0 7.99998C0 9.43998 0.368 10.784 1.104 12.032C1.808 13.2373 2.76267 14.192 3.968 14.896C5.216 15.632 6.56 16 8 16C9.44 16 10.784 15.632 12.032 14.896C13.2373 14.192 14.192 13.2373 14.896 12.032C15.632 10.784 16 9.43998 16 7.99998C16 6.55998 15.632 5.21598 14.896 3.96797C14.192 2.76264 13.2373 1.80798 12.032 1.10398C10.784 0.367975 9.44 -2.47955e-05 8 -2.47955e-05ZM14.4 8.39998C14.2507 8.59198 13.92 8.80531 13.408 9.03998C12.768 9.31731 12.032 9.53064 11.2 9.67998V6.95998C12.288 6.77864 13.168 6.53864 13.84 6.23998C13.872 6.20798 13.9253 6.18131 14 6.15998C14.0853 6.12798 14.1387 6.10131 14.16 6.07998C14.32 6.63464 14.4 7.27464 14.4 7.99998V8.39998ZM6.8 11.52C6.93867 11.52 7.14133 11.536 7.408 11.568C7.67467 11.5893 7.872 11.6 8 11.6C8.53333 11.6 8.93333 11.5733 9.2 11.52C9.008 12.2773 8.8 12.912 8.576 13.424C8.36267 13.8933 8.17067 14.192 8 14.32C7.808 14.1813 7.61067 13.8826 7.408 13.424C7.152 12.8906 6.94933 12.256 6.8 11.52ZM8 9.99998C7.63733 9.99998 7.376 9.99464 7.216 9.98398C6.93867 9.97331 6.69333 9.95198 6.48 9.91998C6.48 9.74931 6.46933 9.46664 6.448 9.07198C6.416 8.61331 6.4 8.25598 6.4 7.99998V7.11998C6.77333 7.17331 7.30667 7.19998 8 7.19998C8.69333 7.19998 9.22667 7.17331 9.6 7.11998V7.99998C9.6 8.25598 9.584 8.61331 9.552 9.07198C9.53067 9.46664 9.52 9.74931 9.52 9.91998C9.30667 9.95198 9.06133 9.97331 8.784 9.98398C8.624 9.99464 8.36267 9.99998 8 9.99998ZM9.44 5.51998C9.12 5.57331 8.64 5.59998 8 5.59998C7.36 5.59998 6.88 5.57331 6.56 5.51998C6.656 4.82664 6.8 4.18131 6.992 3.58397C7.14133 3.07198 7.31733 2.62931 7.52 2.25597C7.69067 1.93598 7.85067 1.71731 8 1.59997C8.14933 1.71731 8.30933 1.93598 8.48 2.25597C8.68267 2.62931 8.85867 3.07198 9.008 3.58397C9.2 4.18131 9.344 4.82664 9.44 5.51998ZM13.44 4.63998C12.5867 5.00264 11.7867 5.24264 11.04 5.35997C10.9653 4.71997 10.848 4.11198 10.688 3.53598C10.5387 2.95998 10.3627 2.44798 10.16 1.99998C11.5573 2.49064 12.6507 3.37064 13.44 4.63998ZM2.56 4.63998C2.976 4.02131 3.456 3.49331 4 3.05597C4.576 2.58664 5.216 2.23464 5.92 1.99998C5.52533 2.87464 5.20533 3.99464 4.96 5.35997C3.92533 5.11464 3.12533 4.87464 2.56 4.63998ZM1.92 6.07998C1.952 6.11198 2.00533 6.14398 2.08 6.17598L2.24 6.23998C2.96533 6.55998 3.84533 6.79998 4.88 6.95998C4.848 7.09864 4.82667 7.26398 4.816 7.45598C4.80533 7.56264 4.8 7.74398 4.8 7.99998C4.8 8.74664 4.82667 9.30664 4.88 9.67998C4.048 9.53064 3.31733 9.31731 2.688 9.03998C2.16533 8.80531 1.82933 8.59198 1.68 8.39998V7.99998C1.63733 7.67998 1.63733 7.34931 1.68 7.00798C1.72267 6.66664 1.80267 6.35731 1.92 6.07998ZM2.16 10.56C3.14133 10.9546 4.128 11.2213 5.12 11.36C5.248 12.2133 5.51467 13.0933 5.92 14C5.088 13.7226 4.34133 13.2853 3.68 12.688C3.02933 12.08 2.52267 11.3706 2.16 10.56ZM13.84 10.56C13.4773 11.3706 12.9653 12.08 12.304 12.688C11.6533 13.2853 10.912 13.7226 10.08 14C10.4853 13.0933 10.752 12.2133 10.88 11.36C12.1493 11.1786 13.136 10.912 13.84 10.56Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function LockIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='12px'\n height='13px'\n viewBox='0 0 13 15'\n role='presentation'\n aria-label={formatMessage({id: 'generic_icons.channel.private', defaultMessage: 'Private Channel Icon'})}\n >\n <g\n stroke='none'\n strokeWidth='1'\n fill='inherit'\n fillRule='evenodd'\n >\n <g\n transform='translate(-116.000000, -175.000000)'\n fillRule='nonzero'\n fill='inherit'\n >\n <g transform='translate(95.000000, 0.000000)'>\n <g transform='translate(20.000000, 113.000000)'>\n <g transform='translate(1.000000, 62.000000)'>\n <path d='M12.0714286,6.5 L11.1428571,6.5 L11.1428571,4.64285714 C11.1428571,2.07814286 9.06471429,0 6.5,0 C3.93528571,0 1.85714286,2.07814286 1.85714286,4.64285714 L1.85714286,6.5 L0.928571429,6.5 C0.415071429,6.5 0,7.00792857 0,7.52142857 L0,13.9285714 C0,14.4420714 0.415071429,14.8571429 0.928571429,14.8571429 L12.0714286,14.8571429 C12.5849286,14.8571429 13,14.4420714 13,13.9285714 L13,7.52142857 C13,7.00792857 12.5849286,6.5 12.0714286,6.5 Z M6.5,1.85714286 C8.03585714,1.85714286 9.28571429,3.107 9.28571429,4.64285714 L9.28571429,6.5 L8.35714286,6.5 L4.64285714,6.5 L3.71428571,6.5 L3.71428571,4.64285714 C3.71428571,3.107 4.96414286,1.85714286 6.5,1.85714286 Z'/>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MentionsIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='12px'\n height='12px'\n viewBox='0 0 18 18'\n version='1.1'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.mention', defaultMessage: 'Mention Icon'})}\n fill='inherit'\n >\n <path d='M9 11.7C9.72 11.7 10.35 11.43 10.89 10.89C11.43 10.35 11.7 9.71999 11.7 8.99999C11.7 8.27999 11.43 7.64999 10.89 7.10999C10.35 6.56999 9.72 6.29999 9 6.29999C8.28 6.29999 7.65 6.56999 7.11 7.10999C6.57 7.64999 6.3 8.27999 6.3 8.99999C6.3 9.71999 6.57 10.35 7.11 10.89C7.65 11.43 8.28 11.7 9 11.7ZM9 -1.26362e-05C11.46 -1.26362e-05 13.56 0.869987 15.3 2.60999C16.176 3.48599 16.842 4.45199 17.298 5.50799C17.766 6.59999 18 7.76399 18 8.99999V10.26C18 10.692 17.916 11.118 17.748 11.538C17.592 11.922 17.376 12.276 17.1 12.6C16.788 12.912 16.446 13.14 16.074 13.284C15.714 13.428 15.306 13.5 14.85 13.5C13.746 13.5 12.876 13.05 12.24 12.15C11.34 13.05 10.26 13.5 9 13.5C7.716 13.5 6.666 13.05 5.85 12.15C4.95 11.25 4.5 10.2 4.5 8.99999C4.5 7.70399 4.95 6.65399 5.85 5.84999C6.666 4.94999 7.716 4.49999 9 4.49999C10.296 4.49999 11.346 4.94999 12.15 5.84999C13.05 6.74999 13.5 7.79999 13.5 8.99999V10.26C13.5 10.44 13.536 10.614 13.608 10.782C13.692 10.95 13.8 11.106 13.932 11.25C14.076 11.382 14.232 11.49 14.4 11.574C14.568 11.658 14.718 11.7 14.85 11.7C15.03 11.7 15.204 11.664 15.372 11.592C15.54 11.508 15.696 11.394 15.84 11.25C16.08 11.01 16.2 10.68 16.2 10.26V8.99999C16.2 7.01999 15.48 5.30999 14.04 3.86999C13.332 3.16199 12.564 2.63999 11.736 2.30399C10.908 1.96799 9.996 1.79999 9 1.79999C7.056 1.79999 5.346 2.48999 3.87 3.86999C3.174 4.52999 2.652 5.30399 2.304 6.19199C1.968 7.04399 1.8 7.97999 1.8 8.99999C1.8 9.98399 1.974 10.902 2.322 11.754C2.67 12.594 3.186 13.356 3.87 14.04C4.554 14.724 5.328 15.252 6.192 15.624C7.092 16.008 8.028 16.2 9 16.2H13.5V18H9C7.752 18 6.6 17.772 5.544 17.316C4.488 16.872 3.51 16.2 2.61 15.3C1.71 14.4 1.05 13.44 0.63 12.42C0.21 11.4 0 10.266 0 9.01799C0 7.75799 0.222 6.59399 0.666 5.52599C1.098 4.49399 1.746 3.52199 2.61 2.60999C4.266 0.869987 6.396 -1.26362e-05 9 -1.26362e-05Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MenuIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='10px'\n viewBox='0 0 16 10'\n version='1.1'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.menu', defaultMessage: 'Menu Icon'})}\n >\n <g\n stroke='none'\n strokeWidth='1'\n fill='inherit'\n fillRule='evenodd'\n >\n <g\n transform='translate(-188.000000, -38.000000)'\n fillRule='nonzero'\n fill='inherit'\n >\n <g>\n <g>\n <g transform='translate(188.000000, 38.000000)'>\n <path d='M15.5,0 C15.776,0 16,0.224 16,0.5 L16,1.5 C16,1.776 15.776,2 15.5,2 L0.5,2 C0.224,2 0,1.776 0,1.5 L0,0.5 C0,0.224 0.224,0 0.5,0 L15.5,0 Z M15.5,4 C15.776,4 16,4.224 16,4.5 L16,5.5 C16,5.776 15.776,6 15.5,6 L0.5,6 C0.224,6 0,5.776 0,5.5 L0,4.5 C0,4.224 0.224,4 0.5,4 L15.5,4 Z M15.5,8 C15.776,8 16,8.224 16,8.5 L16,9.5 C16,9.776 15.776,10 15.5,10 L0.5,10 C0.224,10 0,9.776 0,9.5 L0,8.5 C0,8.224 0.224,8 0.5,8 L15.5,8 Z'/>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function SearchIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 17 17'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n >\n <path d='M16.398 15.138L13.014 11.754C13.458 11.178 13.8 10.548 14.04 9.86399C14.28 9.14399 14.4 8.40599 14.4 7.64999C14.4 6.42599 14.094 5.29199 13.482 4.24799C12.882 3.22799 12.072 2.41799 11.052 1.81799C10.008 1.20599 8.874 0.899988 7.65 0.899988C6.426 0.899988 5.292 1.20599 4.248 1.81799C3.228 2.41799 2.418 3.22799 1.818 4.24799C1.206 5.29199 0.9 6.42599 0.9 7.64999C0.9 8.87399 1.206 10.008 1.818 11.052C2.418 12.072 3.228 12.882 4.248 13.482C5.292 14.094 6.426 14.4 7.65 14.4C8.406 14.4 9.138 14.274 9.846 14.022C10.53 13.794 11.16 13.458 11.736 13.014L15.138 16.398C15.306 16.566 15.516 16.65 15.768 16.65C16.02 16.65 16.23 16.56 16.398 16.38C16.566 16.212 16.65 16.008 16.65 15.768C16.65 15.528 16.566 15.318 16.398 15.138ZM2.7 7.64999C2.7 6.74999 2.922 5.92199 3.366 5.16599C3.81 4.40999 4.41 3.80999 5.166 3.36599C5.922 2.92199 6.75 2.69999 7.65 2.69999C8.55 2.69999 9.378 2.92199 10.134 3.36599C10.89 3.80999 11.49 4.40999 11.934 5.16599C12.378 5.92199 12.6 6.74999 12.6 7.64999C12.6 8.54999 12.378 9.37799 11.934 10.134C11.49 10.89 10.89 11.49 10.134 11.934C9.378 12.378 8.55 12.6 7.65 12.6C6.75 12.6 5.922 12.378 5.166 11.934C4.41 11.49 3.81 10.89 3.366 10.134C2.922 9.37799 2.7 8.54999 2.7 7.64999Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ComponentProps, RefObject} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {components} from 'react-select';\nimport type {ValueType, ActionMeta, InputActionMeta} from 'react-select';\nimport type {Async} from 'react-select/async';\nimport AsyncSelect from 'react-select/async';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport CloseCircleSolidIcon from 'components/widgets/icons/close_circle_solid_icon';\nimport PublicChannelIcon from 'components/widgets/icons/globe_icon';\nimport PrivateChannelIcon from 'components/widgets/icons/lock_icon';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {Constants} from 'utils/constants';\n\nimport './channels_input.scss';\n\ntype Props<T extends Channel> = {\n placeholder: React.ReactNode;\n autoFocus?: boolean;\n ariaLabel: string;\n channelsLoader: (value: string, callback?: (channels: T[]) => void) => Promise<T[]>;\n onChange: (channels: T[]) => void;\n value: T[];\n onInputChange: (change: string) => void;\n inputValue: string;\n loadingMessage?: MessageDescriptor;\n noOptionsMessage?: MessageDescriptor;\n formatOptionLabel?: ComponentProps<typeof AsyncSelect<T>>['formatOptionLabel'];\n}\n\ntype State<T> = {\n options: T[];\n};\n\nconst messages = defineMessages({\n loading: {\n id: 'widgets.channels_input.loading',\n defaultMessage: 'Loading',\n },\n noOptions: {\n id: 'widgets.channels_input.empty',\n defaultMessage: 'No channels found',\n },\n});\n\nexport default class ChannelsInput<T extends Channel> extends React.PureComponent<Props<T>, State<T>> {\n static defaultProps = {\n loadingMessage: messages.loading,\n noOptionsMessage: messages.noOptions,\n };\n private selectRef: RefObject<Async<T> & {handleInputChange: (newValue: string, actionMeta: InputActionMeta | {action: 'custom'}) => string}>;\n\n constructor(props: Props<T>) {\n super(props);\n this.selectRef = React.createRef();\n this.state = {\n options: [],\n };\n }\n\n getOptionValue = (channel: T) => channel.id;\n\n handleInputChange = (inputValue: string, action: InputActionMeta) => {\n if (action.action === 'input-blur' && inputValue !== '') {\n for (const option of this.state.options) {\n if (this.props.inputValue === option.name) {\n this.onChange([...this.props.value, option], {} as ActionMeta<T>);\n this.props.onInputChange('');\n return;\n }\n }\n }\n if (action.action !== 'input-blur' && action.action !== 'menu-close') {\n this.props.onInputChange(inputValue);\n }\n };\n\n optionsLoader = (_input: string, callback: (options: T[]) => void) => {\n const customCallback = (options: T[]) => {\n this.setState({options});\n callback(options);\n };\n const result = this.props.channelsLoader(this.props.inputValue, customCallback);\n if (result && result.then) {\n result.then(customCallback);\n }\n };\n\n loadingMessage = () => {\n const text = (\n <FormattedMessage\n {...this.props.loadingMessage}\n />\n );\n\n // faking types due to longstanding mismatches in react-select & @types/react-select\n return (<LoadingSpinner text={text}/> as unknown as string);\n };\n\n NoOptionsMessage = (props: Record<string, any>) => {\n const inputValue = props.selectProps.inputValue;\n if (!inputValue) {\n return null;\n }\n const Msg: any = components.NoOptionsMessage;\n return (\n <div className='channels-input__option channels-input__option--no-matches'>\n <Msg {...props}>\n <FormattedMarkdownMessage\n {...this.props.noOptionsMessage}\n values={{text: inputValue}}\n />\n </Msg>\n </div>\n );\n };\n\n formatOptionLabel = (channel: T) => {\n let icon = <PublicChannelIcon className='public-channel-icon'/>;\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n icon = <PrivateChannelIcon className='private-channel-icon'/>;\n }\n return (\n <>\n {icon}\n {channel.display_name}\n <span className='channel-name'>{channel.name}</span>\n </>\n );\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onChange = (value: T[], _meta: ActionMeta<T>) => {\n if (this.props.onChange) {\n this.props.onChange(value);\n }\n };\n\n MultiValueRemove = ({children, innerProps}: {children: React.ReactNode | React.ReactNode[]; innerProps: Record<string, any>}) => (\n <div {...innerProps}>\n {children || <CloseCircleSolidIcon/>}\n </div>\n );\n\n components = {\n NoOptionsMessage: this.NoOptionsMessage,\n MultiValueRemove: this.MultiValueRemove,\n IndicatorsContainer: () => null,\n };\n\n onFocus = () => {\n this.selectRef.current?.handleInputChange(this.props.inputValue, {action: 'custom'});\n };\n\n render() {\n return (\n <AsyncSelect\n ref={this.selectRef}\n onChange={this.onChange as (value: ValueType<Channel>, _meta: ActionMeta<Channel>) => void}\n\n loadOptions={this.optionsLoader}\n isMulti={true}\n isClearable={false}\n className={classNames('ChannelsInput', {empty: this.props.inputValue === ''})}\n classNamePrefix='channels-input'\n placeholder={this.props.placeholder}\n components={this.components}\n getOptionValue={this.getOptionValue}\n formatOptionLabel={this.props.formatOptionLabel ?? this.formatOptionLabel}\n loadingMessage={this.loadingMessage}\n defaultOptions={false}\n defaultMenuIsOpen={false}\n openMenuOnClick={false}\n onInputChange={this.handleInputChange}\n inputValue={this.props.inputValue}\n openMenuOnFocus={true}\n onFocus={this.onFocus}\n tabSelectsValue={true}\n value={this.props.value}\n aria-label={this.props.ariaLabel}\n autoFocus={this.props.autoFocus}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {imageURLForTeam} from 'utils/utils';\n\nimport './team_icon.scss';\n\ntype Props = {\n\n /** Team icon URL (when available) */\n url?: string | null;\n\n /** Team display name (used for the initials) if icon URL is not set */\n content: React.ReactNode;\n\n /**\n * Size of the icon, \"sm\", \"md\" or \"lg\".\n *\n * @default \"regular\"\n **/\n size?: 'sm' | 'lg';\n\n /** Whether to add hover effect to the icon */\n withHover?: boolean;\n\n /** Whether to add additional classnames */\n className?: string;\n\n /** react-intl helper object */\n intl: IntlShape;\n};\n\n/**\n * An icon representing a Team. If `url` is set - shows the image,\n * otherwise shows team initials\n */\nexport class TeamIcon extends React.PureComponent<Props> {\n public static defaultProps = {\n size: 'sm' as const,\n };\n\n public render() {\n const {content, url, size, withHover, className} = this.props;\n const hoverCss = withHover ? '' : 'no-hover';\n const {formatMessage} = this.props.intl;\n\n // FIXME Nowhere does imageURLForTeam seem to check for display_name.\n const teamIconUrl = url || imageURLForTeam({display_name: content} as Team);\n let icon;\n if (typeof content === 'string') {\n if (teamIconUrl) {\n icon = (\n <div\n data-testid='teamIconImage'\n className={`TeamIcon__image TeamIcon__${size}`}\n aria-label={\n formatMessage({\n id: 'sidebar.team_menu.button.teamImage',\n defaultMessage: '{teamName} Team Image',\n }, {\n teamName: content,\n })\n }\n style={{backgroundImage: `url('${teamIconUrl}')`}}\n role={'img'}\n />\n );\n } else {\n icon = (\n <div\n data-testid='teamIconInitial'\n className={`TeamIcon__initials TeamIcon__initials__${size}`}\n aria-label={\n formatMessage({\n id: 'sidebar.team_menu.button.teamInitials',\n defaultMessage: '{teamName} Team Initials',\n }, {\n teamName: content,\n })\n }\n role={'img'}\n >\n {content ? content.replace(/\\s/g, '').substring(0, 2) : '??'}\n </div>\n );\n }\n } else {\n icon = content;\n }\n return (\n <div className={classNames(`TeamIcon TeamIcon__${size}`, {withImage: teamIconUrl}, className, hoverCss)}>\n <div className={`TeamIcon__content ${hoverCss}`}>\n {icon}\n </div>\n </div>\n );\n }\n}\n\nexport default injectIntl(TeamIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Bot} from '@mattermost/types/bots';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getUsers} from 'mattermost-redux/selectors/entities/common';\n\nexport const ExternalBotAccountNames: string[] = ['mattermost-advisor'];\n\nexport function getBotAccounts(state: GlobalState) {\n return state.entities.bots.accounts;\n}\n\nexport const getExternalBotAccounts: (state: GlobalState) => Record<string, Bot> = createSelector(\n 'getExternalBotAccounts',\n getBotAccounts,\n getUsers,\n (botAccounts, userProfiles) => {\n const nextState: Record<string, Bot> = {};\n Object.values(botAccounts).forEach((botAccount) => {\n const botUser = userProfiles[botAccount.user_id];\n if (botUser && !ExternalBotAccountNames.includes(botUser.username)) {\n nextState[botAccount.user_id] = botAccount;\n }\n });\n\n return nextState;\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nexport type SuccessResult = {data: any}\n\nexport type ErrorResult = {error: any}\n\nexport function isSuccess(result: ActionResult): result is SuccessResult {\n return 'data' in result && !isError(result);\n}\n\nexport function isError(result: ActionResult): result is ErrorResult {\n return Boolean((result as ErrorResult).error);\n}\n\nexport type ModalData<ModalProps> = {\n modalId: string;\n dialogProps?: Omit<ModalProps, 'onHide' | 'onExited'> & {onHide?: () => void; onExited?: () => void};\n dialogType: React.ElementType<ModalProps>;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useLocation} from 'react-router-dom';\n\nexport function useQuery() {\n return new URLSearchParams(useLocation().search);\n}\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AnalyticsVisualizationType = exports.LogLevelEnum = void 0;\nvar LogLevelEnum;\n(function (LogLevelEnum) {\n LogLevelEnum[\"SILLY\"] = \"silly\";\n LogLevelEnum[\"DEBUG\"] = \"debug\";\n LogLevelEnum[\"INFO\"] = \"info\";\n LogLevelEnum[\"WARN\"] = \"warn\";\n LogLevelEnum[\"ERROR\"] = \"error\";\n})(LogLevelEnum || (exports.LogLevelEnum = LogLevelEnum = {}));\nvar AnalyticsVisualizationType;\n(function (AnalyticsVisualizationType) {\n AnalyticsVisualizationType[\"Count\"] = \"count\";\n AnalyticsVisualizationType[\"LineChart\"] = \"line_chart\";\n AnalyticsVisualizationType[\"DoughnutChart\"] = \"doughnut_chart\";\n})(AnalyticsVisualizationType || (exports.AnalyticsVisualizationType = AnalyticsVisualizationType = {}));\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.areShippingDetailsValid = exports.InvoiceLineItemType = void 0;\n// actual string values come from customer-web-server and should be kept in sync with values seen there\nexports.InvoiceLineItemType = {\n Full: 'full',\n Partial: 'partial',\n OnPremise: 'onpremise',\n Metered: 'metered',\n};\nconst areShippingDetailsValid = (address) => {\n if (!address) {\n return false;\n }\n return Boolean(address.city && address.country && address.line1 && address.postal_code && address.state);\n};\nexports.areShippingDetailsValid = areShippingDetailsValid;\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isRemoteClusterPatch = isRemoteClusterPatch;\nfunction isRemoteClusterPatch(x) {\n return ((x.display_name !== undefined && x.display_name !== '') ||\n x.default_team_id !== undefined);\n}\n"],"names":["setNeedsLoggedInLimitReachedCheck","data","type","ActionTypes","NEEDS_LOGGED_IN_LIMIT_REACHED_CHECK","setAdminConsoleUsersManagementTableProperties","SET_ADMIN_CONSOLE_USER_MANAGEMENT_TABLE_PROPERTIES","CLEAR_ADMIN_CONSOLE_USER_MANAGEMENT_TABLE_PROPERTIES","getUserReports","options","arguments","length","undefined","async","dispatch","getState","Client4","getUsersForReporting","error","forceLogoutIfNecessary","logError","getUserCountForReporting","filter","startUsersBatchExport","tableFilters","AddGroupsToChannelModal","React","constructor","props","super","_defineProperty","this","actions","setModalSearchTerm","setState","show","err","addError","message","saving","groupIDs","state","values","map","v","id","skipCommit","onAddCallback","handleHide","Promise","all","linkGroupSyncable","groupID","currentChannelId","SyncableType","Channel","auto_add","handleResponse","value","Object","assign","userIds","indexOf","push","loadingState","loadingGroups","page","prevPage","setGroupsLoadingState","getGroupsNotAssociatedToChannel","searchTerm","GROUPS_PER_PAGE","then","term","option","isSelected","onAdd","onMouseMove","rowSelected","key","ref","selectedItemRef","className","onClick","src","groupsAvatar","alt","width","height","display_name","FormattedMessage","defaultMessage","num","member_count","searchTimeoutId","search","componentDidMount","getTeam","teamID","getAllGroupsAssociatedToTeam","getAllGroupsAssociatedToChannel","componentDidUpdate","prevProps","clearTimeout","window","setTimeout","Constants","SEARCH_TIMEOUT_MILLISECONDS","renderValue","render","numRemainingText","buttonSubmitText","defineMessage","buttonSubmitLoadingText","groupsToShow","groups","excludeGroups","hasGroup","og","find","g","includeGroups","groupsToShowValues","group","_objectSpread","label","Modal","dialogClassName","onHide","onExited","Header","closeButton","Title","componentClass","channelName","currentChannelName","Body","MultiSelect","optionRenderer","renderOption","intl","valueRenderer","perPage","handlePageChange","handleInput","handleDelete","handleAdd","addValue","handleSubmit","maxValues","loading","placeholderText","_pt","isRequired","injectIntl","connect","ownProps","views","modalSearch","channel","getCurrentChannel","selectGroupsNotAssociatedToChannel","team_id","regex","RegExp","test","name","bindActionCreators","RESOURCE_KEYS","ABOUT","EDITION_AND_LICENSE","REPORTING","SITE_STATISTICS","TEAM_STATISTICS","SERVER_LOGS","USER_MANAGEMENT","USERS","GROUPS","TEAMS","CHANNELS","PERMISSIONS","SYSTEM_ROLES","AUTHENTICATION","SIGNUP","EMAIL","PASSWORD","MFA","LDAP","SAML","OPENID","GUEST_ACCESS","INTEGRATIONS","INTEGRATION_MANAGEMENT","BOT_ACCOUNTS","GIF","CORS","COMPLIANCE","DATA_RETENTION_POLICY","COMPLIANCE_EXPORT","COMPLIANCE_MONITORING","CUSTOM_TERMS_OF_SERVICE","PRODUCTS","BOARDS","SITE","CUSTOMIZATION","LOCALIZATION","USERS_AND_TEAMS","NOTIFICATIONS","ANNOUNCEMENT_BANNER","EMOJI","POSTS","FILE_SHARING_AND_DOWNLOADS","PUBLIC_LINKS","NOTICES","IP_FILTERING","EXPERIMENTAL","FEATURES","FEATURE_FLAGS","BLEVE","ENVIRONMENT","WEB_SERVER","DATABASE","ELASTICSEARCH","FILE_STORAGE","IMAGE_PROXY","SMTP","PUSH_NOTIFICATION_SERVER","HIGH_AVAILABILITY","RATE_LIMITING","LOGGING","SESSION_LENGTHS","PERFORMANCE_MONITORING","DEVELOPER","ResourceToSysConsolePermissionsTable","Permissions","SYSCONSOLE_READ_ABOUT_EDITION_AND_LICENSE","SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE","billing","SYSCONSOLE_READ_BILLING","SYSCONSOLE_WRITE_BILLING","SYSCONSOLE_READ_REPORTING_SITE_STATISTICS","SYSCONSOLE_WRITE_REPORTING_SITE_STATISTICS","SYSCONSOLE_READ_REPORTING_TEAM_STATISTICS","SYSCONSOLE_WRITE_REPORTING_TEAM_STATISTICS","SYSCONSOLE_READ_REPORTING_SERVER_LOGS","SYSCONSOLE_WRITE_REPORTING_SERVER_LOGS","SYSCONSOLE_READ_USERMANAGEMENT_USERS","SYSCONSOLE_WRITE_USERMANAGEMENT_USERS","SYSCONSOLE_READ_USERMANAGEMENT_GROUPS","SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS","SYSCONSOLE_READ_USERMANAGEMENT_TEAMS","SYSCONSOLE_WRITE_USERMANAGEMENT_TEAMS","SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS","SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS","SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS","SYSCONSOLE_WRITE_USERMANAGEMENT_PERMISSIONS","SYSCONSOLE_READ_USERMANAGEMENT_SYSTEM_ROLES","SYSCONSOLE_WRITE_USERMANAGEMENT_SYSTEM_ROLES","SYSCONSOLE_READ_SITE_CUSTOMIZATION","SYSCONSOLE_WRITE_SITE_CUSTOMIZATION","SYSCONSOLE_READ_SITE_LOCALIZATION","SYSCONSOLE_WRITE_SITE_LOCALIZATION","SYSCONSOLE_READ_SITE_USERS_AND_TEAMS","SYSCONSOLE_WRITE_SITE_USERS_AND_TEAMS","SYSCONSOLE_READ_SITE_NOTIFICATIONS","SYSCONSOLE_WRITE_SITE_NOTIFICATIONS","SYSCONSOLE_READ_SITE_ANNOUNCEMENT_BANNER","SYSCONSOLE_WRITE_SITE_ANNOUNCEMENT_BANNER","SYSCONSOLE_READ_SITE_EMOJI","SYSCONSOLE_WRITE_SITE_EMOJI","SYSCONSOLE_READ_SITE_POSTS","SYSCONSOLE_WRITE_SITE_POSTS","SYSCONSOLE_READ_SITE_FILE_SHARING_AND_DOWNLOADS","SYSCONSOLE_WRITE_SITE_FILE_SHARING_AND_DOWNLOADS","SYSCONSOLE_READ_SITE_PUBLIC_LINKS","SYSCONSOLE_WRITE_SITE_PUBLIC_LINKS","SYSCONSOLE_READ_SITE_NOTICES","SYSCONSOLE_WRITE_SITE_NOTICES","SYSCONSOLE_READ_SITE_IP_FILTERS","SYSCONSOLE_WRITE_SITE_IP_FILTERS","SYSCONSOLE_READ_ENVIRONMENT_WEB_SERVER","SYSCONSOLE_WRITE_ENVIRONMENT_WEB_SERVER","SYSCONSOLE_READ_ENVIRONMENT_DATABASE","SYSCONSOLE_WRITE_ENVIRONMENT_DATABASE","SYSCONSOLE_READ_ENVIRONMENT_ELASTICSEARCH","SYSCONSOLE_WRITE_ENVIRONMENT_ELASTICSEARCH","SYSCONSOLE_READ_ENVIRONMENT_FILE_STORAGE","SYSCONSOLE_WRITE_ENVIRONMENT_FILE_STORAGE","SYSCONSOLE_READ_ENVIRONMENT_IMAGE_PROXY","SYSCONSOLE_WRITE_ENVIRONMENT_IMAGE_PROXY","SYSCONSOLE_READ_ENVIRONMENT_SMTP","SYSCONSOLE_WRITE_ENVIRONMENT_SMTP","SYSCONSOLE_READ_ENVIRONMENT_PUSH_NOTIFICATION_SERVER","SYSCONSOLE_WRITE_ENVIRONMENT_PUSH_NOTIFICATION_SERVER","SYSCONSOLE_READ_ENVIRONMENT_HIGH_AVAILABILITY","SYSCONSOLE_WRITE_ENVIRONMENT_HIGH_AVAILABILITY","SYSCONSOLE_READ_ENVIRONMENT_RATE_LIMITING","SYSCONSOLE_WRITE_ENVIRONMENT_RATE_LIMITING","SYSCONSOLE_READ_ENVIRONMENT_LOGGING","SYSCONSOLE_WRITE_ENVIRONMENT_LOGGING","SYSCONSOLE_READ_ENVIRONMENT_SESSION_LENGTHS","SYSCONSOLE_WRITE_ENVIRONMENT_SESSION_LENGTHS","SYSCONSOLE_READ_ENVIRONMENT_PERFORMANCE_MONITORING","SYSCONSOLE_WRITE_ENVIRONMENT_PERFORMANCE_MONITORING","SYSCONSOLE_READ_ENVIRONMENT_DEVELOPER","SYSCONSOLE_WRITE_ENVIRONMENT_DEVELOPER","SYSCONSOLE_READ_AUTHENTICATION_SIGNUP","SYSCONSOLE_WRITE_AUTHENTICATION_SIGNUP","SYSCONSOLE_READ_AUTHENTICATION_EMAIL","SYSCONSOLE_WRITE_AUTHENTICATION_EMAIL","SYSCONSOLE_READ_AUTHENTICATION_PASSWORD","SYSCONSOLE_WRITE_AUTHENTICATION_PASSWORD","SYSCONSOLE_READ_AUTHENTICATION_MFA","SYSCONSOLE_WRITE_AUTHENTICATION_MFA","SYSCONSOLE_READ_AUTHENTICATION_LDAP","SYSCONSOLE_WRITE_AUTHENTICATION_LDAP","SYSCONSOLE_READ_AUTHENTICATION_SAML","SYSCONSOLE_WRITE_AUTHENTICATION_SAML","SYSCONSOLE_READ_AUTHENTICATION_OPENID","SYSCONSOLE_WRITE_AUTHENTICATION_OPENID","SYSCONSOLE_READ_AUTHENTICATION_GUEST_ACCESS","SYSCONSOLE_WRITE_AUTHENTICATION_GUEST_ACCESS","plugins","SYSCONSOLE_READ_PLUGINS","SYSCONSOLE_WRITE_PLUGINS","SYSCONSOLE_READ_INTEGRATIONS_INTEGRATION_MANAGEMENT","SYSCONSOLE_WRITE_INTEGRATIONS_INTEGRATION_MANAGEMENT","SYSCONSOLE_READ_PRODUCTS_BOARDS","SYSCONSOLE_WRITE_PRODUCTS_BOARDS","SYSCONSOLE_READ_INTEGRATIONS_BOT_ACCOUNTS","SYSCONSOLE_WRITE_INTEGRATIONS_BOT_ACCOUNTS","SYSCONSOLE_READ_INTEGRATIONS_GIF","SYSCONSOLE_WRITE_INTEGRATIONS_GIF","SYSCONSOLE_READ_INTEGRATIONS_CORS","SYSCONSOLE_WRITE_INTEGRATIONS_CORS","SYSCONSOLE_READ_COMPLIANCE_DATA_RETENTION_POLICY","SYSCONSOLE_WRITE_COMPLIANCE_DATA_RETENTION_POLICY","SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_EXPORT","SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_EXPORT","SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_MONITORING","SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_MONITORING","SYSCONSOLE_READ_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE","SYSCONSOLE_WRITE_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE","SYSCONSOLE_READ_EXPERIMENTAL_FEATURES","SYSCONSOLE_WRITE_EXPERIMENTAL_FEATURES","SYSCONSOLE_READ_EXPERIMENTAL_FEATURE_FLAGS","SYSCONSOLE_WRITE_EXPERIMENTAL_FEATURE_FLAGS","SYSCONSOLE_READ_EXPERIMENTAL_BLEVE","SYSCONSOLE_WRITE_EXPERIMENTAL_BLEVE","SetByEnv","SettingSet","_ref","children","helpText","inputId","setByEnv","Label","styled","withConfig","displayName","isDisabled","BooleanSetting","_ref2","onChange","trueText","falseText","disabled","disabledText","helptext","useMemo","handleChange","useCallback","e","target","Utils","checked","propTypes","Settings","htmlFor","ColorSetting","color","Setting","ColorInput","DropdownSetting","val","text","memo","FileUploadSetting","_this$fileInputRef$cu","fileInputRef","current","click","_this$fileInputRef$cu2","files","fileSelected","fileName","_this$fileInputRef$cu3","_this$fileInputRef$cu4","preventDefault","uploading","file","onSubmit","serverError","handleChooseClick","accept","fileType","uploadingText","GeneratedSetting","crypto","toString","substring","replaceAll","defaultProps","regenerateText","regenerateHelpText","placeholder","regenerate","getJobsByType","entities","jobs","jobsByTypeList","JobCancelButton","job","useIntl","cancelButton","handleClick","status","JobStatuses","PENDING","IN_PROGRESS","title","formatMessage","_job$data","_job$data2","_job$data3","is_downloadable","parseInt","messages_exported","export_type","exportFormats","EXPORT_FORMAT_GLOBALRELAY","ExternalLink","location","href","concat","getJobsRoute","JobFinishAt","millis","CANCEL_REQUESTED","date","Date","FormattedDate","day","month","year","FormattedTime","hour","minute","last_activity_at","start_at","runningMillis","now","lastActivity","formatDate","formatTime","second","seconds","Math","round","minutes","CANCELED","SUCCESS","WARNING","ERROR","JobTable","getExtraInfoText","jobType","cancelJob","jobId","reload","jobData","createJob","interval","setInterval","componentWillUnmount","clearInterval","showFilesColumn","JobTypes","MESSAGE_EXPORT","downloadExportResults","items","handleCancelJob","JobStatus","JobDownloadLink","JobRunLength","classNames","hideJobCreateButton","handleCreateJob","createJobButtonText","createJobHelpText","hideTable","colSpan","_getConfig$MessageExp","createSelector","jobsByType","getConfig","MessageExportSettings","DownloadExportResults","Table","getOptionLabel","MultiSelectSetting","selected","noResultText","setError","useState","newValue","updatedValues","n","valuesMap","reduce","calculatedValue","result","item","found","ReactSelect","isMulti","delimiter","clearable","noResultsText","FormError","RadioSetting","optionValue","RemoveFileSetting","removeButtonText","removingText","removing","setRemoving","handleRemove","RequestButton","busy","fail","success","doRequest","requestAction","errMsg","includeDetailedError","detailed_error","saveNeeded","saveConfigAction","errorMessage","WarningIcon","showSuccessMessage","successMessage","SuccessIcon","widgetClassNames","handleRequest","LoadingWrapper","loadingText","buttonText","alternativeActionElement","SchemaText","isMarkdown","textValues","html","marked","breaks","sanitize","renderer","CustomRenderer","dangerouslySetInnerHTML","__html","FormattedMarkdownMessage","SettingsGroup","container","header","subtitle","wrapperClass","contentClass","sectionTitle","sectionSubtitle","sectionHeader","AdminTextSetting","footer","sharedProps","_objectWithoutProperties","_excluded","isTextDisabled","placeholderToUse","TextSetting","labelClassName","inputClassName","UserAutocompleteSetting","userSuggestionProvidersRef","useRef","GenericUserProvider","autocompleteUsers","handleUserSelected","user","username","SuggestionBox","onItemSelected","listComponent","SuggestionList","listPosition","providers","requiredCharacters","openOnFocus","withBackButton","trueString","falseString","MAPPING","enableTeamCreation","roleName","permission","CREATE_TEAM","shouldHave","editOthersPosts","EDIT_OTHERS_POSTS","enableOnlyAdminIntegrations","MANAGE_INCOMING_WEBHOOKS","MANAGE_OUTGOING_WEBHOOKS","MANAGE_SLASH_COMMANDS","MANAGE_OAUTH","emptyList","escapePathPart","pathPart","replace","unescapePathPart","descriptorOrStringToString","SchemaAdminSettings","_this","confirmNeededId","showConfirmId","updatedRoles","mappingValues","roles","rolesClone","JSON","parse","stringify","pertinentRoleNames","roleNames","forEach","v1","v2","names","Set","roleNamesInMapping","keys","includes","purgeNonPertinentRoles","mappingKey","roleRules","Error","role","permissions","addPermissionToRole","permissionIndex","splice","removePermissionFromRole","mutateRolesBasedOnMapping","entries","roleClone","originalPermissionSet","newPermissionSet","difference","x","has","size","rolesFromMapping","schema","settings","acc","TYPE_PERMISSION","permissions_mapping_name","editRole","doSubmit","getStateFromConfig","setNavigationBlocked","AdminHeader","setting","label_markdown","Markdown","label_values","help_text","helpTextValues","disabled_help_text","disabled_help_text_markdown","disabled_help_text_values","help_text_markdown","help_text_values","config","license","enterpriseReady","consoleAccess","cloud","isCurrentUserSystemAdmin","Boolean","isHidden","handleRequestAction","skipSaveNeeded","sourceUrlKey","action","metadata","Map","tsetting","setFromMetadataField","inputData","get","TYPE_TEXT","TYPE_FILE_UPLOAD","_this$buildSettingFun","_this$buildSettingFun2","buildSettingFunctions","onSetData","renderSettingHelpText","renderLabel","success_message","error_message","inputType","TYPE_NUMBER","TYPE_LONG_TEXT","dynamic_value","multiple","join","_this$state$setting$k","default","validate","placeholder_values","isSetByEnv","maxLength","max_length","_this$state$setting$k2","handlePermissionChange","_this$state$setting$k3","o","selectedValue","selectedOptionForHelpText","hideHelp","isHelpHidden","renderDropdownOptionHelpText","_this$state$setting$k4","r","no_result","_this$state$setting$k5","locales","I18n","l","order","sort","a","b","split","changedId","_values$find","_this$state$setting$k6","defaultOption","banner_type","additionalClassName","renderBanner","_this$state$setting$k7","regenerate_help_text","handleGeneratedChange","s","confirm","warning","isCloudStarter","Cloud","SkuShortName","clientWarning","_this$state$setting$k8","TYPE_USERNAME","JobsTable","job_type","render_job","removeFile","callback","remove_action","successCallback","remove_help_text","remove_button_text","removing_text","uploading_text","uploadFile","upload_action","filename","idpCertificateFileError","CustomComponent","component","componentInstance","registerSaveAction","setSaveNeeded","unRegisterSaveAction","cancelSubmit","showConfirm","showTitle","saveAction","indexOfSaveAction","saveActions","settingsList","sections","section","startsWith","endsWith","getConfigFromState","patchConfig","serverErrorId","results","hasSaveActionError","some","path","getConfigValue","environmentConfig","hidden","_setting$isHidden","call","isValid","_this$state$serverErr","_this$state","customComponentWrapperClass","renderTitle","renderSettings","hybridSchemaAndComponent","SaveButton","canSave","savingMessage","WithTooltip","iconClassName","textClassName","Link","to","isPlugin","buildTextSetting","TYPE_COLOR","buildColorSetting","TYPE_BOOL","buildBoolSetting","buildPermissionSetting","TYPE_DROPDOWN","buildDropdownSetting","TYPE_RADIO","buildRadioSetting","TYPE_BANNER","buildBannerSetting","TYPE_GENERATED","buildGeneratedSetting","buildUsernameSetting","TYPE_BUTTON","buildButtonSetting","TYPE_LANGUAGE","buildLanguageSetting","TYPE_JOBSTABLE","buildJobsTableSetting","buildFileUploadSetting","TYPE_ROLES","buildRolesSetting","TYPE_CUSTOM","buildCustomSetting","getDerivedStateFromProps","prevSchemaId","sectionSettings","setConfigValue","getSettingValue","previousValue","onConfigSave","mappingPart","hasOwn","hasUnmetCondition","allConditionsAreMet","mappingPartIterator","mappingValueFromRoles","onConfigLoad","getSetting","obj","setValue","pathParts","part","slice","getEnablePluginSetting","plugin","getPluginSchema","pluginId","_state$entities$admin","admin","getAdminConsoleCustomComponents","getAdminConsoleCustomSections","appsFeatureFlagEnabled","isCurrentLicenseCloud","customComponents","customSections","appsFeatureFlagIsEnabled","isCloudLicense","escapedPluginId","pluginEnabledConfigKey","parsePluginSettings","toLowerCase","bannerType","it","any","stateIsFalse","not","userHasWritePermissionOnResource","SettingsTypes","stateIsTrue","translate","hosting","settings_schema","_customSections$key","custom","fallback","parsePluginSettingSections","appsPluginID","_plugin$settings_sche","_plugin$settings_sche2","_plugin$settings_sche3","_plugin$settings_sche4","pluginEnableSetting","hasAllCustomSectionsDisabled","every","allCustomSectionsAllowFallback","_plugin$settings_sche5","_plugin$settings_sche6","warningBanner","_plugin$settings_sche7","_plugin$settings_sche8","unshift","checkDisableSetting","match","params","plugin_id","getRoles","CustomPluginSettings","OLDAdminSettings","prevState","handleSaved","server_error_id","str","defaultValue","isNaN","minimumValue","stateInit","PluginItemState","PluginState","PLUGIN_STATE_NOT_RUNNING","PLUGIN_STATE_STARTING","PLUGIN_STATE_RUNNING","PLUGIN_STATE_FAILED_TO_START","PLUGIN_STATE_FAILED_TO_STAY_RUNNING","PLUGIN_STATE_STOPPING","PluginItemStateDescription","messages","defineMessages","enable","enableDesc","uploadTitle","installedTitle","installedDesc","uploadDesc","uploadDisabledDesc","enableMarketplace","enableMarketplaceDesc","enableRemoteMarketplace","enableRemoteMarketplaceDesc","automaticPrepackagedPlugins","automaticPrepackagedPluginsDesc","marketplaceUrl","marketplaceUrlDesc","searchableStrings","PluginItem","_ref3","activateButton","pluginStatus","handleEnable","handleDisable","showInstances","hasSettings","activating","deactivating","active","settingsButton","description","removeButton","notices","instances","instance","version","clusterSummary","cluster_id","PluginSettings","Enable","EnableUploads","enableUploads","AllowInsecureDownloadURL","allowInsecureDownloadUrl","EnableMarketplace","EnableRemoteMarketplace","AutomaticPrepackagedPlugins","MarketplaceURL","RequirePluginSignature","requirePluginSignature","_this$fileInput$curre","fileInput","lastMessage","element","force","uploadPlugin","confirmOverwriteUploadModal","overwritingUpload","getPlugins","msg","_element$files","helpSubmitUpload","pluginDownloadUrl","installing","installPluginFromUrl","confirmOverwriteInstallModal","overwritingInstall","url","link","DeveloperLinks","PLUGINS","installFromUrl","currentTarget","getAttribute","showRemoveModal","removePlugin","enablePlugin","disablePlugin","_ref4","onConfirm","onCancel","overwriteButton","ConfirmModal","confirmButtonClass","confirmButtonText","ExperimentalSettings","RestrictSystemAdmin","_this$props$config","_this$props$config$Pl","_this$props$config$Ex","enableUploadButton","uploadButtonText","pluginsList","pluginsContainer","pluginsListContainer","btnClass","pluginStatuses","LoadingScreen","nameCompare","localeCompare","p","showRemovePluginModal","uploadHelpText","overwriteUploadPluginModal","renderOverwritePluginModal","handleOverwriteUploadPlugin","handleOverwriteUploadPluginCancel","removePluginModal","renderRemovePluginModal","handleRemovePlugin","handleRemovePluginCancel","renderEnablePluginsSetting","PLUGIN_SIGNING","handleChooseFileClick","handleUpload","handleSubmitUpload","getMarketplaceURLHelpText","resolveRemoveModal","_config$PluginSetting","_config$PluginSetting2","_config$PluginSetting3","_config$PluginSetting4","_config$PluginSetting5","_config$PluginSetting6","_config$PluginSetting7","_config$PluginSetting8","getPluginStatuses","PluginManagement","StatisticCount","icon","count","content","totalUsers","hint","InformationOutlineIcon","ActivatedUserCard","activatedUsers","seatsPurchased","isCloud","isBetween5PercerntAnd10PercentPurchasedSeats","isOver10PercerntPurchasedSeats","calculateOverageUserActivated","activeUsers","showOverageWarning","activeUserStatus","team_statistics__message","AlertOutlineIcon","DoughnutChart","canvasRef","chartRef","useEffect","ctx","getContext","deepEqual","update","Chart","_chartRef$current","destroy","formatPostsPerDayData","labels","fillChartData","datasets","fillColor","borderColor","pointBackgroundColor","pointBorderColor","pointHoverBackgroundColor","pointHoverBorderColor","synchronizeChartLabels","_len","datas","Array","_key","add","from","formatUsersWithPostsPerDayData","chartData","LineChart","legend","display","chart","responsive","style","dataCopy","chartOptions","_this$chart","initChart","addEventListener","resizeChart","hasData","hasChart","removeEventListener","PropTypes","StatTypes","totalPosts","totalSessions","totalCommands","totalIncomingWebhooks","totalOutgoingWebhooks","totalWebsockets","totalMasterDbConnections","totalReadDbConnections","postTypes","channelTypes","totalTeams","totalChannels","dailyActiveUsers","monthlyActiveUsers","SystemAnalytics","pluginSiteStats","AdminActions","isLicensed","fetchPluginStats","pluginKeys","pluginStatHandlers","allHandlers","handler","allStats","allStatsIndexed","pluginStats","idx","getStatValue","stat","stats","skippedIntensiveQueries","TOTAL_POSTS","POST_PER_DAY","BOT_POST_PER_DAY","USERS_WITH_POSTS_PER_DAY","postCountsDay","botPostCountsDay","userCountsWithPostsDay","banner","postCount","postTotalGraph","botPostTotalGraph","activeUserGraph","advancedStats","advancedGraphs","sessionCount","commandCount","incomingCount","outgoingCount","TOTAL_SESSIONS","TOTAL_COMMANDS","TOTAL_IHOOKS","TOTAL_OHOOKS","TOTAL_WEBSOCKET_CONNECTIONS","TOTAL_MASTER_DB_CONNECTIONS","TOTAL_READ_DB_CONNECTIONS","channelTypeData","totalPublic","TOTAL_PUBLIC_CHANNELS","totalPrivate","TOTAL_PRIVATE_GROUPS","backgroundColor","hoverBackgroundColor","postTypeData","filePosts","TOTAL_FILE_POSTS","hashtagPosts","TOTAL_HASHTAG_POSTS","postTypeGraph","userCount","TOTAL_USERS","Users","teamCount","TOTAL_TEAMS","totalPublicChannelsCount","totalPrivateGroupsCount","channelCount","DAILY_ACTIVE_USERS","MONTHLY_ACTIVE_USERS","pluginCounts","pluginLineCharts","pluginDoughnutCharts","visualizationType","AnalyticsVisualizationType","Count","systemCards","getLicense","IsLicensed","analytics","siteStatsHandlers","Banner","TableChart","tip","info","publicChannels","privateGroups","recentUsers","newlyCreated","team","activatedUsersCardsMessages","TeamAnalytics","recentlyActiveUsers","getProfilesInTeam","General","PROFILE_CHUNK_SIZE","newUsers","teamId","teams","t","setGlobalItem","initialTeam","getData","getTeams","totalPostsCount","userActiveGraph","recentActiveUsers","locale","getMonthLong","email","newlyCreatedUsers","create_at","formatNewUsersData","aName","toUpperCase","bName","handleTeamChange","getTeamsList","makeGetGlobalItem","getCurrentLocale","teamAnalytics","SECTION_NONE","SECTION_TLS","SECTION_STARTTLS","CONNECTION_SECURITY_HELP_TEXT_EMAIL","cellPadding","CONNECTION_SECURITY_HELP_TEXT_LDAP","CONNECTION_SECURITY_HELP_TEXT_WEBSERVER","WEBSERVER_MODE_HELP_TEXT","LOG_LEVEL_OPTIONS","ReloadIcon","ComplianceReports","loadingReports","getComplianceReports","_this$descInput$curre","_this$emailsInput$cur","_this$keywordsInput$c","runningReport","desc","descInput","emails","emailsInput","keywords","keywordsInput","fromInput","end_at","toInput","createComplianceReport","enabled","getDateTime","list","i","reports","report","download","getBaseRoute","user_id","profile","users","dataCell","LocalizedPlaceholderInput","readOnly","runReport","margin","greenStatus","redStatus","whiteSpace","marginTop","getUsersForReports","profiles","complianceReports","usersMap","u","ComplianceSettings","requests","createCompliance","selectComplianceReports","Audits","loadingAudits","getAudits","clear","marginBottom","AuditTable","audits","showUserId","showIp","showSession","renderComplianceReports","activityLogHeader","Compliance","Selectors","CloudFetchError","useDispatch","useSelector","retryFailedCloudFetches","EmptyBillingHistorySvg","viewBox","fill","xmlns","xmlnsXlink","d","stroke","strokeWidth","maskUnits","y","mask","fillRule","clipRule","fillOpacity","clipPath","patternContentUnits","xlinkHref","transform","CloudInvoicePreview","_props$url","isPreviewModalOpen","isModalOpen","ModalIdentifiers","CLOUD_INVOICE_PREVIEW","closeModal","downloadLink","PDFPreview","fileInfo","extension","fileUrl","scale","handleBgClose","InvoiceUserCount","invoice","fullUsers","line_items","InvoiceLineItemType","Full","quantity","partialUsers","Partial","meteredUsers","Metered","onPremUsers","OnPremise","floor","fractionalSeats","numberToFixedDynamic","fullSeats","toFixed","partialSeats","BillingHistoryTable","invoices","billingHistory","setBillingHistory","firstRecord","setFirstRecord","numInvoices","invoicesByDate","period_start","paging","startRecord","endRecord","min","totalRecords","previousPage","nextPage","getInvoicePdfUrl","openModal","modalId","dialogType","dialogProps","timeZone","current_product_name","number","FormattedNumber","total","currency","getPaymentStatus","rel","stopPropagation","NoBillingHistorySection","selfHosted","HostedCustomerLinks","SELF_HOSTED_BILLING","CloudLinks","BILLING_DOCS","trackEvent","screen","UpgradeLink","styleButton","styleLink","openSalesLink","useOpenSalesLink","telemetryInfo","handleLinkClick","CloudTrialBanner","trialEndDate","endDate","getCurrentUser","storedDismissedEndDate","getPreference","Preferences","CLOUD_TRIAL_BANNER","CloudBanners","UPGRADE_FROM_TRIAL","shouldShowBanner","isEmpty","today","moment","bannerIsStillDismissed","Number","diff","showBanner","setShowBanner","AlertBanner","mode","onDismiss","onDismissBanner","addTenDaysToToday","format","savePreferences","category","time","endOf","tz","getBrowserTimezone","hideIcon","actionButtonLeft","actionButtonRight","CloudTrialSvg","rx","cx","cy","ry","strokeOpacity","filterUnits","colorInterpolationFilters","floodOpacity","in","dy","stdDeviation","in2","PrivateCloudSvg","ContactSalesCard","contactSalesLink","isFreeTrial","subscriptionPlan","onUpgradeMattermostCloud","pricingLink","PRICING","isCloudLegacyPlan","CloudProducts","LEGACY","STARTER","PROFESSIONAL","ENTERPRISE","trackingLocation","UpgradeSvg","opacity","noBillingHistory","partialChargesTooltipTitle","partialChargesTooltipText","FreeTrial","daysLeftOnTrial","TrialPeriodDays","TRIAL_1_DAY","TRIAL_0_DAYS","TRIAL_WARNING_THRESHOLD","BillingSummary","body","FeatureList","_limits$messages$hist","_limits$messages","_limits$files$total_s","_limits$files","_features","limits","useGetLimits","featuresCloudStarter","limit","formatNumber","history","fallbackStarterLimits","asGBString","total_storage","totalStorage","featuresCloudStarterLegacy","featuresCloudProfessional","featuresCloudEnterprise","features","hasSomeLimits","featureElements","feature","PlanDetailsTopElements","productName","isYearly","openPricingModal","useOpenPricingModal","userCountDisplay","trialBadge","Tag","monthlyBadge","yearlyBadge","viewPlansButton","product","sku","recurring_interval","RecurringIntervals","YEAR","price_per_seat","getPrice","billing_scheme","BillingSchemes","FLAT_FEE","PlanDetails","subscription","getCloudSubscription","getSubscriptionProduct","getRemainingDaysFromFutureTimestamp","trial_end_at","TRIAL_30_DAYS","useGetTotalUsersNoBots","PlanPricing","currentPlanText","CompanySvg","addInfoButton","BlockableLink","noCompanyInfoSection","CompanyInfoDisplay","_companyInfo$company_","companyInfo","customer","address","company_address","line1","billing_address","isCompanyBillingFilled","num_employees","employees","line2","city","postal_code","country","US_STATES","code","CA_PROVINCES","StateSelector","onStateSelected","stateList","withId","testId","DropdownInput","stateCode","Input","onBlur","required","enableIndexingTitle","enableIndexingDescription","bulkIndexingTitle","createJob_help","purgeIndexesHelpText","purgeIndexesButton","purgeIndexesButton_label","enableSearchingTitle","enableSearchingDescription","BrandImageSetting","brandImage","deleteBrandImage","brandImageExists","uploadBrandImage","brandImageTimestamp","imageRef","fetch","getBrandImageUrl","String","resp","catch","console","handleSave","reader","FileReader","img","onload","_e$target","_e$target2","_e$target3","ArrayBuffer","setAttribute","readAsDataURL","overlay","isVertical","handleDeleteButtonPressed","handleSelectClick","ACCEPT_STATIC_IMAGE","handleImageChange","ClusterTable","PureComponent","versionMismatch","statusGreen","configMismatch","versionMismatchWarning","configHash","singleItem","clusterInfos","config_hash","clusterInfo","statusYellow","hostname","ipaddress","clusterCell","schema_version","clusterTable","ClusterTableContainer","setClusterInfos","load","getClusterStatus","cluster","noteDescription","enableTitle","enableDescription","clusterName","clusterNameDesc","overrideHostname","overrideHostnameDesc","useIPAddress","useIPAddressDesc","enableExperimentalGossipEncryption","enableExperimentalGossipEncryptionDesc","enableGossipCompression","enableGossipCompressionDesc","gossipPort","gossipPortDesc","configLoadedFromCluster","CustomEnableDisableGuestAccountsSetting","targetId","submit","confirmNeeded","handleConfirm","chunks","termsOfServiceTitle","enableTermsOfServiceTitle","termsOfServiceTextTitle","termsOfServiceTextHelp","termsOfServiceReAcceptanceTitle","termsOfServiceReAcceptanceHelp","enableTermsOfServiceHelp","getTermsOfService","createTermsOfService","_props$config$Support","_props$config$Support2","SupportSettings","CustomTermsOfServiceEnabled","termsEnabled","CustomTermsOfServiceReAcceptancePeriod","parseIntNonZero","reAcceptancePeriod","DEFAULT_TERMS_OF_SERVICE_RE_ACCEPTANCE_PERIOD","_this$props$config$Su","receivedTermsText","termsText","handleAPIError","loadingTermsText","handleTermsEnabledChange","CustomTermsOfService","handleTermsTextChange","MAX_TERMS_OF_SERVICE_TEXT_LENGTH","handleReAcceptancePeriodChange","errorTooltip","_config$SupportSettin","_config$SupportSettin2","CustomURLSchemesSetting","trim","arr","valueAsArray","stringToArray","arrayToString","HeaderElement","col","flexGrow","field","columns","DataGridCell","row","column","textAlign","overflow","cells","DataGridRow","index","FilterCheckbox","updateOption","toggleOption","defaultChecked","FilterList","optionKey","updateValues","valuesToRender","currentValue","FilterItem","Filter","document","handleClickOutside","event","_this$filterRef","_this$filterRef$curre","filterRef","contains","hidePopover","_this$buttonRef","_this$buttonRef$curre","buttonRef","blur","optionsModified","onFilter","filterCount","calculateFilterCount","filterKey","FilterListComponent","valid","filters","renderFilterOptions","Filter__active","togglePopover","Filter__show","resetFilters","DataGridSearch","onSearch","_this$props$filterPro","filterProps","FaSearchIcon","handleSearch","resetSearch","extraComponent","DataGrid","_this$ref","minimumColumnWidth","fixedColumns","fixedColumnWidth","visibleColumns","availableWidth","clientWidth","fixed","startCount","endCount","firstPage","lastPage","prevPageFn","nextPageFn","PreviousIcon","NextIcon","hiddenColumns","handleResize","renderRows","rows","rowsContainerStyles","rowsToRender","loadingIndicator","LoadingSpinner","placeholderEmpty","renderHeader","DataGridHeader","renderSearch","renderFooter","CardHeader","expanded","Card","childrenWithProps","Children","child","isValidElement","cloneElement","setHeight","expanding","setExpanding","setExpanded","node","scrollHeight","onTransitionEnd","stopExpanding","TitleAndButtonCardHeader","createJob_title","settings_title","globalPolicy_title","globalPolicy_subTitle","customPolicies_title","customPolicies_subTitle","jobCreation_title","jobCreation_subTitle","createJob_instructions","DataRetentionSettings","deleteDataRetentionCustomPolicy","loadPage","hours","hoursInt","years","days","channel_messages","getGlobalRetentionSetting","EnableMessageDeletion","globalMessageRetentionHours","EnableFileDeletion","globalFileRetentionHours","MenuWrapper","stopPropagationOnToggle","Menu","openLeft","openUp","ariaLabel","ItemAction","getHistory","buttonClass","policy","channel_count","team_count","policies","customPolicies","desciptionId","durationId","appliedToId","menuWrapperId","getMessageRetentionSetting","post_duration","applied_to","getChannelAndTeamCounts","deleteCustomPolicy","customPoliciesLoading","getDataRetentionCustomPolicies","customPoliciesCount","showEditJobTime","_this$inputRef$curren","inputRef","focus","DATA_RETENTION","_this$inputRef$curren2","newConfig","DeletionJobStartTime","_DataRetentionSetting","timeArray","minuteIntervals","h","hourLabel","hourValue","timeOfDay","getJobTimeOptions","getPaginationProps","getGlobalPolicyColumns","getGlobalPolicyRows","getCustomPolicyColumns","getCustomPolicyRows","components","DropdownIndicator","IndicatorSeparator","changeJobTimeConfig","styles","control","base","minHeight","menu","getJobStartTime","hideSelectedOptions","isSearchable","getJobTimes","onFocus","menuIsOpen","createRef","getDataRetentionCustomPoliciesCount","DataRetentionMessageRetentionHours","DataRetentionFileRetentionHours","fetchDataRetentionCustomPolicies","TeamFilterDropdown","_props$option$values","_props$option$values$","setList","pageNumber","setPageNumber","loadListInPageNumber","response","existingList","optionValues","team_ids","selectedValues","AsyncSelect","isClearable","classNamePrefix","cacheOptions","loadingMessage","noOptionsMessage","loadOptions","callBack","searchTeams","per_page","defaultOptions","actionMeta","isArray","onMenuScrollToBottom","LoadingIndicator","mapDispatchToProps","PAGE_SIZE","ChannelList","pageSize","policyId","setStateLoading","getDataRetentionCustomPolicyChannels","setStatePage","channelsToAdd","channelsToRemove","totalCount","getVisibleTotalCount","onRemoveCallback","channels","channelsToDisplay","includeTeamsList","numberOfTeamsRemoved","pageToLoad","pageLoaded","iconToDisplay","GlobeIcon","PRIVATE_CHANNEL","LockIcon","isArchivedChannel","ArchiveIcon","team_display_name","remove","removeChannel","setChannelListSearch","debounce","searchChannels","public","private","privateChannels","deleted","filterOptions","teamIds","setChannelListFilters","filtersModified","isEqual","searchDebounced","getRows","getColumns","getPolicyChannels","getChannelsInPolicy","_state$views$search$c","getDataRetentionCustomPolicy","channelListSearch","searchChannelsInPolicy","filteredTeams","filterChannelsMatchingTerm","filterChannelList","channelListToMap","searchChannelsToAdd","FOREVER","YEARS","DAYS","keepForeverOption","yearsOption","daysOption","hoursOption","TeamList","getDataRetentionCustomPolicyTeams","teamsToAdd","teamsToRemove","teamsToDisplay","TeamIcon","removeTeam","setTeamListSearch","getPolicyTeams","getTeamsInPolicy","teamListSearch","searchTeamsInPolicy","filterTeamsStartingWithTerm","teamListToMap","searchTeamsToAdd","ChannelSelectorModal","loadingChannels","onModalDismissed","onChannelsSelected","setChannelsLoadingState","loadChannels","CHANNELS_PER_PAGE","excludePolicyConstrained","newState","stateChannelIDs","stateChannel","serverChannel","compareChannels","multiselectComponent","OPEN_CHANNEL","searchAllChannels","not_associated_to_group","alreadySelected","_this$props$alreadySe","policy_id","excludeTeamIds","_this$props$excludeTe","handleExit","aDisplayName","bDisplayName","TeamSelectorModal","_this$props$onTeamsSe","_this$props","onTeamsSelected","confirmed","modalID","ADD_TEAMS_TO_SCHEME","scheme_id","confirmAddModal","confirmAddTeam","loadingTeams","setTeamsLoadingState","loadTeams","TEAMS_PER_PAGE","imageURLForTeam","renderConfirmModal","confirmModal","delete_at","currentSchemeId","excludeGroupConstrained","group_constrained","teamsValues","baseStyles","input","provided","border","boxShadow","padding","cursor","borderRadius","indicatorSeparator","menuPortal","zIndex","IndicatorsContainer","Control","Option","focused","isFocused","onDropdownChange","onInputChange","exceptionToInput","inputValue","dropdownClassNamePrefix","otherProps","containerRef","inputFocused","setInputFocused","setFocused","showInput","setShowInput","_inputRef$current","showTextInput","_inputRef$current2","showLegend","Input_fieldset___error","Input_fieldset___legend","Input_fieldset___split","Input_legend___focus","formatAsString","onInputFocus","onInputBlur","maxWidth","_props$onFocus","_props$onBlur","Input__focus","offsetWidth","left","menuPortalTarget","CustomPolicyForm","addChannelOpen","addTeamOpen","_this$props$policy","fetchPolicy","policyName","messageRetentionInputValue","getMessageRetentionDefaultInputValue","messageRetentionDropdownValue","getMessageRetentionDefaultDropdownValue","removedTeamsCount","newTeams","removedTeams","_removedTeams$team$id","_newTeams$team$id","_removedTeams$team$id2","removedChannelsCount","newChannels","removedChannels","_removedChannels$chan","_newChannels$channel$","_removedChannels$chan2","_teamsToDisplay","updateDataRetentionCustomPolicy","addDataRetentionCustomPolicyTeams","removeDataRetentionCustomPolicyTeams","addDataRetentionCustomPolicyChannels","removeDataRetentionCustomPolicyChannels","postDuration","formErrorText","policyInfo","newPolicy","channel_ids","createDataRetentionCustomPolicy","inputErrorText","customMessage","ItemStatus","DropdownInputHybrid","channelAndDirectMessageRetention","closeAddTeam","addToNewTeams","openAddTeam","addToRemovedTeams","closeAddChannel","addToNewChannels","getTeamsToExclude","openAddChannel","addToRemovedChannels","fetchPolicyTeams","GlobalPolicyForm","isEnabled","fileRetentionDropdownValue","fileRetentionInputValue","setDeletionEnabled","isMessageRetentionSetByEnv","MessageRetentionDays","MessageRetentionHours","setRetentionHours","isFileRetentionSetByEnv","FileRetentionDays","FileRetentionHours","dropdownValue","_this$props$environme","_this$props$environme2","_this$props$config$Da","_this$props$environme3","_this$props$environme4","_this$props$config$Da2","_this$props$environme5","_this$props$environme6","_this$props$config$Da3","_this$props$environme7","_this$props$environme8","_this$props$config$Da4","_this$props$environme9","_this$props$environme10","_this$props$config$Da5","_this$props$environme11","_this$props$environme12","_this$props$config$Da6","channelAndMessageRetention","fileRetention","getDefaultDropdownValue","messageRetentionHours","getDefaultInputValue","fileRetentionHours","getEnvironmentConfig","MigrationsTable","createHelpText","migrations","setMigrations","getAppliedSchemaMigrations","handleGetAppliedSchemaMigrations","migration","recycleDescription","featureName","reloadConfiguration","button","disableDatabaseSearchTitle","disableDatabaseSearchDescription","driverName","driverNameDescription","dataSource","dataSourceDescription","maxConnectionsTitle","maxConnectionsDescription","maxOpenTitle","maxOpenDescription","queryTimeoutTitle","queryTimeoutDescription","connMaxLifetimeTitle","connMaxLifetimeDescription","connMaxIdleTimeTitle","connMaxIdleTimeDescription","minimumHashtagLengthTitle","minimumHashtagLengthDescription","traceTitle","traceDescription","connectionUrlTitle","connectionUrlDescription","skipTLSVerificationTitle","skipTLSVerificationDescription","usernameTitle","usernameDescription","passwordTitle","passwordDescription","sniffTitle","sniffDescription","testHelpText","elasticsearch_test_button","help","rebuildChannelsIndexTitle","rebuildChannelIndexHelpText","rebuildChannelsIndexButtonText","documentationLink","AnnouncementBannerSVG","strokeLinecap","strokeLinejoin","x1","y1","x2","y2","EmbargoedEntityTrialError","LicenseLinks","EMBARGOED_COUNTRIES","TrialLoadStatus","WrappedComponent","trialButton","upgradeTermsMessage","gettingTrialErrorMsg","gettingTrialError","gettingTrialResponseCode","gettingTrial","upgradingPercentage","handleUpgrade","upgradeError","restartError","handleRestart","restarting","openEEModal","openTrialForm","restartedAfterUpgradePrefs","getBoolPreference","UNIQUE","Unique","REQUEST_TRIAL_AFTER_SERVER_UPGRADE","clickedUpgradeAndTrialBtn","CLICKED_UPGRADE_AND_TRIAL_BTN","userId","getCurrentUserId","setLoadStatus","NotStarted","handleRequestLicense","savePrefsRestartedAfterUpgrade","savePrefsAndRequestTrial","Started","Failed","Embargoed","reqLicense","clickedBtn","eeModalTerms","TRIAL_INFO_LINK","trialInfoLink","Success","btnText","strong","linkEvaluation","SOFTWARE_SERVICES_LICENSE_AGREEMENT","linkPrivacy","AboutLinks","PRIVACY_POLICY","onHandleUpgrade","percentage","useOpenStartTrialFormModal","FeatureDiscovery","customerEmail","firstName","contact_first_name","lastName","contact_last_name","companyName","utmMedium","goToMattermostContactSalesForm","minimumSKURequiredForFeature","learnMoreURL","LicenseSkus","Enterprise","TELEMETRY_CATEGORIES","SELF_HOSTED_ADMIN","contactSalesFunc","PurchaseLink","eventID","buttonTextElement","ctaPrimaryButton","StartTrialBtn","telemetryId","renderAsButton","trackingPage","CLOUD_ADMIN","highlight","getPrevTrialLicense","_this$props$prevTrial","copy","featureDiscoveryImage","isCloudTrial","isSubscriptionLoaded","prevTrialLicense","renderPostTrialCta","renderStartTrial","hadPrevCloudTrial","isPaidSubscription","withGetCloudSubscription","hasPriorTrial","checkHadPriorTrial","is_free_trial","getCloudCustomer","Starter","ComplianceExportSVG","CustomTermsOfServiceSVG","DataRetentionSVG","GroupsSVG","GuestAccessSVG","GroupProfile","customID","showAtMention","MentionsIcon","LineSwitch","subTitle","singleLine","toggled","onToggle","offText","onText","last","Toggle","AdminPanel","onHeaderClick","subtitleValues","GroupSettingsToggle","isDefault","allowReference","GroupProfileAndSettings","displayname","mentionname","GroupTeamsAndChannelsRow","onRemoveItem","showConfirmationModal","onChangeRoles","schemeAdmin","onToggleCollapse","channelAdmin","teamAdmin","member","dropDown","isNil","currentRole","roleToBe","localizeMessage","testid","changeRoles","extraClasses","arrowIcon","hasChildren","collapsed","toggleCollapse","channelIcon","typeText","displayType","removeItem","displayAssignedRolesDropdown","GroupTeamsAndChannels","existingTeams","teamEntries","team_type","scheme_admin","channelEntriesByTeam","channel_type","channel_display_name","channel_id","teamChannels","teamsAndChannelsToEntries","entry","GroupUsersRow","lastPictureUpdate","Avatar","getProfilePictureUrl","GROUP_MEMBERS_PAGE_SIZE","GroupUsers","members","getMembers","numberOfMembersToLoad","first_name","last_name","last_picture_update","renderPagination","BlockableButton","blocked","onCancelConfirmed","restProps","deferNavigation","getNavigationBlocked","SaveChangesPanel","cancelLink","GroupDetails","groupTeams","group_id","groupChannels","itemsToRemove","syncableType","syncableTypeFromEntryType","makeAPIRequest","Team","gt","gc","entryType","rolesToChange","listToUpdate","getId","stateKey","updatedItems","originalAllowReference","allow_reference","groupMentionName","hasAllowReferenceChanged","originalGroupMentionName","hasGroupMentionNameChanged","patchGroupSuccessful","handlePatchGroup","addsSuccessful","handleAddedTeamsAndChannels","removesSuccessful","handleRemovedTeamsAndChannels","rolesSuccessful","handleRolesToUpdate","getGroupSyncables","allSuccuessful","groupTeamOrChannel","GroupNameIsTakenError","lcGroupMentionName","patchGroup","_result$error","promises","syncableID","patchGroupSyncable","errors","_r$error","groupTeam","roleChangeKey","groupChannel","_r$error2","unlink","_r$error3","memberCount","onMentionToggle","onMentionChange","loadingTeamsAndChannels","onRemoveTeamOrChannel","addTeams","addChannels","getGroup","getGroupStats","gcs","stateIDs","getGroupTeams","getGroupChannels","selectProfilesInGroup","getGroupMemberCount","fetchGroup","getProfilesInGroup","fetchGroupSyncables","unlinkGroupSyncable","GroupRow","setLoading","linkHandler","primary_key","unlinkHandler","onRowClick","onCheckToggle","CheckboxCheckedIcon","mattermost_group_id","failed","has_syncables","LDAP_GROUPS_PAGE_SIZE","FILTER_STATE_SEARCH_KEY_MAPPING","filterIsConfigured","is_configured","filterIsUnconfigured","filterIsLinked","is_linked","filterIsUnlinked","GroupsList","showFilters","searchString","getLdapGroups","q","handleGetGroupsResponse","fetchError","searchGroups","newChecked","linkSelectedGroups","unlinkSelectedGroups","selectionActionButtonType","hasSelectedLinked","renderSelectionActionButton","opts","re","handleGroupSearchKeyUp","KeyCodes","ENTER","k","newSearchString","stringFilterPresent","handleFilterCheck","updates","renderSearchFilters","nativeEvent","stopImmediatePropagation","onKeyUp","SearchIcon","resetFiltersAndSearch","closeFilters","once","getSortedListOfLdapGroups","ldapGroups","getLdapGroupsCount","fetchLdapGroups","linkLdapGroup","unlinkLdapGroup","GroupSettings","siteURL","getSiteURL","DocLinks","DEFAULT_LDAP_GROUP_SYNC","IPFilteringAddOrEditModal","onSave","existingRange","currentIP","setName","CIDR","setCIDR","cidr_block","CIDRError","setCIDRError","ip","useLegend","cidr","validateCIDRInput","ipaddr","validateCIDR","Footer","allowedIPRange","owner_id","DeleteConfirmationModal","filterToDelete","EditTableRow","handleRowMouseEnter","handleRowMouseLeave","setEditFilter","handleConfirmDeleteFilter","hoveredRow","onMouseEnter","onMouseLeave","PencilOutlineIcon","TrashCanOutlineIcon","IPNotInRangeErrorPanel","currentUsersIP","setShowAddModal","EditSectionHeader","currentIPIsInRange","IPFilteringEarthSvg","NoFiltersPanel","EditSection","ipFilters","setHoveredRow","EnableSectionContent","filterToggle","setFilterToggle","learnmore","toggleClassName","SaveConfirmationModal","includeDisclaimer","customerportal","keyRemove","EnterpriseEditionLeftPanel","openEELicenseModal","upgradedFromTE","isTrialLicense","statsActiveUsers","unsanitizedLicense","setUnsanitizedLicense","openContactSales","unsanitizedL","getClientLicenseOld","_unused","fetchUnSanitizedLicense","skuName","getSkuDisplayName","IsGovSku","expirationDays","ExpiresAt","variant","uppercase","renderLicenseContent","toTitleCase","licenseValues","StartsAt","IssuedAt","Name","Company","renderLicenseValues","renderAddNewLicenseButton","renderRemoveButton","_fileInputRef$current","FileTypes","LICENSE_EXTENSION","ContactUsButton","customClass","handleContactUsLinkClick","SetupSystemSvg","EnterpriseEditionRightPanel","isEnterpriseOrE20","isEnterpriseOrE20License","contactSalesBtn","isGovSku","ConfirmLicenseRemovalModal","CONFIRM_LICENSE_REMOVAL","handleOnClose","GenericModal","compassDesign","AlertSvg","currentSKU","currentLicenseSKU","EELicenseModal","ENTERPRISE_EDITION_LICENSE","onClose","FileSvg","UploadLicenseSvg","UploadLicenseModal","fileObj","setFileObj","fileObjFromProps","isUploading","setIsUploading","setServerError","uploadSuccessful","setUploadSuccessful","currentLicense","UPLOAD_LICENSE","uploadLicenseContent","extLen","fileNameWithoutExt","substr","displayFileName","fileSizeToString","handleRemoveFile","uploadLicense","getLicenseConfig","startsAt","expiresAt","licensedUsersNum","SuccessSvg","RenewLicenseCard","isLicenseExpired","endOfLicense","daysToEndLicense","cardTitle","licenseSku","StarterLeftPanel","currentPlan","StarterRightPanel","TeamEdition","TeamEditionRightPanel","setClickNormalUpgradeBtn","upgradeButton","currentDate","daysToLicenseExpire","toDateString","daysCount","licenseSettingsStarterEditionMessages","enterpriseEditionLeftPanelMessages","LicenseSettings","upgradeToE0Status","reloadPercentage","licenseSKUWithFirstLetterCapitalized","removeLicense","getServerLimits","upgradeToE0","ping","checkRestarted","restartServer","clickNormalUpgradeBtn","createLink","TERMS_OF_SERVICE","TrialLicenseCard","isLicenseExpiring","RenewLinkCard","getFilteredUsersStats","include_bots","include_deleted","leftPanel","rightPanel","confirmLicenseRemoval","TeamEditionLeftPanel","TrialBanner","renewLicenseCard","termsAndPolicy","comparePlans","requestTrialLicense","_selectFilteredUserSt","selectFilteredUserStats","total_users_count","UpgradedFromTE","globalRelayCustomerType_title","globalRelayCustomerType_description","globalRelaySMTPUsername_title","globalRelaySMTPUsername_description","globalRelaySMTPPassword_title","globalRelaySMTPPassword_description","globalRelayEmailAddress_title","globalRelayEmailAddress_description","complianceExportTitle","complianceExportDesc","exportJobStartTime_title","exportJobStartTime_description","exportFormat_title","exportFormat_description_intro","exportFormat_description_details","EnableExport","enableComplianceExport","ExportFormat","exportFormat","DailyRunTime","exportJobStartTime","GlobalRelaySettings","CustomerType","globalRelayCustomerType","SMTPUsername","globalRelaySMTPUsername","SMTPPassword","globalRelaySMTPPassword","EmailAddress","globalRelayEmailAddress","CustomSMTPServerName","globalRelayCustomSMTPServerName","CustomSMTPPort","globalRelayCustomSMTPPort","SMTPServerTimeout","globalRelaySMTPServerTimeout","warning_count","progress_message","exportFormatOptions","EXPORT_FORMAT_ACTIANCE","EXPORT_FORMAT_CSV","globalRelaySettings","globalRelayEmail","globalRelaySMTPServerName","globalRelaySMTPPort","dropdownHelpText","COMPILANCE_EXPORT","getJobDetails","OpenIdConvert","Office365Settings","DirectoryId","DiscoveryEndpoint","GoogleSettings","GitLabSettings","UserAPIEndpoint","Scope","OPENID_SCOPES","AuthEndpoint","TokenEndpoint","imagePath","upgradeConfig","CheckboxSetting","passwordMinLength","password","minimumLength","minimumLengthDescription","lowercase","symbol","preview","attemptTitle","attemptDescription","passwordRequirements","max","getPasswordErrorsMessage","passwordErrors","getScheme","schemeId","bindClientFunc","clientFunc","onSuccess","SchemeTypes","RECEIVED_SCHEME","getSchemes","scope","PAGE_SIZE_DEFAULT","RECEIVED_SCHEMES","createScheme","scheme","CREATED_SCHEME","deleteScheme","DELETED_SCHEME","patchScheme","PATCHED_SCHEME","getSchemeTeams","RECEIVED_SCHEME_TEAMS","schemes","makeGetSchemeTeams","allTeams","log","schemeTeams","AdminPanelWithLink","linkText","PermissionsSchemeSummary","schemeName","confirmButton","deleting","showConfirmModal","handleDeleteConfirmed","handleDeleteCanceled","_this$props$actions","extraTeams","_this$props$teams$sli","_this$props$teams","goToEdit","delete","teamOverrideSchemesNoSchemes","loadMoreSchemes","introBanner","systemSchemeBannerTitle","systemSchemeBannerText","systemSchemeBannerButton","teamOverrideSchemesTitle","teamOverrideSchemesBannerText","teamOverrideSchemesNewButton","PermissionSchemesSettings","loadingMore","loadSchemes","loadSchemeTeams","phase2MigrationIsComplete","jobsAreEnabled","clusterIsEnabled","teamOverrideUnavalableView","hasCustomSchemes","CustomPermissionsSchemes","Professional","teamOverrideView","teamOverrideSchemesMigrationView","ONBOARD_ADVANCED_PERMISSIONS","renderTeamOverrideSchemes","status_code","RunJobs","EnableCluster","AccordionToggleIcon","AdminPanelTogglable","open","EditPostTimeLimitButton","timeLimit","UNSET_POST_EDIT_TIME_LIMIT","PostEditTimeLimit","INT32_MAX","EditPostTimeLimitModal","ServiceSettings","setSaving","setErrorMessage","postEditTimeLimit","setPostEditTimeLimit","alwaysAllowPostEditing","setAlwaysAllowPostEditing","handleOptionChange","ALLOW_EDIT_POST_ALWAYS","ALLOW_EDIT_POST_TIME_LIMIT","step","CheckboxPartialIcon","PermissionCheckbox","extraClass","rolesRolesStrings","all_users","channel_admin","channel_user","system_admin","system_user","team_admin","team_user","selectRow","additionalValues","inherited","formattedName","showTooltip","_parent$parentElement","parent","parentElement","isInheritLink","permissionRolesStrings","assign_system_admin_role","convert_public_channel_to_private","convert_private_channel_to_public","create_direct_channel","create_group_channel","create_post","create_private_channel","create_public_channel","create_team","create_user_access_token","delete_others_posts","delete_post","delete_private_channel","delete_public_channel","edit_other_users","edit_post","import_team","list_team_channels","list_users_without_team","manage_channel_roles","create_emojis","delete_emojis","delete_others_emojis","manage_jobs","manage_oauth","manage_private_channel_properties","manage_public_channel_properties","manage_roles","manage_slash_commands","manage_system","manage_team","manage_team_roles","manage_incoming_webhooks","manage_outgoing_webhooks","permanent_delete_user","read_channel","read_user_access_token","remove_user_from_team","revoke_user_access_token","upload_file","use_channel_mentions","use_group_mentions","view_team","edit_others_posts","invite_guest","manage_shared_channels","manage_secure_connections","playbook_public_create","playbook_public_manage_properties","playbook_public_manage_members","playbook_public_make_private","playbook_private_create","playbook_private_manage_properties","playbook_private_manage_members","playbook_private_make_public","run_create","create_custom_group","manage_custom_group_members","delete_custom_group","restore_custom_group","edit_custom_group","manage_outgoing_oauth_connections","PermissionRow","uniqId","toggleSelect","PermissionDescription","groupRolesStrings","delete_posts","integrations","posts","private_channel","public_channel","reactions","send_invites","edit_posts","teams_team_scope","guest_reactions","guest_create_post","guest_create_private_channel","guest_delete_post","guest_edit_post","guest_use_channel_mentions","guest_use_group_mentions","manage_private_channel_members_and_read_groups","manage_public_channel_members_and_read_groups","playbook_public","playbook_private","runs","custom_groups","manage_public_channel_bookmarks","manage_private_channel_bookmarks","getRecursivePermissions","PermissionGroup","ids","getStatus","permissionsToToggle","fromParent","prevPermissions","_role$permissions","PermissionsScope","_this$props$role","_this$props$role$perm","isInScope","comesFromParent","parentRole","toggleSelectRow","toggleSelectSubGroup","combined","root","_this$props$parentRol","anyChecked","anyUnchecked","_this$props$role2","_this$props$role2$per","_this$props$role3","_this$props$role3$per","allPermissionsFromParent","hasPermissionsOnScope","permissionsRows","addVals","renderPermission","renderGroup","classes","additionalValuesProp","toggleSelectGroup","toggleExpanded","GuestPermissionsTree","editTimeLimitModalIsVisible","setEditTimeLimitModalIsVisible","setPermissions","defaultPermissions","CREATE_PRIVATE_CHANNEL","EDIT_POST","DELETE_POST","CREATE_POST","UPLOAD_FILE","ADD_REACTION","REMOVE_REACTION","USE_CHANNEL_MENTIONS","LDAPGroups","USE_GROUP_MENTIONS","openPostTimeLimitModal","closePostTimeLimitModal","toggleGroup","ADDITIONAL_VALUES","editTimeLimitButton","GUEST_INCLUDED_PERMISSIONS","READ_CHANNEL","PermissionsTree","teamsGroup","publicChannelsGroup","privateChannelsGroup","postsGroup","integrationsGroup","sharedChannelsGroup","customGroupsGroup","EnableIncomingWebhooks","EnableOutgoingWebhooks","EnableOAuthServiceProvider","EnableOutgoingOAuthConnections","MANAGE_OUTGOING_OAUTH_CONNECTIONS","EnableCommands","EnableCustomEmoji","CREATE_EMOJIS","DELETE_EMOJIS","DELETE_OTHERS_EMOJIS","EnableGuestAccounts","INVITE_GUEST","ExperimentalSharedChannels","MANAGE_SHARED_CHANNELS","MANAGE_SECURE_CONNECTIONS","customGroupsEnabled","pop","GeneralConstants","TEAM_ADMIN_ROLE","SYSTEM_ADMIN_ROLE","CONVERT_PRIVATE_CHANNEL_TO_PUBLIC","ADD_BOOKMARK_PUBLIC_CHANNEL","EDIT_BOOKMARK_PUBLIC_CHANNEL","DELETE_BOOKMARK_PUBLIC_CHANNEL","ORDER_BOOKMARK_PUBLIC_CHANNEL","ADD_BOOKMARK_PRIVATE_CHANNEL","EDIT_BOOKMARK_PRIVATE_CHANNEL","DELETE_BOOKMARK_PRIVATE_CHANNEL","ORDER_BOOKMARK_PRIVATE_CHANNEL","isVisible","INVITE_USER","GET_PUBLIC_LINK","ADD_USER_TO_TEAM","CREATE_PUBLIC_CHANNEL","MANAGE_PUBLIC_CHANNEL_PROPERTIES","MANAGE_PUBLIC_CHANNEL_MEMBERS","READ_PUBLIC_CHANNEL_GROUPS","DELETE_PUBLIC_CHANNEL","CONVERT_PUBLIC_CHANNEL_TO_PRIVATE","MANAGE_PRIVATE_CHANNEL_PROPERTIES","MANAGE_PRIVATE_CHANNEL_MEMBERS","READ_PRIVATE_CHANNEL_GROUPS","DELETE_PRIVATE_CHANNEL","PLAYBOOK_PUBLIC_CREATE","PLAYBOOK_PUBLIC_MANAGE_PROPERTIES","PLAYBOOK_PUBLIC_MANAGE_MEMBERS","isNonEnterpriseLicense","PLAYBOOK_PUBLIC_MAKE_PRIVATE","isEnterpriseLicense","PLAYBOOK_PRIVATE_CREATE","PLAYBOOK_PRIVATE_MANAGE_PROPERTIES","PLAYBOOK_PRIVATE_MANAGE_MEMBERS","PLAYBOOK_PRIVATE_MAKE_PUBLIC","RUN_CREATE","DELETE_OTHERS_POSTS","CREATE_CUSTOM_GROUP","MANAGE_CUSTOM_GROUP_MEMBERS","EDIT_CUSTOM_GROUP","DELETE_CUSTOM_GROUP","RESTORE_CUSTOM_GROUP","updateGroups","EXCLUDED_PERMISSIONS","VIEW_MEMBERS","JOIN_PUBLIC_TEAMS","LIST_PUBLIC_TEAMS","JOIN_PRIVATE_TEAMS","LIST_PRIVATE_TEAMS","PLAYBOOK_PUBLIC_VIEW","PLAYBOOK_PRIVATE_VIEW","isCustomGroupsEnabled","PermissionsTreePlaybooks","_props$role2","filteredGroups","_props$role","PermissionSystemSchemeSettings","querySelector","openRoles","scrollIntoView","behavior","block","toggleRole","selectedPermission","goToSelectedRow","_role$permissions2","_role$permissions3","_role$permissions4","_role$permissions5","playbook_member","run_member","_role$permissions6","_role$permissions7","_role$permissions8","system_guest","team_guest","channel_guest","_roles$system_user$pe","_roles$team_user$perm","_roles$channel_user$p","_roles$playbook_membe","_roles$system_guest$p","_roles$team_guest$per","_roles$channel_guest$","teamAdminPromise","channelAdminPromise","playbookAdminPromise","playbook_admin","derivedRoles","restoreExcludedPermissions","deriveRolesFromAllUsers","haveGuestAccountsPermissions","guestRoles","restoreGuestPermissions","deriveRolesFromGuests","guests","systemGuestPromise","teamGuestPromise","channelGuestPromise","roleId","newOpenRoles","newPermissions","channelAdminRole","channelAdminPermissions","teamAdminRole","teamAdminPermissions","ModeratedPermissions","newRolesState","DefaultRolePermissions","GuestAccountsPermissions","_this$props$license","loaded","togglePermission","showResetDefaultModal","resetDefaults","run_admin","urlParams","URLSearchParams","rolesNeeded","SYSTEM_USER_ROLE","TEAM_USER_ROLE","CHANNEL_ADMIN_ROLE","CHANNEL_USER_ROLE","PLAYBOOK_ADMIN_ROLE","PLAYBOOK_MEMBER_ROLE","RUN_ADMIN_ROLE","RUN_MEMBER_ROLE","SYSTEM_GUEST_ROLE","TEAM_GUEST_ROLE","CHANNEL_GUEST_ROLE","loadRolesIfNeeded","loadRolesIntoState","UNSAFE_componentWillReceiveProps","nextProps","_props$roles$system_u","_props$roles$system_g","AdminPanelWithButton","onButtonClick","buttonId","TeamInList","onRemoveTeam","handleRemoveTeam","getTeamStats","loadTeamStats","PermissionTeamSchemeSettings","default_team_guest_role","default_team_user_role","default_team_admin_role","default_channel_guest_role","default_channel_user_role","default_channel_admin_role","default_playbook_admin_role","default_playbook_member_role","default_run_member_role","_teamUser","_channelUser","_playbookMember","_runMember","_teamGuest","_channelGuest","teamGuest","teamUser","channelGuest","channelUser","playbookAdmin","playbookMember","runMember","isLoaded","baseTeam","baseChannel","basePlaybookMember","baseRunMember","schemeDescription","getStateRoles","allUsers","derived","derivedGuests","newScheme","teamUserPromise","channelUserPromise","currentTeams","serverTeams","addedTeams","updateTeamScheme","_filter","linkOverrideTeam","linkSystemScheme","handleNameChange","LocalizedPlaceholderTextarea","handleDescriptionChange","loadScheme","rowIdFromQuery","PUSH_NOTIFICATIONS_OFF","PUSH_NOTIFICATIONS_MHPNS","PUSH_NOTIFICATIONS_MTPNS","PUSH_NOTIFICATIONS_CUSTOM","PUSH_NOTIFICATIONS_LOCATION_US","PUSH_NOTIFICATIONS_LOCATION_DE","PUSH_NOTIFICATIONS_SERVER_DIC","MHPNS_US","MHPNS_DE","DROPDOWN_ID_SERVER_TYPE","DROPDOWN_ID_SERVER_LOCATION","pushNotificationServer","pushTitle","pushServerTitle","pushNotificationServerType","agree","pushNotificationServerLocation","MTPNS","EmailSettings","SendPushNotifications","PushNotificationServer","TeamSettings","MaxNotificationsPerChannel","maxNotificationsPerChannel","pushNotificationServerTypes","MHPNS","tosCheckbox","locationDropdown","sendHelpText","pushServerHelpText","SETUP_PUSH_NOTIFICATIONS","linkIOS","linkAndroid","linkHPNS","handleAgreeChange","linkTerms","pushNotificationServerLocations","handleDropdownChange","isPushNotificationServerSetByEnv","remoteRow","remote","_team$display_name","useTeamOptions","getActiveTeamsList","teamsById","getEditLocation","rc","pathname","remote_id","isConfirmed","site_url","isPendingState","isErrorState","SectionHeading","FormFieldLabel","SectionHeader","attrs","$borderless","css","SectionContent","$compact","ModalBody","AdminSection","PlaceholderHeading","PlaceholderParagraph","ModalParagraph","PlaceholderContainer","AdminWrapper","InnerLabel","HelpText","FormField","ModalFieldsetWrapper","ModalLegend","ModalFieldset","ModalNoticeWrapper","Button","LinkButton","$destructive","ConnectionStatusLabel","_ref5","tagName","PendingConnectionLabel","Interval","before","DateTime","fromMillis","last_ping_at","isConnected","ConnectedLabel","OfflineConnectionLabel","timestamp","Timestamp","ranges","LASTSYNC_TOOLTIP_RANGES","UrlWrapper","RelativeRanges","labelStyle","TeamSelector","teamValues","teamA","teamB","noop","SecureConnectionAcceptInviteModal","setDisplayName","defaultTeamId","setDefaultTeamId","inviteCode","setInviteCode","setPassword","need","formFilled","default_team_id","invite","isConfirmDisabled","handleCancel","handleEnterKeyPress","modalHeaderText","bodyOverflowVisible","autoCloseOnConfirmButton","errorText","containerClassName","creating","SecureConnectionCreateInviteModal","copiedRecently","inviteCopied","copyInvite","useCopyText","passwordCopied","copyPassword","done","share","notice","SectionNotice","backdrop","addon","copied","ContentCopyIcon","copymsg","CheckIcon","SecureConnectionDeleteModal","chunk","isDeleteModal","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","enumerable","apply","getOwnPropertyDescriptors","defineProperties","defineProperty","Symbol","toPrimitive","TypeError","_toPrimitive","_toPropertyKey","configurable","writable","SharedChannelsAddModal","close","remoteId","remotesByChannelId","remotes","setRemotes","setLoadingState","getSharedChannelRemotes","include_unconfirmed","useSharedChannelRemotes","query","setQuery","setChannelsInner","setErrors","setDone","setChannels","nextChannels","errs","nextErrs","useLatest","signal","exclude_remote","delay","TYPING_DELAY_MS","bodyPadding","ChannelsInput","channel_name","DEFAULT_CHANNEL_UI_NAME","channelsLoader","autoFocus","formatOptionLabel","ChannelLabel","SecondaryTextRight","ChannelError","getChannel","channelLabel","bold","ChannelLabelWrapper","ChannelDisplayName","ChannelIcon","_ref6","hasOwnProperty","_objectWithoutPropertiesLoose","propertyIsEnumerable","Icon","ArchiveOutlineIcon","func","deps","start","controller","AbortController","cancel","abort","DOMException","args","currentRequest","resolve","reject","SharedChannelsRemoveModal","SecureConnectionRow","remoteCluster","titleId","RowLink","Detail","RowMenu","onDeleteSuccess","menuId","useHistory","promptDelete","SECURE_CONNECTION_DELETE","deleteRemoteCluster","useRemoteClusterDelete","promptCreateInvite","SECURE_CONNECTION_CREATE_INVITE","getRandomValues","Uint32Array","chars","generateInviteRemoteCluster","useRemoteClusterCreateInvite","menuButton","class","DotsHorizontalIcon","connection","leadingElement","CodeTagsIcon","handleCreateInvite","handleEdit","isDestructive","Placeholder","serviceNotRunning","BuildingSvg","placeholderTitle","placeholderSubtitle","AddMenu","buttonClassNames","promptAcceptInvite","useRemoteClusterAcceptInvite","SECURE_CONNECTION_ACCEPT_INVITE","acceptInviteRemoteCluster","acceptInvite","cleanUpUrlable","addConnection","menuAriaLabel","createConnection","handleCreate","acceptInvitation","pageTitle","Pagination","onPreviousPageClick","disablePrevPage","isLoading","onNextPageClick","disableNextPage","SORTABLE_CLASS","PINNED_CLASS","PAGE_SIZES","PageSizes","LoadingStates","ListTable","tableMeta","table","meta","headerIdPrefix","tableId","rowIdPrefix","cellIdPrefix","hasPagination","disablePaginationControls","pageSizeOptions","selectedPageSize","pagination","handleRowClick","rowOriginalId","colCount","getAllColumns","rowCount","getRowModel","hasDualSidedPagination","paginationInfo","Loading","tableCaption","getHeaderGroups","headerGroup","headers","getAriaSortForTableHeader","getCanSort","getIsSorted","getCanPin","getToggleSortingHandler","isPlaceholder","flexRender","columnDef","original","getVisibleCells","cell","getIsPlaceholder","Loaded","emptyDataMessage","getFooterGroups","footerGroup","menuPlacement","selectedOption","setPageSize","canSort","sortDirection","ElapsedDurationCell","todaysDate","startOf","valueOf","elapsedDays","exactPassedInDate","startOfTodayMoment","passedInDateMoment","startOfPassedInDateMoment","elapsedDaysText","SecureConnectionDetail","_remoteCluster$displa","_remoteCluster$defaul","connection_id","useParams","isCreating","_useLocation","useLocation","initRemoteCluster","applyPatch","save","currentRemoteCluster","hasChanges","patch","useRemoteClusterEdit","editing","setCurrentRemoteCluster","setPatch","getRemoteCluster","isRemoteClusterPatch","patchRemoteCluster","isFormValid","promptCreate","useRemoteClusterCreate","createRemoteCluster","remote_cluster","SharedChannelRemotes","_props$rc","setFilter","useSharedChannelRemoteRows","sharedChannelRemotes","setSharedChannelRemotes","collected","missing","exclude_home","getMyChannelsOnce","getAllTeamsChannels","ChannelTypes","RECEIVED_ALL_CHANNELS","firstNotFound","_getChannel","_getMyChannelsOnce","allSettled","fetchChannel","promptAdd","SHARED_CHANNEL_REMOTE_INVITE","sharedChannelRemoteInvite","reason","useSharedChannelsAdd","showTabs","handleChangeTab","tabKey","SharedChannelRemotesTable","AddChannelsButton","PlusIcon","TabsWrapper","Tabs","defaultActiveKey","activeKey","onSelect","unmountOnExit","Tab","eventKey","ChatSvg","channelId","ChannelIconWrapper","ChannelName","TeamName","createColumnHelper","accessor","getValue","enableHiding","enableSorting","RemoteActions","useReactTable","initialState","sorting","getCoreRowModel","getSortedRowModel","enableSortingRemoval","enableMultiSort","renderFallbackValue","manualPagination","TableWrapper","AdminConsoleListTable","promptRemove","SHARED_CHANNEL_REMOTE_UNINVITE","sharedChannelRemoteUninvite","useSharedChannelsRemove","RemoteActionsRoot","FullLogEventModal","navigator","clipboard","writeText","showCopySuccess","copySuccess","copyLog","renderContents","LogList","onSearchChange","_this$props$logs$leng","_this$props$logs","logs","dateAsc","handleDateSort","ArrowUpIcon","ArrowDownIcon","timeA","timeB","level","caller","showFullLogEvent","modalLog","modalOpen","levelValues","levels","logLevels","onFiltersChange","errorsButton","showErrors","getErrorCount","warn","debug","hideModal","PlainLogList","nextDisabled","logPanel","scrollTop","nextButton","previousButton","fontFamily","tabIndex","bannerDesc","Logs","loadingLogs","getLogs","serverNames","dateFrom","dateTo","loadingPlain","getPlainLogs","performSearch","filteredLogs","worker","isPlainLogs","reloadPlain","getUrl","plainLogs","_config$LogSettings","LogSettings","FileJson","webSessionHoursDesc_extendLength","mobileSessionHoursDesc_extendLength","ssoSessionHoursDesc_extendLength","webSessionHoursDesc","mobileSessionHoursDesc","ssoSessionHoursDesc","sessionIdleTimeout","extendSessionLengthActivity_label","extendSessionLengthActivity_helpText","terminateSessionsOnPasswordChange_label","terminateSessionsOnPasswordChange_helpText","webSessionHours","mobileSessionHours","ssoSessionHours","sessionCache","sessionCacheDesc","sessionHoursEx","sessionIdleTimeoutDesc","FieldInput","$deleted","$strong","DangerText","FieldDeleteButton","RemoveUserPropertyFieldModal","BatchProcessingError","useOperation","op","initialStatus","setStatus","useOperationStatus","doOp","ValidationWarningNameRequired","ValidationWarningNameUnique","ValidationWarningNameTaken","getIncrementedName","desiredName","collection","newName","isCreatePending","isDeletePending","newPendingField","generateId","update_at","UserPropertiesTable","updateField","deleteField","collectionToArray","ColHeaderLeft","_collection$warnings","_collection$warnings$","toDelete","warningId","warnings","EditableValue","borderless","MAX_CUSTOM_ATTRIBUTE_NAME_LENGTH","TextBoxOutlineIcon","TypeCellWrapper","ColHeaderRight","Actions","useUserPropertyFieldDelete","USER_PROPERTY_FIELD_DELETE","ActionsRoot","_props$disabled","select","SystemProperties","userProperties","useUserPropertiesTable","userPropertyFields","readIO","pendingIO","itemOps","useUserPropertyFields","fieldCollection","ops","initial","_ops$opts$forceInitia","_ops$opts","forceInitialGet","_ops$select","setData","useThing","getCustomProfileAttributeFields","collectionFromArray","pendingCollection","pending","setPending","doCommit","commit","currentPending","next","beforeUpdate","reset","usePendingThing","prevCollection","process","create","edit","deleteCustomProfileAttributeField","Reflect","deleteProperty","orderId","pendingItem","patchCustomProfileAttributeField","nextItem","createCustomProfileAttributeField","newItem","cause","byNamesLower","groupBy","pendingByName","currentByName","_pendingByName$field$","_pendingByName$field$2","_currentByName$field$","_currentByName$field$2","_currentByName$field$3","_currentByName$field$4","_currentByName$field$5","collectionReplaceItem","collectionAddItem","collectionRemoveItem","nonDeletedCount","f","MAX_CUSTOM_ATTRIBUTES","newData","saveError","rolesStrings","system_user_manager","system_manager","system_read_only_admin","system_custom_group_admin","SystemRoles","sectionStrings","about","about_edition_and_license","reporting","reporting_site_statistics","reporting_team_statistics","reporting_server_logs","user_management","user_management_users","user_management_groups","user_management_teams","user_management_channels","user_management_permissions","user_management_system_roles","environment","environment_web_server","environment_database","environment_elasticsearch","environment_file_storage","environment_image_proxy","environment_smtp","environment_push_notification_server","environment_high_availability","environment_rate_limiting","environment_logging","environment_session_lengths","environment_performance_monitoring","environment_developer","site","site_customization","site_localization","site_users_and_teams","site_notifications","site_announcement_banner","site_emoji","site_posts","site_file_sharing_and_downloads","site_public_links","site_notices","authentication","authentication_signup","authentication_email","authentication_password","authentication_mfa","authentication_ldap","authentication_saml","authentication_openid","authentication_guest_access","integrations_integration_management","integrations_bot_accounts","integrations_gif","integrations_cors","compliance","compliance_data_retention_policy","compliance_compliance_export","compliance_compliance_monitoring","compliance_custom_terms_of_service","experimental","experimental_features","experimental_feature_flags","experimental_bleve","readAccess","writeAccess","noAccess","mixedAccess","SystemRolePermissionDropdown","subsections","updatePermissions","canWriteLabel","canWriteDescription","canReadLabel","canReadDescription","noAccessLabel","mixedAccessLabel","noAccessDescription","currentAccess","access","DropdownIcon","updatePermission","SystemRolePermission","visibleSections","permissionsMap","permissionsToUpdate","getAccessForSection","isSectionVisible","chevron","subsectionsCount","setSectionVisible","subsection","renderSectionRow","hasDescription","renderSubsectionToggle","hasNoAccess","canRead","canWrite","getAccessForSectionByName","sectionName","MANAGE_SYSTEM","renderSubsections","sectionsList","SECTIONS_BY_ROLES","PERMISSIONS_SYSTEM_USER_MANAGER","getPermissionsMap","memoizeResult","getSectionsListForRole","sectionsByRole","SystemRolePermissions","sectionIndex","findIndex","visible","isLicensedForCloud","editedSectionsByRole","PERMISSIONS_SYSTEM_CUSTOM_GROUP_ADMIN","permissionsToShow","permissionShortName","removeSection","ProfilePicture","UserGridRemove","removeUser","AddUsersToRoleModal","getProfiles","USERS_PER_PAGE","setUsersLoadingState","searchResults","searchProfiles","is_bot","displayEntireNameForUser","BotTag","isGuest","GuestTag","_value$data","needMoreUsers","usersToDisplay","excludeUsers","hasUser","includeUsers","profilesList","filteredProfilesList","filterProfilesStartingWithTerm","filterProfiles","profileListToMap","searchUsersToAdd","ariaLabelRenderer","renderAriaLabel","exclude_roles","exclude_bots","selectProfiles","SystemRoleUsers","usersToRemove","usersToAdd","setUserGridSearch","UserGridName","new","ToggleModalButton","ADD_USER_TO_ROLE","_state$views$search$u","userGridSearch","searchProfilesStartingWithTerm","makeSearchProfilesStartingWithTerm","SystemRole","nextState","updatedRolePermissions","getSaveStateNeeded","updateUserRoles","PERMISSIONS_SYSTEM_ADMIN","rolePermissionsWithAncillaryPermssions","getAncillaryPermissions","newRole","isError","userIdsToRemove","removeUserPromises","uniq","resultWithError","userIdsToAdd","addUserPromises","saveKey","updatedPermissions","perm","readPermission","writePermission","addUsersToRole","removeUserFromRole","getRolesById","role_id","AdminUserCard","Bullet","nickname","ResetPasswordModal","_this$props$onSuccess","currentPassword","currentPasswordRef","errorMsg","serverErrorCurrentPass","passwordRef","isValidPassword","passwordConfig","serverErrorNewPass","updateUserPassword","urlClass","auth_service","newPasswordFocus","currentUserId","urlClassCurrentPass","doCancel","requireLowercase","requireNumber","requireSymbol","requireUppercase","getPasswordConfig","AbstractList","getTeamsData","onPageChangedCallback","getPaging","headerLabels","headerLabel","pageStart","pageEnd","renderRow","renderHeaderLabels","EllipsisHorizontalIcon","removeGroup","TeamListDropdown","doRemoveUserFromTeam","doMakeUserTeamAdmin","doMakeUserTeamMember","isAdmin","isMember","scheme_user","scheme_guest","showMakeTeamAdmin","showMakeTeamMember","makeTeamAdminOnClick","makeTeamMemberOnClick","removeUserTeamOnClick","TeamRow","allow_open_invite","teamIconUrl","renderTeamType","renderTeamRole","minWidth","marginLeft","memberships","getTeamMembersForUser","mergeTeamsWithMemberships","teamsWithMemberships","userDetailCallback","object","filterAndSortTeamsByDisplayName","removeUserFromTeam","getTeamsAndMemberships","updateTeamMemberSchemeRoles","refreshTeams","getTeamsForUser","ConfirmManageUserSettingsModal","userDisplayName","getDisplayName","br","ConfirmModalRedux","AtIcon","EmailIcon","ShieldOutlineIcon","SystemUserDetail","getUser","emailField","addUserToTeam","finally","_this$state$user","LDAP_SERVICE","updateUserActive","toggleCloseModalDeactivateMember","updateUserMfa","didEmailChanged","isSaveNeeded","isSaving","isEmail","updatedUser","patchUser","_this$state$user2","showDeactivateMemberModal","RESET_PASSWORD_MODAL","showResetPasswordModal","showTeamSelectorModal","CONFIRM_MANAGE_USER_SETTINGS_MODAL","openUserSettingsModal","USER_SETTINGS","UserSettingsModal","adminMode","isContentProductSettings","userID","_this$state$user3","_this$props$match$par","_this$state$user$posi","_this$state$user4","_this$state2","_this$state2$user","_this$state$user5","_this$state$user6","_this$state$user7","_this$state$user8","_this$state$user9","_this$state$user10","_this$state$user$user","_this$state$user11","_this$state$user$user2","_this$state$user12","_this$state$user13","_this$state$user14","position","handleEmailChange","SheidOutlineIcon","getUserAuthenticationTextField","mfaEnabled","toggleOpenModalResetPassword","mfa_active","handleRemoveMFA","handleActivateUser","getManagedByLdapText","toggleOpenModalDeactivateMember","showManageUserSettings","openConfirmEditUserSettingsModal","showLockedManageUserSettings","toggleOpenTeamSelectorModal","handleTeamsLoaded","EMAIL_SERVICE","handleDeactivateMember","toggleCloseTeamSelectorModal","handleAddUserToTeams","authenticationTextField","service","SAML_SERVICE","OFFICE365_SERVICE","getUserPreferences","getShowManageUserSettings","getShowLockedManageUserSettings","EnableMultifactorAuthentication","ColumnNames","StatusFilter","RoleFilters","TeamFilters","RevokeSessionsButton","showModal","setShowModal","handleModalToggle","SystemPermissionGate","REVOKE_USER_ACCESS_TOKEN","revokeSessionsForAllUsers","emitUserLoggedOutEvent","SystemUsersColumnTogglerMenu","getColumnName","columnId","createAt","lastLoginAt","lastStatusAt","lastPostDate","daysActive","as","selectedCount","visibleColumnsLength","inputSuffix","allColumns","getIsVisible","postStatsColumns","isMySql","trailingElements","getToggleVisibilityHandler","getCanHide","get30DaysBack","prev","setDate","getDate","get6MonthsBack","setMonth","getMonth","getBeginningOfLastMonth","beginningOfMonth","getEndOfLastMonth","endOfMonth","SystemUsersDateRangeMenu","updateDateRange","dateRange","ReportDuration","Last30Days","PreviousMonth","Last6Months","AllTime","startDate","ExportErrorModal","isInProgress","ExportUserDataModal","_tableFilterProps$dat","tableFilterProps","getAdminConsoleUserManagementTableProperties","filterRole","filterStatus","filterTeam","exportDataButton","checkboxText","showCheckbox","checkboxInFooter","UpgradeExportDataModal","convertTableOptionsToUserReportOptions","tableOptions","page_size","from_column_value","fromColumnValue","from_id","fromId","direction","sortColumn","UserReportSortColumns","sort_column","getSortColumnForOptions","ReportSortDirection","descending","ascending","sort_direction","getSortDirectionForOptions","sortIsDescending","search_term","getSearchFilterOption","AllTeams","NoTeams","team_filter","has_no_team","Active","hide_inactive","Deactivated","hide_active","Any","role_filter","date_range","getSortableColumnValueBySortColumn","getPaginationInfo","pageIndex","currentLength","totalItems","getDefaultSelectedValueFromList","SystemUsersExport","skipDialog","CATEGORY_REPORTING","HIDE_BATCH_EXPORT_CONFIRM_MODAL","tableOptionsToUserReport","doExport","EXPORT_ERROR_MODAL","usersLenght","EXPORT_USER_DATA_MODAL","UPGRADE_EXPORT_DATA_MODAL","StyledPopoverContainer","SystemUsersFiltersStatus","initialValue","SystemUsersFilterRole","Admin","Member","Guest","SystemUsersFilterTeam","initialLabel","initialOptions","InputError","SystemUsersFilterPopover","isPopoverOpen","setPopoverOpen","filterState","setFilterState","context","floatingContext","refs","floatingRefs","floatingStyles","useFloating","onOpenChange","whileElementsMounted","autoUpdate","middleware","offset","autoPlacement","allowedPlacements","isMounted","floatingTransistionStyles","useTransitionStyles","floatingContextClick","useClick","floatingContextDismiss","useDismiss","floatingContextRole","useRole","getReferenceProps","getFloatingProps","useInteractions","filtersCount","setReference","FloatingFocusManager","setFloating","filterTeamLabel","teamFilter","teamFilterLabel","roleFilter","statusFilter","getStateFromProps","hasPostAllRole","UserUtils","hasPostAllPublicRole","hasUserAccessTokenRole","isSystemAdmin","ManageRolesModal","oldRoles","SYSTEM_USER_ACCESS_TOKEN_ROLE","SYSTEM_POST_ALL_ROLE","SYSTEM_POST_ALL_PUBLIC_ROLE","trackRoleChanges","isSuccess","handleError","additionalRoles","userAccessTokenContent","PERSONAL_ACCESS_TOKENS","handlePostAllChange","handlePostAllPublicChange","userAccessTokensEnabled","handleUserAccessTokenChange","handleSystemAdminChange","_prevState$user","_nextProps$user","EnableUserAccessTokens","ManageTeamsDropdown","isTeamAdmin","teamMember","isSysAdmin","isGuestUser","onError","onMemberChange","removeFromTeam","handleRemoveUserFromTeam","RemoveFromTeamButton","ManageTeamsModal","setTeams","teamMembers","setTeamMembers","setShow","loadTeamsAndTeamMembers","getTeamMembers","handleMemberRemove","handleMemberChange","teamList","systemAdminIndicator","RevokeTokenButton","revokeUserAccessToken","tokenId","ManageTokensModal","userAccessTokens","tokenList","userAccessTokensList","token","linkAuthentication","linkPersonalAccessTokens","getUserAccessTokensForUser","userAccessTokensByUser","ResetEmailModal","emailRef","isEmailError","isCurrentPasswordError","_this$props$user","isEmailValid","isCurrentPasswordValid","_this$props$user2","groupClass","CreateGroupSyncablesMembershipsModal","createGroupMembershipsButton","cancelGroupMembershipsButton","cancelButtonText","createGroupTeamsAndChannels","DeactivateMemberModal","_config$ServiceSettin","_config$ServiceSettin2","bots","getExternalBotAccounts","SiteURL","confirmationMessage","messageForUsersWithBotAccounts","DisableBotsWhenOwnerIsDeactivated","bot","linkBots","linkDocumentation","deactivateMemberButton","DemoteToGuestModal","demoteGuestButton","demoteUserToGuest","PromoteToMemberModal","promoteUserButton","promoteGuestToUser","RevokeSessionsModal","currentUser","revokeUserButtonButton","revokeAllSessionsForUser","SystemUsersListAction","_useSelector","_config$ServiceSettin3","_config$GuestAccounts","_config$SamlSettings","rowIndex","updateUser","haveSysConsoleWriteUserManagementUsersPermissions","haveISystemPermission","menuButtonId","menuItemIdPrefix","disableEditingOtherUsers","handleManageRolesClick","MANAGE_ROLES_MODAL","handleManageTeamsClick","MANAGE_TEAMS_MODAL","handleManageUserSettingsClick","handleManageTokensClick","MANAGE_TOKENS_MODAL","handleResetPasswordClick","handleRemoveMfaClick","adminResetMfa","handleSwitchToEmailPasswordClick","handleUpdateEmailClick","RESET_EMAIL_MODAL","handlePromoteToMemberClick","PROMOTE_TO_MEMBER_MODAL","handleDemoteToGuestClick","DEMOTE_TO_GUEST_MODAL","handleRemoveSessionsClick","REVOKE_SESSIONS_MODAL","handleReSyncUserViaLdapGroupsClick","CREATE_GROUP_SYNCABLES_MEMBERSHIP_MODAL","handleActivateUserClick","handleDeactivateMemberClick","DEACTIVATE_MEMBER_MODAL","getMilliseconds","disableActivationToggle","getManagedByLDAPText","managedByLDAP","userRoles","ExperimentalEnableAuthenticationTransfer","GuestAccountsSettings","SamlSettings","EnableSyncWithLdap","SystemUsersSearch","timeout","setInputValue","inputPrefix","onClear","siteName","mapStateToProps","_tableProperties$sort","_tableProperties$sort2","_tableProperties$page","_tableProperties$page2","_tableProperties$curs","_tableProperties$curs2","_tableProperties$curs3","_tableProperties$colu","_tableProperties$sear","_tableProperties$filt","_tableProperties$filt2","_tableProperties$filt3","_tableProperties$filt4","_tableProperties$date","SiteName","enableUserAccessTokens","experimentalEnableAuthenticationTransfer","SQLDriverName","hideMySqlNotification","getPreferences","HIDE_MYSQL_STATS_NOTIFICATION","tableProperties","tablePropertySortColumn","adminConsoleUserManagementTablePropertiesInitialState","tablePropertySortIsDescending","tablePropertyPageSize","tablePropertyPageIndex","tablePropertyCursorDirection","cursorDirection","tablePropertyCursorUserId","cursorUserId","tablePropertyCursorColumnValue","cursorColumnValue","tablePropertyColumnVisibility","columnVisibility","tablePropertySearchTerm","tablePropertyFilterTeam","tablePropertyFilterTeamLabel","tablePropertyFilterRole","tablePropertyFilterStatus","tablePropertyDateRange","_props$tablePropertyS","_props$tablePropertyP","_table$getVisibleLeaf","_table$getVisibleLeaf2","userReports","setUserReports","setUserCount","showMySqlBanner","setShowMySqlBanner","handleDismissMySqlNotice","updateUserReport","updatedReport","getUserCount","fetchUserReportsWithOptions","accessorKey","_info$row$original","_info$row$original$re","isRemoteUser","imageURLForUser","SharedUserIndicator","withTooltip","enablePinning","isNumeric","_info$row$original2","_info$row$original2$r","sortingTableState","paginationTableState","_userReports$find","userReport","CursorPaginationDirection","onPaginationChange","updateFn","updatedPaginationState","onSortingChange","currentSortingState","updatedSortingState","onColumnVisibilityChange","updatedVisibilityState","manualSorting","manualFiltering","formatMessageChunk","getAllLeafColumns","getVisibleLeafColumns","emptyListText","noPadding","manual","isSearching","searchChannelsDebounced","_filters$deleted","searchErrored","include_search_by_id","total_count","sharedChannelIcon","shared","SharedChannelIndicator","management","groupConstrained","exclude_group_constrained","compareByDisplayName","getSortedListOfChannels","getAllChannels","c","List","ChannelsSettings","ChannelsList","MemberListGroup","loadComplete","in_group_id","searchProfilesInGroup","GroupMembersModal","onLoad","setNewGroupRole","GROUP_MEMBERS","displayCurrentRole","displayRoleToBe","GroupList","isModeSync","emptyListModeSync","onGroupRemoved","totalGroups","ChannelGroups","removedGroups","synced","ADD_GROUPS_TO_CHANNEL","UserGridRoleDropdown","makeAdmin","makeMember","membership","handleUpdateMembership","getDropDownOptions","getCurrentRole","localizedRole","getLocalizedRole","getAriaLabel","dropdownEnabled","showMakeAdmin","showMakeMember","handleMakeAdmin","handleMakeUser","UserGrid","membershipsToUpdate","updateMembership","forceUpdate","includeUsersList","numberOfUsersRemoved","newMembership","ChannelMembers","loadProfilesAndReloadChannelMembers","updateRole","systemRoles","channelRoles","channel_roles","setUserGridFilters","in_channel","channelMembers","enableGuestAccounts","CHANNEL_INVITE","ChannelInviteModal","getChannelStats","searchTermModified","searchProfilesAndChannelMembers","in_channel_id","allow_inactive","getUserGridFilters","doGetProfilesInChannel","makeGetProfilesInChannel","doSearchProfilesInChannel","makeSearchProfilesInChannel","getChannelMembersInChannels","_filteredUserStats$to","getAllChannelStats","pinnedpost_count","guest_count","files_count","selectFilteredUsersStats","PERIOD_TO_SLASH_REGEX","MEMBERS_CAN_CREATE_POST_PERMISSION","MEMBERS_CAN_POST_REACTIONS_PERMISSION","MEMBERS_CAN_MANAGE_CHANNEL_MEMBERS_PERMISSION","MEMBERS_CAN_USE_CHANNEL_MENTIONS_PERMISSION","MEMBERS_CAN_MANAGE_CHANNEL_BOOKMARKS_PERMISSION","getChannelModerationRowsMessages","createPostRowMessages","descriptionMembers","disabledGuests","disabledMembers","disabledBoth","postReactionsRowMessages","manageMembersRowMessages","channelMentionsRowMessages","disabledGuestsDueToCreatePosts","disabledMembersDueToCreatePosts","disabledBothDueToCreatePosts","manageBookmarksRowMessages","CHANNEL_MODERATED_PERMISSIONS","CREATE_REACTIONS","MANAGE_MEMBERS","MANAGE_BOOKMARKS","channelModerationHeaderMessages","titleMessage","subtitleMessageForMembersAndGuests","subtitleMessageForMembers","ChannelModerationTableRow","_channelModerationPer5","_channelModerationPer6","_channelModerationPer7","_channelModerationPer8","_channelModerationPer9","_channelModerationPer10","channelModerationPermissionMessages","descriptionId","descriptionDefaultMessage","_channelModerationPer","_channelModerationPer2","_channelModerationPer3","_channelModerationPer4","guestAccountsEnabled","errorMessages","Roles","GUESTS","guestsDisabled","MEMBERS","membersDisabled","ChannelModeration","_entry$roles$guests","_entry$roles$guests2","isGuestsDisabled","isMembersDisabled","disabledKey","disabledKeyId","disabledKeyMessage","createPostsKey","createPostsObject","channelPermissions","_channelModerationPer11","_channelModerationPer12","_channelModerationPer13","_channelModerationPer14","_channelModerationPer15","_channelModerationPer16","_channelModerationPer17","_channelModerationPer18","_channelModerationPer19","_channelModerationPer20","_channelModerationPer21","_channelModerationPer22","_channelModerationPer23","_channelModerationPer24","_channelModerationPer25","schemeLink","teamSchemeID","teamSchemeDisplayName","permissionName","_disabledKeyId","_channelModerationPer26","_channelModerationPer27","publicOrPrivate","isPublic","_channelModerationPer28","_channelModerationPer29","_channelModerationPer30","_channelModerationPer31","scheme_name","scheme_link","onChannelPermissionsChanged","_entry$roles$guests3","_entry$roles$guests4","errorMessagesToDisplay","SyncGroupsToggle","isSynced","groupsSupported","AllowAllToggle","ChannelModes","ChannelProfile","isArchived","archiveBtn","sharedBlock","onToggleArchive","ConvertAndRemoveConfirmModal","toPublic","removeAmount","toPublicTitle","toPrivateTitle","convertMessage","toPublicMessage","toPrivateMessage","convertMessageSecondLine","toPublicMessageSecondLine","toPrivateMessageSecondLine","confirmMessage","toPublicConfirm","toPrivateConfirm","amount","modalClass","ConvertConfirmModal","convertConfirmationMessage","toPublicMessageConfirmation","toPrivateMessageConfirmation","UsersToRemoveGroups","tooltip","UsersToRemoveRole","_user$roles","UsersToRemove","loadChannelMembersForProfilesList","loadTeamMembersForProfilesList","scopeId","teamRoles","team_roles","setModalFilters","GroupUsersRole","getFilterOptions","membershipsLoaded","loadMembersForProfilesList","searchUsers","filteredProfilesMap","_getConfig","modalFilters","getMembersInTeams","UsersToBeRemovedModal","GroupsUsers","NeedGroupsError","isChannel","NeedDomainsError","UsersWillBeRemovedError","USERS_TO_BE_REMOVED","RemoveConfirmModal","inChannel","ChannelDetails","_props$channel","_props$channel2","_props$channel3","_props$channel4","isOriginallyPublic","isPrivacyChanging","processGroupsChange","gid","cloneDeep","channelRole","currentValueIndex","_this$props$channelPe","originalObj","allGroups","showConvertConfirmModal","showRemoveConfirmModal","showConvertAndRemoveConfirmModal","showArchiveConfirmModal","usersToRemoveCount","channelToBeArchived","origGroups","channelID","rolesToUpdate","deleteChannel","channelToBeRestored","unarchiveChannel","previousServerError","convert","updateChannelPrivacy","res","patchChannel","patchChannelSyncable","groupActions","actionsToAwait","channelModerationEnabled","getGroups","getChannelModerations","manageMembersIndex","updatedManageMembers","patchChannelPermissionsArray","patchChannelModerationsResult","patchChannelModerations","restrictChannelMentions","privacyChanging","usersToAddList","usersToRemoveList","userRolesToUpdate","addUserActions","removeUserActions","addChannelMember","removeChannelMember","updateChannelMemberSchemeRoles","rolesToPromote","rolesToDemote","schemeUser","_this$props$channel","isLocalArchived","isServerArchived","_this$props$channel2","_usersToAdd$user$id","_usersToRemove$user$i","_usersToRemove$user$i2","teamScheme","nonArchivedContent","hideConvertConfirmModal","channelPermissionsChanged","hideRemoveConfirmModal","hideConvertAndRemoveConfirmModal","setToggles","channelGroupsEnabled","handleGroupChange","handleGroupRemoved","addUserToRemove","addUsersToAdd","addRolesToUpdate","hideArchiveConfirmModal","DEFAULT_CHANNEL","_prevProps$channel","_prevProps$team","_prevProps$channel2","_channelPermissions$f","currentCreatePostRoles","membersMinusGroupMembers","ex","E20","getGroupsAssociatedToChannel","getAllGroups","fetchAssociatedGroups","fetchTeam","fetchChannelModerations","searchTeamsDebounced","allowOpenInvite","invite_only","inviteOnly","filtersList","isLicensedForLDAPGroups","renderManagementMethodText","getSortedListOfTeams","general","fetchTeams","TeamsSettings","TeamGroups","syncChecked","ADD_GROUPS_TO_TEAM","AddGroupsToTeamModal","AddUsersToTeamModal","getProfilesNotInTeam","not_in_team_id","teamName","filterExcludeGuests","selectProfilesNotInTeam","TeamMembers","loadProfilesAndReloadTeamMembers","in_team","searchProfilesAndTeamMembers","_state$views$search$u2","active_member_count","searchProfilesInTeam","allAllowedChecked","allowedDomainsChecked","allowedDomains","AllowedDomainsToggle","TeamModes","TeamProfile","usageDeltas","useGetUsageDeltas","usage","useGetUsage","overrideRestoreDisabled","setOverrideRestoreDisabled","restoreDisabled","setRestoreDisabled","teamsLoaded","pointerEvents","ArchiveButton___archived","ArchiveButton___unarchived","toggleArchive","PRICING_MODAL","PricingModal","TeamDetails","showRemoveConfirmation","teamToBeArchived","deleteTeam","teamToBeRestored","unarchiveTeam","patchTeamPromise","patchTeam","allowed_domains","patchTeamSyncable","_resultWithError$erro","_resultWithError$erro2","_resultWithError$erro3","_resultWithError$erro4","_resultWithError$erro5","usersToAddCopy","_this$props$team","_this$props$team2","hideRemoveUsersModal","getGroupsAssociatedToTeam","ValidationResult","isExpanded","contentRef","itemRef","setOpen","contentEl","hasItems","toggle","extraContent","accordionItemsData","expandMultiple","openFirstElement","onItemOpened","currentIndexes","setCurrentIndexes","accordionItem","AccordionCard","newIndexes","_index","ChipsList","chipsData","hideCountZeroChips","chipsList","chipLegend","chipKey","INFO","Chip","additionalMarkup","CtaButtons","learnMoreLink","learnMoreText","actionLink","actionText","telemetryAction","actionButtonCallback","getClickHandler","WORKSPACE_OPTIMIZATION_DASHBOARD","checks","OK","testSiteURL","testURL","configUrl","ConsolePages","configText","infoUrl","SITE_URL","infoText","scoreImpact","impactModifier","impactModifiers","runAccessChecks","check","ssl","protocol","SSL_CERTIFICATE","sessionLength","SessionLengthMobileInHours","rootUserCheck","root_status","fetchRootStatus","fileStorage","filestore_status","testFileStorage","runConfigChecks","dataRetentionCheck","_config$DataRetention","_config$DataRetention2","json","testDataRetention","trialOrEnterpriseCtaConfig","runDataPrivacyChecks","usesLDAP","_options$analytics","_config$LdapSettings","LdapSettings","ldapTest","testLdap","isStarterLicense","AD_LDAP","SETUP_LDAP","runEaseOfUseChecks","_options$analytics2","_config$Elasticsearch","_config$Elasticsearch2","ElasticsearchSettings","EnableIndexing","EnableSearching","elasticsearchTest","testElasticsearch","runPerformanceChecks","testServerVersion","serverVersion","fetchAndCompareVersion","installedVersion","DOWNLOAD_UPDATE","UPGRADE_SERVER","tag_name","sanitizedVersion","newVersionParts","installedVersionParts","numeric","sensitivity","runUpdateChecks","NONE","getUpdatesData","descriptionOk","ArrowUpBoldCircleOutlineIcon","getConfigurationData","hide","TuneIcon","getAccessData","ServerVariantIcon","getPerformanceData","ChartLineIcon","getDataPrivacyData","LockOutlineIcon","getEaseOfManagementData","AccountMultipleOutlineIcon","CircularChart","isPercentage","strokeDasharray","OverallScore","chips","chartValue","contentTitle","contentDescription","scoreGraph","ExclamationThickIcon","AccordionItem","successIcon","FILE_STORAGE_DRIVER_LOCAL","FILE_STORAGE_DRIVER_S3","MEBIBYTE","pow","funcs","_len2","_key2","stateMatches","stateEquals","configIsTrue","_config$group","configIsFalse","_config$group2","configContains","word","_config$group3","_config$group3$settin","licensed","cloudLicensed","licensedForFeature","licensedForSku","licensedForCloudStarter","hidePaymentInfo","_cloud$subscription","_cloud$subscription2","product_id","userHasReadPermissionOnResource","_consoleAccess$read","read","userHasReadPermissionOnSomeResources","resource","_consoleAccess$write","write","validators","minValue","usesLegacyOauth","getRestrictedIndicator","displayBlocked","minimumPlanRequiredForFeature","_cloud$subscription3","RestrictedIndicator","useModal","tooltipMessageBlocked","shouldDisplay","subscriptionProduct","adminDefinitionMessages","data_retention_title","ip_filtering_title","cache_settings_title","cache_type_title","cache_type_desc","redis_address_title","redis_address_desc","redis_address_placeholder","redis_password_title","redis_password_desc","redis_db_title","redis_db_desc","redis_db_placeholder","redis_clientcache_title","redis_clientcache_desc","AdminDefinition","licenseSettingsSearchableStrings","CreditCardOutlineIcon","billingSubscriptionSearchableStrings","BillingSubscriptions","selectCloudSubscription","errorLoadingData","getCloudErrors","products","actionQueryParam","useQuery","getCloudProducts","pageVisited","billing_history","billingHistorySearchableStrings","BillingHistory","getCloudInvoices","invoicesError","getInvoices","billingHistoryTable","areInvoicesEmpty","company_info","billingCompanyInfoSearchableStrings","CompanyInfo","customerError","company_info_edit","CompanyInfoEdit","_companyInfo$company_2","_companyInfo$company_3","_companyInfo$company_4","_companyInfo$company_5","_companyInfo$company_6","_companyInfo$company_7","_companyInfo$billing_","_companyInfo$billing_2","_companyInfo$billing_3","_companyInfo$billing_4","_companyInfo$billing_5","_companyInfo$billing_6","_companyInfo$billing_7","_companyInfo$billing_8","_companyInfo$billing_9","_companyInfo$billing_10","setCompanyName","numEmployees","setNumEmployees","setAddress","address2","setAddress2","setCity","postalCode","setPostalCode","setCountry","getName","contentChanged","setContentChanged","sameAsBillingAddress","setSameAsBillingAddress","setIsValid","setIsSaving","setValidation","updateState","setStateFunc","billingAddressDisplay","companyAddressInput","CountrySelector","stateValue","updateCloudCustomer","updateCloudCustomerAddress","ChartBarIcon","workspace_optimization","getServerVersion","canStartTrial","daysUntilExpiration","getIsStarterLicense","LICENSE","configuration","performance","dataPrivacy","easyManagement","refreshData","useMetricsData","overallScoreChips","overallScore","_","accordionKey","accordionData","accordionDataChips","Accordion","system_analytics","systemAnalyticsSearchableStrings","team_statistics","teamAnalyticsSearchableStrings","server_logs","serverLogsSearchableStrings","ServerLogs","system_users","systemUsersSearchableStrings","SystemUsers","system_user_detail","ID_PATH_PATTERN","group_detail","restrictedIndicator","groups_feature_discovery","isDiscovery","GroupsFeatureDiscovery","team_detail","channel_detail","ChannelSettings","systemScheme","teamSchemeDetail","PermissionSchemeSearchableStrings","system_role","system_roles","system_roles_feature_discovery","SystemRolesFeatureDiscovery","SystemRolesSVG","web_server","DefinitionConstants","DESKTOP_MANAGED_RESOURCES","reloadConfig","recycleDatabaseConnections","invalidateAllCaches","database","databaseSearchableStrings","SqlSettings","MaxIdleConns","maxIdleConns","MaxOpenConns","maxOpenConns","Trace","trace","DisableDatabaseSearch","disableDatabaseSearch","QueryTimeout","queryTimeout","ConnMaxLifetimeMilliseconds","parseIntNonNegative","connMaxLifetimeMilliseconds","ConnMaxIdleTimeMilliseconds","connMaxIdleTimeMilliseconds","MinimumHashtagLength","minimumHashtagLength","recycleDbButton","recycleDatabaseConnection","searchBackend","getSearchBackend","ActiveSearchBackend","DriverName","DataSource","elasticsearch","elasticSearchSearchableStrings","ConnectionURL","connectionUrl","Backend","backend","SkipTLSVerification","skipTLSVerification","CA","ca","ClientCert","clientCert","ClientKey","clientKey","Username","Password","Sniff","sniff","enableIndexing","enableSearching","EnableAutocomplete","enableAutocomplete","IgnoredPurgeIndexes","ignoredPurgeIndexes","configTested","canPurgeAndIndex","handleSettingChanged","doTestConfig","ELASTICSEARCH_POST_INDEXING","getExtraInfo","rebuildChannelsIndex","elasticsearchPurgeIndexes","jobSubType","sub_type","jobProgress","percent","progress","storage","configVal","displayVal","CONFIGURE_DOCUMENT_CONTENT_SEARCH","testS3Connection","export_storage","image_proxy","SETUP_IMAGE_PROXY","smtp","testSmtp","push_notification_server","pushSearchableStrings","PushNotificationsSettings","high_availability","clusterSearchableStrings","ClusterSettings","ClusterName","OverrideHostname","UseIPAddress","EnableExperimentalGossipEncryption","EnableGossipCompression","GossipPort","showWarning","Cluster","clusterId","HIGH_AVAILABILITY_CLUSTER","clusterTableContainer","overrideHandleChange","cache_settings","CacheTypes","LRU","REDIS","rate_limiting","logging","boldedLogLevel","previousVal","ADVANCED_LOGGING","session_lengths","sessionLengthSearchableStrings","ExtendSessionLengthWithActivity","extendSessionLengthWithActivity","TerminateSessionsOnPasswordChange","terminateSessionsOnPasswordChange","SessionLengthWebInHours","sessionLengthWebInHours","sessionLengthMobileInHours","SessionLengthSSOInHours","sessionLengthSSOInHours","SessionCacheInMinutes","sessionCacheInMinutes","SessionIdleTimeoutInMinutes","parseIntZeroOrMin","sessionIdleTimeoutInMinutes","sessionLengthWebHelpText","sessionLengthMobileHelpText","sessionLengthSSOHelpText","sessionTimeoutSetting","metrics","SETUP_PERFORMANCE_MONITORING","developer","CogOutlineIcon","customization","MAX_SITENAME_LENGTH","MAX_CUSTOM_BRAND_TEXT_LENGTH","system_properties","systemPropertiesSearchableStrings","localization","users_and_teams","TEAMMATE_NAME_DISPLAY","SHOW_USERNAME","SHOW_NICKNAME_FULLNAME","SHOW_FULLNAME","notifications","announcement_banner","announcement_banner_feature_discovery","AnnouncementBannerFeatureDiscovery","emoji","linkKnownIssues","linkCommunityChannel","SHARE_LINKS_TO_MESSAGES","FORMAT_MESSAGES","maxResult","maxValue","minResult","wrangler","file_sharing_downloads","public_links","IN_PRODUCT_NOTICES","ip_filtering","IPFiltering","setIpFilters","originalIpFilters","setOriginalIpFilters","setCurrentUsersIP","installationStatus","setInstallationStatus","setSavingMessage","savingDescription","setSavingDescription","savingButtonMessages","SAVING_PREVIOUS_CHANGE","SAVING_CHANGES","savingDescriptionMessages","getInstallationStatus","getIPFilters","getCurrentIP","haveFiltersChanged","ipAddress","allowedIPRanges","usersAddr","cidrBlock","addr","kind","isIPAddressInRanges","getInstallation","changeSavingDescription","installationFetchAttempts","pollInstallationStatus","handleEditFilter","prevIpFilters","updatedFilters","handleDeleteFilter","IP_FILTERING_DELETE_CONFIRMATION_MODAL","_prevIpFilters$filter","handleAddFilter","IP_FILTERING_ADD_EDIT_MODAL","IP_FILTERING_SAVE_CONFIRMATION_MODAL","applyIPFilters","_ipFilters$some","editFilter","saveConfirmModalProps","secure_connection_detail","secure_connections","secureConnectionsSearchableStrings","_remoteClusters$map","remoteClusters","useRemoteClusters","setRemoteClusters","loadingStatus","getRemoteClusters","excludePlugins","signup","invalidateAllEmailInvites","passwordSearchableStrings","_this$state$passwordM","_this$state$maximumLo","PasswordSettings","MinimumLength","passwordMinimumLength","MIN_PASSWORD_LENGTH","Lowercase","passwordLowercase","Uppercase","passwordUppercase","passwordNumber","passwordSymbol","EnableForgotLink","passwordEnableForgotLink","MaximumLoginAttempts","maximumLoginAttempts","MAXIMUM_LOGIN_ATTEMPTS_DEFAULT","MAX_PASSWORD_LENGTH","_this$state$passwordM2","_this$state$maximumLo2","_this$state$passwordE","handleBooleanChange","getSampleErrorMsg","sampleErrorMsg","_config$PasswordSetti","_config$PasswordSetti2","_config$PasswordSetti3","_config$PasswordSetti4","_config$PasswordSetti5","_config$PasswordSetti6","mfa","MULTI_FACTOR_AUTH","ldap","uploadPrivateLdapCertificate","removePrivateLdapCertificate","uploadPublicLdapCertificate","removePublicLdapCertificate","CONFIGURE_AD_LDAP_QUERY_TIMEOUT","LDAP_SYNC","linkedLdapGroupsCount","ldapUsers","deleteCount","updateCount","totalLdapGroupsCount","groupDeleteCount","groupMemberDeleteCount","groupMemberAddCount","ldap_users_count","delete_count","update_count","ldap_groups_count","total_ldap_groups_count","group_delete_count","group_member_delete_count","group_member_add_count","ldap_feature_discovery","LDAPFeatureDiscovery","saml","CONFIGURE_OVERRIDE_SAML_BIND_DATA_WITH_LDAP","getSamlMetadataFromIdp","uploadIdpSamlCertificate","set_action","setSamlIdpCertificateFromMetadata","removeIdpSamlCertificate","urlChunk","siteUrl","addSlashIfNeeded","uploadPrivateSamlCertificate","removePrivateSamlCertificate","uploadPublicSamlCertificate","removePublicSamlCertificate","saml_feature_discovery","SAMLFeatureDiscovery","gitlab","_config$GitLabSetting","_config$GitLabSetting2","Url","lineBreak","loginUrlChunk","signupUrlChunk","oauth","_config$GitLabSetting3","_config$Office365Sett","_config$GoogleSetting","_config$GitLabSetting4","_config$GitLabSetting5","oauthType","GITLAB_SERVICE","GOOGLE_SERVICE","OpenIdSettings","linkLogin","linkConsole","linkAPI","linkTenant","linkApps","openid","_config$Office365Sett2","_config$GoogleSetting2","_config$GitLabSetting6","_config$OpenIdSetting","_config$GitLabSetting7","_config$GitLabSetting8","openidType","OPENID_SERVICE","configSetting","OpenIDCustomFeatureDiscovery","openid_feature_discovery","OpenIDFeatureDiscovery","guest_access","guest_access_feature_discovery","GuestAccessFeatureDiscovery","PowerPlugOutlineIcon","plugin_management","pluginManagementSearchableStrings","SitemapIcon","integration_management","INCOMING_WEBHOOKS","OUTGOING_WEBHOOKS","SETUP_CUSTOM_SLASH_COMMANDS","ENABLE_OAUTH2","slashCommands","CUSTOM_SLASH_COMMANDS","outgoingWebhooks","interactiveMessages","INTERACTIVE_MESSAGES","interactiveDialogs","INTERACTIVE_DIALOGS","bot_accounts","gif","cors","FormatListBulletedIcon","custom_policy_form_edit","CustomDataRetentionForm","custom_policy_form","global_policy_form","GlobalDataRetentionForm","data_retention","dataRetentionSearchableStrings","data_retention_feature_discovery","DataRetentionFeatureDiscovery","message_export","messageExportSearchableStrings","compliance_export_feature_discovery","ComplianceExportFeatureDiscovery","auditSearchableStrings","COMPILANCE_MONITORING","custom_terms_of_service","customTermsOfServiceSearchableStrings","CustomTermsOfServiceSettings","custom_terms_of_service_feature_discovery","customTermsOfServiceMessages","CustomTermsOfServiceFeatureDiscovery","FlaskOutlineIcon","ENABLE_CLIENT_SIDE_CERTIFICATION","ENABLE_HARDENED_MODE","feature_flags","featureFlagsMessages","flags","FeatureFlags","ffKey","bleve","bleveSearchableStrings","BleveSettings","IndexDir","indexDir","BLEVE_POST_INDEXING","blevePurgeIndexes","audit_logging","getAdminDefinition","adminConsoleReducers","adminDefinition","reducers","reducer","adminConsoleCustomComponents","adminConsoleCustomSections","getConsoleAccess","getMySystemPermissions","mySystemPermissions","addEntriesForKey","entryKey","hasWriteUserManagementPermission","isEnterprise","SearchKeywordMarking","keyword","markJsRef","doMark","Mark","mark","accuracy","exclude","debouncedDoMark","keywordToMark","markJs","unmark","DiscardChangesModal","AdminSidebarCategory","definitionKey","parentLink","sectionClass","titleDiv","NavLink","activeClassName","clonedChildren","sectionsClassName","renderedChildren","Route","AdminSidebarSection","tag","tagDiv","indicatorElem","sidebarItemSafeId","createSafeId","sidebarItem","sidebarItemClickHandler","CommercialSupportModal","showBannerWarning","updateBannerWarning","packetContents","currentIndex","mandatory","URL","getSystemRoute","searchParams","set","append","formattedDate","presumedFileName","matches","exec","genereateDownloadURLWithParams","method","blob","createObjectURL","createElement","extractFilename","appendChild","removeChild","supportLink","doHide","debugLink","hideBannerWarning","updateCheckStatus","downloadSupportPacket","EnableFile","FileLevel","support_packet","MenuItemBlockableLinkImpl","MenuItemBlockableLink","menuItem","AdminNavbarDropdown","navigationBlocked","GlobalActions","teamToRender","switchTeams","teamsArray","commercialSupport","ItemExternalLink","ItemToggleModalRedux","COMMERCIAL_SUPPORT","adminGuideLink","Group","AboutBuildModal","appTitle","handleLogout","getMyTeams","SidebarHeader","me","profilePicture","MenuIcon","AdminSidebarHeader","extractTextsFromPlugin","texts","extractTextFromSetting","stripMarkdown","settingsTexts","pushString","shouldStripMarkdown","pushText","extractTextsFromSection","searchableString","extractTextFromSettings","schemaSection","generateIndex","FlexSearch","addToIndex","adminDefinitionsToUrlsAndTexts","pluginsObj","getPluginEntries","renderScrollView","renderScrollThumbHorizontal","renderScrollThumbVertical","AdminSidebar","currentSiteName","buildEnterpriseReady","definition","sidebarSections","isSectionHidden","sidebarItems","_item$restrictedIndic","subKey","subDefinitionKey","sidebarPluginItems","renderPluginsMenu","isPluginPresentInSections","searchRef","updateTitle","showTaskList","QuickInput","handleSearchChange","handleClearFilter","Scrollbars","autoHide","autoHideTimeout","autoHideDuration","renderThumbHorizontal","renderThumbVertical","renderView","renderRootMenu","BuildEnterpriseReady","taskListStatus","getBool","OnboardingTaskCategory","OnboardingTaskList","ONBOARDING_TASK_LIST_SHOW","isUserFirstAdmin","isFirstAdmin","isMobileView","getIsMobileView","pure","AdminConsole","extraProps","schemas","flatMap","defaultUrl","schemaRoutes","isItemDisabled","Switch","Redirect","_document$getElementB","selectLhsItem","LhsItemType","None","selectTeam","classList","getElementById","resetTheme","_document$getElementB2","applyTheme","currentTheme","mainRolesLoaded","showNavigationPrompt","cancelNavigation","confirmNavigation","currentUserHasAnAdminRole","unauthorizedRoute","AnnouncementBarController","SystemNotice","BackstageNavbar","renderRoutes","ModalController","connector","getGeneralConfig","LocalStorageStore","getPreviousTeamId","getTheme","BackIcon","teamExists","DEFAULT_COPY_TIMEOUT","successCopyTimeout","successCopyTimeoutReceived","trackCallback","setCopiedRecently","copyError","setCopyError","timerRef","textField","innerText","execCommand","withBackupValue","maybeLimit","limitsLoaded","MAX_VALUE","_limits$teams","totalStorageLoaded","historyLoaded","cloudArchived","FileInfoPreview","canDownloadFiles","infoParts","infoString","modals","modalState","modalOutput","modal","modalComponent","_modal$dialogProps","_modal$dialogProps$on","bind","fileDownloadUrl","getFileDownloadUrl","_this$container$curre","_this$container$curre2","_this$parentNode$clie","_this$parentNode","bounding","getBoundingClientRect","viewportTop","viewportBottom","parentNode","clientHeight","top","bottom","canvas","pdfCanvasRef","isInViewport","pdfPagesRendered","pdf","viewport","getViewport","renderContext","canvasContext","promise","pdfjsLib","cMapUrl","cMapPacked","onDocumentLoad","onDocumentLoadError","numPages","pdfPagesLoaded","pdfPages","getPage","renderPDFPage","prevFileUrl","_this$parentNode2","getPdfDocument","handleScroll","pdfCanvases","adminOnly","allowForget","InstallationDate","getTime","ServerVersion","UserAgent","currentChannel","_notice$show","dismissedNotices","preferences","remind","getCurrentNotice","CATEGORY_SYSTEM_NOTICE","dismissNotice","getStandardAnalytics","visibleMessage","MattermostLogo","hideAndRemind","hideAndForget","getSystemNoticePreferences","makeGetCategory","getPreferenceNameMap","nameMap","hasBeenDismissed","Notices","noOptions","_input","customCallback","selectProps","Msg","NoOptionsMessage","PublicChannelIcon","PrivateChannelIcon","_meta","innerProps","CloseCircleSolidIcon","MultiValueRemove","_this$selectRef$curre","selectRef","handleInputChange","_this$props$formatOpt","optionsLoader","empty","getOptionValue","defaultMenuIsOpen","openMenuOnClick","openMenuOnFocus","tabSelectsValue","withHover","hoverCss","backgroundImage","withImage","ExternalBotAccountNames","getBotAccounts","accounts","getUsers","botAccounts","userProfiles","botAccount","botUser","LogLevelEnum","exports"],"sourceRoot":""}