Add select all button to modals

This commit is contained in:
Gabe Kangas
2021-01-20 22:05:16 -08:00
parent f3d4d095ae
commit 98b122f8c5
3 changed files with 34 additions and 7 deletions

View File

@@ -36,6 +36,7 @@ function convertScopeStringToTag(scopeString) {
function NewTokenModal(props) { function NewTokenModal(props) {
const [selectedScopes, setSelectedScopes] = useState([]); const [selectedScopes, setSelectedScopes] = useState([]);
const [name, setName] = useState('');
const scopes = Object.keys(availableScopes).map(function (key) { const scopes = Object.keys(availableScopes).map(function (key) {
return { value: key, label: availableScopes[key].description } return { value: key, label: availableScopes[key].description }
@@ -46,15 +47,21 @@ function NewTokenModal(props) {
} }
function saveToken() { function saveToken() {
props.onOk(name, selectedScopes) props.onOk(name, selectedScopes);
}
const [name, setName] = useState(''); // Clear the modal
setSelectedScopes([]);
setName('');
}
const okButtonProps = { const okButtonProps = {
disabled: selectedScopes.length === 0 || name === '' disabled: selectedScopes.length === 0 || name === ''
}; };
function selectAll() {
setSelectedScopes(Object.keys(availableScopes));
}
return ( return (
<Modal title="Create New Access token" visible={props.visible} onOk={saveToken} onCancel={props.onCancel} okButtonProps={okButtonProps}> <Modal title="Create New Access token" visible={props.visible} onOk={saveToken} onCancel={props.onCancel} okButtonProps={okButtonProps}>
<p><Input value={name} placeholder="Access token name/description" onChange={(input) => setName(input.currentTarget.value)} /></p> <p><Input value={name} placeholder="Access token name/description" onChange={(input) => setName(input.currentTarget.value)} /></p>
@@ -62,7 +69,8 @@ function NewTokenModal(props) {
<p> <p>
Select the permissions this access token will have. It cannot be edited after it's created. Select the permissions this access token will have. It cannot be edited after it's created.
</p> </p>
<Checkbox.Group options={scopes} onChange={onChange} /> <Checkbox.Group options={scopes} value={selectedScopes} onChange={onChange} />
<Button onClick={selectAll}>Select all</Button>
</Modal> </Modal>
) )
} }

View File

@@ -54,12 +54,20 @@ function NewWebhookModal(props) {
setSelectedEvents(checkedValues); setSelectedEvents(checkedValues);
} }
function selectAll() {
setSelectedEvents(Object.keys(availableEvents));
}
function save() { function save() {
props.onOk(webhookUrl, selectedEvents) props.onOk(webhookUrl, selectedEvents)
// Reset the modal
setWebhookUrl('');
setSelectedEvents(null);
} }
const okButtonProps = { const okButtonProps = {
disabled: selectedEvents.length === 0 || !isValidUrl(webhookUrl) disabled: selectedEvents?.length === 0 || !isValidUrl(webhookUrl)
}; };
return ( return (
@@ -69,7 +77,8 @@ function NewWebhookModal(props) {
<p> <p>
Select the events that will be sent to this webhook. Select the events that will be sent to this webhook.
</p> </p>
<Checkbox.Group options={events} onChange={onChange} /> <Checkbox.Group options={events} value={selectedEvents} onChange={onChange} />
<Button onClick={selectAll}>Select all</Button>
</Modal> </Modal>
) )
} }

10
web/utils/urls.ts Normal file
View File

@@ -0,0 +1,10 @@
// Stolen from https://stackoverflow.com/a/5717133
export function isValidUrl(url: string): boolean {
var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
return !!pattern.test(url);
}