diff --git a/docs/documentation/docs/assets/DynamicFormWithFileSelection.png b/docs/documentation/docs/assets/DynamicFormWithFileSelection.png new file mode 100644 index 000000000..548b28573 Binary files /dev/null and b/docs/documentation/docs/assets/DynamicFormWithFileSelection.png differ diff --git a/docs/documentation/docs/controls/DynamicForm.md b/docs/documentation/docs/controls/DynamicForm.md index 19954739b..ce2326d4d 100644 --- a/docs/documentation/docs/controls/DynamicForm.md +++ b/docs/documentation/docs/controls/DynamicForm.md @@ -26,6 +26,17 @@ import { DynamicForm } from "@pnp/spfx-controls-react/lib/DynamicForm"; ``` ![DynamicForm](../assets/DynamicForm.png) +## File selection + +To upload a file when creating a new document in a document library you need to specify: +- enableFileSelection: Set this parameter to true to enable file selection. +- contentTypeId: This parameter specifies the target content type ID of the document you are creating. +- supportedFileExtensions: This parameter is optional and is used to specify the supported file extensions if they are different from the default ones. + +Enabling the file selection will display a new button on top of the form that allow the user to select a file from the recent files, browsing OneDrive or select and upload a file from the computer. + +![DynamicFormWithFileSelection](../assets/DynamicFormWithFileSelection.png) + ## Implementation The `DynamicForm` can be configured with the following properties: @@ -38,6 +49,7 @@ The `DynamicForm` can be configured with the following properties: | contentTypeId | string | no | content type ID | | disabled | boolean | no | Allows form to be disabled. Default value is `false`| | disabledFields | string[] | no | InternalName of fields that should be disabled. Default value is `false`| +| enableFileSelection | boolean | no | Specify if the form should support the creation of a new list item in a document library attaching a file to it. This option is only available for document libraries and works only when the contentTypeId is specified and has a base type of type Document. Default value is `false`| | hiddenFields | string[] | no | InternalName of fields that should be hidden. Default value is `false`| | onListItemLoaded | (listItemData: any) => Promise<void> | no | List item loaded handler. Allows to access list item information after it's loaded.| | onBeforeSubmit | (listItemData: any) => Promise<boolean> | no | Before submit handler. Allows to modify the object to be submitted or cancel the submission. To cancel, return `true`.| @@ -45,6 +57,7 @@ The `DynamicForm` can be configured with the following properties: | onSubmitError | (listItemData: any, error: Error) => void | no | Handler of submission error. | | onCancelled | () => void | no | Handler when form has been cancelled. | | returnListItemInstanceOnSubmit | boolean | no | Specifies if `onSubmitted` event should pass PnPJS list item (`IItem`) as a second parameter. Default - `true` | +| supportedFileExtensions | string[] | no | Specify the supported file extensions for the file picker. Only used when enableFileSelection is `true`. Default value is `["docx", "doc", "pptx", "ppt", "xlsx", "xls", "pdf"]`. | | webAbsoluteUrl | string | no | Absolute Web Url of target site (user requires permissions). | | fieldOverrides | {[columnInternalName: string] : {(fieldProperties: IDynamicFieldProps): React.ReactElement\}} | no | Key value pair for fields you want to override. Key is the internal field name, value is the function to be called for the custom element to render. | | respectEtag | boolean | no | Specifies if the form should respect the ETag of the item. Default - `true` | diff --git a/src/controls/dynamicForm/DynamicForm.module.scss b/src/controls/dynamicForm/DynamicForm.module.scss index d3fc6b123..db54b38a4 100644 --- a/src/controls/dynamicForm/DynamicForm.module.scss +++ b/src/controls/dynamicForm/DynamicForm.module.scss @@ -147,3 +147,8 @@ } } } + +.selectedFileContainer { + display: flex; + margin: 10px 0px; +} diff --git a/src/controls/dynamicForm/DynamicForm.tsx b/src/controls/dynamicForm/DynamicForm.tsx index 207e9149b..7cd5d4eff 100644 --- a/src/controls/dynamicForm/DynamicForm.tsx +++ b/src/controls/dynamicForm/DynamicForm.tsx @@ -12,7 +12,7 @@ import { IStackTokens, Stack } from "@fluentui/react/lib/Stack"; import * as React from "react"; import { IUploadImageResult } from "../../common/SPEntities"; import SPservice from "../../services/SPService"; -import { IFilePickerResult } from "../filePicker"; +import { FilePicker, IFilePickerResult } from "../filePicker"; import { DynamicField } from "./dynamicField"; import { DateFormat, @@ -27,6 +27,7 @@ import { DialogFooter, DialogType, } from "@fluentui/react/lib/Dialog"; +import { Icon } from 'office-ui-fabric-react'; import "@pnp/sp/lists"; import "@pnp/sp/content-types"; @@ -109,6 +110,11 @@ export class DynamicForm extends React.Component< ) : (
+ {this.props.enableFileSelection === true && + this.props.listItemId === undefined && + this.props.contentTypeId !== undefined && + this.props.contentTypeId.startsWith("0x0101") && + this.renderFileSelectionControl()} {fieldCollection.map((v, i) => { if ( fieldOverrides && @@ -182,6 +188,9 @@ export class DynamicForm extends React.Component< onSubmitted, onBeforeSubmit, onSubmitError, + enableFileSelection, + validationErrorDialogProps, + returnListItemInstanceOnSubmit } = this.props; try { @@ -218,11 +227,22 @@ export class DynamicForm extends React.Component< } } }); + if (shouldBeReturnBack) { this.setState({ fieldCollection: fields, isValidationErrorDialogOpen: - this.props.validationErrorDialogProps + validationErrorDialogProps + ?.showDialogOnValidationError === true, + }); + return; + } + + if (enableFileSelection === true && this.state.selectedFile === undefined && this.props.listItemId === undefined) { + this.setState({ + missingSelectedFile: true, + isValidationErrorDialogOpen: + validationErrorDialogProps ?.showDialogOnValidationError === true, }); return; @@ -322,7 +342,7 @@ export class DynamicForm extends React.Component< if (onSubmitted) { onSubmitted( iur.data, - this.props.returnListItemInstanceOnSubmit !== false + returnListItemInstanceOnSubmit !== false ? iur.item : undefined ); @@ -338,28 +358,33 @@ export class DynamicForm extends React.Component< else if ( contentTypeId === undefined || contentTypeId === "" || - !contentTypeId.startsWith("0x0120")|| - contentTypeId.startsWith("0x01") + (!contentTypeId.startsWith("0x0120") && + contentTypeId.startsWith("0x01")) ) { - // We are adding a new list item - try { - const contentTypeIdField = "ContentTypeId"; - //check if item contenttype is passed, then update the object with content type id, else, pass the object - if (contentTypeId !== undefined && contentTypeId.startsWith("0x01")) objects[contentTypeIdField] = contentTypeId; - const iar = await sp.web.lists.getById(listId).items.add(objects); - if (onSubmitted) { - onSubmitted( - iar.data, - this.props.returnListItemInstanceOnSubmit !== false - ? iar.item - : undefined - ); - } - } catch (error) { - if (onSubmitError) { - onSubmitError(objects, error); + if (contentTypeId === undefined || enableFileSelection === true) { + await this.addFileToLibrary(objects); + } + else { + // We are adding a new list item + try { + const contentTypeIdField = "ContentTypeId"; + //check if item contenttype is passed, then update the object with content type id, else, pass the object + if (contentTypeId !== undefined && contentTypeId.startsWith("0x01")) objects[contentTypeIdField] = contentTypeId; + const iar = await sp.web.lists.getById(listId).items.add(objects); + if (onSubmitted) { + onSubmitted( + iar.data, + this.props.returnListItemInstanceOnSubmit !== false + ? iar.item + : undefined + ); + } + } catch (error) { + if (onSubmitError) { + onSubmitError(objects, error); + } + console.log("Error", error); } - console.log("Error", error); } } else if (contentTypeId.startsWith("0x0120")) { @@ -408,6 +433,9 @@ export class DynamicForm extends React.Component< } console.log("Error", error); } + } else if (contentTypeId.startsWith("0x01") && enableFileSelection === true) { + // We are adding a folder or a Document Set + await this.addFileToLibrary(objects); } this.setState({ @@ -422,6 +450,64 @@ export class DynamicForm extends React.Component< } }; + private addFileToLibrary = async (objects: {}): Promise => { + const { + selectedFile + } = this.state; + + const { + listId, + contentTypeId, + onSubmitted, + onSubmitError, + returnListItemInstanceOnSubmit + } = this.props; + + try { + const idField = "ID"; + const contentTypeIdField = "ContentTypeId"; + + const library = await sp.web.lists.getById(listId); + const itemTitle = + selectedFile !== undefined && selectedFile.fileName !== undefined && selectedFile.fileName !== "" + ? (selectedFile.fileName as string).replace( + /["|*|:|<|>|?|/|\\||]/g, + "_" + ) // Replace not allowed chars in folder name + : ""; // Empty string will be replaced by SPO with Folder Item ID + + const fileCreatedResult = await library.rootFolder.files.addChunked(encodeURI(itemTitle), await selectedFile.downloadFileContent()); + const fields = await fileCreatedResult.file.listItemAllFields(); + + if (fields[idField]) { + // Read the ID of the just created folder or Document Set + const folderId = fields[idField]; + + // Set the content type ID for the target item + objects[contentTypeIdField] = contentTypeId; + // Update the just created folder or Document Set + const iur = await library.items.getById(folderId).update(objects); + if (onSubmitted) { + onSubmitted( + iur.data, + returnListItemInstanceOnSubmit !== false + ? iur.item + : undefined + ); + } + } else { + throw new Error( + "Unable to read the ID of the just created folder or Document Set" + ); + } + } catch (error) { + if (onSubmitError) { + onSubmitError(objects, error); + } + console.log("Error", error); + } + } + // trigger when the user change any value in the form private onChange = async ( internalName: string, @@ -597,8 +683,8 @@ export class DynamicForm extends React.Component< hiddenName = response.value; termSetId = field.TermSetId; anchorId = field.AnchorId; - if (item !== null) { - item[field.InternalName].forEach((element) => { + if (item !== null && item[field.InternalName] !== null && item[field.InternalName].results !== null) { + item[field.InternalName].results.forEach((element) => { selectedTags.push({ key: element.TermGuid, name: element.Label, @@ -871,6 +957,77 @@ export class DynamicForm extends React.Component< return errorMessage; }; + private renderFileSelectionControl = (): React.ReactElement => { + const { + selectedFile, + missingSelectedFile + } = this.state; + + const labelEl = ; + + return
+
+ + {labelEl} +
+ { + if (filePickerResult.length === 1) { + this.setState({ + selectedFile: filePickerResult[0], + missingSelectedFile: false + }); + } + else { + this.setState({ + missingSelectedFile: true + }); + } + }} + required={true} + context={this.props.context} + hideWebSearchTab={true} + hideStockImages={true} + hideLocalMultipleUploadTab={true} + hideLinkUploadTab={true} + hideSiteFilesTab={true} + checkIfFileExists={true} + /> + {selectedFile &&
+ + {selectedFile.fileName} +
} + {missingSelectedFile === true && +
{strings.DynamicFormRequiredFileMessage}
} +
; + } + + private getFileIconFromExtension = (): string => { + const fileExtension = this.state.selectedFile.fileName.split('.').pop(); + switch (fileExtension) { + case 'pdf': + return 'PDF'; + case 'docx': + case 'doc': + return 'WordDocument'; + case 'pptx': + case 'ppt': + return 'PowerPointDocument'; + case 'xlsx': + case 'xls': + return 'ExcelDocument'; + case 'jpg': + case 'jpeg': + case 'png': + case 'gif': + return 'FileImage'; + default: + return 'Document'; + } + } + private isEmptyNumOrString(value: string | number): boolean { if ((value?.toString().trim().length || 0) === 0) return true; } diff --git a/src/controls/dynamicForm/IDynamicFormProps.ts b/src/controls/dynamicForm/IDynamicFormProps.ts index f62e44196..0c67f558c 100644 --- a/src/controls/dynamicForm/IDynamicFormProps.ts +++ b/src/controls/dynamicForm/IDynamicFormProps.ts @@ -82,4 +82,17 @@ export interface IDynamicFormProps { * Specify validation error dialog properties */ validationErrorDialogProps?: IValidationErrorDialogProps; + + /** + * Specify if the form should support the creation of a new list item in a document library attaching a file to it. + * This option is only available for document libraries and works only when the contentTypeId is specified and has a base type of type Document. + * Default - false + */ + enableFileSelection?: boolean; + + /** + * Specify the supported file extensions for the file picker. Default - "docx", "doc", "pptx", "ppt", "xlsx", "xls", "pdf" + * Only used when enableFileSelection is true + */ + supportedFileExtensions?: string[]; } diff --git a/src/controls/dynamicForm/IDynamicFormState.ts b/src/controls/dynamicForm/IDynamicFormState.ts index 2f3de2198..9a91f3a41 100644 --- a/src/controls/dynamicForm/IDynamicFormState.ts +++ b/src/controls/dynamicForm/IDynamicFormState.ts @@ -1,13 +1,13 @@ - import { IInstalledLanguageInfo } from '@pnp/sp/regional-settings'; import { IDynamicFieldProps } from './dynamicField/IDynamicFieldProps'; +import { IFilePickerResult } from "../filePicker"; + export interface IDynamicFormState { fieldCollection: IDynamicFieldProps[]; installedLanguages?: IInstalledLanguageInfo[]; isSaving?: boolean; etag?: string; isValidationErrorDialogOpen: boolean; + selectedFile?: IFilePickerResult; + missingSelectedFile?: boolean; } - - - diff --git a/src/loc/bg-bg.ts b/src/loc/bg-bg.ts index 813cc925e..59112a698 100644 --- a/src/loc/bg-bg.ts +++ b/src/loc/bg-bg.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Стойността трябва да е по-голяма от {0}", "DynamicFormNumberValueMustBeBetween": "Стойността трябва да е между {0} и {1}", "DynamicFormNumberValueMustBeLowerThan": "Стойността трябва да е по-ниска от {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Използвайте това местоположение:", "ListItemCommentDIalogDeleteSubText": "Наистина ли искате да изтриете този коментар?", "ListItemCommentsDialogDeleteTitle": "Потвърдете Изтриване на коментар", diff --git a/src/loc/ca-es.ts b/src/loc/ca-es.ts index 210195ee7..05d5fffba 100644 --- a/src/loc/ca-es.ts +++ b/src/loc/ca-es.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "El valor ha de ser superior a {0}", "DynamicFormNumberValueMustBeBetween": "El valor ha d'estar entre {0} i {1}", "DynamicFormNumberValueMustBeLowerThan": "El valor ha de ser inferior a {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Utilitzeu aquesta ubicació:", "ListItemCommentDIalogDeleteSubText": "Esteu segur que voleu suprimir aquest comentari?", "ListItemCommentsDialogDeleteTitle": "Confirmació de la supressió del comentari", diff --git a/src/loc/da-dk.ts b/src/loc/da-dk.ts index e3d4df04c..51be4e087 100644 --- a/src/loc/da-dk.ts +++ b/src/loc/da-dk.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Værdien skal være større end {0}", "DynamicFormNumberValueMustBeBetween": "Værdien skal være mellem {0} og {1}", "DynamicFormNumberValueMustBeLowerThan": "Værdien skal være lavere end {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Brug denne placering:", "ListItemCommentDIalogDeleteSubText": "Er du sikker på, at du vil slette denne kommentar?", "ListItemCommentsDialogDeleteTitle": "Bekræft kommentar til sletning", diff --git a/src/loc/de-de.ts b/src/loc/de-de.ts index 8d9687e6d..db0ccf754 100644 --- a/src/loc/de-de.ts +++ b/src/loc/de-de.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Der Wert muss größer als {0} sein.", "DynamicFormNumberValueMustBeBetween": "Der Wert muss zwischen {0} und {1} liegen.", "DynamicFormNumberValueMustBeLowerThan": "Der Wert muss niedriger als {0} sein.", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Verwenden Sie diesen Speicherort:", "ListItemCommentDIalogDeleteSubText": "Sind Sie sicher, dass Sie diesen Kommentar löschen möchten?", "ListItemCommentsDialogDeleteTitle": "Kommentar löschen bestätigen", diff --git a/src/loc/el-gr.ts b/src/loc/el-gr.ts index 56ba1243c..ad5b4cad5 100644 --- a/src/loc/el-gr.ts +++ b/src/loc/el-gr.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Η τιμή πρέπει να είναι μεγαλύτερη από {0}", "DynamicFormNumberValueMustBeBetween": "Η τιμή πρέπει να είναι μεταξύ {0} και {1}", "DynamicFormNumberValueMustBeLowerThan": "Η τιμή πρέπει να είναι μικρότερη από {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Χρησιμοποιήστε αυτήν τη θέση:", "ListItemCommentDIalogDeleteSubText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το σχόλιο;", "ListItemCommentsDialogDeleteTitle": "Επιβεβαίωση διαγραφής σχολίου", diff --git a/src/loc/en-us.ts b/src/loc/en-us.ts index b0b3a1e27..f91d4f71a 100644 --- a/src/loc/en-us.ts +++ b/src/loc/en-us.ts @@ -388,6 +388,9 @@ define([], () => { DynamicFormNumberValueMustBeGreaterThan: "Value must be greater than {0}", DynamicFormNumberValueMustBeBetween: "Value must be between {0} and {1}", DynamicFormNumberValueMustBeLowerThan: "Value must be lower than {0}", + DynamicFormChooseFileLabel: "File", + DynamicFormChooseFileButtonText: "Select file", + DynamicFormRequiredFileMessage: "File is required.", customDisplayName: "Use this location:", ListItemCommentDIalogDeleteSubText: "Are you sure that you want to delete this comment?", ListItemCommentsDialogDeleteTitle: "Confirm Delete Comment", diff --git a/src/loc/es-es.ts b/src/loc/es-es.ts index 0502143fe..85256e1b8 100644 --- a/src/loc/es-es.ts +++ b/src/loc/es-es.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "El valor debe ser mayor que {0}", "DynamicFormNumberValueMustBeBetween": "El valor debe estar entre {0} y {1}", "DynamicFormNumberValueMustBeLowerThan": "El valor debe ser inferior a {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Utilice esta ubicación:", "ListItemCommentDIalogDeleteSubText": "¿Está seguro de que desea eliminar este comentario?", "ListItemCommentsDialogDeleteTitle": "Confirmar comentario de eliminación", diff --git a/src/loc/et-ee.ts b/src/loc/et-ee.ts index dae38980c..58c0a45ee 100644 --- a/src/loc/et-ee.ts +++ b/src/loc/et-ee.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Väärtus peab olema suurem kui {0}", "DynamicFormNumberValueMustBeBetween": "Väärtus peab olema vahemikus {0} kuni {1}", "DynamicFormNumberValueMustBeLowerThan": "Väärtus peab olema väiksem kui {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Kasuta seda asukohta:", "ListItemCommentDIalogDeleteSubText": "Kas soovite kindlasti selle kommentaari kustutada?", "ListItemCommentsDialogDeleteTitle": "Kommentaari kustutamise kinnitamine", diff --git a/src/loc/eu-es.ts b/src/loc/eu-es.ts index fc6b030c8..d39f064b3 100644 --- a/src/loc/eu-es.ts +++ b/src/loc/eu-es.ts @@ -385,5 +385,8 @@ TermSetNavigationNoTerms: "No terms defined", "DynamicFormNumberValueMustBeGreaterThan": "Balioak {0} baino handiagoa izan behar du", "DynamicFormNumberValueMustBeBetween": "Balioak {0} eta {1} artean egon behar du", "DynamicFormNumberValueMustBeLowerThan": "Balioak {0} baino txikiagoa izan behar du", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", }; }); diff --git a/src/loc/fi-fi.ts b/src/loc/fi-fi.ts index 9a378c06d..8a8243efb 100644 --- a/src/loc/fi-fi.ts +++ b/src/loc/fi-fi.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Arvon on oltava suurempi kuin {0}", "DynamicFormNumberValueMustBeBetween": "Tämän kentän arvon on oltava välillä {0} - {1}", "DynamicFormNumberValueMustBeLowerThan": "Arvon on oltava pienempi kuin {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Käytä tätä sijaintia:", "ListItemCommentDIalogDeleteSubText": "Haluatko varmasti poistaa tämän kommentin?", "ListItemCommentsDialogDeleteTitle": "Vahvista poista kommentti", diff --git a/src/loc/fr-ca.ts b/src/loc/fr-ca.ts index 9b8c20943..ed304f733 100644 --- a/src/loc/fr-ca.ts +++ b/src/loc/fr-ca.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "La valeur doit être supérieure à {0}", "DynamicFormNumberValueMustBeBetween": "La valeur doit être comprise entre {0} et {1}", "DynamicFormNumberValueMustBeLowerThan": "La valeur doit être inférieure à {0}", + "DynamicFormChooseFileLabel": "Fichier", + "DynamicFormChooseFileButtonText": "Sélectionnez un fichier", + "DynamicFormRequiredFileMessage": "Un fichier est requis.", "customDisplayName": "Utilisez cet emplacement :", "ListItemCommentDIalogDeleteSubText": "Êtes-vous sûr de vouloir supprimer ce commentaire?", "ListItemCommentsDialogDeleteTitle": "Confirmer supprimer le commentaire", diff --git a/src/loc/fr-fr.ts b/src/loc/fr-fr.ts index 3ea6c1b1a..f0cc76a0e 100644 --- a/src/loc/fr-fr.ts +++ b/src/loc/fr-fr.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "La valeur doit être supérieure à {0}", "DynamicFormNumberValueMustBeBetween": "La valeur doit être comprise entre {0} et {1}", "DynamicFormNumberValueMustBeLowerThan": "La valeur doit être inférieure à {0}", + "DynamicFormChooseFileLabel": "Fichier", + "DynamicFormChooseFileButtonText": "Sélectionnez un fichier", + "DynamicFormRequiredFileMessage": "Un fichier est requis.", "customDisplayName": "Utilisez cet emplacement :", "ListItemCommentDIalogDeleteSubText": "Êtes-vous sûr de vouloir supprimer ce commentaire ?", "ListItemCommentsDialogDeleteTitle": "Confirmer la suppression du commentaire", diff --git a/src/loc/it-it.ts b/src/loc/it-it.ts index bc04ab732..354dcc451 100644 --- a/src/loc/it-it.ts +++ b/src/loc/it-it.ts @@ -368,6 +368,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Il valore inserito deve essere maggiore di {0}", "DynamicFormNumberValueMustBeBetween": "Il valore inserito deve essere compreso tra {0} e {1}", "DynamicFormNumberValueMustBeLowerThan": "Il valore inserito deve essere minore di {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Seleziona file", + "DynamicFormRequiredFileMessage": "Il file è obbligatorio.", "customDisplayName": "Utilizzare questa posizione:", "ListItemCommentDIalogDeleteSubText": "Eliminare questo commento?", "ListItemCommentsDialogDeleteTitle": "Conferma eliminazione commento", diff --git a/src/loc/ja-jp.ts b/src/loc/ja-jp.ts index fccce14db..0946f1326 100644 --- a/src/loc/ja-jp.ts +++ b/src/loc/ja-jp.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "値は {0} より大きくなければなりません", "DynamicFormNumberValueMustBeBetween": "値は {0} から {1} の間である必要があります", "DynamicFormNumberValueMustBeLowerThan": "値は {0} より小さい必要があります", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "この場所を使用します。", "ListItemCommentDIalogDeleteSubText": "このコメントを削除しますか?", "ListItemCommentsDialogDeleteTitle": "コメントの削除の確認", diff --git a/src/loc/lt-lt.ts b/src/loc/lt-lt.ts index 5a996cf33..7cbfd7d75 100644 --- a/src/loc/lt-lt.ts +++ b/src/loc/lt-lt.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Reikšmė turi būti didesnė nei {0}", "DynamicFormNumberValueMustBeBetween": "Reikšmė turi būti nuo {0} iki {1}", "DynamicFormNumberValueMustBeLowerThan": "Vertė turi būti mažesnė nei {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Naudokite šią vietą:", "ListItemCommentDIalogDeleteSubText": "Ar tikrai norite panaikinti šį komentarą?", "ListItemCommentsDialogDeleteTitle": "Patvirtinti naikinimo komentarą", diff --git a/src/loc/lv-lv.ts b/src/loc/lv-lv.ts index ad9eca083..afb8140e5 100644 --- a/src/loc/lv-lv.ts +++ b/src/loc/lv-lv.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Vērtībai ir jābūt lielākai par {0}", "DynamicFormNumberValueMustBeBetween": "Vērtībai ir jābūt no {0} līdz {1}", "DynamicFormNumberValueMustBeLowerThan": "Vērtībai ir jābūt mazākai par {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Izmantojiet šo atrašanās vietu:", "ListItemCommentDIalogDeleteSubText": "Vai tiešām vēlaties dzēst šo komentāru?", "ListItemCommentsDialogDeleteTitle": "Apstiprināt dzēst komentāru", diff --git a/src/loc/mystrings.d.ts b/src/loc/mystrings.d.ts index f9e9d524b..cbc8cf23b 100644 --- a/src/loc/mystrings.d.ts +++ b/src/loc/mystrings.d.ts @@ -372,6 +372,9 @@ declare interface IControlStrings { DynamicFormNumberValueMustBeGreaterThan: string; DynamicFormNumberValueMustBeBetween: string; DynamicFormNumberValueMustBeLowerThan: string; + DynamicFormChooseFileLabel: string; + DynamicFormChooseFileButtonText: string; + DynamicFormRequiredFileMessage: string; // Location picker customDisplayName: string; diff --git a/src/loc/nb-no.ts b/src/loc/nb-no.ts index f59db8baa..e152dd0ff 100644 --- a/src/loc/nb-no.ts +++ b/src/loc/nb-no.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Verdien må være større enn {0}", "DynamicFormNumberValueMustBeBetween": "Verdien må være mellom {0} og {1}", "DynamicFormNumberValueMustBeLowerThan": "Verdien må være lavere enn {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Bruk denne plasseringen:", "ListItemCommentDIalogDeleteSubText": "Er du sikker på at du vil slette denne kommentaren?", "ListItemCommentsDialogDeleteTitle": "Bekreft sletting av kommentar", diff --git a/src/loc/nl-nl.ts b/src/loc/nl-nl.ts index 6863f8d8e..4fda0e850 100644 --- a/src/loc/nl-nl.ts +++ b/src/loc/nl-nl.ts @@ -368,6 +368,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Waarde moet groter zijn dan {0}", "DynamicFormNumberValueMustBeBetween": "Waarde moet tussen {0} en {1} liggen", "DynamicFormNumberValueMustBeLowerThan": "Waarde moet lager zijn dan {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Gebruik deze locatie:", "ListItemCommentDIalogDeleteSubText": "Weet u zeker dat u deze opmerking wilt verwijderen?", "ListItemCommentsDialogDeleteTitle": "Opmerking verwijderen bevestigen", diff --git a/src/loc/pl-pl.ts b/src/loc/pl-pl.ts index c668f568c..17f6895bb 100644 --- a/src/loc/pl-pl.ts +++ b/src/loc/pl-pl.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Wartość musi być większa niż {0}", "DynamicFormNumberValueMustBeBetween": "Wartość musi mieścić się w przedziale od {0} do {1}", "DynamicFormNumberValueMustBeLowerThan": "Wartość musi być mniejsza niż {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Użyj tej lokalizacji:", "ListItemCommentDIalogDeleteSubText": "Czy na pewno chcesz usunąć ten komentarz?", "ListItemCommentsDialogDeleteTitle": "Potwierdź Usuń komentarz", diff --git a/src/loc/pt-br.ts b/src/loc/pt-br.ts index d28b24555..a473b17f3 100644 --- a/src/loc/pt-br.ts +++ b/src/loc/pt-br.ts @@ -368,6 +368,9 @@ define([], () => { DynamicFormNumberValueMustBeGreaterThan: "O valor deve ser maior que {0}", DynamicFormNumberValueMustBeBetween: "O valor deve estar entre {0} e {1}", DynamicFormNumberValueMustBeLowerThan: "O valor deve ser inferior a {0}", + DynamicFormChooseFileLabel: "File", + DynamicFormChooseFileButtonText: "Select file", + DynamicFormRequiredFileMessage: "File is required.", customDisplayName: "Utilize este local:", ListItemCommentDIalogDeleteSubText: "Tem a certeza que quer eliminar este comentário?", ListItemCommentsDialogDeleteTitle: "Confirmar Eliminar Comentário", diff --git a/src/loc/pt-pt.ts b/src/loc/pt-pt.ts index e48fa53a7..f27b6fca4 100644 --- a/src/loc/pt-pt.ts +++ b/src/loc/pt-pt.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "O valor deve ser maior que {0}", "DynamicFormNumberValueMustBeBetween": "O valor deve estar entre {0} e {1}", "DynamicFormNumberValueMustBeLowerThan": "O valor deve ser inferior a {0}", + "DynamicFormChooseFileLabel": "Ficheiro", + "DynamicFormChooseFileButtonText": "Selecionar ficheiro", + "DynamicFormRequiredFileMessage": "Ficheiro é necessário.", "customDisplayName": "Utilize este local:", "ListItemCommentDIalogDeleteSubText": "Tem a certeza que quer eliminar este comentário?", "ListItemCommentsDialogDeleteTitle": "Confirmar Eliminar Comentário", diff --git a/src/loc/ro-ro.ts b/src/loc/ro-ro.ts index d3be25630..98a16d1dc 100644 --- a/src/loc/ro-ro.ts +++ b/src/loc/ro-ro.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Valoarea trebuie să fie mai mare decât {0}", "DynamicFormNumberValueMustBeBetween": "Valoarea trebuie să fie între {0} și {1}", "DynamicFormNumberValueMustBeLowerThan": "Valoarea trebuie să fie mai mică decât {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Utilizați această locație:", "ListItemCommentDIalogDeleteSubText": "Sunteți sigur că doriți să ștergeți acest comentariu?", "ListItemCommentsDialogDeleteTitle": "Confirmați ștergerea comentariului", diff --git a/src/loc/ru-ru.ts b/src/loc/ru-ru.ts index 290ec45fd..6a732d47d 100644 --- a/src/loc/ru-ru.ts +++ b/src/loc/ru-ru.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Значение должно быть больше {0}", "DynamicFormNumberValueMustBeBetween": "Значение должно быть между {0} и {1}.", "DynamicFormNumberValueMustBeLowerThan": "Значение должно быть меньше {0}.", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Используйте это расположение:", "ListItemCommentDIalogDeleteSubText": "Вы уверены, что хотите удалить этот комментарий?", "ListItemCommentsDialogDeleteTitle": "Подтвердить удаление комментария", diff --git a/src/loc/sk-sk.ts b/src/loc/sk-sk.ts index 77c7f203c..e9e63f885 100644 --- a/src/loc/sk-sk.ts +++ b/src/loc/sk-sk.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Hodnota musí byť väčšia ako {0}", "DynamicFormNumberValueMustBeBetween": "Hodnota musí byť medzi {0} a {1}", "DynamicFormNumberValueMustBeLowerThan": "Hodnota musí byť nižšia ako {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Použite toto umiestnenie:", "ListItemCommentDIalogDeleteSubText": "Naozaj chcete odstrániť tento komentár?", "ListItemCommentsDialogDeleteTitle": "Potvrdiť odstránenie komentára", diff --git a/src/loc/sr-latn-rs.ts b/src/loc/sr-latn-rs.ts index 569508203..acb4d669a 100644 --- a/src/loc/sr-latn-rs.ts +++ b/src/loc/sr-latn-rs.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Vrednost mora da bude veća od {0}", "DynamicFormNumberValueMustBeBetween": "Vrednost mora da bude između {0} i {1}", "DynamicFormNumberValueMustBeLowerThan": "Vrednost mora biti manja od {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Koristi ovu lokaciju:", "ListItemCommentDIalogDeleteSubText": "Želite li zaista da izbrišete ovaj komentar?", "ListItemCommentsDialogDeleteTitle": "Potvrda brisanja komentara", diff --git a/src/loc/sv-se.ts b/src/loc/sv-se.ts index 6d3880e5a..d7ae67aef 100644 --- a/src/loc/sv-se.ts +++ b/src/loc/sv-se.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Värdet måste vara större än {0}", "DynamicFormNumberValueMustBeBetween": "Värdet måste vara mellan {0} och {1}", "DynamicFormNumberValueMustBeLowerThan": "Värdet måste vara lägre än {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Använd den här platsen:", "ListItemCommentDIalogDeleteSubText": "Vill du ta bort den här kommentaren?", "ListItemCommentsDialogDeleteTitle": "Bekräfta ta bort kommentar", diff --git a/src/loc/tr-tr.ts b/src/loc/tr-tr.ts index d19bb08c5..cdedff5e8 100644 --- a/src/loc/tr-tr.ts +++ b/src/loc/tr-tr.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Değer, {0} değerinden büyük olmalıdır", "DynamicFormNumberValueMustBeBetween": "Değer, {0} ile {1} arasında olmalıdır", "DynamicFormNumberValueMustBeLowerThan": "Değer, {0} değerinden düşük olmalıdır", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Bu konumu kullan:", "ListItemCommentDIalogDeleteSubText": "Bu yorumu silmek istediğinizden emin misiniz?", "ListItemCommentsDialogDeleteTitle": "Açıklamayı Sil'i Onayla", diff --git a/src/loc/vi-vn.ts b/src/loc/vi-vn.ts index 6c9ca5905..ea1df60cf 100644 --- a/src/loc/vi-vn.ts +++ b/src/loc/vi-vn.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "Giá trị phải lớn hơn {0}", "DynamicFormNumberValueMustBeBetween": "Giá trị phải nằm trong khoảng từ {0} đến {1}", "DynamicFormNumberValueMustBeLowerThan": "Giá trị phải thấp hơn {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "Sử dụng vị trí này:", "ListItemCommentDIalogDeleteSubText": "Bạn có chắc chắn rằng bạn muốn xóa bình luận này không?", "ListItemCommentsDialogDeleteTitle": "Xác nhận Xóa Chú thích", diff --git a/src/loc/zh-cn.ts b/src/loc/zh-cn.ts index f20ddcfaa..7ca751e2e 100644 --- a/src/loc/zh-cn.ts +++ b/src/loc/zh-cn.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "值必须大于 {0}", "DynamicFormNumberValueMustBeBetween": "值必须介于 {0} 和 {1} 之间", "DynamicFormNumberValueMustBeLowerThan": "值必须小于 {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "使用此位置:", "ListItemCommentDIalogDeleteSubText": "您确定要删除此评论吗?", "ListItemCommentsDialogDeleteTitle": "确认删除注释", diff --git a/src/loc/zh-tw.ts b/src/loc/zh-tw.ts index ddf418773..4fff0b10e 100644 --- a/src/loc/zh-tw.ts +++ b/src/loc/zh-tw.ts @@ -370,6 +370,9 @@ define([], () => { "DynamicFormNumberValueMustBeGreaterThan": "值必須大於 {0}", "DynamicFormNumberValueMustBeBetween": "值必須介於 {0} 和 {1} 之間", "DynamicFormNumberValueMustBeLowerThan": "值必須小於 {0}", + "DynamicFormChooseFileLabel": "File", + "DynamicFormChooseFileButtonText": "Select file", + "DynamicFormRequiredFileMessage": "File is required.", "customDisplayName": "使用此位置:", "ListItemCommentDIalogDeleteSubText": "您確定要刪除此評論嗎?", "ListItemCommentsDialogDeleteTitle": "確認刪除註釋",