Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added limit exceed error message with new limit #33601

Merged
merged 22 commits into from
Feb 10, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ebf46e0
Added limit exceed error message with new limit
dhairyasenjaliya Dec 26, 2023
d791082
type fixes
dhairyasenjaliya Dec 26, 2023
8416455
added for remaning room
dhairyasenjaliya Dec 28, 2023
cb61222
limit on legal name
dhairyasenjaliya Jan 9, 2024
36492af
Fix to display both error validation
dhairyasenjaliya Jan 16, 2024
69a50b1
Fix legal name errors
dhairyasenjaliya Jan 16, 2024
1a8f405
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Jan 19, 2024
93121c7
fix typo
dhairyasenjaliya Jan 19, 2024
cd20094
Change const name to more relavent
dhairyasenjaliya Feb 1, 2024
eb5bd6d
merge
dhairyasenjaliya Feb 1, 2024
f34d83b
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Feb 1, 2024
8941290
Resolve conflict
dhairyasenjaliya Feb 1, 2024
784d5bc
Resolve conflict - 1
dhairyasenjaliya Feb 1, 2024
130fa1b
Resolve conflict - 2
dhairyasenjaliya Feb 1, 2024
614659c
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Feb 1, 2024
02883ac
Resolve conflict - 3
dhairyasenjaliya Feb 1, 2024
00eedcc
added proper error messages
dhairyasenjaliya Feb 2, 2024
3fa1172
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Feb 2, 2024
2dc88fa
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Feb 6, 2024
36d9542
Remove key for welcome message
dhairyasenjaliya Feb 6, 2024
7e4d7db
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Feb 6, 2024
4b2b5ab
Merge branch 'main' of https://github.com/dhairyasenjaliya/Expensify …
dhairyasenjaliya Feb 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1551,7 +1551,10 @@ const CONST = {
FORM_CHARACTER_LIMIT: 50,
LEGAL_NAMES_CHARACTER_LIMIT: 150,
LOGIN_CHARACTER_LIMIT: 254,
WORKSPACE_NAME_CHARACTER_LIMIT: 80,

TITLE_CHARACTER_LIMIT: 100,
DESCRIPTION_LIMIT: 500,

AVATAR_CROP_MODAL: {
// The next two constants control what is min and max value of the image crop scale.
// Values define in how many times the image can be bigger than its container.
Expand Down
1 change: 0 additions & 1 deletion src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1651,7 +1651,6 @@ export default {
nameInputLabel: 'Name',
nameInputHelpText: 'This is the name you will see on your workspace.',
nameIsRequiredError: 'You need to define a name for your workspace.',
nameIsTooLongError: `Your workspace name can be at most ${CONST.WORKSPACE_NAME_CHARACTER_LIMIT} characters long.`,
currencyInputLabel: 'Default currency',
currencyInputHelpText: 'All expenses on this workspace will be converted to this currency.',
currencyInputDisabledText: "The default currency can't be changed because this workspace is linked to a USD bank account.",
Expand Down
1 change: 0 additions & 1 deletion src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1674,7 +1674,6 @@ 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.',
nameIsTooLongError: `El nombre de su espacio de trabajo no puede tener más de ${CONST.WORKSPACE_NAME_CHARACTER_LIMIT} caracteres.`,
currencyInputLabel: 'Moneda por defecto',
currencyInputHelpText: 'Todas los gastos en este espacio de trabajo serán convertidos a esta moneda.',
currencyInputDisabledText: 'La moneda predeterminada no se puede cambiar porque este espacio de trabajo está vinculado a una cuenta bancaria en USD.',
Expand Down
17 changes: 17 additions & 0 deletions src/pages/EditRequestDescriptionPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import TextInput from '@components/TextInput';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import * as Browser from '@libs/Browser';
import * as ErrorUtils from '@libs/ErrorUtils';
import updateMultilineInputRange from '@libs/updateMultilineInputRange';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand All @@ -28,6 +29,21 @@ function EditRequestDescriptionPage({defaultDescription, onSubmit}) {
const descriptionInputRef = useRef(null);
const focusTimeoutRef = useRef(null);

/**
* @param {Object} values
* @param {String} values.title
* @returns {Object} - An object containing the errors for each inputID
*/
const validate = useCallback((values) => {
const errors = {};

if (values.comment.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'comment', ['common.error.characterLimitExceedCounter', {length: values.comment.length, limit: CONST.DESCRIPTION_LIMIT}]);
}

return errors;
}, []);

useFocusEffect(
useCallback(() => {
focusTimeoutRef.current = setTimeout(() => {
Expand Down Expand Up @@ -55,6 +71,7 @@ function EditRequestDescriptionPage({defaultDescription, onSubmit}) {
style={[styles.flexGrow1, styles.ph5]}
formID={ONYXKEYS.FORMS.MONEY_REQUEST_DESCRIPTION_FORM}
onSubmit={onSubmit}
validate={validate}
submitButtonText={translate('common.save')}
enabledWhenOffline
>
Expand Down
15 changes: 15 additions & 0 deletions src/pages/ReportWelcomeMessagePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,21 @@ function ReportWelcomeMessagePage({report, policy}: ReportWelcomeMessagePageProp
setWelcomeMessage(value);
}, []);

/**
* @param {Object} values
* @param {String} values.title
* @returns {Object} - An object containing the errors for each inputID
*/
const validate = useCallback((values) => {
dhairyasenjaliya marked this conversation as resolved.
Show resolved Hide resolved
const errors = {};

if (values.welcomeMessage.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'welcomeMessage', ['common.error.characterLimitExceedCounter', {length: values.welcomeMessage.length, limit: CONST.DESCRIPTION_LIMIT}]);
}

return errors;
}, []);

const submitForm = useCallback(() => {
Report.updateWelcomeMessage(report?.reportID ?? '', report?.welcomeMessage ?? '', welcomeMessage.trim());
}, [report?.reportID, report?.welcomeMessage, welcomeMessage]);
Expand Down
20 changes: 20 additions & 0 deletions src/pages/iou/MoneyRequestDescriptionPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import * as IOU from '@libs/actions/IOU';
import * as Browser from '@libs/Browser';
import * as ErrorUtils from '@libs/ErrorUtils';
import * as MoneyRequestUtils from '@libs/MoneyRequestUtils';
import Navigation from '@libs/Navigation/Navigation';
import updateMultilineInputRange from '@libs/updateMultilineInputRange';
Expand Down Expand Up @@ -95,6 +96,24 @@ function MoneyRequestDescriptionPage({iou, route, selectedTab}) {
Navigation.goBack(ROUTES.MONEY_REQUEST_CONFIRMATION.getRoute(iouType, reportID));
}

/**
* @param {Object} values
* @param {String} values.title
* @returns {Object} - An object containing the errors for each inputID
*/
const validate = useCallback((values) => {
const errors = {};

if (values.moneyRequestComment.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'moneyRequestComment', [
'common.error.characterLimitExceedCounter',
{length: values.moneyRequestComment.length, limit: CONST.DESCRIPTION_LIMIT},
]);
}

return errors;
}, []);

/**
* Sets the money request comment by saving it to Onyx.
*
Expand All @@ -121,6 +140,7 @@ function MoneyRequestDescriptionPage({iou, route, selectedTab}) {
style={[styles.flexGrow1, styles.ph5]}
formID={ONYXKEYS.FORMS.MONEY_REQUEST_DESCRIPTION_FORM}
onSubmit={(value) => updateComment(value)}
validate={validate}
submitButtonText={translate('common.save')}
enabledWhenOffline
>
Expand Down
20 changes: 20 additions & 0 deletions src/pages/iou/request/step/IOURequestStepDescription.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import * as Browser from '@libs/Browser';
import compose from '@libs/compose';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import updateMultilineInputRange from '@libs/updateMultilineInputRange';
import * as IOU from '@userActions/IOU';
Expand Down Expand Up @@ -61,6 +62,24 @@ function IOURequestStepDescription({
}, []),
);

/**
* @param {Object} values
* @param {String} values.title
* @returns {Object} - An object containing the errors for each inputID
*/
const validate = useCallback((values) => {
const errors = {};

if (values.moneyRequestComment.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'moneyRequestComment', [
'common.error.characterLimitExceedCounter',
{length: values.moneyRequestComment.length, limit: CONST.DESCRIPTION_LIMIT},
]);
}

return errors;
}, []);

const navigateBack = () => {
Navigation.goBack(backTo || ROUTES.HOME);
};
Expand All @@ -85,6 +104,7 @@ function IOURequestStepDescription({
style={[styles.flexGrow1, styles.ph5]}
formID={ONYXKEYS.FORMS.MONEY_REQUEST_DESCRIPTION_FORM}
onSubmit={updateComment}
validate={validate}
submitButtonText={translate('common.save')}
enabledWhenOffline
>
Expand Down
12 changes: 4 additions & 8 deletions src/pages/settings/Profile/PersonalDetails/LegalNamePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,23 @@ function LegalNamePage(props) {
ErrorUtils.addErrorMessage(errors, 'legalFirstName', 'privatePersonalDetails.error.hasInvalidCharacter');
} else if (_.isEmpty(values.legalFirstName)) {
errors.legalFirstName = 'common.error.fieldRequired';
} else if (values.legalFirstName.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'legalFirstName', ['common.error.characterLimitExceedCounter', {length: values.legalFirstName.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}
if (ValidationUtils.doesContainReservedWord(values.legalFirstName, CONST.DISPLAY_NAME.RESERVED_NAMES)) {
ErrorUtils.addErrorMessage(errors, 'legalFirstName', 'personalDetails.error.containsReservedWord');
}
if (values.legalFirstName.length > CONST.LEGAL_NAME.MAX_LENGTH) {
ErrorUtils.addErrorMessage(errors, 'legalFirstName', ['common.error.characterLimitExceedCounter', {length: values.legalFirstName.length, limit: CONST.LEGAL_NAME.MAX_LENGTH}]);
}

if (!ValidationUtils.isValidLegalName(values.legalLastName)) {
ErrorUtils.addErrorMessage(errors, 'legalLastName', 'privatePersonalDetails.error.hasInvalidCharacter');
} else if (_.isEmpty(values.legalLastName)) {
errors.legalLastName = 'common.error.fieldRequired';
} else if (values.legalLastName.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'legalLastName', ['common.error.characterLimitExceedCounter', {length: values.legalLastName.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}
if (ValidationUtils.doesContainReservedWord(values.legalLastName, CONST.DISPLAY_NAME.RESERVED_NAMES)) {
ErrorUtils.addErrorMessage(errors, 'legalLastName', 'personalDetails.error.containsReservedWord');
}
if (values.legalLastName.length > CONST.LEGAL_NAME.MAX_LENGTH) {
ErrorUtils.addErrorMessage(errors, 'legalLastName', ['common.error.characterLimitExceedCounter', {length: values.legalLastName.length, limit: CONST.LEGAL_NAME.MAX_LENGTH}]);
}

return errors;
}, []);
Expand Down Expand Up @@ -112,7 +110,6 @@ function LegalNamePage(props) {
aria-label={props.translate('privatePersonalDetails.legalFirstName')}
role={CONST.ROLE.PRESENTATION}
defaultValue={legalFirstName}
maxLength={CONST.LEGAL_NAME.MAX_LENGTH + CONST.SEARCH_MAX_LENGTH}
spellCheck={false}
/>
</View>
Expand All @@ -125,7 +122,6 @@ function LegalNamePage(props) {
aria-label={props.translate('privatePersonalDetails.legalLastName')}
role={CONST.ROLE.PRESENTATION}
defaultValue={legalLastName}
maxLength={CONST.LEGAL_NAME.MAX_LENGTH + CONST.SEARCH_MAX_LENGTH}
spellCheck={false}
/>
</View>
Expand Down
2 changes: 2 additions & 0 deletions src/pages/settings/Report/RoomNamePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ function RoomNamePage({policy, report, reports, translate}) {
} else if (ValidationUtils.isExistingRoomName(values.roomName, reports, report.policyID)) {
// The room name can't be set to one that already exists on the policy
ErrorUtils.addErrorMessage(errors, 'roomName', 'newRoomPage.roomAlreadyExistsError');
} else if (values.roomName.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'roomName', ['common.error.characterLimitExceedCounter', {length: values.roomName.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}

return errors;
Expand Down
16 changes: 16 additions & 0 deletions src/pages/tasks/NewTaskDescriptionPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useThemeStyles from '@hooks/useThemeStyles';
import * as Browser from '@libs/Browser';
import compose from '@libs/compose';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import updateMultilineInputRange from '@libs/updateMultilineInputRange';
import * as Task from '@userActions/Task';
Expand Down Expand Up @@ -47,6 +48,20 @@ function NewTaskDescriptionPage(props) {
Navigation.goBack(ROUTES.NEW_TASK);
};

/**
* @param {Object} values - form input values passed by the Form component
* @returns {Boolean}
*/
function validate(values) {
const errors = {};

if (values.taskDescription.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'taskDescription', ['common.error.characterLimitExceedCounter', {length: values.taskDescription.length, limit: CONST.DESCRIPTION_LIMIT}]);
}

return errors;
}

return (
<ScreenWrapper
includeSafeAreaPaddingBottom={false}
Expand All @@ -63,6 +78,7 @@ function NewTaskDescriptionPage(props) {
formID={ONYXKEYS.FORMS.NEW_TASK_FORM}
submitButtonText={props.translate('common.next')}
style={[styles.mh5, styles.flexGrow1]}
validate={(values) => validate(values)}
onSubmit={(values) => onSubmit(values)}
enabledWhenOffline
>
Expand Down
5 changes: 5 additions & 0 deletions src/pages/tasks/NewTaskDetailsPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@ function NewTaskDetailsPage(props) {
if (!values.taskTitle) {
// We error if the user doesn't enter a task name
ErrorUtils.addErrorMessage(errors, 'taskTitle', 'newTaskPage.pleaseEnterTaskName');
} else if (values.taskTitle.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'taskTitle', ['common.error.characterLimitExceedCounter', {length: values.taskTitle.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}
if (values.taskDescription.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'taskDescription', ['common.error.characterLimitExceedCounter', {length: values.taskDescription.length, limit: CONST.DESCRIPTION_LIMIT}]);
}

return errors;
Expand Down
2 changes: 2 additions & 0 deletions src/pages/tasks/NewTaskTitlePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ function NewTaskTitlePage(props) {
if (!values.taskTitle) {
// We error if the user doesn't enter a task name
ErrorUtils.addErrorMessage(errors, 'taskTitle', 'newTaskPage.pleaseEnterTaskName');
} else if (values.taskTitle.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'taskTitle', ['common.error.characterLimitExceedCounter', {length: values.taskTitle.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}

return errors;
Expand Down
16 changes: 15 additions & 1 deletion src/pages/tasks/TaskDescriptionPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import withLocalize, {withLocalizePropTypes} from '@components/withLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import * as Browser from '@libs/Browser';
import compose from '@libs/compose';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as ReportUtils from '@libs/ReportUtils';
import StringUtils from '@libs/StringUtils';
Expand Down Expand Up @@ -49,7 +50,20 @@ const defaultProps = {
const parser = new ExpensiMark();
function TaskDescriptionPage(props) {
const styles = useThemeStyles();
const validate = useCallback(() => ({}), []);

/**
* @param {Object} values - form input values passed by the Form component
* @returns {Boolean}
*/
const validate = useCallback((values) => {
const errors = {};

if (values.description.length > CONST.DESCRIPTION_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'description', ['common.error.characterLimitExceedCounter', {length: values.description.length, limit: CONST.DESCRIPTION_LIMIT}]);
}

return errors;
}, []);

const submit = useCallback(
(values) => {
Expand Down
3 changes: 3 additions & 0 deletions src/pages/tasks/TaskTitlePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalD
import withLocalize, {withLocalizePropTypes} from '@components/withLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import compose from '@libs/compose';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as ReportUtils from '@libs/ReportUtils';
import withReportOrNotFound from '@pages/home/report/withReportOrNotFound';
Expand Down Expand Up @@ -53,6 +54,8 @@ function TaskTitlePage(props) {

if (_.isEmpty(values.title)) {
errors.title = 'newTaskPage.pleaseEnterTaskName';
} else if (values.title.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'title', ['common.error.characterLimitExceedCounter', {length: values.title.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}

return errors;
Expand Down
2 changes: 2 additions & 0 deletions src/pages/workspace/WorkspaceNewRoomPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@ function WorkspaceNewRoomPage(props) {
} else if (ValidationUtils.isExistingRoomName(values.roomName, props.reports, values.policyID)) {
// Certain names are reserved for default rooms and should not be used for policy rooms.
ErrorUtils.addErrorMessage(errors, 'roomName', 'newRoomPage.roomAlreadyExistsError');
} else if (values.roomName.length > CONST.TITLE_CHARACTER_LIMIT) {
ErrorUtils.addErrorMessage(errors, 'roomName', ['common.error.characterLimitExceedCounter', {length: values.roomName.length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}

if (!values.policyID) {
Expand Down
6 changes: 3 additions & 3 deletions src/pages/workspace/WorkspaceSettingsPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import withWindowDimensions, {windowDimensionsPropTypes} from '@components/withW
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import compose from '@libs/compose';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as ReportUtils from '@libs/ReportUtils';
import * as UserUtils from '@libs/UserUtils';
Expand Down Expand Up @@ -81,10 +82,10 @@ function WorkspaceSettingsPage({policy, currencyList, windowWidth, route}) {

if (!ValidationUtils.isRequiredFulfilled(name)) {
errors.name = 'workspace.editor.nameIsRequiredError';
} else if ([...name].length > CONST.WORKSPACE_NAME_CHARACTER_LIMIT) {
} else if ([...name].length > CONST.TITLE_CHARACTER_LIMIT) {
// Uses the spread syntax to count the number of Unicode code points instead of the number of UTF-16
// code units.
errors.name = 'workspace.editor.nameIsTooLongError';
ErrorUtils.addErrorMessage(errors, 'name', ['common.error.characterLimitExceedCounter', {length: [...name].length, limit: CONST.TITLE_CHARACTER_LIMIT}]);
}

return errors;
Expand Down Expand Up @@ -150,7 +151,6 @@ function WorkspaceSettingsPage({policy, currencyList, windowWidth, route}) {
label={translate('workspace.editor.nameInputLabel')}
accessibilityLabel={translate('workspace.editor.nameInputLabel')}
defaultValue={policy.name}
maxLength={CONST.WORKSPACE_NAME_CHARACTER_LIMIT}
containerStyles={[styles.mt4]}
spellCheck={false}
/>
Expand Down
Loading