Skip to content

Commit a2f1aba

Browse files
Thomas GermanThomas German
authored andcommitted
Fix number validation issue, extend to currency
1 parent dcd5656 commit a2f1aba

File tree

5 files changed

+319
-22
lines changed

5 files changed

+319
-22
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: 35 additions & 9 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,
@@ -207,8 +207,12 @@ export class DynamicForm extends React.Component<
207207
val.fieldDefaultValue = null;
208208
shouldBeReturnBack = true;
209209
}
210-
} else if (val.fieldType === "Number") {
211-
if ((val.newValue < val.minimumValue) || (val.newValue > val.maximumValue)) {
210+
}
211+
if (val.fieldType === "Number") {
212+
if (this.isEmptyNumOrString(val.newValue) && (val.minimumValue != null || val.maximumValue != null)) {
213+
val.newValue = val.fieldDefaultValue = null;
214+
}
215+
if (!this.isEmptyNumOrString(val.newValue) && (isNaN(Number(val.newValue)) || (val.newValue < val.minimumValue) || (val.newValue > val.maximumValue))) {
212216
shouldBeReturnBack = true;
213217
}
214218
}
@@ -514,6 +518,7 @@ export class DynamicForm extends React.Component<
514518
order++;
515519
const fieldType = field.TypeAsString;
516520
field.order = order;
521+
let cultureName: string;
517522
let hiddenName = "";
518523
let termSetId = "";
519524
let anchorId = "";
@@ -539,10 +544,14 @@ export class DynamicForm extends React.Component<
539544
});
540545
} else if (fieldType === "Note") {
541546
richText = field.RichText;
542-
} else if (fieldType === "Number") {
547+
} else if (fieldType === "Number" || fieldType === "Currency") {
543548
minValue = field.MinimumValue;
544549
maxValue = field.MaximumValue;
545-
showAsPercentage = field.ShowAsPercentage;
550+
if (fieldType === "Number") {
551+
showAsPercentage = field.ShowAsPercentage;
552+
} else {
553+
cultureName = this.cultureNameLookup(field.CurrencyLocaleId);
554+
}
546555
} else if (fieldType === "Lookup") {
547556
lookupListId = field.LookupList;
548557
lookupField = field.LookupField;
@@ -689,15 +698,16 @@ export class DynamicForm extends React.Component<
689698
defaultValue = JSON.parse(defaultValue);
690699
} else if (fieldType === "Boolean") {
691700
defaultValue = Boolean(Number(defaultValue));
692-
}
693-
701+
}
702+
694703
tempFields.push({
695704
newValue: null,
696705
fieldTermSetId: termSetId,
697706
fieldAnchorId: anchorId,
698707
options: choices,
699708
lookupListID: lookupListId,
700709
lookupField: lookupField,
710+
cultureName,
701711
changedValue: defaultValue,
702712
fieldType: field.TypeAsString,
703713
fieldTitle: field.Title,
@@ -722,20 +732,31 @@ export class DynamicForm extends React.Component<
722732
description: field.Description,
723733
minimumValue: minValue,
724734
maximumValue: maxValue,
725-
showAsPercentage: showAsPercentage,
735+
showAsPercentage: showAsPercentage
726736
});
727737
tempFields.sort((a, b) => a.Order - b.Order);
728738
}
729739
}
730740

731-
this.setState({ fieldCollection: tempFields, etag: etag });
741+
let installedLanguages: IInstalledLanguageInfo[];
742+
if (tempFields.filter(f => f.fieldType === "Currency").length > 0) {
743+
installedLanguages = await sp.web.regionalSettings.getInstalledLanguages();
744+
}
745+
746+
this.setState({ fieldCollection: tempFields, installedLanguages, etag });
732747
//return arrayItems;
733748
} catch (error) {
734749
console.log(`Error get field informations`, error);
735750
return null;
736751
}
737752
};
738753

754+
private cultureNameLookup(lcid: number): string {
755+
const pageCulture = this.props.context.pageContext.cultureInfo.currentCultureName;
756+
if (!lcid) return pageCulture;
757+
return this.state.installedLanguages?.find(lang => lang.Lcid === lcid).DisplayName ?? pageCulture;
758+
}
759+
739760
private uploadImage = async (
740761
file: IFilePickerResult
741762
): Promise<IUploadImageResult> => {
@@ -840,4 +861,9 @@ export class DynamicForm extends React.Component<
840861

841862
return errorMessage;
842863
};
864+
865+
private isEmptyNumOrString(value: string | number) {
866+
if (value == null) return true;
867+
if ((value?.toString().trim().length || 0) === 0) return true;
868+
}
843869
}

src/controls/dynamicForm/IDynamicFormState.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11

2+
import { IInstalledLanguageInfo } from '@pnp/sp/regional-settings';
23
import { IDynamicFieldProps } from './dynamicField/IDynamicFieldProps';
34
export interface IDynamicFormState {
45
fieldCollection: IDynamicFieldProps[];
6+
installedLanguages?: IInstalledLanguageInfo[];
57
isSaving?: boolean;
68
etag?: string;
79
isValidationErrorDialogOpen: boolean;

0 commit comments

Comments
 (0)