Skip to content

Commit

Permalink
Added field validation
Browse files Browse the repository at this point in the history
  • Loading branch information
bschlintz committed Oct 7, 2020
1 parent 6fceb05 commit d0e57d8
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 6 deletions.
2 changes: 1 addition & 1 deletion config/package-solution.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"solution": {
"name": "Page Navigation Web Part",
"id": "840975cd-1c33-4576-a145-8c5e4d6c5b7c",
"version": "1.0.1.0",
"version": "1.0.0.0",
"includeClientSideAssets": true,
"isDomainIsolated": false,
"skipFeatureDeployment": false,
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "page-navigation",
"version": "1.0.1",
"version": "1.0.0",
"private": true,
"main": "lib/index.js",
"engines": {
Expand Down
2 changes: 1 addition & 1 deletion src/webparts/pageNavigation/components/EditMode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const EditMode: React.FC<IEditPanelProps> = ({ navTitle, navLinks, onSave, onCan

return (
<Stack className={styles.navEditOuterContainer} tokens={{ childrenGap: 10 }}>
<TextField styles={{field: styles.navEditPageNavField}} placeholder="Page Navigation" value={localNavTitle} onChange={onNavTitleChange} />
<TextField styles={{field: styles.navEditPageNavField}} placeholder="Page Navigation" value={localNavTitle} onChange={onNavTitleChange} maxLength={255} />
<NavEditor navLinks={localNavLinks} onNavLinksChange={onNavLinksChange}/>
<Stack horizontal horizontalAlign="end" tokens={{childrenGap: 10 }}>
<DefaultButton disabled={isSaving} onClick={onCancel}>Cancel</DefaultButton>
Expand Down
23 changes: 21 additions & 2 deletions src/webparts/pageNavigation/components/NavLinkModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,23 @@ export interface INavLinkModalProps {
onCancel: () => void;
onSave: (newOrUpdatedNavLink: PageNavLink) => void;
}
const INVALID_URL_MESSAGE = "Invalid: URL must start with /, http://, or https://";

const NavLinkModal: React.FC<INavLinkModalProps> = ({ navLink, isOpen, isAdd, onSave, onCancel }) => {
const [ hasChanges, setHasChanges ] = useState<boolean>(false);
const [ localNavLink, setLocalNavLink ] = useState<PageNavLink>(navLink);
const [ urlValidationError, setUrlValidationError ] = useState<string>(null);

const isValidUrl = (url: string): boolean => {
try {
if (url.startsWith('/')) return true;
if (url.startsWith('https://')) return true;
if (url.startsWith('http://')) return true;
}
catch {
return false;
}
};

const onTitleChange = (event: any, newValue: string) => {
setLocalNavLink({
Expand All @@ -33,6 +46,7 @@ const NavLinkModal: React.FC<INavLinkModalProps> = ({ navLink, isOpen, isAdd, on
...localNavLink,
url: newValue
});
setUrlValidationError(isValidUrl(newValue) ? null: INVALID_URL_MESSAGE);
setHasChanges(true);
};

Expand Down Expand Up @@ -73,7 +87,7 @@ const NavLinkModal: React.FC<INavLinkModalProps> = ({ navLink, isOpen, isAdd, on
{localNavLink && <>
<Stack tokens={{ childrenGap: 10 }}>
<TextField label="Title" value={localNavLink.title} onChange={onTitleChange} />
<TextField label="URL" value={localNavLink.url} onChange={onUrlChange} />
<TextField label="URL" value={localNavLink.url} onChange={onUrlChange} errorMessage={urlValidationError} />
<Toggle
label="Open In New Tab"
checked={typeof(localNavLink.newTab) === "undefined" ? false : localNavLink.newTab}
Expand All @@ -88,7 +102,12 @@ const NavLinkModal: React.FC<INavLinkModalProps> = ({ navLink, isOpen, isAdd, on
)}
<Stack horizontal horizontalAlign="end" tokens={{ padding: '10px 0 0 0', childrenGap: 10 }}>
<DefaultButton onClick={onCancel}>Cancel</DefaultButton>
<PrimaryButton disabled={!hasChanges || !localNavLink.title || !localNavLink.url} onClick={onClickSave}>Save</PrimaryButton>
{/* Can save when
1) there are changes
2) the title and url fields are not blank
3) the url field is a valid http URL
*/}
<PrimaryButton disabled={!hasChanges || !localNavLink.title || !localNavLink.url || !!urlValidationError} onClick={onClickSave}>Save</PrimaryButton>
</Stack>
</Stack>
</>}
Expand Down

0 comments on commit d0e57d8

Please sign in to comment.