diff --git a/res/css/_components.scss b/res/css/_components.scss index ec3af8655e..c0fade8e5e 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -75,6 +75,7 @@ @import "./views/dialogs/_DeactivateAccountDialog.scss"; @import "./views/dialogs/_DevtoolsDialog.scss"; @import "./views/dialogs/_EditCommunityPrototypeDialog.scss"; +@import "./views/dialogs/_ExportDialog.scss"; @import "./views/dialogs/_FeedbackDialog.scss"; @import "./views/dialogs/_ForwardDialog.scss"; @import "./views/dialogs/_GroupAddressPicker.scss"; diff --git a/res/css/views/dialogs/_ExportDialog.scss b/res/css/views/dialogs/_ExportDialog.scss new file mode 100644 index 0000000000..69b76221bb --- /dev/null +++ b/res/css/views/dialogs/_ExportDialog.scss @@ -0,0 +1,22 @@ +.mx_ExportDialog_subheading { + font-size: $font-16px; + display: block; + font-family: $font-family; + font-weight: 600; + color: $primary-fg-color; + margin-top: 18px; + margin-bottom: 12px; +} + +.mx_ExportDialog .mx_RadioButton > .mx_RadioButton_content { + margin-top: 5px; + margin-bottom: 5px; +} + +.mx_ExportDialog .mx_Field { + width: 256px; +} + +.mx_ExportDialog .mx_Field_postfix { + padding: 9px 10px; +} diff --git a/src/components/views/dialogs/ExportDialog.tsx b/src/components/views/dialogs/ExportDialog.tsx index 7aba38c5c0..8cefffaa9f 100644 --- a/src/components/views/dialogs/ExportDialog.tsx +++ b/src/components/views/dialogs/ExportDialog.tsx @@ -4,10 +4,14 @@ import { _t } from "../../../languageHandler"; import { IDialogProps } from "./IDialogProps"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; -import Dropdown from "../elements/Dropdown"; +import Field from "../elements/Field"; +import StyledRadioGroup from "../elements/StyledRadioGroup"; +import StyledCheckbox from "../elements/StyledCheckbox"; import exportConversationalHistory, { exportFormats, exportTypes, + textForFormat, + textForType, } from "../../../utils/exportUtils/exportUtils"; interface IProps extends IDialogProps { @@ -15,18 +19,21 @@ interface IProps extends IDialogProps { } const ExportDialog: React.FC = ({ room, onFinished }) => { - const [format, setFormat] = useState("HTML"); + const [exportFormat, setExportFormat] = useState("HTML"); + const [exportType, setExportType] = useState("TIMELINE"); + const [includeAttachments, setAttachments] = useState(false); + const [numberOfMessages, setNumberOfMessages] = useState(); + const [sizeLimit, setSizeLimit] = useState(8); + const onExportClick = async () => { await exportConversationalHistory( room, - exportFormats.PLAIN_TEXT, - exportTypes.START_DATE, + exportFormats[exportFormat], + exportTypes[exportType], { - startDate: parseInt( - new Date("2021.05.20").getTime().toFixed(0), - ), - attachmentsIncluded: true, - maxSize: 7 * 1024 * 1024, // 7 MB + numberOfMessages, + attachmentsIncluded: includeAttachments, + maxSize: sizeLimit * 1024 * 1024, }, ); }; @@ -35,15 +42,40 @@ const ExportDialog: React.FC = ({ room, onFinished }) => { onFinished(false); }; - const options = Object.keys(exportFormats).map(key => { - return
- { exportFormats[key] } -
- }) + const exportFormatOptions = Object.keys(exportFormats).map((format) => ({ + value: format, + label: textForFormat(format), + })); + + const exportTypeOptions = Object.keys(exportTypes).map((type) => { + return ( + + ); + }); + + let MessageCount = null; + if (exportType === exportTypes.LAST_N_MESSAGES) { + MessageCount = ( + { + setNumberOfMessages(parseInt(e.target.value)); + }} + type="number" + /> + ); + } + + const sizePostFix = ({_t("MB")}); return ( = ({ room, onFinished }) => { )}

- { setFormat(key) }} - value={format} - label={_t("Export formats")} + {_t("Format")} + + setExportFormat(key)} + definitions={exportFormatOptions} + /> + + {_t("Messages")} + + { + setExportType(e.target.value); + }} > - { options } - + {exportTypeOptions} +
+ { MessageCount } + + + {_t("Size Limit")} + + + setSizeLimit(e.target.value)} + /> + + + setAttachments((e.target as HTMLInputElement).checked) + } + > + {_t("Include Attachments")} + { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 9ab4a77c9f..cb28f2b07b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -735,6 +735,12 @@ "Invite to %(spaceName)s": "Invite to %(spaceName)s", "Share your public space": "Share your public space", "Unknown App": "Unknown App", + "HTML": "HTML", + "JSON": "JSON", + "Plain Text": "Plain Text", + "From the beginning": "From the beginning", + "For a number of messages": "For a number of messages", + "Current Timeline": "Current Timeline", "Media omitted": "Media omitted", "Media omitted - file size limit exceeded": "Media omitted - file size limit exceeded", "%(creatorName)s created this room.": "%(creatorName)s created this room.", @@ -2249,8 +2255,13 @@ "There was an error updating your community. The server is unable to process your request.": "There was an error updating your community. The server is unable to process your request.", "Update community": "Update community", "An error has occurred.": "An error has occurred.", + "Number of messages": "Number of messages", + "MB": "MB", "Export Chat": "Export Chat", "Select from the options below to export chats from your timeline": "Select from the options below to export chats from your timeline", + "Format": "Format", + "Size Limit": "Size Limit", + "Include Attachments": "Include Attachments", "Export": "Export", "Feedback sent": "Feedback sent", "Rate %(brand)s": "Rate %(brand)s", diff --git a/src/utils/exportUtils/exportUtils.ts b/src/utils/exportUtils/exportUtils.ts index 7a1d4a9f11..37d0bbc524 100644 --- a/src/utils/exportUtils/exportUtils.ts +++ b/src/utils/exportUtils/exportUtils.ts @@ -4,26 +4,41 @@ import HTMLExporter from "./HtmlExport"; import JSONExporter from "./JSONExport"; import PlainTextExporter from "./PlainTextExport"; -_t("HTML"); -_t("JSON"); -_t("Plain Text"); - export enum exportFormats { HTML = "HTML", JSON = "JSON", - PLAIN_TEXT = "Plain Text", + PLAIN_TEXT = "PLAIN_TEXT", } -_t("Current Timeline"); -_t("From the beginning") -_t("From a specific date") -_t("Last n messages"); - export enum exportTypes { - TIMELINE = "Current Timeline", - BEGINNING = "From the beginning", - START_DATE = "From a specific date", - LAST_N_MESSAGES = "Last n messages", + TIMELINE = "TIMELINE", + BEGINNING = "BEGINNING", + // START_DATE = "START_DATE", + LAST_N_MESSAGES = "LAST_N_MESSAGES", +} + +export const textForFormat = (format: string) => { + switch (format) { + case exportFormats.HTML: + return _t("HTML"); + case exportFormats.JSON: + return _t("JSON"); + case exportFormats.PLAIN_TEXT: + return _t("Plain Text"); + } +} + +export const textForType = (type: string) => { + switch (type) { + case exportTypes.BEGINNING: + return _t("From the beginning"); + case exportTypes.LAST_N_MESSAGES: + return _t("For a number of messages"); + case exportTypes.TIMELINE: + return _t("Current Timeline"); + // case exportTypes.START_DATE: + // return _t("From a specific date"); + } } export interface exportOptions {