Skip to content

Commit 57dbfdf

Browse files
committed
Showing correct min and max files validation text
1 parent 726245b commit 57dbfdf

File tree

5 files changed

+67
-173
lines changed

5 files changed

+67
-173
lines changed

preview/resources/referoResources.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ export const getResources = (language: string): Resources => {
6464
previousStep: 'Previous',
6565
attachmentError_required: 'Upload file',
6666
attachmentError_minFiles: 'Add at least {0} file(s)',
67-
attachmentError_maxFiles: 'Maximum of {0} file(s) are allowed',
67+
attachmentError_maxFiles: 'Maximum of {1} file(s) are allowed',
68+
attachmentError_minFiles_and_maxFiles: 'At least {0} file(s) and a maximum of {1} file(s) are allowed',
6869
attachmentError_fileSize: 'File size must be less than {0}MB',
6970
attachmentError_fileType: 'Allowed file types are:',
7071
dateError_invalid: 'Invalid date',
@@ -152,7 +153,8 @@ export const getResources = (language: string): Resources => {
152153
previousStep: 'Précédent',
153154
attachmentError_required: 'Upload file',
154155
attachmentError_minFiles: 'Add at least {0} file(s)',
155-
attachmentError_maxFiles: 'Maximum of {0} file(s) are allowed',
156+
attachmentError_maxFiles: 'Maximum of {1} file(s) are allowed',
157+
attachmentError_minFiles_and_maxFiles: 'At least {0} file(s) and a maximum of {1} file(s) are allowed',
156158
attachmentError_fileSize: 'File size must be less than {0}MB',
157159
attachmentError_fileType: 'Allowed file types are:',
158160
dateError_invalid: 'Invalid date',
@@ -239,7 +241,8 @@ export const getResources = (language: string): Resources => {
239241
previousStep: 'Forrige',
240242
attachmentError_required: 'Last opp fil',
241243
attachmentError_minFiles: 'Legg til minst {0} fil(er)',
242-
attachmentError_maxFiles: 'Maks {0} fil(er) er tillatt',
244+
attachmentError_maxFiles: 'Maks {1} fil(er) er tillatt',
245+
attachmentError_minFiles_and_maxFiles: 'Minst {0} fil(er) og maks {1} fil(er) er tillatt',
243246
attachmentError_fileSize: 'Filstørrelse må være mindre enn {0}MB',
244247
attachmentError_fileType: 'Tillatte filtyper er:',
245248
dateError_invalid: 'Ugyldig dato',

preview/skjema/q.json

+10-140
Original file line numberDiff line numberDiff line change
@@ -59,158 +59,28 @@
5959
}
6060
}
6161
],
62-
"id": "a93bf3e9-d09c-4625-8b92-7c2b80e78ab2",
62+
"id": "8eb85cb6-b384-43f3-ae49-7f6b263f26bf",
6363
"item": [
6464
{
65-
"linkId": "3c1d0ce2-0092-47f5-80d9-49ee4c408e9a",
66-
"type": "group",
67-
"text": "Masse text",
68-
"item": [
69-
{
70-
"linkId": "e92f2c98-7725-4054-8b8b-b1eedbfca679",
71-
"type": "display",
72-
"text": "Textenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfg",
73-
"extension": [
74-
{
75-
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
76-
"valueCodeableConcept": {
77-
"coding": [
78-
{
79-
"system": "http://hl7.org/fhir/ValueSet/questionnaire-item-control",
80-
"code": "highlight"
81-
}
82-
]
83-
}
84-
}
85-
],
86-
"required": false
87-
},
88-
{
89-
"linkId": "cf760c67-e129-433a-8ba3-f2d0d390c561",
90-
"type": "display",
91-
"text": "Textenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfg",
92-
"extension": [
93-
{
94-
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
95-
"valueCodeableConcept": {
96-
"coding": [
97-
{
98-
"system": "http://hl7.org/fhir/ValueSet/questionnaire-item-control",
99-
"code": "highlight"
100-
}
101-
]
102-
}
103-
}
104-
],
105-
"required": false
106-
},
107-
{
108-
"linkId": "5706c393-f1d3-4fa8-8c0e-b9cd12f926a4",
109-
"type": "display",
110-
"text": "Textenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfg",
111-
"extension": [
112-
{
113-
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
114-
"valueCodeableConcept": {
115-
"coding": [
116-
{
117-
"system": "http://hl7.org/fhir/ValueSet/questionnaire-item-control",
118-
"code": "highlight"
119-
}
120-
]
121-
}
122-
}
123-
],
124-
"required": false
125-
},
126-
{
127-
"linkId": "d9934477-4e1a-432c-8926-44919f5e36bc",
128-
"type": "display",
129-
"text": "Textenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfg",
130-
"extension": [
131-
{
132-
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
133-
"valueCodeableConcept": {
134-
"coding": [
135-
{
136-
"system": "http://hl7.org/fhir/ValueSet/questionnaire-item-control",
137-
"code": "highlight"
138-
}
139-
]
140-
}
141-
}
142-
],
143-
"required": false
144-
},
145-
{
146-
"linkId": "6002e306-9659-4fe8-8aa4-7aa43089ced9",
147-
"type": "display",
148-
"text": "Textenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfgTextenba sda adasdsdg sfsdgdfgdfb dsdssd f<sdf <dsfg sdfsfdsfsd gfsg dfghdfg dhdfh gdfh dfgsdfgd fg dfg dfgdfgd fgd gdfg dfg dfg dfg dfg dfg dfgdf gdfg dfg dfgd dfg dfg dfg dfg",
149-
"extension": [
150-
{
151-
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
152-
"valueCodeableConcept": {
153-
"coding": [
154-
{
155-
"system": "http://hl7.org/fhir/ValueSet/questionnaire-item-control",
156-
"code": "highlight"
157-
}
158-
]
159-
}
160-
}
161-
],
162-
"required": false
163-
}
164-
],
165-
"required": false
166-
},
167-
{
168-
"linkId": "6180d900-5082-4bea-879f-33b678656b2e",
65+
"linkId": "6aa0c52a-67e4-4122-86ac-f45e454fbb87",
16966
"type": "attachment",
170-
"text": "Mandatory",
67+
"text": "Last opp et vedlegg",
17168
"extension": [
172-
{
173-
"url": "http://helsenorge.no/fhir/StructureDefinition/sdf-sublabel",
174-
"valueMarkdown": "22323"
175-
},
17669
{
17770
"url": "http://hl7.org/fhir/StructureDefinition/maxSize",
178-
"valueDecimal": 3
179-
}
180-
],
181-
"required": true
182-
},
183-
{
184-
"linkId": "c3dd9f35-00ad-4d4d-e256-7080ff9594fd",
185-
"type": "attachment",
186-
"text": "Mandatory 2",
187-
"extension": [
188-
{
189-
"url": "http://helsenorge.no/fhir/StructureDefinition/sdf-sublabel",
190-
"valueMarkdown": "22323"
71+
"valueDecimal": 5
19172
},
19273
{
193-
"url": "http://hl7.org/fhir/StructureDefinition/maxSize",
194-
"valueDecimal": 3
195-
}
196-
],
197-
"required": true
198-
},
199-
{
200-
"linkId": "ee1e9262-1371-45be-9c96-d53fe1d0dcbd",
201-
"type": "attachment",
202-
"text": "Mandatory 3",
203-
"extension": [
204-
{
205-
"url": "http://helsenorge.no/fhir/StructureDefinition/sdf-sublabel",
206-
"valueMarkdown": "22323"
74+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-minOccurs",
75+
"valueInteger": 2
20776
},
20877
{
209-
"url": "http://hl7.org/fhir/StructureDefinition/maxSize",
210-
"valueDecimal": 3
78+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-maxOccurs",
79+
"valueInteger": 3
21180
}
21281
],
213-
"required": true
82+
"required": true,
83+
"repeats": true
21484
}
21585
]
21686
}

src/components/formcomponents/attachment/attachment-validation.ts

+37-14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { UploadFile } from '@helsenorge/file-upload/components/file-upload';
44

55
import { convertBytesToMBString } from './attachmentUtil';
66
import { getValidationTextExtension } from '@/util/extension';
7+
import { Resources } from '@/util/resources';
78

89
export const validateMinFiles = (
910
files: UploadFile[],
@@ -15,8 +16,8 @@ export const validateMinFiles = (
1516
if (!minFiles || (files && files.length >= minFiles)) {
1617
return true;
1718
}
18-
if (getCustomValidationText(item, genericErrorText)) {
19-
return getCustomValidationText(item, genericErrorText);
19+
if (getValidationTextForAttachment(item, genericErrorText)) {
20+
return getValidationTextForAttachment(item, genericErrorText);
2021
}
2122
return errorMessage ? errorMessage.replace('{0}', minFiles.toString()) : '';
2223
};
@@ -31,8 +32,8 @@ export const validateMaxFiles = (
3132
if (!maxFiles || (files && files.length <= maxFiles)) {
3233
return true;
3334
}
34-
if (getCustomValidationText(item, genericErrorText)) {
35-
return getCustomValidationText(item, genericErrorText);
35+
if (getValidationTextForAttachment(item, genericErrorText)) {
36+
return getValidationTextForAttachment(item, genericErrorText);
3637
}
3738
return errorMessage ? errorMessage.replace('{0}', maxFiles.toString()) : '';
3839
};
@@ -47,8 +48,8 @@ export const validateFileSize = (
4748
if (sizeIsValid(file, maxSize)) {
4849
return true;
4950
}
50-
if (getCustomValidationText(item, genericErrorText)) {
51-
return getCustomValidationText(item, genericErrorText);
51+
if (getValidationTextForAttachment(item, genericErrorText)) {
52+
return getValidationTextForAttachment(item, genericErrorText);
5253
}
5354
return errorMessage ? errorMessage.replace('{0}', convertBytesToMBString(maxSize)) : '';
5455
};
@@ -63,8 +64,8 @@ export const validateFileType = (
6364
if (mimeTypeIsValid(file, validTypes)) {
6465
return true;
6566
}
66-
if (getCustomValidationText(item, genericErrorText)) {
67-
return getCustomValidationText(item, genericErrorText);
67+
if (getValidationTextForAttachment(item, genericErrorText)) {
68+
return getValidationTextForAttachment(item, genericErrorText);
6869
}
6970
return errorMessage ? errorMessage + ` ${validTypes.join(', ')}.` : '';
7071
};
@@ -83,14 +84,36 @@ const sizeIsValid = (file: UploadFile, size: number): boolean => {
8384
return true;
8485
};
8586

86-
export const getCustomValidationText = (item?: QuestionnaireItem, genericErrorText?: string): string => {
87-
const validationText = getValidationTextExtension(item);
88-
if (validationText) {
89-
return validationText;
87+
export const getNumberOfFilesValidationText = (
88+
item: QuestionnaireItem | undefined,
89+
minFiles: number | undefined,
90+
maxFiles: number | undefined,
91+
resources: Resources | undefined
92+
): string => {
93+
let validationText =
94+
(minFiles && !maxFiles && resources?.attachmentError_minFiles) ||
95+
(maxFiles && !minFiles && resources?.attachmentError_maxFiles) ||
96+
(maxFiles && minFiles && resources?.attachmentError_minFiles_and_maxFiles) ||
97+
undefined;
98+
99+
if (minFiles) {
100+
validationText = validationText?.replace('{0}', minFiles?.toString());
101+
}
102+
if (maxFiles) {
103+
validationText = validationText?.replace('{1}', maxFiles?.toString());
104+
}
105+
106+
return getValidationTextForAttachment(item, validationText);
107+
};
108+
109+
export const getValidationTextForAttachment = (item?: QuestionnaireItem, validationText?: string): string => {
110+
const validationTextExtension = getValidationTextExtension(item);
111+
if (validationTextExtension) {
112+
return validationTextExtension;
90113
}
91114

92-
if (genericErrorText) {
93-
return genericErrorText;
115+
if (validationText) {
116+
return validationText;
94117
}
95118
return '';
96119
};

src/components/formcomponents/attachment/attachmenthtml.tsx

+9-15
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import NotificationPanel from '@helsenorge/designsystem-react/components/Notific
77
import FileUpload, { MimeTypes, UploadFile } from '@helsenorge/file-upload/components/file-upload';
88
import { useFileUpload } from '@helsenorge/file-upload/components/file-upload/useFileUpload';
99

10-
import { getCustomValidationText } from './attachment-validation';
10+
import { getNumberOfFilesValidationText, getValidationTextForAttachment } from './attachment-validation';
1111
import {
1212
validateNumberOfFiles,
1313
validateFileType,
@@ -20,12 +20,12 @@ import { getId, isReadOnly } from '@/util';
2020
import { Resources } from '@/util/resources';
2121

2222
import { ReferoLabel } from '@/components/referoLabel/ReferoLabel';
23-
import { TextMessage } from '@/types/text-message';
2423
import { QuestionnaireComponentItemProps } from '@/components/createQuestionnaire/GenerateQuestionnaireComponents';
2524
import { ReadOnly } from '../read-only/readOnly';
2625
import { getErrorMessage } from '@/components/validation/rules';
2726
import { shouldValidate } from '@/components/validation/utils';
2827
import { useAttachmentSync } from './useAttachmentSync';
28+
import { TextMessage } from '@/types/text-message';
2929

3030
type Props = QuestionnaireComponentItemProps & {
3131
onUpload: (files: UploadFile[]) => void;
@@ -78,18 +78,12 @@ const AttachmentHtml = (props: Props): JSX.Element | null => {
7878

7979
const fieldState = getFieldState(idWithLinkIdAndItemIndex, formState);
8080
const { error } = fieldState;
81-
const numberOfFilesMessage = getCustomValidationText(
82-
item,
83-
(minFiles && !maxFiles && resources?.attachmentError_minFiles) ||
84-
(maxFiles && !minFiles && resources?.attachmentError_maxFiles) ||
85-
(maxFiles && minFiles && resources?.attachmentError_minFiles) ||
86-
undefined
87-
);
88-
const validationFileTypesMessage = getCustomValidationText(item, resources?.attachmentError_fileType);
81+
const numberOfFilesValidationText = getNumberOfFilesValidationText(item, minFiles, maxFiles, resources);
82+
const fileTypesValidationText = getValidationTextForAttachment(item, resources?.attachmentError_fileType);
8983
const maxValueBytes = getAttachmentMaxSizeBytesToUse(attachmentMaxFileSize, item);
9084

9185
const validFileTypes: MimeTypes[] = attachmentValidTypes ? attachmentValidTypes : VALID_FILE_TYPES;
92-
const filSizeErrorMessage = resources?.attachmentError_fileSize?.replace(
86+
const filSizeValidationText = resources?.attachmentError_fileSize?.replace(
9387
'{0}',
9488
convertBytesToMBString(getAttachmentMaxSizeBytesToUse(attachmentMaxFileSize, item))
9589
);
@@ -102,12 +96,12 @@ const AttachmentHtml = (props: Props): JSX.Element | null => {
10296
} = useFileUpload(
10397
internalRegister,
10498
[
105-
validateFileType(validFileTypes, validationFileTypesMessage),
106-
validateFileSize(0, maxValueBytes, getCustomValidationText(item, filSizeErrorMessage || 'total file size')),
99+
validateFileType(validFileTypes, fileTypesValidationText),
100+
validateFileSize(0, maxValueBytes, getValidationTextForAttachment(item, filSizeValidationText || 'total file size')),
107101
],
108102
[
109-
validateNumberOfFiles(minFiles ?? 0, maxFiles ?? 20, numberOfFilesMessage || 'Number of files'),
110-
validateTotalFileSize(0, maxValueBytes, getCustomValidationText(item, filSizeErrorMessage || 'total file size')),
103+
validateNumberOfFiles(minFiles ?? 0, maxFiles ?? 20, numberOfFilesValidationText || 'Number of files'),
104+
validateTotalFileSize(0, maxValueBytes, getValidationTextForAttachment(item, filSizeValidationText || 'total file size')),
111105
]
112106
);
113107

src/util/resources.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,13 @@ export interface Resources {
244244
*/
245245
attachmentError_minFiles?: string;
246246
/**
247-
* Maks {0} fil(er) er tillatt
247+
* Maks {1} fil(er) er tillatt
248248
*/
249249
attachmentError_maxFiles?: string;
250+
/**
251+
* Minst {0} fil(er) og maks {1} fil(er) er tillatt
252+
*/
253+
attachmentError_minFiles_and_maxFiles?: string;
250254
/**
251255
* Filstørrelse må være mindre enn {0}MB
252256
*/

0 commit comments

Comments
 (0)