frontend: Add org_type to realm settings updates and events.

Adds a drop-down menu for updating the organization type in the
`organization_profile_admin` page. Implements front end for
this setting to work / update like other organization profile,
notification and permissions settings.

One special note about this dropdown is that the listed options
should change once an organization has successfully set a type
other than 'unspecified' in the database. To accomplish this
the initial settings overlay build checks the realm_org_type
value in the page_params to select the correct options list,
and when the dropdown value is reset, either for update events
or for discarding changes, the page_params value is again used
to check for whether the 'unspecified' value should be present
as an option in the dropdown menu.

Adds basic node test for the `server_events_dispatch`.
Also adds a new help center documentation article for this
organization setting that is linked to in the UI.

Fixes #21692.
This commit is contained in:
Lauryn Menard
2022-04-12 17:41:07 +02:00
committed by Tim Abbott
parent d2207d4ad5
commit 1292338537
11 changed files with 140 additions and 4 deletions

View File

@@ -392,6 +392,10 @@ run_test("realm settings", ({override}) => {
});
assert_same(page_params.realm_name, "new_realm_name");
event = event_fixtures.realm__update__org_type;
dispatch(event);
assert_same(page_params.realm_org_type, 50);
event = event_fixtures.realm__update__emails_restricted_to_domains;
test_realm_boolean(event, "realm_emails_restricted_to_domains");

View File

@@ -342,6 +342,13 @@ exports.fixtures = {
value: 42,
},
realm__update__org_type: {
type: "realm",
op: "update",
property: "org_type",
value: 50,
},
realm__update__signup_notifications_stream_id: {
type: "realm",
op: "update",

View File

@@ -80,6 +80,7 @@ export function build_page() {
const options = {
custom_profile_field_types: page_params.custom_profile_field_types,
realm_name: page_params.realm_name,
realm_org_type: page_params.realm_org_type,
realm_available_video_chat_providers: page_params.realm_available_video_chat_providers,
giphy_rating_options: page_params.giphy_rating_options,
giphy_api_key_empty: page_params.giphy_api_key === "",
@@ -162,6 +163,7 @@ export function build_page() {
disable_enable_spectator_access_setting: !page_params.server_web_public_streams_enabled,
can_sort_by_email: settings_data.show_email(),
realm_push_notifications_enabled: page_params.realm_push_notifications_enabled,
realm_org_type_values: settings_org.get_org_type_dropdown_options(),
};
if (options.realm_logo_source !== "D" && options.realm_night_logo_source === "D") {

View File

@@ -214,6 +214,7 @@ export function dispatch_normal_event(event) {
name: notifications.redraw_title,
name_changes_disabled: settings_account.update_name_change_display,
notifications_stream_id: noop,
org_type: noop,
private_message_policy: noop,
send_welcome_emails: noop,
message_content_allowed_in_email_notifications: noop,

View File

@@ -441,6 +441,71 @@ export const user_role_values = {
},
};
export const all_org_type_values = {
// When org_type was added to the database model, 'unspecified'
// was the default for existing organizations. To discourage
// organizations keeping (or selecting) it as an option, we
// use an empty string for its description.
unspecified: {
code: 0,
description: "",
},
business: {
code: 10,
description: $t({defaultMessage: "Business"}),
},
opensource: {
code: 20,
description: $t({defaultMessage: "Open-source project"}),
},
education_nonprofit: {
code: 30,
description: $t({defaultMessage: "Education (non-profit)"}),
},
education: {
code: 35,
description: $t({defaultMessage: "Education (for-profit)"}),
},
research: {
code: 40,
description: $t({defaultMessage: "Research"}),
},
event: {
code: 50,
description: $t({defaultMessage: "Event or conference"}),
},
nonprofit: {
code: 60,
description: $t({defaultMessage: "Non-profit (registered)"}),
},
government: {
code: 70,
description: $t({defaultMessage: "Government"}),
},
political_group: {
code: 80,
description: $t({defaultMessage: "Political group"}),
},
community: {
code: 90,
description: $t({defaultMessage: "Community"}),
},
personal: {
code: 100,
description: $t({defaultMessage: "Personal"}),
},
other: {
code: 1000,
description: $t({defaultMessage: "Other"}),
},
};
// Remove the 'unspecified' org_type for dropdown menu options
// when an org_type other than 'unspecified' has been selected.
export const defined_org_type_values = Object.fromEntries(
Object.entries(all_org_type_values).slice(1),
);
export const expires_in_values = {
// Backend support for this configuration is not available yet.
// hour: {

View File

@@ -116,6 +116,14 @@ export function get_organization_settings_options() {
return options;
}
export function get_org_type_dropdown_options() {
const current_org_type = page_params.realm_org_type;
if (current_org_type !== 0) {
return settings_config.defined_org_type_values;
}
return settings_config.all_org_type_values;
}
export function get_realm_time_limits_in_minutes(property) {
let val = (page_params[property] / 60).toFixed(1);
if (Number.parseFloat(val, 10) === Number.parseInt(val, 10)) {
@@ -238,6 +246,7 @@ const simple_dropdown_properties = [
"realm_wildcard_mention_policy",
"realm_move_messages_between_streams_policy",
"realm_edit_topic_policy",
"realm_org_type",
];
function set_property_dropdown_value(property_name) {
@@ -507,6 +516,15 @@ function discard_property_element_changes(elem, for_realm_default_settings) {
realm_user_settings_defaults.email_notifications_batching_period_seconds,
);
break;
case "realm_org_type":
set_input_element_value($elem, property_value);
// Remove 'unspecified' option (value=0) from realm_org_type
// dropdown menu options whenever page_params.realm_org_type
// returns another value.
if (property_value !== 0) {
$("#id_realm_org_type option[value=0]").remove();
}
break;
default:
if (property_value !== undefined) {
set_input_element_value($elem, property_value);

View File

@@ -17,6 +17,14 @@
autocomplete="off" data-setting-widget-type="string"
value="{{ realm_name }}" maxlength="40" />
</div>
<div class="input-group admin-realm">
<label for="realm_org_type" class="dropdown-title">{{t "Organization type" }}
{{> ../help_link_widget link="/help/organization-type" }}
</label>
<select name="realm_org_type" class="setting-widget prop-element" id="id_realm_org_type" data-setting-widget-type="number">
{{> dropdown_options_widget option_values=realm_org_type_values}}
</select>
</div>
<div class="input-group admin-realm">
<label for="realm_description">{{t "Organization description" }}</label>
<textarea id="id_realm_description" name="realm_description" class="admin-realm-description setting-widget prop-element"

View File

@@ -7,8 +7,10 @@
{settings_tab|organization-profile}
1. Edit your organization **name**, **description**, and **profile picture**.
1. Click **Save changes**.
1. Edit your organization **name**, **type**, **description**, and
**profile picture**.
{!save-changes.md!}
{end_tabs}

View File

@@ -128,6 +128,7 @@
## Organization basics
* [Review your organization's settings](/help/review-your-organization-settings)
* [Organization type](/help/organization-type)
* [Import from Mattermost](/help/import-from-mattermost)
* [Import from Slack](/help/import-from-slack)
* [Import from Gitter](/help/import-from-gitter)

View File

@@ -0,0 +1,24 @@
# Organization type
An organization's type is used to customize the experience for users
in your organization, including initial organization settings and
Welcome Bot messages received by new users.
## Set organization type
{!admin-only.md!}
{start_tabs}
{settings_tab|organization-profile}
1. Under **Organization type**, select the option that best fits
your organization.
{!save-changes.md!}
{end_tabs}
## Related articles
* [Configure default new user settings](/help/configure-default-new-user-settings)

View File

@@ -3932,7 +3932,8 @@ paths:
org_type:
type: integer
description: |
The type of the organization.
The [organization type](/help/organization-type)
for the realm.
- 0 = Unspecified
- 10 = Business
@@ -11488,7 +11489,10 @@ paths:
description: |
Present if `realm` is present in `fetch_event_types`.
The type of the organization.
The [organization type](/help/organization-type) for the realm.
Useful only to clients supporting changing this setting for the
organization, or clients implementing onboarding content or
other features that varies with organization type.
- 0 = Unspecified
- 10 = Business