diff --git a/ui/src/dataExplorer/components/SaveAsTaskForm.tsx b/ui/src/dataExplorer/components/SaveAsTaskForm.tsx index e25f3836f0..c1f255de2c 100644 --- a/ui/src/dataExplorer/components/SaveAsTaskForm.tsx +++ b/ui/src/dataExplorer/components/SaveAsTaskForm.tsx @@ -87,13 +87,7 @@ class SaveAsTaskForm extends PureComponent { } public render() { - const { - taskOptions, - dismiss, - tokens, - tokenStatus, - selectedToken, - } = this.props + const {taskOptions, dismiss, tokenStatus, selectedToken} = this.props return ( { onSubmit={this.handleSubmit} canSubmit={this.isFormValid} dismiss={dismiss} - tokens={tokens} + tokens={this.getRelevantTokens()} selectedToken={selectedToken} onTokenChange={this.handleTokenChange} /> @@ -117,6 +111,49 @@ class SaveAsTaskForm extends PureComponent { ) } + private getRelevantTokens() { + const authorizations = this.props.tokens + + const {draftQueries, activeQueryIndex} = this.props + let readBucketName = '' + if (draftQueries[activeQueryIndex].editMode === 'builder') { + readBucketName = draftQueries[activeQueryIndex].builderConfig.buckets[0] + } else { + const text = draftQueries[activeQueryIndex].text + const res = text.split('bucket:') + readBucketName = res[1].slice(2, 3) + } + const writeBucketName = this.props.taskOptions.toBucketName + + const readAuthorizations = authorizations.filter(auth => + auth.permissions.some( + permission => + permission.action === 'read' && + permission.resource.type === 'buckets' && + (!permission.resource.name || + permission.resource.name === readBucketName) + ) + ) + + const writeAuthorizations = authorizations.filter(auth => + auth.permissions.some( + permission => + permission.action === 'write' && + permission.resource.type === 'buckets' && + (!permission.resource.name || + permission.resource.name === writeBucketName) + ) + ) + + const relevantAuthorizations = _.intersectionBy( + readAuthorizations, + writeAuthorizations, + 'id' + ) + + return relevantAuthorizations + } + private get isFormValid(): boolean { const { taskOptions: {name, cron, interval}, diff --git a/ui/src/tasks/components/TaskTokenDropdown.tsx b/ui/src/tasks/components/TaskTokenDropdown.tsx index e196e47ae2..3bb44f918e 100644 --- a/ui/src/tasks/components/TaskTokenDropdown.tsx +++ b/ui/src/tasks/components/TaskTokenDropdown.tsx @@ -15,21 +15,43 @@ interface Props { export default class TaskTokenDropdown extends PureComponent { public render() { - const {tokens, selectedToken, onTokenChange} = this.props + const {onTokenChange} = this.props return ( - {tokens.map(t => ( - - {t.description || 'Name this token'} - - ))} + {this.dropdownTokens} ) } + private get dropdownTokens(): JSX.Element[] { + const {tokens} = this.props + if (tokens.length > 0) { + return tokens.map(t => ( + + {t.description || 'Name this token'} + + )) + } + return [ + + {'You don’t have any tokens with appropriate permissions for this use'} + , + ] + } + + private get selectedID(): string { + const {selectedToken, tokens} = this.props + + if (tokens.length > 0) { + if (selectedToken) { + return selectedToken.id + } + } + return 'no-tokens' + } }