Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ <h3 class="mb-2">{{ section.title }}</h3>
</div>

@if (section.description) {
<p class="mb-3">{{ section.description }}</p>
<p class="preserve-whitespace mb-3">{{ section.description }}</p>
}
<ng-container *ngTemplateOutlet="questionList; context: { $implicit: section.questions }"></ng-container>
</p-card>
Expand All @@ -40,151 +40,150 @@ <h3 class="mb-2">{{ section.title }}</h3>
<ng-template #questionList let-questions>
@for (q of questions; track q.id) {
<form class="mb-4" [formGroup]="stepForm">
<p-card>
<label [for]="q.groupKey">
<div class="flex align-items-baseline gap-1">
<h3 class="mb-2">
{{ q.displayText }}
@if (q.required) {
<span class="text-red-500">*</span>
}
</h3>
</div>
@if (q.paragraphText) {
<p class="mb-3 preserve-whitespace">{{ q.paragraphText }}</p>
}
@if (q.helpText) {
<p class="preserve-whitespace">{{ q.helpText }}</p>
}
</label>
@if (q.exampleText) {
<p-inplace #inplaceRef styleClass="mb-4">
<ng-template #display>
<span class="text-primary font-medium">{{ 'common.links.showExample' | translate }} </span>
</ng-template>
<ng-template #content>
<p-button size="small" (onClick)="inplaceRef.deactivate()" variant="text" styleClass="font-medium">
{{ 'common.links.hideExample' | translate }}
</p-button>
<p class="m-0">{{ q.exampleText }}</p>
</ng-template>
</p-inplace>
<label [for]="q.groupKey">
<div class="flex align-items-baseline gap-1">
<h3 class="mb-2">
{{ q.displayText }}
@if (q.required) {
<span class="text-red-500">*</span>
}
</h3>
</div>
@if (q.paragraphText) {
<p class="mb-3 preserve-whitespace">{{ q.paragraphText }}</p>
}
@if (q.helpText) {
<p class="preserve-whitespace">{{ q.helpText }}</p>
}
</label>

@switch (q.fieldType) {
@case (FieldType.TextArea) {
<textarea
id="{{ q.groupKey }}"
class="w-full"
rows="5"
cols="30"
pTextarea
[formControlName]="q.responseKey!"
></textarea>
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
}
@case (FieldType.Radio) {
<div class="flex flex-column gap-2 mt-3">
@for (option of q.options; track option) {
<div class="flex align -items-center gap-2">
<p-radioButton
[formControlName]="q.responseKey!"
[inputId]="option.value"
[value]="option.value"
></p-radioButton>

<label [for]="option.value" class="mb-0 cursor-pointer">{{ option.label }}</label>
@if (option.helpText) {
<osf-info-icon [tooltipText]="option.helpText" tooltipPosition="top"></osf-info-icon>
}
</div>
}
</div>
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
@if (q.exampleText) {
<p-inplace #inplaceRef styleClass="mb-4">
<ng-template #display>
<span class="text-primary font-medium">{{ 'common.links.showExample' | translate }} </span>
</ng-template>
<ng-template #content>
<p-button size="small" (onClick)="inplaceRef.deactivate()" variant="text" styleClass="font-medium">
{{ 'common.links.hideExample' | translate }}
</p-button>
<p class="m-0">{{ q.exampleText }}</p>
</ng-template>
</p-inplace>
}

@switch (q.fieldType) {
@case (FieldType.TextArea) {
<textarea
id="{{ q.groupKey }}"
class="w-full"
rows="5"
cols="30"
pTextarea
[formControlName]="q.responseKey!"
></textarea>
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
@case (FieldType.Checkbox) {
<div class="flex flex-column gap-2 mt-3">
@for (option of q.options; track option) {
<div class="flex align-items-center gap-2">
<p-checkbox
[inputId]="option.value"
[formControlName]="q.responseKey!"
[value]="option.value"
></p-checkbox>

<label [for]="option.value" class="mb-0 cursor-pointer">{{ option.label }}</label>
@if (option.helpText) {
<osf-info-icon [tooltipText]="option.helpText" tooltipPosition="top"></osf-info-icon>
}
</div>
}
</div>
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
@case (FieldType.Radio) {
<div class="flex flex-column gap-2 mt-3">
@for (option of q.options; track option) {
<div class="flex align -items-center gap-2">
<p-radioButton
[formControlName]="q.responseKey!"
[inputId]="option.value"
[value]="option.value"
></p-radioButton>

<label [for]="option.value" class="mb-0 cursor-pointer">{{ option.label }}</label>
@if (option.helpText) {
<osf-info-icon [tooltipText]="option.helpText" tooltipPosition="top"></osf-info-icon>
}
</div>
}
</div>
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
}
@case (FieldType.Checkbox) {
<div class="flex flex-column gap-2 mt-3">
@for (option of q.options; track option) {
<div class="flex align-items-center gap-2">
<p-checkbox
[inputId]="option.value"
[formControlName]="q.responseKey!"
[value]="option.value"
></p-checkbox>

@case (FieldType.Text) {
<input [formControlName]="q.responseKey!" type="text" class="w-full" pInputText />
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
<label [for]="option.value" class="mb-0 cursor-pointer">{{ option.label }}</label>
@if (option.helpText) {
<osf-info-icon [tooltipText]="option.helpText" tooltipPosition="top"></osf-info-icon>
}
</div>
}
</div>
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
@case (FieldType.File) {
<h3 class="mb-2">{{ 'files.actions.uploadFile' | translate }}</h3>
<p class="mb-1">
{{ 'shared.files.limitText' | translate }}
</p>
<p>
{{ 'shared.files.description' | translate }}
</p>
<div class="flex flex-wrap gap-2 mt-3 mb-3">
@for (file of attachedFiles[q.responseKey!] || []; track file) {
<p-chip
[label]="file.name"
severity="info"
removable="true"
(onRemove)="removeFromAttachedFiles(file, q.responseKey!)"
/>
}
</div>
<div class="-ml-3 -mr-3">
<osf-files-control
[attachedFiles]="attachedFiles[q.responseKey!]"
[filesLink]="filesLink()"
[projectId]="projectId()"
[provider]="provider()"
(attachFile)="onAttachFile($event, q.responseKey!)"
[filesViewOnly]="filesViewOnly()"
></osf-files-control>
</div>
}

@case (FieldType.Text) {
<input [formControlName]="q.responseKey!" type="text" class="w-full" pInputText />
@if (
stepForm.controls[q.responseKey!].errors?.['required'] &&
(stepForm.controls[q.responseKey!].touched || stepForm.controls[q.responseKey!].dirty)
) {
<p-message class="simple-variant flex mt-1" severity="error" variant="simple" size="small">
{{ INPUT_VALIDATION_MESSAGES.required | translate }}
</p-message>
}
}
</p-card>
@case (FieldType.File) {
<h3 class="mb-2">{{ 'files.actions.uploadFile' | translate }}</h3>
<p class="mb-1">
{{ 'shared.files.limitText' | translate }}
</p>
<p>
{{ 'shared.files.description' | translate }}
</p>
<div class="flex flex-wrap gap-2 mt-3 mb-3">
@for (file of attachedFiles[q.responseKey!] || []; track file) {
<p-chip
[label]="file.name"
severity="info"
removable="true"
(onRemove)="removeFromAttachedFiles(file, q.responseKey!)"
/>
}
</div>
<div class="-ml-3 -mr-3">
<osf-files-control
[attachedFiles]="attachedFiles[q.responseKey!]"
[filesLink]="filesLink()"
[projectId]="projectId()"
[provider]="provider()"
(attachFile)="onAttachFile($event, q.responseKey!)"
[filesViewOnly]="filesViewOnly()"
></osf-files-control>
</div>
}
}
</form>
}
</ng-template>
Expand Down
Loading
Loading