From 571ee74e664a07b14ce5356e3c4a55d753dd9555 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Tue, 6 Dec 2022 17:58:41 -0800 Subject: [PATCH 01/10] pass in previous name --- src/libs/actions/Policy.js | 3 ++- src/pages/workspace/WorkspaceSettingsPage.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js index 9f3edbde34a8..42bd01b98506 100644 --- a/src/libs/actions/Policy.js +++ b/src/libs/actions/Policy.js @@ -352,7 +352,7 @@ function clearAvatarErrors(policyID) { * @param {String} name * @param {String} currency */ -function updateGeneralSettings(policyID, name, currency) { +function updateGeneralSettings(policyID, name, currency, prevName) { const optimisticData = [ { onyxMethod: CONST.ONYX.METHOD.MERGE, @@ -395,6 +395,7 @@ function updateGeneralSettings(policyID, name, currency) { [DateUtils.getMicroseconds()]: Localize.translateLocal('workspace.editor.genericFailureMessage'), }, }, + name: prevName, }, }, ]; diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 9916619518c6..48300bd1a5a5 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -58,7 +58,7 @@ class WorkspaceSettingsPage extends React.Component { } const name = values.name.trim(); const outputCurrency = values.currency; - Policy.updateGeneralSettings(this.props.policy.id, name, outputCurrency); + Policy.updateGeneralSettings(this.props.policy.id, name, outputCurrency, this.props.policy.name); Keyboard.dismiss(); } From 9a4c1edacafd085296b7f60be1039689c2bfcdd3 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Wed, 7 Dec 2022 14:37:21 -0800 Subject: [PATCH 02/10] add trimming --- src/libs/actions/Policy.js | 3 +-- src/pages/workspace/WorkspaceSettingsPage.js | 14 ++++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js index 42bd01b98506..9f3edbde34a8 100644 --- a/src/libs/actions/Policy.js +++ b/src/libs/actions/Policy.js @@ -352,7 +352,7 @@ function clearAvatarErrors(policyID) { * @param {String} name * @param {String} currency */ -function updateGeneralSettings(policyID, name, currency, prevName) { +function updateGeneralSettings(policyID, name, currency) { const optimisticData = [ { onyxMethod: CONST.ONYX.METHOD.MERGE, @@ -395,7 +395,6 @@ function updateGeneralSettings(policyID, name, currency, prevName) { [DateUtils.getMicroseconds()]: Localize.translateLocal('workspace.editor.genericFailureMessage'), }, }, - name: prevName, }, }, ]; diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 48300bd1a5a5..e5cf78f977fb 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -36,8 +36,9 @@ class WorkspaceSettingsPage extends React.Component { constructor(props) { super(props); - this.submit = this.submit.bind(this); this.getCurrencyItems = this.getCurrencyItems.bind(this); + this.submit = this.submit.bind(this); + this.trimName = this.trimName.bind(this); this.validate = this.validate.bind(this); } @@ -56,20 +57,25 @@ class WorkspaceSettingsPage extends React.Component { if (this.props.policy.isPolicyUpdating) { return; } - const name = values.name.trim(); + const name = this.trimName(values.name); const outputCurrency = values.currency; - Policy.updateGeneralSettings(this.props.policy.id, name, outputCurrency, this.props.policy.name); + Policy.updateGeneralSettings(this.props.policy.id, name, outputCurrency); Keyboard.dismiss(); } validate(values) { const errors = {}; - if (!values.name || !values.name.trim().length) { + const name = this.trimName(values.name); + if (!name || !name.length) { errors.name = this.props.translate('workspace.editor.nameIsRequiredError'); } return errors; } + trimName(name) { + return name.replace(/<(.|\n)*?>/g, '').trim(); + } + render() { return ( From 1c91cfc369495a73add42746e515b5d72a1f4d6b Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Wed, 18 Jan 2023 18:06:10 -0800 Subject: [PATCH 03/10] add hasHtml check --- src/pages/workspace/WorkspaceSettingsPage.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 1d15f6edfbd3..b9fa9540b4c8 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -37,7 +37,7 @@ class WorkspaceSettingsPage extends React.Component { this.getCurrencyItems = this.getCurrencyItems.bind(this); this.submit = this.submit.bind(this); - this.trimName = this.trimName.bind(this); + this.hasHtml = this.hasHtml.bind(this); this.validate = this.validate.bind(this); } @@ -56,23 +56,28 @@ class WorkspaceSettingsPage extends React.Component { if (this.props.policy.isPolicyUpdating) { return; } - const name = this.trimName(values.name); const outputCurrency = values.currency; - Policy.updateGeneralSettings(this.props.policy.id, name, outputCurrency); + Policy.updateGeneralSettings(this.props.policy.id, values.name, outputCurrency); Keyboard.dismiss(); } validate(values) { const errors = {}; - const name = this.trimName(values.name); - if (!name || !name.length) { + + if (this.hasHtml(values.name)) { + errors.name = 'has html'; + } + + if (!values.name || !values.name.length) { errors.name = this.props.translate('workspace.editor.nameIsRequiredError'); } return errors; } - trimName(name) { - return name.replace(/<(.|\n)*?>/g, '').trim(); + hasHtml(name) { + const trimmedName = name.trim(); + console.log(trimmedName.search(/<(.|\n)*?>/g)); + return trimmedName.search(/<(.|\n)*?>/g) != -1; } render() { From 5cf6e5eb913a9ca1a8687c256234bdefa6071e69 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Thu, 19 Jan 2023 15:27:43 -0800 Subject: [PATCH 04/10] remove console logs --- src/pages/workspace/WorkspaceSettingsPage.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index e14061521051..65a5eebdacb6 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -65,7 +65,7 @@ class WorkspaceSettingsPage extends React.Component { const errors = {}; if (this.hasHtml(values.name)) { - errors.name = 'has html'; + errors.name = 'HTML tags are not allowed in workspace names.'; } if (!values.name || !values.name.length) { @@ -76,7 +76,6 @@ class WorkspaceSettingsPage extends React.Component { hasHtml(name) { const trimmedName = name.trim(); - console.log(trimmedName.search(/<(.|\n)*?>/g)); return trimmedName.search(/<(.|\n)*?>/g) != -1; } From 0ffd526ff14acf194e1d3a836b89871245b3b5b8 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Thu, 19 Jan 2023 15:34:33 -0800 Subject: [PATCH 05/10] clean up --- src/pages/workspace/WorkspaceSettingsPage.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 65a5eebdacb6..1ddafa4653e5 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -63,20 +63,21 @@ class WorkspaceSettingsPage extends React.Component { validate(values) { const errors = {}; + const name = values.name.trim(); - if (this.hasHtml(values.name)) { + if (this.hasHtml(name)) { errors.name = 'HTML tags are not allowed in workspace names.'; } - if (!values.name || !values.name.length) { + if (!name || !name.length) { errors.name = this.props.translate('workspace.editor.nameIsRequiredError'); } + return errors; } hasHtml(name) { - const trimmedName = name.trim(); - return trimmedName.search(/<(.|\n)*?>/g) != -1; + return name.search(/<(.|\n)*?>/g) != -1; } render() { From 51c619f8033071155e367dd1065d804d92df71f4 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Thu, 19 Jan 2023 17:13:28 -0800 Subject: [PATCH 06/10] clarify --- src/pages/workspace/WorkspaceSettingsPage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 1ddafa4653e5..413589dcba15 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -77,6 +77,7 @@ class WorkspaceSettingsPage extends React.Component { } hasHtml(name) { + // Searches for anything that looks like an html tag "< >"" return name.search(/<(.|\n)*?>/g) != -1; } From 8c6cef464bcc2032bef6424c718d0af92bf9a974 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Thu, 19 Jan 2023 23:25:02 -0800 Subject: [PATCH 07/10] lint --- src/pages/workspace/WorkspaceSettingsPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 413589dcba15..9d5467f8fb58 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -78,7 +78,7 @@ class WorkspaceSettingsPage extends React.Component { hasHtml(name) { // Searches for anything that looks like an html tag "< >"" - return name.search(/<(.|\n)*?>/g) != -1; + return name.search(/<(.|\n)*?>/g) !== -1; } render() { From 4d46195f3e346c35f53b26424607be91a1d0db9f Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Fri, 20 Jan 2023 15:24:04 -0800 Subject: [PATCH 08/10] use translate --- src/languages/en.js | 3 ++- src/languages/es.js | 1 + src/pages/workspace/WorkspaceSettingsPage.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 98f254b2321a..0d4066dc3275 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -944,7 +944,8 @@ export default { editor: { nameInputLabel: 'Name', nameInputHelpText: 'This is the name you will see on your workspace.', - nameIsRequiredError: 'You need to define a name for your workspace', + nameIsRequiredError: 'You need to define a name for your workspace.', + nameHasHtml: 'HTML tags are not allowed in workspace names.', currencyInputLabel: 'Default currency', currencyInputHelpText: 'All expenses on this workspace will be converted to this currency.', save: 'Save', diff --git a/src/languages/es.js b/src/languages/es.js index eeb46d702bd5..ab5a96b008f9 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -947,6 +947,7 @@ export default { nameInputLabel: 'Nombre', nameInputHelpText: 'Este es el nombre que verás en tu espacio de trabajo.', nameIsRequiredError: 'Debes definir un nombre para tu espacio de trabajo.', + nameHasHtml: 'Las etiquetas HTML no están permitidas en los nombres de espacios de trabajo.', currencyInputLabel: 'Moneda por defecto', currencyInputHelpText: 'Todas los gastos en este espacio de trabajo serán convertidos a esta moneda.', save: 'Guardar', diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 9d5467f8fb58..88bde770e9b2 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -66,7 +66,7 @@ class WorkspaceSettingsPage extends React.Component { const name = values.name.trim(); if (this.hasHtml(name)) { - errors.name = 'HTML tags are not allowed in workspace names.'; + errors.name = this.props.translate('workspace.editor.nameHasHtml'); } if (!name || !name.length) { From 3a3ab8d72c2819a963b653c397c6e32dc4d4dd20 Mon Sep 17 00:00:00 2001 From: Kosuke Tseng Date: Mon, 23 Jan 2023 22:15:17 -0800 Subject: [PATCH 09/10] feedback changes --- src/languages/es.js | 2 +- src/pages/workspace/WorkspaceSettingsPage.js | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/languages/es.js b/src/languages/es.js index ab5a96b008f9..7d51150d6f7e 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -947,7 +947,7 @@ export default { nameInputLabel: 'Nombre', nameInputHelpText: 'Este es el nombre que verás en tu espacio de trabajo.', nameIsRequiredError: 'Debes definir un nombre para tu espacio de trabajo.', - nameHasHtml: 'Las etiquetas HTML no están permitidas en los nombres de espacios de trabajo.', + nameHasHtml: 'Las etiquetas HTML no están permitidas en los nombres de los espacios de trabajo.', currencyInputLabel: 'Moneda por defecto', currencyInputHelpText: 'Todas los gastos en este espacio de trabajo serán convertidos a esta moneda.', save: 'Guardar', diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 88bde770e9b2..c5d37c15083a 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -65,7 +65,8 @@ class WorkspaceSettingsPage extends React.Component { const errors = {}; const name = values.name.trim(); - if (this.hasHtml(name)) { + // Searches for anything that looks like an html tag "< >"" + if (name.search(/<(.|\n)*?>/g) !== -1) { errors.name = this.props.translate('workspace.editor.nameHasHtml'); } @@ -76,11 +77,6 @@ class WorkspaceSettingsPage extends React.Component { return errors; } - hasHtml(name) { - // Searches for anything that looks like an html tag "< >"" - return name.search(/<(.|\n)*?>/g) !== -1; - } - render() { return ( Date: Mon, 23 Jan 2023 22:15:31 -0800 Subject: [PATCH 10/10] clean up --- src/pages/workspace/WorkspaceSettingsPage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index c5d37c15083a..b67e774fbcb4 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -37,7 +37,6 @@ class WorkspaceSettingsPage extends React.Component { this.getCurrencyItems = this.getCurrencyItems.bind(this); this.submit = this.submit.bind(this); - this.hasHtml = this.hasHtml.bind(this); this.validate = this.validate.bind(this); }