Skip to content

Commit 2581b12

Browse files
authored
Merge pull request #1605 from t0mgerman/Fix-for-number-field-validation
Fix for number field validation and behaviour, addition of currency constraint validation
2 parents deeaefe + 3daff4e commit 2581b12

File tree

7 files changed

+328
-45
lines changed

7 files changed

+328
-45
lines changed
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
export default {
2+
AD: 'EUR',
3+
AE: 'AED',
4+
AF: 'AFN',
5+
AG: 'XCD',
6+
AI: 'XCD',
7+
AL: 'ALL',
8+
AM: 'AMD',
9+
AO: 'AOA',
10+
AR: 'ARS',
11+
AS: 'USD',
12+
AT: 'EUR',
13+
AU: 'AUD',
14+
AW: 'AWG',
15+
AX: 'EUR',
16+
AZ: 'AZN',
17+
BA: 'BAM',
18+
BB: 'BBD',
19+
BD: 'BDT',
20+
BE: 'EUR',
21+
BF: 'XOF',
22+
BG: 'BGN',
23+
BH: 'BHD',
24+
BI: 'BIF',
25+
BJ: 'XOF',
26+
BL: 'EUR',
27+
BM: 'BMD',
28+
BN: 'BND',
29+
BO: 'BOB',
30+
BQ: 'USD',
31+
BR: 'BRL',
32+
BS: 'BSD',
33+
BT: 'BTN',
34+
BV: 'NOK',
35+
BW: 'BWP',
36+
BY: 'BYN',
37+
BZ: 'BZD',
38+
CA: 'CAD',
39+
CC: 'AUD',
40+
CD: 'CDF',
41+
CF: 'XAF',
42+
CG: 'XAF',
43+
CH: 'CHF',
44+
CI: 'XOF',
45+
CK: 'NZD',
46+
CL: 'CLP',
47+
CM: 'XAF',
48+
CN: 'CNY',
49+
CO: 'COP',
50+
CR: 'CRC',
51+
CU: 'CUP',
52+
CV: 'CVE',
53+
CW: 'ANG',
54+
CX: 'AUD',
55+
CY: 'EUR',
56+
CZ: 'CZK',
57+
DE: 'EUR',
58+
DJ: 'DJF',
59+
DK: 'DKK',
60+
DM: 'XCD',
61+
DO: 'DOP',
62+
DZ: 'DZD',
63+
EC: 'USD',
64+
EE: 'EUR',
65+
EG: 'EGP',
66+
EH: 'MAD',
67+
ER: 'ERN',
68+
ES: 'EUR',
69+
ET: 'ETB',
70+
FI: 'EUR',
71+
FJ: 'FJD',
72+
FK: 'FKP',
73+
FM: 'USD',
74+
FO: 'DKK',
75+
FR: 'EUR',
76+
GA: 'XAF',
77+
GB: 'GBP',
78+
GD: 'XCD',
79+
GE: 'GEL',
80+
GF: 'EUR',
81+
GG: 'GBP',
82+
GH: 'GHS',
83+
GI: 'GIP',
84+
GL: 'DKK',
85+
GM: 'GMD',
86+
GN: 'GNF',
87+
GP: 'EUR',
88+
GQ: 'XAF',
89+
GR: 'EUR',
90+
GS: 'GBP',
91+
GT: 'GTQ',
92+
GU: 'USD',
93+
GW: 'XOF',
94+
GY: 'GYD',
95+
HK: 'HKD',
96+
HM: 'AUD',
97+
HN: 'HNL',
98+
HR: 'EUR',
99+
HT: 'HTG',
100+
HU: 'HUF',
101+
ID: 'IDR',
102+
IE: 'EUR',
103+
IL: 'ILS',
104+
IM: 'GBP',
105+
IN: 'INR',
106+
IO: 'USD',
107+
IQ: 'IQD',
108+
IR: 'IRR',
109+
IS: 'ISK',
110+
IT: 'EUR',
111+
JE: 'GBP',
112+
JM: 'JMD',
113+
JO: 'JOD',
114+
JP: 'JPY',
115+
KE: 'KES',
116+
KG: 'KGS',
117+
KH: 'KHR',
118+
KI: 'AUD',
119+
KM: 'KMF',
120+
KN: 'XCD',
121+
KP: 'KPW',
122+
KR: 'KRW',
123+
KW: 'KWD',
124+
KY: 'KYD',
125+
KZ: 'KZT',
126+
LA: 'LAK',
127+
LB: 'LBP',
128+
LC: 'XCD',
129+
LI: 'CHF',
130+
LK: 'LKR',
131+
LR: 'LRD',
132+
LS: 'LSL',
133+
LT: 'EUR',
134+
LU: 'EUR',
135+
LV: 'EUR',
136+
LY: 'LYD',
137+
MA: 'MAD',
138+
MC: 'EUR',
139+
MD: 'MDL',
140+
ME: 'EUR',
141+
MF: 'EUR',
142+
MG: 'MGA',
143+
MH: 'USD',
144+
MK: 'MKD',
145+
ML: 'XOF',
146+
MM: 'MMK',
147+
MN: 'MNT',
148+
MO: 'MOP',
149+
MP: 'USD',
150+
MQ: 'EUR',
151+
MR: 'MRO',
152+
MS: 'XCD',
153+
MT: 'EUR',
154+
MU: 'MUR',
155+
MV: 'MVR',
156+
MW: 'MWK',
157+
MX: 'MXN',
158+
MY: 'MYR',
159+
MZ: 'MZN',
160+
NA: 'NAD',
161+
NC: 'XPF',
162+
NE: 'XOF',
163+
NF: 'AUD',
164+
NG: 'NGN',
165+
NI: 'NIO',
166+
NL: 'EUR',
167+
NO: 'NOK',
168+
NP: 'NPR',
169+
NR: 'AUD',
170+
NU: 'NZD',
171+
NZ: 'NZD',
172+
OM: 'OMR',
173+
PA: 'PAB',
174+
PE: 'PEN',
175+
PF: 'XPF',
176+
PG: 'PGK',
177+
PH: 'PHP',
178+
PK: 'PKR',
179+
PL: 'PLN',
180+
PM: 'EUR',
181+
PN: 'NZD',
182+
PR: 'USD',
183+
PS: 'ILS',
184+
PT: 'EUR',
185+
PW: 'USD',
186+
PY: 'PYG',
187+
QA: 'QAR',
188+
RE: 'EUR',
189+
RO: 'RON',
190+
RS: 'RSD',
191+
RU: 'RUB',
192+
RW: 'RWF',
193+
SA: 'SAR',
194+
SB: 'SBD',
195+
SC: 'SCR',
196+
SD: 'SDG',
197+
SE: 'SEK',
198+
SG: 'SGD',
199+
SH: 'SHP',
200+
SI: 'EUR',
201+
SJ: 'NOK',
202+
SK: 'EUR',
203+
SL: 'SLL',
204+
SM: 'EUR',
205+
SN: 'XOF',
206+
SO: 'SOS',
207+
SR: 'SRD',
208+
ST: 'STD',
209+
SV: 'SVC',
210+
SX: 'ANG',
211+
SY: 'SYP',
212+
SZ: 'SZL',
213+
TC: 'USD',
214+
TD: 'XAF',
215+
TF: 'EUR',
216+
TG: 'XOF',
217+
TH: 'THB',
218+
TJ: 'TJS',
219+
TK: 'NZD',
220+
TL: 'USD',
221+
TM: 'TMT',
222+
TN: 'TND',
223+
TO: 'TOP',
224+
TR: 'TRY',
225+
TT: 'TTD',
226+
TV: 'AUD',
227+
TW: 'TWD',
228+
TZ: 'TZS',
229+
UA: 'UAH',
230+
UG: 'UGX',
231+
UM: 'USD',
232+
US: 'USD',
233+
UY: 'UYU',
234+
UZ: 'UZS',
235+
VA: 'EUR',
236+
VC: 'XCD',
237+
VE: 'VEF',
238+
VG: 'USD',
239+
VI: 'USD',
240+
VN: 'VND',
241+
VU: 'VUV',
242+
WF: 'XPF',
243+
WS: 'WST',
244+
YE: 'YER',
245+
YT: 'EUR',
246+
ZA: 'ZAR',
247+
ZM: 'ZMW',
248+
ZW: 'ZWL'
249+
};

src/controls/dynamicForm/DynamicForm.tsx

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable @microsoft/spfx/no-async-await */
22
import { SPHttpClient } from "@microsoft/sp-http";
3-
import { sp } from "@pnp/sp/presets/all";
3+
import { IInstalledLanguageInfo, sp } from "@pnp/sp/presets/all";
44
import * as strings from "ControlStrings";
55
import {
66
DefaultButton,
@@ -206,14 +206,16 @@ export class DynamicForm extends React.Component<
206206
} else if (Array.isArray(val.newValue) && val.newValue.length === 0) {
207207
val.fieldDefaultValue = null;
208208
shouldBeReturnBack = true;
209-
} else if(val.fieldType === "Number"){
210-
shouldBeReturnBack = this.validateNumberOnSubmit(val);
211-
}
212-
} else if(val.fieldType === "Number"){
213-
if(val.newValue === null){
214-
val.newValue = val.fieldDefaultValue;
215209
}
216-
shouldBeReturnBack = this.validateNumberOnSubmit(val);
210+
}
211+
if (val.fieldType === "Number") {
212+
if (val.showAsPercentage) val.newValue /= 100;
213+
if (this.isEmptyNumOrString(val.newValue) && (val.minimumValue !== null || val.maximumValue !== null)) {
214+
val.newValue = val.fieldDefaultValue = null;
215+
}
216+
if (!this.isEmptyNumOrString(val.newValue) && (isNaN(Number(val.newValue)) || (val.newValue < val.minimumValue) || (val.newValue > val.maximumValue))) {
217+
shouldBeReturnBack = true;
218+
}
217219
}
218220
});
219221
if (shouldBeReturnBack) {
@@ -343,7 +345,7 @@ export class DynamicForm extends React.Component<
343345
try {
344346
const contentTypeIdField = "ContentTypeId";
345347
//check if item contenttype is passed, then update the object with content type id, else, pass the object
346-
contentTypeId !== undefined && contentTypeId.startsWith("0x01") ? objects[contentTypeIdField] = contentTypeId : objects;
348+
if (contentTypeId !== undefined && contentTypeId.startsWith("0x01")) objects[contentTypeIdField] = contentTypeId;
347349
const iar = await sp.web.lists.getById(listId).items.add(objects);
348350
if (onSubmitted) {
349351
onSubmitted(
@@ -524,6 +526,7 @@ export class DynamicForm extends React.Component<
524526
order++;
525527
const fieldType = field.TypeAsString;
526528
field.order = order;
529+
let cultureName: string;
527530
let hiddenName = "";
528531
let termSetId = "";
529532
let anchorId = "";
@@ -549,10 +552,14 @@ export class DynamicForm extends React.Component<
549552
});
550553
} else if (fieldType === "Note") {
551554
richText = field.RichText;
552-
} else if (fieldType === "Number") {
555+
} else if (fieldType === "Number" || fieldType === "Currency") {
553556
minValue = field.MinimumValue;
554557
maxValue = field.MaximumValue;
555-
showAsPercentage = field.ShowAsPercentage;
558+
if (fieldType === "Number") {
559+
showAsPercentage = field.ShowAsPercentage;
560+
} else {
561+
cultureName = this.cultureNameLookup(field.CurrencyLocaleId);
562+
}
556563
} else if (fieldType === "Lookup") {
557564
lookupListId = field.LookupList;
558565
lookupField = field.LookupField;
@@ -699,15 +706,16 @@ export class DynamicForm extends React.Component<
699706
defaultValue = JSON.parse(defaultValue);
700707
} else if (fieldType === "Boolean") {
701708
defaultValue = Boolean(Number(defaultValue));
702-
}
703-
709+
}
710+
704711
tempFields.push({
705712
newValue: null,
706713
fieldTermSetId: termSetId,
707714
fieldAnchorId: anchorId,
708715
options: choices,
709716
lookupListID: lookupListId,
710717
lookupField: lookupField,
718+
cultureName,
711719
changedValue: defaultValue,
712720
fieldType: field.TypeAsString,
713721
fieldTitle: field.Title,
@@ -732,20 +740,31 @@ export class DynamicForm extends React.Component<
732740
description: field.Description,
733741
minimumValue: minValue,
734742
maximumValue: maxValue,
735-
showAsPercentage: showAsPercentage,
743+
showAsPercentage: showAsPercentage
736744
});
737745
tempFields.sort((a, b) => a.Order - b.Order);
738746
}
739747
}
740748

741-
this.setState({ fieldCollection: tempFields, etag: etag });
749+
let installedLanguages: IInstalledLanguageInfo[];
750+
if (tempFields.filter(f => f.fieldType === "Currency").length > 0) {
751+
installedLanguages = await sp.web.regionalSettings.getInstalledLanguages();
752+
}
753+
754+
this.setState({ fieldCollection: tempFields, installedLanguages, etag });
742755
//return arrayItems;
743756
} catch (error) {
744757
console.log(`Error get field informations`, error);
745758
return null;
746759
}
747760
};
748761

762+
private cultureNameLookup(lcid: number): string {
763+
const pageCulture = this.props.context.pageContext.cultureInfo.currentCultureName;
764+
if (!lcid) return pageCulture;
765+
return this.state.installedLanguages?.find(lang => lang.Lcid === lcid).DisplayName ?? pageCulture;
766+
}
767+
749768
private uploadImage = async (
750769
file: IFilePickerResult
751770
): Promise<IUploadImageResult> => {
@@ -852,19 +871,8 @@ export class DynamicForm extends React.Component<
852871
return errorMessage;
853872
};
854873

855-
private validateNumberOnSubmit = (val:IDynamicFieldProps): boolean => {
856-
let shouldBeReturnBack = false;
857-
if (val.fieldType === "Number" && val.showAsPercentage) {
858-
const minValue = val.minimumValue !== undefined ? val.minimumValue * 100 : undefined;
859-
const maxValue = val.maximumValue !== undefined ? val.maximumValue * 100 : undefined;
860-
if ((val.newValue < minValue) || (val.newValue > maxValue)) {
861-
shouldBeReturnBack = true;
862-
}
863-
} else if(val.fieldType === "Number" && !val.showAsPercentage){
864-
if ((val.newValue < val.minimumValue) || (val.newValue > val.maximumValue)) {
865-
shouldBeReturnBack = true;
866-
}
867-
}
868-
return shouldBeReturnBack;
874+
private isEmptyNumOrString(value: string | number): boolean {
875+
if (value === null) return true;
876+
if ((value?.toString().trim().length || 0) === 0) return true;
869877
}
870878
}

0 commit comments

Comments
 (0)