@pnp/spfx-controls-react 3.17.0-beta.6991023 → 3.17.0-beta.7003036

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.json +6 -2
  2. package/CHANGELOG.md +8 -0
  3. package/lib/common/telemetry/version.js +1 -1
  4. package/lib/controls/dynamicForm/DynamicForm.d.ts +3 -0
  5. package/lib/controls/dynamicForm/DynamicForm.d.ts.map +1 -1
  6. package/lib/controls/dynamicForm/DynamicForm.js +200 -71
  7. package/lib/controls/dynamicForm/DynamicForm.js.map +1 -1
  8. package/lib/controls/dynamicForm/DynamicForm.module.css +2 -2
  9. package/lib/controls/dynamicForm/DynamicForm.module.scss.d.ts +1 -0
  10. package/lib/controls/dynamicForm/DynamicForm.module.scss.d.ts.map +1 -1
  11. package/lib/controls/dynamicForm/DynamicForm.module.scss.js +21 -20
  12. package/lib/controls/dynamicForm/DynamicForm.module.scss.js.map +1 -1
  13. package/lib/controls/dynamicForm/IDynamicFormProps.d.ts +11 -0
  14. package/lib/controls/dynamicForm/IDynamicFormProps.d.ts.map +1 -1
  15. package/lib/controls/dynamicForm/IDynamicFormState.d.ts +3 -0
  16. package/lib/controls/dynamicForm/IDynamicFormState.d.ts.map +1 -1
  17. package/lib/loc/bg-bg.js +3 -0
  18. package/lib/loc/bg-bg.js.map +1 -1
  19. package/lib/loc/ca-es.js +3 -0
  20. package/lib/loc/ca-es.js.map +1 -1
  21. package/lib/loc/da-dk.js +3 -0
  22. package/lib/loc/da-dk.js.map +1 -1
  23. package/lib/loc/de-de.js +3 -0
  24. package/lib/loc/de-de.js.map +1 -1
  25. package/lib/loc/el-gr.js +3 -0
  26. package/lib/loc/el-gr.js.map +1 -1
  27. package/lib/loc/en-us.js +3 -0
  28. package/lib/loc/en-us.js.map +1 -1
  29. package/lib/loc/es-es.js +3 -0
  30. package/lib/loc/es-es.js.map +1 -1
  31. package/lib/loc/et-ee.js +3 -0
  32. package/lib/loc/et-ee.js.map +1 -1
  33. package/lib/loc/eu-es.js +3 -0
  34. package/lib/loc/eu-es.js.map +1 -1
  35. package/lib/loc/fi-fi.js +3 -0
  36. package/lib/loc/fi-fi.js.map +1 -1
  37. package/lib/loc/fr-ca.js +3 -0
  38. package/lib/loc/fr-ca.js.map +1 -1
  39. package/lib/loc/fr-fr.js +3 -0
  40. package/lib/loc/fr-fr.js.map +1 -1
  41. package/lib/loc/it-it.js +3 -0
  42. package/lib/loc/it-it.js.map +1 -1
  43. package/lib/loc/ja-jp.js +3 -0
  44. package/lib/loc/ja-jp.js.map +1 -1
  45. package/lib/loc/lt-lt.js +3 -0
  46. package/lib/loc/lt-lt.js.map +1 -1
  47. package/lib/loc/lv-lv.js +3 -0
  48. package/lib/loc/lv-lv.js.map +1 -1
  49. package/lib/loc/nb-no.js +3 -0
  50. package/lib/loc/nb-no.js.map +1 -1
  51. package/lib/loc/nl-nl.js +3 -0
  52. package/lib/loc/nl-nl.js.map +1 -1
  53. package/lib/loc/pl-pl.js +3 -0
  54. package/lib/loc/pl-pl.js.map +1 -1
  55. package/lib/loc/pt-br.js +3 -0
  56. package/lib/loc/pt-br.js.map +1 -1
  57. package/lib/loc/pt-pt.js +3 -0
  58. package/lib/loc/pt-pt.js.map +1 -1
  59. package/lib/loc/ro-ro.js +3 -0
  60. package/lib/loc/ro-ro.js.map +1 -1
  61. package/lib/loc/ru-ru.js +3 -0
  62. package/lib/loc/ru-ru.js.map +1 -1
  63. package/lib/loc/sk-sk.js +3 -0
  64. package/lib/loc/sk-sk.js.map +1 -1
  65. package/lib/loc/sr-latn-rs.js +3 -0
  66. package/lib/loc/sr-latn-rs.js.map +1 -1
  67. package/lib/loc/sv-se.js +3 -0
  68. package/lib/loc/sv-se.js.map +1 -1
  69. package/lib/loc/tr-tr.js +3 -0
  70. package/lib/loc/tr-tr.js.map +1 -1
  71. package/lib/loc/vi-vn.js +3 -0
  72. package/lib/loc/vi-vn.js.map +1 -1
  73. package/lib/loc/zh-cn.js +3 -0
  74. package/lib/loc/zh-cn.js.map +1 -1
  75. package/lib/loc/zh-tw.js +3 -0
  76. package/lib/loc/zh-tw.js.map +1 -1
  77. package/package.json +2 -2
package/CHANGELOG.json CHANGED
@@ -4,10 +4,14 @@
4
4
  "version": "3.17.0",
5
5
  "changes":{
6
6
  "new": [],
7
- "enhancements": [],
7
+ "enhancements": [
8
+ "`DyanmicForm`: Added file handling [#1625](https://github.com/pnp/sp-dev-fx-controls-react/pull/1625)"
9
+ ],
8
10
  "fixes": []
9
11
  },
10
- "contributions": []
12
+ "contributions": [
13
+ "[Guido Zambarda](https://github.com/GuidoZam)"
14
+ ]
11
15
  },
12
16
  {
13
17
  "version": "3.16.0",
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## 3.17.0
4
4
 
5
+ ### Enhancements
6
+
7
+ - `DyanmicForm`: Added file handling [#1625](https://github.com/pnp/sp-dev-fx-controls-react/pull/1625)
8
+
9
+ ### Contributors
10
+
11
+ Special thanks to our contributor: [Guido Zambarda](https://github.com/GuidoZam).
12
+
5
13
  ## 3.16.0
6
14
 
7
15
  ### New control(s)
@@ -1,2 +1,2 @@
1
- export var version = "3.17.0-beta.6991023";
1
+ export var version = "3.17.0-beta.7003036";
2
2
  //# sourceMappingURL=version.js.map
@@ -21,6 +21,7 @@ export declare class DynamicForm extends React.Component<IDynamicFormProps, IDyn
21
21
  */
22
22
  render(): JSX.Element;
23
23
  private onSubmitClick;
24
+ private addFileToLibrary;
24
25
  private onChange;
25
26
  private getFieldInformations;
26
27
  private cultureNameLookup;
@@ -30,6 +31,8 @@ export declare class DynamicForm extends React.Component<IDynamicFormProps, IDyn
30
31
  private closeValidationErrorDialog;
31
32
  private getValidationErrorTitle;
32
33
  private getValidationErrorMessage;
34
+ private renderFileSelectionControl;
35
+ private getFileIconFromExtension;
33
36
  private isEmptyNumOrString;
34
37
  }
35
38
  //# sourceMappingURL=DynamicForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicForm.d.ts","sourceRoot":"","sources":["../../../src/controls/dynamicForm/DynamicForm.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,OAAO,eAAe,CAAC;AACvB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,iBAAiB,CAAC;AACzB,OAAO,eAAe,CAAC;AAIvB;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK,CAAC,SAAS,CAC9C,iBAAiB,EACjB,iBAAiB,CAClB;IACC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,MAAM,CAEqC;gBAEvC,KAAK,EAAE,iBAAiB;IA8BpC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAUhC;;OAEG;IACI,MAAM,IAAI,GAAG,CAAC,OAAO;IAiF5B,OAAO,CAAC,aAAa,CAsPnB;IAGF,OAAO,CAAC,QAAQ,CAkDd;IAGF,OAAO,CAAC,oBAAoB,CAyR1B;IAEF,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,WAAW,CAqBjB;IAEF,OAAO,CAAC,mBAAmB,CASzB;IAEF,OAAO,CAAC,aAAa,CA0CnB;IAEF,OAAO,CAAC,0BAA0B,CAIhC;IAEF,OAAO,CAAC,uBAAuB,CAS7B;IAEF,OAAO,CAAC,yBAAyB,CAS/B;IAEF,OAAO,CAAC,kBAAkB;CAG3B"}
1
+ {"version":3,"file":"DynamicForm.d.ts","sourceRoot":"","sources":["../../../src/controls/dynamicForm/DynamicForm.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,OAAO,eAAe,CAAC;AACvB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,iBAAiB,CAAC;AACzB,OAAO,eAAe,CAAC;AAIvB;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK,CAAC,SAAS,CAC9C,iBAAiB,EACjB,iBAAiB,CAClB;IACC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,MAAM,CAEqC;gBAEvC,KAAK,EAAE,iBAAiB;IA8BpC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAUhC;;OAEG;IACI,MAAM,IAAI,GAAG,CAAC,OAAO;IAsF5B,OAAO,CAAC,aAAa,CA4QnB;IAEF,OAAO,CAAC,gBAAgB,CAwDvB;IAGD,OAAO,CAAC,QAAQ,CAkDd;IAGF,OAAO,CAAC,oBAAoB,CAyR1B;IAEF,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,WAAW,CAqBjB;IAEF,OAAO,CAAC,mBAAmB,CASzB;IAEF,OAAO,CAAC,aAAa,CA0CnB;IAEF,OAAO,CAAC,0BAA0B,CAIhC;IAEF,OAAO,CAAC,uBAAuB,CAS7B;IAEF,OAAO,CAAC,yBAAyB,CAS/B;IAEF,OAAO,CAAC,0BAA0B,CA6CjC;IAED,OAAO,CAAC,wBAAwB,CAsB/B;IAED,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -67,8 +67,10 @@ import * as strings from "ControlStrings";
67
67
  import { DefaultButton, PrimaryButton, } from "@fluentui/react/lib/Button";
68
68
  import { ProgressIndicator } from "@fluentui/react/lib/ProgressIndicator";
69
69
  import { Stack } from "@fluentui/react/lib/Stack";
70
+ import { Icon } from "@fluentui/react/lib/components/Icon/Icon";
70
71
  import * as React from "react";
71
72
  import SPservice from "../../services/SPService";
73
+ import { FilePicker } from "../filePicker";
72
74
  import { DynamicField } from "./dynamicField";
73
75
  import styles from "./DynamicForm.module.scss";
74
76
  import { Dialog, DialogFooter, DialogType, } from "@fluentui/react/lib/Dialog";
@@ -89,16 +91,16 @@ var DynamicForm = /** @class */ (function (_super) {
89
91
  : _this.props.context.pageContext.web.absoluteUrl;
90
92
  //trigger when the user submits the form.
91
93
  _this.onSubmitClick = function () { return __awaiter(_this, void 0, void 0, function () {
92
- var _a, listId, listItemId, contentTypeId, onSubmitted, onBeforeSubmit, onSubmitError, shouldBeReturnBack_1, fields, objects, _loop_1, this_1, i, len, isCancelled, newETag, iur, error_1, contentTypeIdField, iar, error_2, idField, titleField, contentTypeIdField, library, folderTitle, newFolder, fields_1, folderId, iur, error_3, error_4;
94
+ var _a, listId, listItemId, contentTypeId, onSubmitted, onBeforeSubmit, onSubmitError, enableFileSelection, validationErrorDialogProps, returnListItemInstanceOnSubmit, shouldBeReturnBack_1, fields, objects, _loop_1, this_1, i, len, isCancelled, newETag, iur, error_1, contentTypeIdField, iar, error_2, idField, titleField, contentTypeIdField, library, folderTitle, newFolder, fields_1, folderId, iur, error_3, error_4;
93
95
  var _this = this;
94
- var _b, _c, _d, _e, _f;
95
- return __generator(this, function (_g) {
96
- switch (_g.label) {
96
+ var _b, _c, _d, _e;
97
+ return __generator(this, function (_f) {
98
+ switch (_f.label) {
97
99
  case 0:
98
- _a = this.props, listId = _a.listId, listItemId = _a.listItemId, contentTypeId = _a.contentTypeId, onSubmitted = _a.onSubmitted, onBeforeSubmit = _a.onBeforeSubmit, onSubmitError = _a.onSubmitError;
99
- _g.label = 1;
100
+ _a = this.props, listId = _a.listId, listItemId = _a.listItemId, contentTypeId = _a.contentTypeId, onSubmitted = _a.onSubmitted, onBeforeSubmit = _a.onBeforeSubmit, onSubmitError = _a.onSubmitError, enableFileSelection = _a.enableFileSelection, validationErrorDialogProps = _a.validationErrorDialogProps, returnListItemInstanceOnSubmit = _a.returnListItemInstanceOnSubmit;
101
+ _f.label = 1;
100
102
  case 1:
101
- _g.trys.push([1, 27, , 28]);
103
+ _f.trys.push([1, 31, , 32]);
102
104
  shouldBeReturnBack_1 = false;
103
105
  fields = (this.state.fieldCollection || []).slice();
104
106
  fields.forEach(function (val) {
@@ -138,7 +140,14 @@ var DynamicForm = /** @class */ (function (_super) {
138
140
  if (shouldBeReturnBack_1) {
139
141
  this.setState({
140
142
  fieldCollection: fields,
141
- isValidationErrorDialogOpen: ((_b = this.props.validationErrorDialogProps) === null || _b === void 0 ? void 0 : _b.showDialogOnValidationError) === true,
143
+ isValidationErrorDialogOpen: (validationErrorDialogProps === null || validationErrorDialogProps === void 0 ? void 0 : validationErrorDialogProps.showDialogOnValidationError) === true,
144
+ });
145
+ return [2 /*return*/];
146
+ }
147
+ if (enableFileSelection === true && this.state.selectedFile === undefined && this.props.listItemId === undefined) {
148
+ this.setState({
149
+ missingSelectedFile: true,
150
+ isValidationErrorDialogOpen: (validationErrorDialogProps === null || validationErrorDialogProps === void 0 ? void 0 : validationErrorDialogProps.showDialogOnValidationError) === true,
142
151
  });
143
152
  return [2 /*return*/];
144
153
  }
@@ -148,8 +157,8 @@ var DynamicForm = /** @class */ (function (_super) {
148
157
  objects = {};
149
158
  _loop_1 = function (i, len) {
150
159
  var val, fieldType, additionalData, columnInternalName, hiddenFieldName, value_1, uploadedImage;
151
- return __generator(this, function (_h) {
152
- switch (_h.label) {
160
+ return __generator(this, function (_g) {
161
+ switch (_g.label) {
153
162
  case 0:
154
163
  val = fields[i];
155
164
  fieldType = val.fieldType, additionalData = val.additionalData, columnInternalName = val.columnInternalName, hiddenFieldName = val.hiddenFieldName;
@@ -177,8 +186,8 @@ var DynamicForm = /** @class */ (function (_super) {
177
186
  if (!(fieldType === "TaxonomyFieldType")) return [3 /*break*/, 3];
178
187
  objects[columnInternalName] = {
179
188
  __metadata: { type: "SP.Taxonomy.TaxonomyFieldValue" },
180
- Label: (_d = (_c = value_1[0]) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : "",
181
- TermGuid: (_f = (_e = value_1[0]) === null || _e === void 0 ? void 0 : _e.key) !== null && _f !== void 0 ? _f : "11111111-1111-1111-1111-111111111111",
189
+ Label: (_c = (_b = value_1[0]) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : "",
190
+ TermGuid: (_e = (_d = value_1[0]) === null || _d === void 0 ? void 0 : _d.key) !== null && _e !== void 0 ? _e : "11111111-1111-1111-1111-111111111111",
182
191
  WssId: "-1",
183
192
  };
184
193
  return [3 /*break*/, 14];
@@ -215,7 +224,7 @@ var DynamicForm = /** @class */ (function (_super) {
215
224
  if (!additionalData) return [3 /*break*/, 11];
216
225
  return [4 /*yield*/, this_1.uploadImage(additionalData)];
217
226
  case 10:
218
- uploadedImage = _h.sent();
227
+ uploadedImage = _g.sent();
219
228
  objects[columnInternalName] = JSON.stringify({
220
229
  type: "thumbnail",
221
230
  fileName: uploadedImage.Name,
@@ -225,24 +234,24 @@ var DynamicForm = /** @class */ (function (_super) {
225
234
  return [3 /*break*/, 12];
226
235
  case 11:
227
236
  objects[columnInternalName] = null;
228
- _h.label = 12;
237
+ _g.label = 12;
229
238
  case 12: return [3 /*break*/, 14];
230
239
  case 13:
231
240
  objects[columnInternalName] = val.newValue;
232
- _h.label = 14;
241
+ _g.label = 14;
233
242
  case 14: return [2 /*return*/];
234
243
  }
235
244
  });
236
245
  };
237
246
  this_1 = this;
238
247
  i = 0, len = fields.length;
239
- _g.label = 2;
248
+ _f.label = 2;
240
249
  case 2:
241
250
  if (!(i < len)) return [3 /*break*/, 5];
242
251
  return [5 /*yield**/, _loop_1(i, len)];
243
252
  case 3:
244
- _g.sent();
245
- _g.label = 4;
253
+ _f.sent();
254
+ _f.label = 4;
246
255
  case 4:
247
256
  i++;
248
257
  return [3 /*break*/, 2];
@@ -250,126 +259,192 @@ var DynamicForm = /** @class */ (function (_super) {
250
259
  if (!onBeforeSubmit) return [3 /*break*/, 7];
251
260
  return [4 /*yield*/, onBeforeSubmit(objects)];
252
261
  case 6:
253
- isCancelled = _g.sent();
262
+ isCancelled = _f.sent();
254
263
  if (isCancelled) {
255
264
  this.setState({
256
265
  isSaving: false,
257
266
  });
258
267
  return [2 /*return*/];
259
268
  }
260
- _g.label = 7;
269
+ _f.label = 7;
261
270
  case 7:
262
271
  newETag = undefined;
263
272
  if (!listItemId) return [3 /*break*/, 12];
264
- _g.label = 8;
273
+ _f.label = 8;
265
274
  case 8:
266
- _g.trys.push([8, 10, , 11]);
275
+ _f.trys.push([8, 10, , 11]);
267
276
  return [4 /*yield*/, sp.web.lists
268
277
  .getById(listId)
269
278
  .items.getById(listItemId)
270
279
  .update(objects, this.state.etag)];
271
280
  case 9:
272
- iur = _g.sent();
281
+ iur = _f.sent();
273
282
  newETag = iur.data["odata.etag"];
274
283
  if (onSubmitted) {
275
- onSubmitted(iur.data, this.props.returnListItemInstanceOnSubmit !== false
284
+ onSubmitted(iur.data, returnListItemInstanceOnSubmit !== false
276
285
  ? iur.item
277
286
  : undefined);
278
287
  }
279
288
  return [3 /*break*/, 11];
280
289
  case 10:
281
- error_1 = _g.sent();
290
+ error_1 = _f.sent();
282
291
  if (onSubmitError) {
283
292
  onSubmitError(objects, error_1);
284
293
  }
285
294
  console.log("Error", error_1);
286
295
  return [3 /*break*/, 11];
287
- case 11: return [3 /*break*/, 26];
296
+ case 11: return [3 /*break*/, 30];
288
297
  case 12:
289
298
  if (!(contentTypeId === undefined ||
290
299
  contentTypeId === "" ||
291
- !contentTypeId.startsWith("0x0120") ||
292
- contentTypeId.startsWith("0x01"))) return [3 /*break*/, 17];
293
- _g.label = 13;
300
+ (!contentTypeId.startsWith("0x0120") &&
301
+ contentTypeId.startsWith("0x01")))) return [3 /*break*/, 18];
302
+ if (!(contentTypeId === undefined || enableFileSelection === true)) return [3 /*break*/, 14];
303
+ return [4 /*yield*/, this.addFileToLibrary(objects)];
294
304
  case 13:
295
- _g.trys.push([13, 15, , 16]);
305
+ _f.sent();
306
+ return [3 /*break*/, 17];
307
+ case 14:
308
+ _f.trys.push([14, 16, , 17]);
296
309
  contentTypeIdField = "ContentTypeId";
297
310
  //check if item contenttype is passed, then update the object with content type id, else, pass the object
298
311
  if (contentTypeId !== undefined && contentTypeId.startsWith("0x01"))
299
312
  objects[contentTypeIdField] = contentTypeId;
300
313
  return [4 /*yield*/, sp.web.lists.getById(listId).items.add(objects)];
301
- case 14:
302
- iar = _g.sent();
314
+ case 15:
315
+ iar = _f.sent();
303
316
  if (onSubmitted) {
304
317
  onSubmitted(iar.data, this.props.returnListItemInstanceOnSubmit !== false
305
318
  ? iar.item
306
319
  : undefined);
307
320
  }
308
- return [3 /*break*/, 16];
309
- case 15:
310
- error_2 = _g.sent();
321
+ return [3 /*break*/, 17];
322
+ case 16:
323
+ error_2 = _f.sent();
311
324
  if (onSubmitError) {
312
325
  onSubmitError(objects, error_2);
313
326
  }
314
327
  console.log("Error", error_2);
315
- return [3 /*break*/, 16];
316
- case 16: return [3 /*break*/, 26];
317
- case 17:
318
- if (!contentTypeId.startsWith("0x0120")) return [3 /*break*/, 26];
319
- _g.label = 18;
328
+ return [3 /*break*/, 17];
329
+ case 17: return [3 /*break*/, 30];
320
330
  case 18:
321
- _g.trys.push([18, 25, , 26]);
331
+ if (!contentTypeId.startsWith("0x0120")) return [3 /*break*/, 28];
332
+ _f.label = 19;
333
+ case 19:
334
+ _f.trys.push([19, 26, , 27]);
322
335
  idField = "ID";
323
336
  titleField = "Title";
324
337
  contentTypeIdField = "ContentTypeId";
325
338
  return [4 /*yield*/, sp.web.lists.getById(listId)];
326
- case 19:
327
- library = _g.sent();
339
+ case 20:
340
+ library = _f.sent();
328
341
  folderTitle = objects[titleField] !== undefined && objects[titleField] !== ""
329
342
  ? objects[titleField].replace(/["|*|:|<|>|?|/|\\||]/g, "_") // Replace not allowed chars in folder name
330
343
  : "";
331
344
  return [4 /*yield*/, library.rootFolder.addSubFolderUsingPath(folderTitle)];
332
- case 20:
333
- newFolder = _g.sent();
334
- return [4 /*yield*/, newFolder.listItemAllFields()];
335
345
  case 21:
336
- fields_1 = _g.sent();
337
- if (!fields_1[idField]) return [3 /*break*/, 23];
346
+ newFolder = _f.sent();
347
+ return [4 /*yield*/, newFolder.listItemAllFields()];
348
+ case 22:
349
+ fields_1 = _f.sent();
350
+ if (!fields_1[idField]) return [3 /*break*/, 24];
338
351
  folderId = fields_1[idField];
339
352
  // Set the content type ID for the target item
340
353
  objects[contentTypeIdField] = contentTypeId;
341
354
  return [4 /*yield*/, library.items.getById(folderId).update(objects)];
342
- case 22:
343
- iur = _g.sent();
355
+ case 23:
356
+ iur = _f.sent();
344
357
  if (onSubmitted) {
345
358
  onSubmitted(iur.data, this.props.returnListItemInstanceOnSubmit !== false
346
359
  ? iur.item
347
360
  : undefined);
348
361
  }
349
- return [3 /*break*/, 24];
350
- case 23: throw new Error("Unable to read the ID of the just created folder or Document Set");
351
- case 24: return [3 /*break*/, 26];
352
- case 25:
353
- error_3 = _g.sent();
362
+ return [3 /*break*/, 25];
363
+ case 24: throw new Error("Unable to read the ID of the just created folder or Document Set");
364
+ case 25: return [3 /*break*/, 27];
365
+ case 26:
366
+ error_3 = _f.sent();
354
367
  if (onSubmitError) {
355
368
  onSubmitError(objects, error_3);
356
369
  }
357
370
  console.log("Error", error_3);
358
- return [3 /*break*/, 26];
359
- case 26:
371
+ return [3 /*break*/, 27];
372
+ case 27: return [3 /*break*/, 30];
373
+ case 28:
374
+ if (!(contentTypeId.startsWith("0x01") && enableFileSelection === true)) return [3 /*break*/, 30];
375
+ // We are adding a folder or a Document Set
376
+ return [4 /*yield*/, this.addFileToLibrary(objects)];
377
+ case 29:
378
+ // We are adding a folder or a Document Set
379
+ _f.sent();
380
+ _f.label = 30;
381
+ case 30:
360
382
  this.setState({
361
383
  isSaving: false,
362
384
  etag: newETag,
363
385
  });
364
- return [3 /*break*/, 28];
365
- case 27:
366
- error_4 = _g.sent();
386
+ return [3 /*break*/, 32];
387
+ case 31:
388
+ error_4 = _f.sent();
367
389
  if (onSubmitError) {
368
390
  onSubmitError(null, error_4);
369
391
  }
370
392
  console.log("Error onSubmit", error_4);
371
- return [3 /*break*/, 28];
372
- case 28: return [2 /*return*/];
393
+ return [3 /*break*/, 32];
394
+ case 32: return [2 /*return*/];
395
+ }
396
+ });
397
+ }); };
398
+ _this.addFileToLibrary = function (objects) { return __awaiter(_this, void 0, void 0, function () {
399
+ var selectedFile, _a, listId, contentTypeId, onSubmitted, onSubmitError, returnListItemInstanceOnSubmit, idField, contentTypeIdField, library, itemTitle, fileCreatedResult, _b, _c, _d, fields, folderId, iur, error_5;
400
+ return __generator(this, function (_e) {
401
+ switch (_e.label) {
402
+ case 0:
403
+ selectedFile = this.state.selectedFile;
404
+ _a = this.props, listId = _a.listId, contentTypeId = _a.contentTypeId, onSubmitted = _a.onSubmitted, onSubmitError = _a.onSubmitError, returnListItemInstanceOnSubmit = _a.returnListItemInstanceOnSubmit;
405
+ _e.label = 1;
406
+ case 1:
407
+ _e.trys.push([1, 9, , 10]);
408
+ idField = "ID";
409
+ contentTypeIdField = "ContentTypeId";
410
+ return [4 /*yield*/, sp.web.lists.getById(listId)];
411
+ case 2:
412
+ library = _e.sent();
413
+ itemTitle = selectedFile !== undefined && selectedFile.fileName !== undefined && selectedFile.fileName !== ""
414
+ ? selectedFile.fileName.replace(/["|*|:|<|>|?|/|\\||]/g, "_") // Replace not allowed chars in folder name
415
+ : "";
416
+ _c = (_b = library.rootFolder.files).addChunked;
417
+ _d = [encodeURI(itemTitle)];
418
+ return [4 /*yield*/, selectedFile.downloadFileContent()];
419
+ case 3: return [4 /*yield*/, _c.apply(_b, _d.concat([_e.sent()]))];
420
+ case 4:
421
+ fileCreatedResult = _e.sent();
422
+ return [4 /*yield*/, fileCreatedResult.file.listItemAllFields()];
423
+ case 5:
424
+ fields = _e.sent();
425
+ if (!fields[idField]) return [3 /*break*/, 7];
426
+ folderId = fields[idField];
427
+ // Set the content type ID for the target item
428
+ objects[contentTypeIdField] = contentTypeId;
429
+ return [4 /*yield*/, library.items.getById(folderId).update(objects)];
430
+ case 6:
431
+ iur = _e.sent();
432
+ if (onSubmitted) {
433
+ onSubmitted(iur.data, returnListItemInstanceOnSubmit !== false
434
+ ? iur.item
435
+ : undefined);
436
+ }
437
+ return [3 /*break*/, 8];
438
+ case 7: throw new Error("Unable to read the ID of the just created folder or Document Set");
439
+ case 8: return [3 /*break*/, 10];
440
+ case 9:
441
+ error_5 = _e.sent();
442
+ if (onSubmitError) {
443
+ onSubmitError(objects, error_5);
444
+ }
445
+ console.log("Error", error_5);
446
+ return [3 /*break*/, 10];
447
+ case 10: return [2 /*return*/];
373
448
  }
374
449
  });
375
450
  }); };
@@ -438,7 +513,7 @@ var DynamicForm = /** @class */ (function (_super) {
438
513
  }); };
439
514
  //getting all the fields information as part of get ready process
440
515
  _this.getFieldInformations = function () { return __awaiter(_this, void 0, void 0, function () {
441
- var _a, listId, listItemId, disabledFields, respectETag, onListItemLoaded, contentTypeId, spList, item, etag, defaultContentType, listFields, tempFields, order, responseValue, hiddenFields, defaultDayOfWeek, _loop_2, this_2, i, len, installedLanguages, error_5;
516
+ var _a, listId, listItemId, disabledFields, respectETag, onListItemLoaded, contentTypeId, spList, item, etag, defaultContentType, listFields, tempFields, order, responseValue, hiddenFields, defaultDayOfWeek, _loop_2, this_2, i, len, installedLanguages, error_6;
442
517
  return __generator(this, function (_b) {
443
518
  switch (_b.label) {
444
519
  case 0:
@@ -568,8 +643,8 @@ var DynamicForm = /** @class */ (function (_super) {
568
643
  hiddenName = response.value;
569
644
  termSetId = field.TermSetId;
570
645
  anchorId = field.AnchorId;
571
- if (item !== null) {
572
- item[field.InternalName].forEach(function (element) {
646
+ if (item !== null && item[field.InternalName] !== null && item[field.InternalName].results !== null) {
647
+ item[field.InternalName].results.forEach(function (element) {
573
648
  selectedTags_1.push({
574
649
  key: element.TermGuid,
575
650
  name: element.Label,
@@ -747,8 +822,8 @@ var DynamicForm = /** @class */ (function (_super) {
747
822
  this.setState({ fieldCollection: tempFields, installedLanguages: installedLanguages, etag: etag });
748
823
  return [3 /*break*/, 17];
749
824
  case 16:
750
- error_5 = _b.sent();
751
- console.log("Error get field informations", error_5);
825
+ error_6 = _b.sent();
826
+ console.log("Error get field informations", error_6);
752
827
  return [2 /*return*/, null];
753
828
  case 17: return [2 /*return*/];
754
829
  }
@@ -789,7 +864,7 @@ var DynamicForm = /** @class */ (function (_super) {
789
864
  _this.getFormFields = function (listId, contentTypeId, webUrl
790
865
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
791
866
  ) { return __awaiter(_this, void 0, void 0, function () {
792
- var context, webAbsoluteUrl, apiUrl, data, results, error_6;
867
+ var context, webAbsoluteUrl, apiUrl, data, results, error_7;
793
868
  return __generator(this, function (_a) {
794
869
  switch (_a.label) {
795
870
  case 0:
@@ -821,9 +896,9 @@ var DynamicForm = /** @class */ (function (_super) {
821
896
  _a.label = 3;
822
897
  case 3: return [2 /*return*/, null];
823
898
  case 4:
824
- error_6 = _a.sent();
825
- console.dir(error_6);
826
- return [2 /*return*/, Promise.reject(error_6)];
899
+ error_7 = _a.sent();
900
+ console.dir(error_7);
901
+ return [2 /*return*/, Promise.reject(error_7)];
827
902
  case 5: return [2 /*return*/];
828
903
  }
829
904
  });
@@ -849,6 +924,55 @@ var DynamicForm = /** @class */ (function (_super) {
849
924
  }
850
925
  return errorMessage;
851
926
  };
927
+ _this.renderFileSelectionControl = function () {
928
+ var _a = _this.state, selectedFile = _a.selectedFile, missingSelectedFile = _a.missingSelectedFile;
929
+ var labelEl = React.createElement("label", { className: styles.fieldRequired + ' ' + styles.fieldLabel }, strings.DynamicFormChooseFileLabel);
930
+ return React.createElement("div", null,
931
+ React.createElement("div", { className: styles.titleContainer },
932
+ React.createElement(Icon, { className: styles.fieldIcon, iconName: "DocumentSearch" }),
933
+ labelEl),
934
+ React.createElement(FilePicker, { buttonLabel: strings.DynamicFormChooseFileButtonText, accepts: _this.props.supportedFileExtensions ? _this.props.supportedFileExtensions : [".docx", ".doc", ".pptx", ".ppt", ".xlsx", ".xls", ".pdf"], onSave: function (filePickerResult) {
935
+ if (filePickerResult.length === 1) {
936
+ _this.setState({
937
+ selectedFile: filePickerResult[0],
938
+ missingSelectedFile: false
939
+ });
940
+ }
941
+ else {
942
+ _this.setState({
943
+ missingSelectedFile: true
944
+ });
945
+ }
946
+ }, required: true, context: _this.props.context, hideWebSearchTab: true, hideStockImages: true, hideLocalMultipleUploadTab: true, hideLinkUploadTab: true, hideSiteFilesTab: true, checkIfFileExists: true }),
947
+ selectedFile && React.createElement("div", { className: styles.selectedFileContainer },
948
+ React.createElement(Icon, { iconName: _this.getFileIconFromExtension() }),
949
+ selectedFile.fileName),
950
+ missingSelectedFile === true &&
951
+ React.createElement("div", { className: styles.errormessage }, strings.DynamicFormRequiredFileMessage));
952
+ };
953
+ _this.getFileIconFromExtension = function () {
954
+ var fileExtension = _this.state.selectedFile.fileName.split('.').pop();
955
+ switch (fileExtension) {
956
+ case 'pdf':
957
+ return 'PDF';
958
+ case 'docx':
959
+ case 'doc':
960
+ return 'WordDocument';
961
+ case 'pptx':
962
+ case 'ppt':
963
+ return 'PowerPointDocument';
964
+ case 'xlsx':
965
+ case 'xls':
966
+ return 'ExcelDocument';
967
+ case 'jpg':
968
+ case 'jpeg':
969
+ case 'png':
970
+ case 'gif':
971
+ return 'FileImage';
972
+ default:
973
+ return 'Document';
974
+ }
975
+ };
852
976
  // Initialize pnp sp
853
977
  if (_this.props.webAbsoluteUrl) {
854
978
  sp.setup({
@@ -898,6 +1022,11 @@ var DynamicForm = /** @class */ (function (_super) {
898
1022
  return (React.createElement("div", null,
899
1023
  fieldCollection.length === 0 ? (React.createElement("div", null,
900
1024
  React.createElement(ProgressIndicator, { label: strings.DynamicFormLoading, description: strings.DynamicFormPleaseWait }))) : (React.createElement("div", null,
1025
+ this.props.enableFileSelection === true &&
1026
+ this.props.listItemId === undefined &&
1027
+ this.props.contentTypeId !== undefined &&
1028
+ this.props.contentTypeId.startsWith("0x0101") &&
1029
+ this.renderFileSelectionControl(),
901
1030
  fieldCollection.map(function (v, i) {
902
1031
  if (fieldOverrides &&
903
1032
  Object.prototype.hasOwnProperty.call(fieldOverrides, v.columnInternalName)) {