diff --git a/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.html b/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.html index 6d722982b..0c060c386 100644 --- a/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.html +++ b/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.html @@ -1,50 +1,132 @@ - diff --git a/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.scss b/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.scss index 838dd19ac..88bd9c9bf 100644 --- a/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.scss +++ b/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.scss @@ -8,15 +8,99 @@ input { width: 100%; } -.parentContainer { - display: flex; - flex-direction: column; - gap: 0; - line-height: 1; - gap: 4px; - white-space: normal; - strong, +.strong { + font-weight: 700; +} +.menu-wrapper { + button { + padding: 16px; + line-height: 1; + max-width: 400px; + } + + label { + padding-left: 16px; + height: 48px; + display: flex; + align-items: center; + } + align-items: center; +} + +.sub-menu-container { + button { + height: 100%; + width: 100%; + padding: 16px !important; + .parentContainer { + display: flex; + flex-direction: column; + gap: 0; + line-height: 1; + gap: 4px; + white-space: normal; + strong, + p { + margin: 0; + } + strong { + padding-top: 16px; + padding-bottom: 4px; + } + p { + padding-bottom: 16px; + } + padding-right: 24px; + } + } + div { + height: 100%; + .parentContainer { + display: flex; + flex-direction: column; + gap: 0; + line-height: 1; + gap: 4px; + white-space: normal; + strong, + p { + margin: 0; + } + strong { + padding-top: 16px; + padding-bottom: 4px; + } + p { + padding-bottom: 16px; + } + padding-right: 24px; + } + } +} + +button.mat-button-wrap-text.secondaryItem { + font-style: italic; + height: 100%; + padding: 16px 16px !important; p { margin: 0; + padding-top: 4px; } + .orc-font-small-print { + font-style: normal; + } +} + +.orc-font-small-print { + line-height: 18px; +} + + +button.mat-button-wrap-text:not(.mobile):not(.secondaryItem) { + padding: 0px 16px !important; +} + + +.not-selectable-label { + padding: 0 16px; } diff --git a/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.ts b/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.ts index 4c78680e9..986790039 100644 --- a/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.ts +++ b/src/app/cdk/deep-select-input/deep-select-input/deep-select-input.component.ts @@ -2,47 +2,150 @@ import { Component, EventEmitter, Input, + Optional, Output, + Self, ViewChild, + forwardRef, } from '@angular/core' -import { MatMenu, MatMenuTrigger } from '@angular/material/menu' +import { MatMenuTrigger } from '@angular/material/menu' +import { + AbstractControl, + ControlValueAccessor, + FormBuilder, + FormControl, + FormGroup, + NG_VALUE_ACCESSOR, + NgControl, +} from '@angular/forms' +import { ErrorStateMatcher } from '@angular/material/core' +import { PlatformInfoService } from '../../platform-info' +import { WorkTypes, WorkTypesLabels } from 'src/app/types/works.endpoint' export interface DeepSelectMenu { isNotSelectableLabel?: boolean - label: string + label?: string description?: string value?: string content?: DeepSelectMenu[] secondaryItem?: boolean + divider?: boolean } @Component({ selector: 'app-deep-select-input', templateUrl: './deep-select-input.component.html', styleUrls: ['./deep-select-input.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DeepSelectInputComponent), + multi: true, + }, + ], }) -export class DeepSelectInputComponent { +export class DeepSelectInputComponent implements ControlValueAccessor { + formgroup @Input() menu: DeepSelectMenu[] = [] - @Output() selectItem = new EventEmitter() + @Input() formControlRef: FormControl @ViewChild('clickHoverMenuTrigger') clickHoverMenuTrigger: MatMenuTrigger + @ViewChild('matMenu') matMenu: MatMenuTrigger + selectItemLabel = $localize`:@@works.pleaseSelectWork:Please select a work type` subMenus: { [key: string]: any } = {} selectedItem: DeepSelectMenu + private onChange: (value: string) => void = () => {} + private onTouched: () => void = () => {} + isMobile: boolean + + constructor(fb: FormBuilder, private platformService: PlatformInfoService) { + this.formgroup = fb.group({ + formControl: [''], + }) + this.platformService.get().subscribe((platform) => { + this.isMobile = platform.columns4 + }) + } - // Emits the selected item onItemSelect(item: DeepSelectMenu) { - this.selectItem.emit(item) this.selectedItem = item - } + this.onChange(item.value) + this.onTouched() + } onSpaceBar(event: KeyboardEvent) { - // Filter space bar key press to prevent scrolling if (event.code === 'Space') { event.preventDefault() event.stopPropagation() this.clickHoverMenuTrigger.openMenu() + this.registerOnChange(this.onChange) + this.registerOnTouched(this.onTouched) + } + } + + // ControlValueAccessor implementation + writeValue(value: string): void { + console.log('writeValue', value) + this.formgroup.get('formControl').setValue(value) + const findItem = (menu: DeepSelectMenu[], value: string) => { + for (const item of menu) { + if (item.value === value) { + return item + } + + if (item.content) { + const foundItem = findItem(item.content, value) + if (foundItem) { + return foundItem + } + } + } + } + if (value === WorkTypes.other) { + this.selectedItem = { + label: WorkTypesLabels[WorkTypes.other], + value: WorkTypes.other, + } + } else { + const foundItem = findItem(this.menu, value) + this.selectedItem = foundItem + } + this.formgroup.get('formControl').setValue(this.selectedItem?.label) + } + + registerOnChange(fn: (value: string) => void): void { + this.onChange = fn + } + + registerOnTouched(fn: () => void): void { + this.onTouched = fn + } + + openMenu() { + this.clickHoverMenuTrigger.openMenu() + } + + setDisabledState?(isDisabled: boolean): void { + // Implement if your component needs to handle the disabled state + } + + ngOnInit() {} + + onMenuClose() { + this.onTouched() + } + + get invalid() { + return this.formControlRef.invalid && this.formControlRef.touched + } + + getMatcher(): ErrorStateMatcher { + return { + isErrorState: (control: AbstractControl) => { + return this.invalid + }, } } } diff --git a/src/app/record/components/work-form/work-form/work-form.component.html b/src/app/record/components/work-form/work-form/work-form.component.html index 1125a5b22..f1f626f55 100644 --- a/src/app/record/components/work-form/work-form/work-form.component.html +++ b/src/app/record/components/work-form/work-form/work-form.component.html @@ -40,8 +40,12 @@ id="cy-work-types" aria-labelledby="work-type-label" [menu]="workTypeMenu" + [formControlRef]="workTypeControl" + formControlName="workType" + > + diff --git a/src/app/record/components/work-form/work-form/work-form.component.ts b/src/app/record/components/work-form/work-form/work-form.component.ts index 4c2d132e6..e7f151048 100644 --- a/src/app/record/components/work-form/work-form/work-form.component.ts +++ b/src/app/record/components/work-form/work-form/work-form.component.ts @@ -2,6 +2,7 @@ import { Component, Inject, Input, OnInit } from '@angular/core' import { AbstractControl, AsyncValidatorFn, + FormControl, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, @@ -721,4 +722,8 @@ export class WorkFormComponent implements OnInit { closeEvent() { this._dialogRef.close() } + + get workTypeControl() : FormControl { + return this.workForm.get('workType') as FormControl + } } diff --git a/src/app/record/components/work-form/work-form/work-type-menu.ts b/src/app/record/components/work-form/work-form/work-type-menu.ts index 43cbc755b..17f285aff 100644 --- a/src/app/record/components/work-form/work-form/work-type-menu.ts +++ b/src/app/record/components/work-form/work-form/work-type-menu.ts @@ -12,20 +12,20 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ isNotSelectableLabel: true, }, { - // Journal article - label: WorkTypesLabels[WorkTypes.journalIssue], + label: WorkTypesLabels[WorkTypes.journalArticle], // Rename from "Journal issue" to "Journal issue or edition" value: WorkTypes.journalArticle, }, { - // Conference paper label: WorkTypesLabels[WorkTypes.conferencePaper], value: WorkTypes.conferencePaper, }, { - // Book chapter label: WorkTypesLabels[WorkTypes.bookChapter], value: WorkTypes.bookChapter, }, + { + divider: true, + }, { label: WorkCategoriesLabel[WorkCategories.academicPublication], value: WorkCategories.academicPublication, @@ -45,30 +45,34 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ value: WorkTypes.conferencePaper, }, { - label: WorkTypesLabels[WorkTypes.conferenceAbstract], - value: WorkTypes.conferenceAbstract, + label: WorkTypesLabels[WorkTypes.conferenceOutput], + value: WorkTypes.conferenceOutput, }, + { - label: WorkTypesLabels[WorkTypes.lectureSpeech], - value: WorkTypes.lectureSpeech, + label: WorkTypesLabels[WorkTypes.conferencePresentation], + value: WorkTypes.conferencePresentation, }, { label: WorkTypesLabels[WorkTypes.conferencePoster], value: WorkTypes.conferencePoster, }, { - label: WorkTypesLabels[WorkTypes.editedBook], - value: WorkTypes.editedBook, + label: WorkTypesLabels[WorkTypes.conferenceProceedings], + value: WorkTypes.conferenceProceedings, }, { label: WorkTypesLabels[WorkTypes.preprint], value: WorkTypes.preprint }, { - label: WorkTypesLabels[WorkTypes.dissertationThesis], + label: WorkTypesLabels[WorkTypes.dissertationThesis], // UPDATING from "Dissertation/thesis" to "Dissertation or thesis" value: WorkTypes.dissertationThesis, }, { label: WorkTypesLabels[WorkTypes.workingPaper], value: WorkTypes.workingPaper, }, + { + divider: true, + }, { label: $localize`:@@works.otherAcademicPublication:Other academic publication`, description: $localize`:@@works.otherLabelMicrocopy:Selecting this will set the work type to ‘Other’`, @@ -95,13 +99,19 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ value: WorkTypes.journalIssue, }, { label: WorkTypesLabels[WorkTypes.review], value: WorkTypes.review }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, + { + label: WorkTypesLabels[WorkTypes.transcriptions], + value: WorkTypes.transcriptions, + }, { label: WorkTypesLabels[WorkTypes.translation], value: WorkTypes.translation, }, { - label: $localize`:@@works.otherReviewAndEditing:Other review or editing`, + divider: true, + }, + { + label: $localize`:@@works.otherReviewAndEditing:Other review or editing output`, description: $localize`:@@works.otherLabelMicrocopy:Selecting this will set the work type to ‘Other’`, value: WorkTypes.other, secondaryItem: true, @@ -114,8 +124,8 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ description: $localize`:@@works.disseminationDescription:Blog posts, media articles, speeches and podcasts`, content: [ { - label: WorkTypesLabels[WorkTypes.onlineResource], - value: WorkTypes.onlineResource, + label: WorkTypesLabels[WorkTypes.blogPost], + value: WorkTypes.blogPost, }, { label: WorkTypesLabels[WorkTypes.dictionaryEntry], @@ -133,11 +143,11 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ label: WorkTypesLabels[WorkTypes.newspaperArticle], value: WorkTypes.newspaperArticle, }, + /// No value for: Talk, interview, podcast or speech + { label: WorkTypesLabels[WorkTypes.website], value: WorkTypes.website }, { - label: WorkTypesLabels[WorkTypes.lectureSpeech], - value: WorkTypes.lectureSpeech, + divider: true, }, - { label: WorkTypesLabels[WorkTypes.website], value: WorkTypes.website }, { label: $localize`:@@works.otherDissemination:Other dissemination output`, value: WorkTypes.other, @@ -155,13 +165,36 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ label: WorkTypesLabels[WorkTypes.artisticPerformance], value: WorkTypes.artisticPerformance, }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, - // { label: WorkTypesLabels[WorkTypes.other], value: WorkTypes.other }, + { + value: WorkTypes.design, + label: WorkTypesLabels[WorkTypes.design], + }, + { + value: WorkTypes.image, + label: WorkTypesLabels[WorkTypes.image], + }, + /// No value for: Interactive resource + { + value: WorkTypes.movingImage, + label: WorkTypesLabels[WorkTypes.movingImage], + }, + { + value: WorkTypes.musicalComposition, + label: WorkTypesLabels[WorkTypes.musicalComposition], + }, + { + value: WorkTypes.sound, + label: WorkTypesLabels[WorkTypes.sound], + }, + { + divider: true, + }, + { + label: $localize`:@@works.otherCreativeData:Other creative output`, + value: WorkTypes.other, + secondaryItem: true, + description: $localize`:@@works.otherLabelMicrocopy:Selecting this will set the work type to ‘Other’`, + }, ], }, { @@ -170,14 +203,20 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ description: $localize`:@@works.dataDescription:Datasets, software, plans and research tools`, content: [ { - label: WorkTypesLabels[WorkTypes.physicalObject], - value: WorkTypes.physicalObject, + label: WorkTypesLabels[WorkTypes.cartographicMaterial], + value: WorkTypes.cartographicMaterial, + }, + { + label: WorkTypesLabels[WorkTypes.clinicalStudy], + value: WorkTypes.clinicalStudy, + }, + { + value: WorkTypes.dataSet, + label: WorkTypesLabels[WorkTypes.dataSet], // UPDATING from "Data set" to "Dataset" }, - { label: WorkTypesLabels[WorkTypes.dataSet], value: WorkTypes.dataSet }, - { label: WorkTypesLabels[WorkTypes.dataSet], value: WorkTypes.dataSet }, { - label: WorkTypesLabels[WorkTypes.dataManagementPlan], value: WorkTypes.dataManagementPlan, + label: WorkTypesLabels[WorkTypes.dataManagementPlan], }, { label: WorkTypesLabels[WorkTypes.physicalObject], @@ -193,7 +232,10 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ }, { label: WorkTypesLabels[WorkTypes.software], value: WorkTypes.software }, { - label: $localize`:@@works.otherData:Other data output`, + divider: true, + }, + { + label: $localize`:@@works.otherData:Other data or process output`, value: WorkTypes.other, secondaryItem: true, description: $localize`:@@works.otherLabelMicrocopy:Selecting this will set the work type to ‘Other’`, @@ -216,13 +258,16 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ value: WorkTypes.registeredCopyright, }, { - label: WorkTypesLabels[WorkTypes.standardsAndPolicy], + label: WorkTypesLabels[WorkTypes.standardsAndPolicy], // UPDATING from "Standard and policy" to "Standards or policy" value: WorkTypes.standardsAndPolicy, }, { label: WorkTypesLabels[WorkTypes.trademark], value: WorkTypes.trademark, }, + { + divider: true, + }, { label: $localize`:@@works.otherLegal:Other legal or IP output`, value: WorkTypes.other, @@ -238,11 +283,15 @@ export const WorkTypeMenu: DeepSelectMenu[] = [ content: [ { label: WorkTypesLabels[WorkTypes.lectureSpeech], - value: WorkTypes.lectureSpeech, + value: WorkTypes.lectureSpeech, /// RENAME from "lecture/speech" to "speech" }, + /// No value for: Teaching material ?? { - label: WorkTypesLabels[WorkTypes.supervisedStudentPublication], value: WorkTypes.supervisedStudentPublication, + label: WorkTypesLabels[WorkTypes.supervisedStudentPublication], + }, + { + divider: true, }, { label: $localize`:@@works.otherTeaching:Other teaching or supervision output`, diff --git a/src/app/types/works.endpoint.ts b/src/app/types/works.endpoint.ts index 843e2ffdc..336bfc695 100644 --- a/src/app/types/works.endpoint.ts +++ b/src/app/types/works.endpoint.ts @@ -64,13 +64,27 @@ export enum WorkTypes { spinOffCompany = 'spin-off-company', standardsAndPolicy = 'standards-and-policy', technicalStandard = 'technical-standard', + blogPost = 'blog-post', + clinicalStudy = 'clinical-study', + cartographicMaterial = 'cartographic-material', + conferenceOutput = 'conference-output', + conferencePresentation = 'conference-presentation', + conferenceProceedings = 'conference-proceedings', + design="design", + image="image", + learningObject="learning-object", + movingImage="moving-image", + musicalComposition="musical-composition", + sound="sound", + transcriptions="transcriptions", + } export const WorkCategoriesLabel = { - [WorkCategories.academicPublication]: $localize`:@@works.conference:Academic publications`, - [WorkCategories.reviewAndEditing]: $localize`:@@works.intellectual:Review and editing`, + [WorkCategories.academicPublication]: $localize`:@@works.academicPublication:Academic publications`, + [WorkCategories.reviewAndEditing]: $localize`:@@works.reviewAndEditing:Review and editing`, [WorkCategories.other_output]: $localize`:@@works.other:Other`, - [WorkCategories.dissemination]: $localize`:@@works.publication:Dissemination`, + [WorkCategories.dissemination]: $localize`:@@works.dissemination:Dissemination`, [WorkCategories.creative]: $localize`:@@works.creative:Creative`, [WorkCategories.dataAndProccesses]: $localize`:@@works.data:Data and processes`, [WorkCategories.legalAndIp]: $localize`:@@works.legal:Legal and IP`, @@ -87,7 +101,7 @@ export const WorkTypesLabels = { [WorkTypes.bookReview]: $localize`:@@works.review:Book review`, [WorkTypes.book]: $localize`:@@works.book:Book`, [WorkTypes.dictionaryEntry]: $localize`:@@works.entry:Dictionary entry`, - [WorkTypes.dissertationThesis]: $localize`:@@works.thesis:Dissertation/Thesis`, + [WorkTypes.dissertationThesis]: $localize`:@@works.thesis:Dissertation or Thesis`, [WorkTypes.editedBook]: $localize`:@@works.editedBook:Edited book`, [WorkTypes.encyclopediaEntry]: $localize`:@@works.encyclopediaEntry:Encyclopedia entry`, [WorkTypes.journalArticle]: $localize`:@@works.journalArticle:Journal article`, // @@ -112,18 +126,32 @@ export const WorkTypesLabels = { [WorkTypes.registeredCopyright]: $localize`:@@works.copyright:Registered copyright`, [WorkTypes.trademark]: $localize`:@@works.trademark:Trademark`, [WorkTypes.annotation]: $localize`:@@works.annotation:Annotation`, - [WorkTypes.artisticPerformance]: $localize`:@@works.artisticPerformance:Artistic performance`, + [WorkTypes.artisticPerformance]: $localize`:@@works.artisticPerformance:Artistic output or performance`, [WorkTypes.dataManagementPlan]: $localize`:@@works.dataManagementPlan:Data management plan`, - [WorkTypes.dataSet]: $localize`:@@works.plan:Data set`, + [WorkTypes.dataSet]: $localize`:@@works.plan:Dataset`, [WorkTypes.invention]: $localize`:@@works.invention:Invention`, [WorkTypes.lectureSpeech]: $localize`:@@works.speech:Lecture/speech`, [WorkTypes.physicalObject]: $localize`:@@works.object:Physical object`, - [WorkTypes.researchTechnique]: $localize`:@@works.technique:Research technique`, + [WorkTypes.researchTechnique]: $localize`:@@works.technique:Research protocol or technique`, [WorkTypes.software]: $localize`:@@works.software:Software`, [WorkTypes.spinOffCompany]: $localize`:@@works.company:Spin off company`, - [WorkTypes.standardsAndPolicy]: $localize`:@@works.policy:Standards and policy`, + [WorkTypes.standardsAndPolicy]: $localize`:@@works.policy:Standards or policy`, [WorkTypes.technicalStandard]: $localize`:@@works.standard:Technical Standard`, [WorkTypes.other]: $localize`:@@works.other:Other`, + [WorkTypes.blogPost]: $localize`:@@works.blogPost:Blog post`, + [WorkTypes.clinicalStudy]: $localize`:@@works.clinicalStudy:Clinical study`, + [WorkTypes.cartographicMaterial]: $localize`:@@works.cartographicMaterial:Cartographic material`, + [WorkTypes.conferenceOutput]: $localize`:@@works.conferenceOutput:Conference output`, + [WorkTypes.conferencePresentation]: $localize`:@@works.conferencePresentation:Conference presentation`, + [WorkTypes.conferenceProceedings]: $localize`:@@works.conferenceProceedings:Conference proceedings`, + [WorkTypes.design]: $localize`:@@works.design:Design`, + [WorkTypes.image]: $localize`:@@works.image:Image`, + [WorkTypes.learningObject]: $localize`:@@works.learningObject:Learning object`, + [WorkTypes.movingImage]: $localize`:@@works.movingImage:Moving image or video`, + [WorkTypes.musicalComposition]: $localize`:@@works.musicalComposition:Musical composition`, + [WorkTypes.sound]: $localize`:@@works.sound:Sound`, + [WorkTypes.transcriptions]: $localize`:@@works.transcriptions:Transcription`, + } export enum WorksTitleName { diff --git a/src/locale/properties/works/works.en.properties b/src/locale/properties/works/works.en.properties index 532f5ccfd..33c71deb6 100644 --- a/src/locale/properties/works/works.en.properties +++ b/src/locale/properties/works/works.en.properties @@ -38,7 +38,7 @@ works.review=Book review works.reviewPublication=Review works.book=Book works.entry=Dictionary entry -works.thesis=Dissertation/Thesis +works.thesis=Dissertation or Thesis works.editedBook=Edited book works.encyclopediaEntry=Encyclopedia entry works.journalArticle=Journal article @@ -62,16 +62,16 @@ works.patent=Patent works.copyright=Registered copyright works.trademark=Trademark works.annotation=Annotation -works.artisticPerformance=Artistic performance +works.artisticPerformance=Artistic output or performance works.dataManagementPlan=Data management plan -works.plan=Data set +works.plan=Dataset works.invention=Invention works.speech=Lecture/speech works.object=Physical object -works.technique=Research technique +works.technique=Research protocol or technique works.software=Software works.company=Spin off company -works.policy=Standards and policy +works.policy=Standards or policy works.standard=Technical Standard works.other=Other works.self=Self @@ -84,6 +84,7 @@ works.versionOfDescription=The identifier applies to an alternate version of the works.fundedByDescription=The identifier applies to the funding for the work. works.conference=Conference works.intellectual=Intellectual property +reviewAndEditing=Review and editing works.publication=Publication works.whoCanSeeWorks=Who can see your works. The default visibility setting is Private. works.selectedWorksVisibility=Selected works to set visibility @@ -239,3 +240,41 @@ works.groupUnrelatedWorksWarning=Grouping un-related works can result in unexpec works.exportAllWorks=Export ALL works works.deleteSelectedWorks=Delete selected works works.setVisibilityForSelectedWorks=Set visibility for selected works +works.selectAWorkType=Select a work type +works.popularWorkTypes=Popular work types +works.publicationDescription=Books, journal articles, conference outputs, preprints and working papers +works.otherAcademicPublication=Other academic publication +works.otherLabelMicrocopy=Selecting this will set the work type to ‘Other’ +works.reviewDescription=Annotations, transcriptions, reviews and editing +works.otherReviewAndEditing=Other review or editing output +works.disseminationDescription=Blog posts, media articles, speeches and podcasts +works.otherDissemination=Other dissemination output +works.creativeDescription=Designs, images, video, music, sound and interactive media +works.otherCreativeData=Other creative output +works.dataDescription=Datasets, software, plans and research tools +works.otherData=Other data or process output +works.legalDescription=Patents, trademarks, copyright and other legal items +works.otherLegal=Other legal or IP output +works.teachingDescription=Working with students +works.otherTeaching=Other teaching or supervision output +works.creative=Creative +works.data=Data and processes +works.legal=Legal and IP +works.teaching=Teaching and supervision +works.blogPost=Blog post +works.clinicalStudy=Clinical study +works.cartographicMaterial=Cartographic material +works.conferenceOutput=Conference output +works.conferencePresentation=Conference presentation +works.conferenceProceedings=Conference proceedings +works.design=Design +works.image=Image +works.learningObject=Learning object +works.movingImage=Moving image or video +works.musicalComposition=Musical composition +works.sound=Sound +works.transcriptions=Transcription +works.dissemination=Dissemination +works.academicPublication=Academic publications +works.reviewAndEditing=Review and editing +works.pleaseSelectWork=Please select a work type \ No newline at end of file