diff --git a/web/src/server_events_dispatch.js b/web/src/server_events_dispatch.js index 47799bfa7b..f4f69ba827 100644 --- a/web/src/server_events_dispatch.js +++ b/web/src/server_events_dispatch.js @@ -764,6 +764,9 @@ export function dispatch_normal_event(event) { if (event.property === "presence_enabled") { activity_ui.redraw_user(current_user.user_id); } + if (event.property === "allow_private_data_export") { + settings_exports.refresh_allow_private_data_export_banner(); + } break; } diff --git a/web/src/settings_exports.ts b/web/src/settings_exports.ts index 7b45f17972..4aefe8c3e4 100644 --- a/web/src/settings_exports.ts +++ b/web/src/settings_exports.ts @@ -3,12 +3,14 @@ import type * as tippy from "tippy.js"; import {z} from "zod"; import render_confirm_delete_data_export from "../templates/confirm_dialog/confirm_delete_data_export.hbs"; +import render_allow_private_data_export_banner from "../templates/modal_banner/allow_private_data_export_banner.hbs"; import render_admin_export_consent_list from "../templates/settings/admin_export_consent_list.hbs"; import render_admin_export_list from "../templates/settings/admin_export_list.hbs"; import render_start_export_modal from "../templates/start_export_modal.hbs"; import * as channel from "./channel.ts"; import * as components from "./components.ts"; +import * as compose_banner from "./compose_banner.ts"; import * as confirm_dialog from "./confirm_dialog.ts"; import * as dialog_widget from "./dialog_widget.ts"; import * as dropdown_widget from "./dropdown_widget.ts"; @@ -23,6 +25,7 @@ import * as settings_config from "./settings_config.ts"; import * as timerender from "./timerender.ts"; import type {HTMLSelectOneElement} from "./types.ts"; import * as ui_report from "./ui_report.ts"; +import {user_settings} from "./user_settings.ts"; export const export_consent_schema = z.object({ user_id: z.number(), @@ -257,6 +260,32 @@ export function populate_export_consents_table(): void { filter_by_consent_dropdown_widget.setup(); } +function maybe_show_allow_private_data_export_banner(): void { + if (!user_settings.allow_private_data_export) { + const context = { + banner_type: compose_banner.WARNING, + classname: "allow_private_data_export_warning", + hide_close_button: true, + }; + $("#allow_private_data_export_banner_container").html( + render_allow_private_data_export_banner(context), + ); + } +} + +export function refresh_allow_private_data_export_banner(): void { + if (user_settings.allow_private_data_export) { + $(".allow_private_data_export_warning").remove(); + } else if ($("#allow_private_data_export_banner_container").length > 0) { + maybe_show_allow_private_data_export_banner(); + const $export_type = $("select:not([multiple])#export_type"); + const selected_export_type = Number.parseInt($export_type.val()!, 10); + if (selected_export_type === settings_config.export_type_values.export_public.value) { + $(".allow_private_data_export_warning").hide(); + } + } +} + function show_start_export_modal(): void { const html_body = render_start_export_modal({ export_type_values: settings_config.export_type_values, @@ -300,6 +329,9 @@ function show_start_export_modal(): void { {users_consented_for_export_count, total_users_count}, ), ); + + maybe_show_allow_private_data_export_banner(); + const $export_type = $("select:not([multiple])#export_type"); $export_type.on("change", () => { const selected_export_type = Number.parseInt($export_type.val()!, 10); @@ -308,8 +340,10 @@ function show_start_export_modal(): void { settings_config.export_type_values.export_full_with_consent.value ) { $("#allow_private_data_export_stats").show(); + $(".allow_private_data_export_warning").show(); } else { $("#allow_private_data_export_stats").hide(); + $(".allow_private_data_export_warning").hide(); } }); } diff --git a/web/templates/modal_banner/allow_private_data_export_banner.hbs b/web/templates/modal_banner/allow_private_data_export_banner.hbs new file mode 100644 index 0000000000..1fc539f41e --- /dev/null +++ b/web/templates/modal_banner/allow_private_data_export_banner.hbs @@ -0,0 +1,8 @@ +{{#> modal_banner . }} + +{{/modal_banner}} diff --git a/web/templates/start_export_modal.hbs b/web/templates/start_export_modal.hbs index d046ea6589..df47e12ed8 100644 --- a/web/templates/start_export_modal.hbs +++ b/web/templates/start_export_modal.hbs @@ -1,3 +1,4 @@ +

{{#tr}} A public data export is a complete data export for your organization other than diff --git a/web/tests/dispatch.test.cjs b/web/tests/dispatch.test.cjs index a8fe383f44..3b34b3ece1 100644 --- a/web/tests/dispatch.test.cjs +++ b/web/tests/dispatch.test.cjs @@ -1208,6 +1208,12 @@ run_test("user_settings", ({override}) => { dispatch(event); assert.equal($("#automatically_offer_update_time_zone").prop("checked"), false); } + + event = event_fixtures.user_settings__allow_private_data_export; + override(user_settings, "allow_private_data_export", false); + override(settings_exports, "refresh_allow_private_data_export_banner", noop); + dispatch(event); + assert_same(user_settings.allow_private_data_export, true); }); run_test("update_message (read)", ({override}) => { diff --git a/web/tests/lib/events.cjs b/web/tests/lib/events.cjs index cc5559554e..e720d530b4 100644 --- a/web/tests/lib/events.cjs +++ b/web/tests/lib/events.cjs @@ -883,6 +883,13 @@ exports.fixtures = { }, }, + user_settings__allow_private_data_export: { + type: "user_settings", + op: "update", + property: "allow_private_data_export", + value: true, + }, + user_settings__color_scheme_automatic: { type: "user_settings", op: "update",