diff --git a/app/models/preprint.ts b/app/models/preprint.ts index 942c04ac82f..7695225d50e 100644 --- a/app/models/preprint.ts +++ b/app/models/preprint.ts @@ -82,6 +82,8 @@ export default class PreprintModel extends AbstractNodeModel { @attr('string') preregLinkInfo!: PreprintPreregLinkInfoEnum; @attr('number') version!: number; @attr('boolean') isLatestVersion!: boolean; + @attr('string') manualDoi!: string; + @attr('string') manualGuid!: string; @belongsTo('node', { inverse: 'preprints' }) node!: AsyncBelongsTo & NodeModel; diff --git a/app/models/registration.ts b/app/models/registration.ts index 5ec13834004..1262ee16963 100644 --- a/app/models/registration.ts +++ b/app/models/registration.ts @@ -115,6 +115,8 @@ export default class RegistrationModel extends NodeModel.extend(Validations) { @attr('boolean') hasAnalyticCode!: boolean; @attr('boolean') hasPapers!: boolean; @attr('boolean') hasSupplements!: boolean; + @attr('string') manualDoi!: string; + @attr('string') manualGuid!: string; // Write-only attributes @attr('array') includedNodeIds?: string[]; diff --git a/app/preprints/-components/submit/title-and-abstract/component.ts b/app/preprints/-components/submit/title-and-abstract/component.ts index 07726a12158..bd7b65ecabf 100644 --- a/app/preprints/-components/submit/title-and-abstract/component.ts +++ b/app/preprints/-components/submit/title-and-abstract/component.ts @@ -2,10 +2,11 @@ import Component from '@glimmer/component'; import PreprintStateMachine from 'ember-osf-web/preprints/-components/submit/preprint-state-machine/component'; import { action } from '@ember/object'; import { ValidationObject } from 'ember-changeset-validations'; -import { validatePresence, validateLength } from 'ember-changeset-validations/validators'; +import { validatePresence, validateLength, validateFormat } from 'ember-changeset-validations/validators'; import buildChangeset from 'ember-osf-web/utils/build-changeset'; import { inject as service } from '@ember/service'; import Intl from 'ember-intl/services/intl'; +import { DOIRegex } from 'ember-osf-web/utils/doi'; /** * The TitleAndAbstract Args @@ -17,6 +18,8 @@ interface TitleAndAbstractArgs { interface TitleAndAbstractForm { title: string; description: string; + manualDoi: string; + manualGuid: string; } /** @@ -45,6 +48,22 @@ export default class TitleAndAbstract extends Component{ }, }), ], + manualDoi: validateFormat({ + allowBlank: true, + allowNone: true, + ignoreBlank: true, + regex: DOIRegex, + type: 'invalid_doi', + }), + manualGuid: validateLength({ + allowBlank: true, + min:5, + type: 'greaterThanOrEqualTo', + translationArgs: { + description: this.intl.t('preprints.submit.step-title.guid'), + gte: '5 characters', + }, + }), }; titleAndAbstractFormChangeset = buildChangeset(this.args.manager.preprint, this.titleAndAbstractFormValidation); diff --git a/app/preprints/-components/submit/title-and-abstract/template.hbs b/app/preprints/-components/submit/title-and-abstract/template.hbs index a53255e1aa2..2848d91f6ac 100644 --- a/app/preprints/-components/submit/title-and-abstract/template.hbs +++ b/app/preprints/-components/submit/title-and-abstract/template.hbs @@ -48,6 +48,42 @@ @onKeyUp={{this.validate}} /> {{/let}} + {{#if (and (feature-flag 'manual_doi_and_guid') (not @manager.isEditFlow))}} + {{#let (unique-id 'manualDoi') as |manualDoiField|}} + + + {{/let}} + {{#let (unique-id 'manualGuid') as |manualGuidField|}} + + + {{/let}} + {{/if}} \ No newline at end of file diff --git a/config/environment.js b/config/environment.js index 61bc5d0ec3b..a69017abdd1 100644 --- a/config/environment.js +++ b/config/environment.js @@ -316,6 +316,7 @@ module.exports = function(environment) { }, storageI18n: 'storage_i18n', gravyWaffle: 'gravy_waffle', + manualDoiAndGuid: 'manual_doi_and_guid', enableInactiveSchemas: 'enable_inactive_schemas', verifyEmailModals: 'ember_verify_email_modals', ABTesting: { diff --git a/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/component.ts b/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/component.ts index db0835f6045..2ca16819ca6 100644 --- a/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/component.ts +++ b/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/component.ts @@ -14,6 +14,10 @@ import RegistrationModel from 'ember-osf-web/models/registration'; import captureException, { getApiErrorMessage } from 'ember-osf-web/utils/capture-exception'; import DraftRegistrationManager from 'registries/drafts/draft/draft-registration-manager'; +import buildChangeset from 'ember-osf-web/utils/build-changeset'; +import { ValidationObject } from 'ember-changeset-validations'; +import { validateFormat, validateLength } from 'ember-changeset-validations/validators'; +import { DOIRegex } from 'ember-osf-web/utils/doi'; import template from './template'; export interface FinalizeRegistrationModalManager { @@ -25,6 +29,11 @@ export interface FinalizeRegistrationModalManager { draftManager: DraftRegistrationManager; } +interface ManualDoiAndGuidForm { + manualDoi: string; + manualGuid: string; +} + @layout(template) @tagName('') export default class FinalizeRegistrationModalManagerComponent extends Component @@ -32,9 +41,32 @@ export default class FinalizeRegistrationModalManagerComponent extends Component @service intl!: Intl; @service toast!: Toast; + // validationFunction() { + // debugger; + // } + manualDoiAndGuidFormChangesetValidation: ValidationObject = { + manualDoi: validateFormat({ + allowBlank: true, + allowNone: true, + ignoreBlank: true, + regex: DOIRegex, + type: 'invalid_doi', + }), + // manualDoi: this.validationFunction, + manualGuid: validateLength({ + allowBlank: true, + min:5, + type: 'greaterThanOrEqualTo', + translationArgs: { + description: this.intl.t('preprints.submit.step-title.guid'), + gte: '5 characters', + }, + }), + }; // Required arguments registration!: RegistrationModel; draftManager!: DraftRegistrationManager; + guidAndDoiFormChangeset!: any; // Optional arguments onSubmitRegistration?: (registrationId: string) => void; @@ -67,6 +99,14 @@ export default class FinalizeRegistrationModalManagerComponent extends Component didReceiveAttrs() { assert('finalize-registration-modal::manager must have a registration', Boolean(this.registration)); + this.guidAndDoiFormChangeset = buildChangeset(this.registration, this.manualDoiAndGuidFormChangesetValidation); + } + + @action + validateManualDoiAndGuid() { + // debugger; + this.guidAndDoiFormChangeset.validate(); + this.guidAndDoiFormChangeset.execute(); } @action diff --git a/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/template.hbs b/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/template.hbs index e6359a0caa2..fc945e23a5c 100644 --- a/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/template.hbs +++ b/lib/osf-components/addon/components/registries/finalize-registration-modal/manager/template.hbs @@ -5,4 +5,6 @@ hasEmbargoEndDate=this.hasEmbargoEndDate submittingRegistration=this.submittingRegistration draftManager=this.draftManager + guidAndDoiFormChangeset=this.guidAndDoiFormChangeset + validateManualDoiAndGuid=this.validateManualDoiAndGuid )}} diff --git a/lib/osf-components/addon/components/registries/finalize-registration-modal/template.hbs b/lib/osf-components/addon/components/registries/finalize-registration-modal/template.hbs index 281eb00cc85..cd53e157514 100644 --- a/lib/osf-components/addon/components/registries/finalize-registration-modal/template.hbs +++ b/lib/osf-components/addon/components/registries/finalize-registration-modal/template.hbs @@ -43,6 +43,44 @@ /> {{/if}} + {{#if (feature-flag 'manual_doi_and_guid')}} + + {{#let (unique-id 'manualDoi') as |manualDoiField|}} + + + {{/let}} + {{#let (unique-id 'manualGuid') as |manualGuidField|}} + + + {{/let}} + + {{/if}}