From 9b10f3ef5450886bc2eb47fc58b649ff67109b1d Mon Sep 17 00:00:00 2001 From: VeraLyu Date: Sun, 19 Mar 2017 21:53:12 +0800 Subject: [PATCH] Split delete modal trigger for reuse (#5740) Spllit delete modal trigger for reuse and make emoji delete to use this modal trigger. --- webapp/components/delete_modal_trigger.jsx | 62 ++++++++++++++++ .../emoji/components/delete_emoji_modal.jsx | 49 +++++++++++++ .../emoji/components/emoji_list_item.jsx | 11 +-- .../components/delete_integration.jsx | 73 +++++-------------- webapp/i18n/en.json | 3 + 5 files changed, 133 insertions(+), 65 deletions(-) create mode 100644 webapp/components/delete_modal_trigger.jsx create mode 100644 webapp/components/emoji/components/delete_emoji_modal.jsx mode change 100644 => 100755 webapp/i18n/en.json diff --git a/webapp/components/delete_modal_trigger.jsx b/webapp/components/delete_modal_trigger.jsx new file mode 100644 index 0000000000..9ccbf33a24 --- /dev/null +++ b/webapp/components/delete_modal_trigger.jsx @@ -0,0 +1,62 @@ +import React from 'react'; + +import ConfirmModal from './confirm_modal.jsx'; + +export default class DeleteModalTrigger extends React.Component { + constructor(props) { + super(props); + if (this.constructor === DeleteModalTrigger) { + throw new TypeError('Can not construct abstract class.'); + } + this.handleConfirm = this.handleConfirm.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleOpenModal = this.handleOpenModal.bind(this); + + this.state = { + showDeleteModal: false + }; + } + + handleOpenModal(e) { + e.preventDefault(); + + this.setState({ + showDeleteModal: true + }); + } + + handleConfirm(e) { + this.props.onDelete(e); + } + + handleCancel() { + this.setState({ + showDeleteModal: false + }); + } + + render() { + return ( + + + { this.triggerTitle } + + + + ); + } +} + +DeleteModalTrigger.propTypes = { + onDelete: React.PropTypes.func.isRequired +}; diff --git a/webapp/components/emoji/components/delete_emoji_modal.jsx b/webapp/components/emoji/components/delete_emoji_modal.jsx new file mode 100644 index 0000000000..604e3a27ba --- /dev/null +++ b/webapp/components/emoji/components/delete_emoji_modal.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import {FormattedMessage} from 'react-intl'; + +import DeleteModalTrigger from '../../delete_modal_trigger.jsx'; + +export default class DeleteEmoji extends DeleteModalTrigger { + get triggerTitle() { + return ( + + ); + } + + get modalTitle() { + return ( + + ); + } + + get modalMessage() { + return ( +
+ + +
+ ); + } + + get modalConfirmButton() { + return ( + + ); + } +} + +DeleteEmoji.propTypes = { + onDelete: React.PropTypes.func.isRequired +}; diff --git a/webapp/components/emoji/components/emoji_list_item.jsx b/webapp/components/emoji/components/emoji_list_item.jsx index f2ed82ba79..019b0ca935 100644 --- a/webapp/components/emoji/components/emoji_list_item.jsx +++ b/webapp/components/emoji/components/emoji_list_item.jsx @@ -4,6 +4,7 @@ import React from 'react'; import EmojiStore from 'stores/emoji_store.jsx'; +import DeleteEmoji from './delete_emoji_modal.jsx'; import * as Utils from 'utils/utils.jsx'; @@ -80,15 +81,7 @@ export default class EmojiListItem extends React.Component { let deleteButton = null; if (this.props.onDelete) { deleteButton = ( - - - + ); } diff --git a/webapp/components/integrations/components/delete_integration.jsx b/webapp/components/integrations/components/delete_integration.jsx index 442ac57f76..8e2e27596c 100644 --- a/webapp/components/integrations/components/delete_integration.jsx +++ b/webapp/components/integrations/components/delete_integration.jsx @@ -1,48 +1,29 @@ import React from 'react'; import {FormattedMessage} from 'react-intl'; -import ConfirmModal from '../../confirm_modal.jsx'; +import DeleteModalTrigger from '../../delete_modal_trigger.jsx'; -export default class DeleteIntegration extends React.Component { - constructor(props) { - super(props); - - this.handleConfirm = this.handleConfirm.bind(this); - this.handleCancel = this.handleCancel.bind(this); - this.handleOpenModal = this.handleOpenModal.bind(this); - - this.state = { - showDeleteModal: false - }; +export default class DeleteIntegration extends DeleteModalTrigger { + get triggerTitle() { + return ( + + ); } - handleOpenModal(e) { - e.preventDefault(); - - this.setState({ - showDeleteModal: true - }); - } - - handleConfirm() { - this.props.onDelete(); - } - - handleCancel() { - this.setState({ - showDeleteModal: false - }); - } - - render() { - const title = ( + get modalTitle() { + return ( ); + } - const message = ( + get modalMessage() { + return (
); + } - const confirmButton = ( + get modalConfirmButton() { + return ( ); - - return ( - - - - - - - ); } } diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json old mode 100644 new mode 100755 index bc30b53e72..85974b7215 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -1275,6 +1275,9 @@ "emoji_list.add": "Add Custom Emoji", "emoji_list.creator": "Creator", "emoji_list.delete": "Delete", + "emoji_list.delete.confirm.button": "Delete", + "emoji_list.delete.confirm.msg": "This action permanently deletes the custom emoji. Are you sure you want to delete it?", + "emoji_list.delete.confirm.title": "Delete Custom Emoji", "emoji_list.empty": "No Custom Emoji Found", "emoji_list.header": "Custom Emoji", "emoji_list.help": "Custom emoji are available to everyone on your server. Type ':' in a message box to bring up the emoji selection menu. Other users may need to refresh the page before new emojis appear.",