Skip to content

[Reference PR] Manual DOI and GUID for Preprints & Registrations - FE #2576

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/models/preprint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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> & NodeModel;
Expand Down
2 changes: 2 additions & 0 deletions app/models/registration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[];
Expand Down
21 changes: 20 additions & 1 deletion app/preprints/-components/submit/title-and-abstract/component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -17,6 +18,8 @@ interface TitleAndAbstractArgs {
interface TitleAndAbstractForm {
title: string;
description: string;
manualDoi: string;
manualGuid: string;
}

/**
Expand Down Expand Up @@ -45,6 +48,22 @@ export default class TitleAndAbstract extends Component<TitleAndAbstractArgs>{
},
}),
],
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);
Expand Down
36 changes: 36 additions & 0 deletions app/preprints/-components/submit/title-and-abstract/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -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|}}
<label for={{manualDoiField}}
data-test-manual-doi-label
>
{{t 'preprints.submit.step-title.doi'}}
<span local-class='required'>*</span>
</label>
<form.text
data-test-manual-doi-input
@valuePath={{'manualDoi'}}
@isRequired={{false}}
{{on 'change' this.validate}}
local-class='input-container'
@uniqueID={{manualDoiField}}
@onKeyUp={{this.validate}}
/>
{{/let}}
{{#let (unique-id 'manualGuid') as |manualGuidField|}}
<label for={{manualGuidField}}
data-test-manudal-guid-label
>
{{t 'preprints.submit.step-title.guid'}}
<span local-class='required'>*</span>
</label>
<form.text
data-test-manual-guid-input
@valuePath={{'manualGuid'}}
@isRequired={{false}}
{{on 'change' this.validate}}
local-class='input-container'
@uniqueID={{manualGuidField}}
@onKeyUp={{this.validate}}
/>
{{/let}}
{{/if}}
</FormControls>
</div>
</div>
1 change: 1 addition & 0 deletions config/environment.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -25,16 +29,44 @@ export interface FinalizeRegistrationModalManager {
draftManager: DraftRegistrationManager;
}

interface ManualDoiAndGuidForm {
manualDoi: string;
manualGuid: string;
}

@layout(template)
@tagName('')
export default class FinalizeRegistrationModalManagerComponent extends Component
implements FinalizeRegistrationModalManager {
@service intl!: Intl;
@service toast!: Toast;

// validationFunction() {
// debugger;
// }
manualDoiAndGuidFormChangesetValidation: ValidationObject<ManualDoiAndGuidForm> = {
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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@
hasEmbargoEndDate=this.hasEmbargoEndDate
submittingRegistration=this.submittingRegistration
draftManager=this.draftManager
guidAndDoiFormChangeset=this.guidAndDoiFormChangeset
validateManualDoiAndGuid=this.validateManualDoiAndGuid
)}}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,44 @@
/>
{{/if}}
</div>
{{#if (feature-flag 'manual_doi_and_guid')}}
<FormControls
@changeset={{this.manager.guidAndDoiFormChangeset}}
data-test-form
as |form|
>
{{#let (unique-id 'manualDoi') as |manualDoiField|}}
<label for={{manualDoiField}}
data-test-manual-doi-label
>
{{t 'preprints.submit.step-title.doi'}}
</label>
<form.text
data-test-manual-doi-input
{{on 'change' this.manager.validateManualDoiAndGuid}}
@valuePath={{'manualDoi'}}
@isRequired={{false}}
@uniqueID={{manualDoiField}}
@onKeyUp={{this.manager.validateManualDoiAndGuid}}
/>
{{/let}}
{{#let (unique-id 'manualGuid') as |manualGuidField|}}
<label for={{manualGuidField}}
data-test-manudal-guid-label
>
{{t 'preprints.submit.step-title.guid'}}
</label>
<form.text
data-test-manual-guid-input
{{on 'change' this.manager.validateManualDoiAndGuid}}
@valuePath={{'manualGuid'}}
@isRequired={{false}}
@uniqueID={{manualGuidField}}
@onKeyUp={{this.manager.validateManualDoiAndGuid}}
/>
{{/let}}
</FormControls>
{{/if}}
</dialog.main>
<dialog.footer>
<Button
Expand Down
3 changes: 2 additions & 1 deletion lib/osf-components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"ember-intl": "*",
"ember-radio-button": "*",
"ember-responsive": "*",
"ember-in-viewport": "*"
"ember-in-viewport": "*",
"ember-feature-flags": "*"
}
}
2 changes: 2 additions & 0 deletions translations/en-us.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1622,6 +1622,8 @@ preprints:
title-input: 'Title'
abstract-input: 'Abstract'
abstract-input-error: '20 characters'
doi: 'DOI'
guid: 'Guid'
step-file:
delete-modal-button: 'Continue'
delete-modal-button-tooltip: 'Version file'
Expand Down