diff --git a/app/dashboard/controller.ts b/app/dashboard/controller.ts index 8f24ac8ad..66f0bae04 100644 --- a/app/dashboard/controller.ts +++ b/app/dashboard/controller.ts @@ -54,6 +54,7 @@ export default class Dashboard extends Controller { popular!: QueryHasManyResult; useSimplePage: boolean = simplePage; useSearch: string = useSearch ? 'true' : 'false'; + canCreateNewProject: boolean = true; @task({ restartable: true }) setupTask = task(function *(this: Dashboard) { @@ -66,6 +67,7 @@ export default class Dashboard extends Controller { this.findNodes.perform(), this.getPopularAndNoteworthy.perform(popularNode, 'popular'), this.getPopularAndNoteworthy.perform(noteworthyNode, 'noteworthy'), + this.checkCreateProjectPermission.perform(), ]); this.set('institutions', institutions.toArray()); @@ -119,6 +121,20 @@ export default class Dashboard extends Controller { } }); + @task({ restartable: true }) + checkCreateProjectPermission = task(function *(this: Dashboard) { + const user = yield this.currentUser.user; + const url: string = `${config.OSF.apiUrl}/v2/users/${user.id}/settings/create-project-permission/`; + try { + const response = yield this.currentUser.authenticatedAJAX({ url }); + if (response) { + this.set('canCreateNewProject', response.can_create_new_project); + } + } catch (e) { + this.set('canCreateNewProject', true); + } + }); + @alias('currentUser.user') user!: User; @or('nodes.length', 'filter', 'findNodes.isRunning') hasNodes!: boolean; diff --git a/app/dashboard/template.hbs b/app/dashboard/template.hbs index a350b3471..d7a3809e9 100644 --- a/app/dashboard/template.hbs +++ b/app/dashboard/template.hbs @@ -31,6 +31,7 @@ @onClick={{action this.openModal}} @type='success' @class='m-t-md f-w-xl' + @disabled={{not this.canCreateNewProject}} > {{t 'dashboard.create_new_project_button'}} diff --git a/lib/osf-components/addon/components/new-project-modal/component.ts b/lib/osf-components/addon/components/new-project-modal/component.ts index 67f124ec0..ecc2ab329 100644 --- a/lib/osf-components/addon/components/new-project-modal/component.ts +++ b/lib/osf-components/addon/components/new-project-modal/component.ts @@ -56,6 +56,7 @@ export default class NewProjectModal extends Component { regions: Region[] = []; running: boolean = false; createError: boolean = false; + createErrorMessage?: string; makeProjectAffiliate: boolean = projectAffiliate; @@ -147,6 +148,16 @@ export default class NewProjectModal extends Component { this.afterProjectCreated(node); } catch (error) { this.toast.error(this.intl.t('new_project.create_failed_header')); + let errorMessage = this.intl.t('new_project.create_failed_msg'); + const errorObj = error.errors.firstObject; + if (errorObj && errorObj.status) { + if (errorObj.status === 403) { + errorMessage = this.intl.t('new_project.forbidden'); + } else if (errorObj.status === 400 && errorObj.type === 1) { + errorMessage = this.intl.t('new_project.limited'); + } + } + this.set('createErrorMessage', errorMessage); this.set('createError', true); } }); diff --git a/lib/osf-components/addon/components/new-project-modal/template.hbs b/lib/osf-components/addon/components/new-project-modal/template.hbs index bce166c19..ccf72b616 100644 --- a/lib/osf-components/addon/components/new-project-modal/template.hbs +++ b/lib/osf-components/addon/components/new-project-modal/template.hbs @@ -8,7 +8,7 @@ -
{{t 'new_project.create_failed_msg'}}
+
{{this.createErrorMessage}}