Skip to content

Commit 4f54f73

Browse files
authored
Merge pull request #751 from nbelyh/feature/folder_explorer_renderers
Custom render callbacks for the "Upload" and "Link" tabs
2 parents 8805856 + e6f9cb8 commit 4f54f73

File tree

8 files changed

+45
-2
lines changed

8 files changed

+45
-2
lines changed

docs/documentation/docs/controls/FilePicker.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ The FilePicker component can be configured with the following properties:
7676
| hideLocalUploadTab | boolean | no | Specifies if LocalUploadTab should be hidden. |
7777
| hideLinkUploadTab | boolean | no | Specifies if LinkUploadTab should be hidden. |
7878
| storeLastActiveTab | boolean | no | Specifies if last active tab will be stored after the Upload panel has been closed. Note: the value of selected tab is stored in the queryString hash. Default `true` |
79+
| renderCustomUploadTabContent | (filePickerResult: IFilePickerResult) => JSX.Element | null | no | Optional renderer to add custom user-defined fields to "Upload" tab |
80+
| renderCustomLinkTabContent | (filePickerResult: IFilePickerResult) => JSX.Element | null | no | Optional renderer to add custom user-defined fields to "Link" tab |
7981

8082
interface `IFilePickerResult`
8183

src/controls/filePicker/FilePicker.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,15 @@ export class FilePicker extends React.Component<IFilePickerProps, IFilePickerSta
121121
this.state.selectedTab === "keyLink" &&
122122
<LinkFilePickerTab
123123
fileSearchService={this.fileSearchService}
124+
renderCustomLinkTabContent={this.props.renderCustomLinkTabContent}
124125
allowExternalTenantLinks={true}
125126
{...linkTabProps}
126127
/>
127128
}
128129
{
129130
this.state.selectedTab === "keyUpload" &&
130131
<UploadFilePickerTab
132+
renderCustomUploadTabContent={this.props.renderCustomUploadTabContent}
131133
{...linkTabProps}
132134
onChange={this._handleOnChange}
133135
/>

src/controls/filePicker/IFilePickerProps.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,12 @@ export interface IFilePickerProps {
121121
* Handler when file picker has been cancelled.
122122
*/
123123
onCancel?: () => void;
124+
/**
125+
* Optional additional renderer for Link tab
126+
*/
127+
renderCustomLinkTabContent?: (filePickerResult: IFilePickerResult) => JSX.Element | null;
128+
/**
129+
* Optional additional renderer for Upload tab
130+
*/
131+
renderCustomUploadTabContent?: (filePickerResult: IFilePickerResult) => JSX.Element | null;
124132
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { IFilePickerTab } from "../FilePicker.types";
1+
import { IFilePickerTab, IFilePickerResult } from "../FilePicker.types";
22
import { FilesSearchService } from "../../../services/FilesSearchService";
33

44
export interface ILinkFilePickerTabProps extends IFilePickerTab {
55
allowExternalTenantLinks: boolean;
66
fileSearchService: FilesSearchService;
7+
renderCustomLinkTabContent: (filePickerResult: IFilePickerResult) => JSX.Element | null;
78
}

src/controls/filePicker/LinkFilePickerTab/LinkFilePickerTab.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export default class LinkFilePickerTab extends React.Component<ILinkFilePickerTa
4545
value={fileUrl}
4646
onChanged={(newValue: string) => this._handleChange(newValue)}
4747
/>
48+
{this.props.renderCustomLinkTabContent && this.props.renderCustomLinkTabContent(this.state.filePickerResult)}
4849
</div>
4950

5051
<div className={styles.actionButtonsContainer}>

src/controls/filePicker/UploadFilePickerTab/IUploadFilePickerTabProps.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ import { IFilePickerResult, IFilePickerTab } from "../FilePicker.types";
22

33
export interface IUploadFilePickerTabProps extends IFilePickerTab {
44
onChange: (value: IFilePickerResult) => void;
5+
renderCustomUploadTabContent: (filePickerResult: IFilePickerResult) => JSX.Element | null;
56
}

src/controls/filePicker/UploadFilePickerTab/UploadFilePickerTab.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export default class UploadFilePickerTab extends React.Component<IUploadFilePick
5252
<label className={styles.localTabLabel} htmlFor="fileInput">{
5353
(fileName ? strings.ChangeFileLinkLabel : strings.ChooseFileLinkLabel)
5454
}</label>
55+
{this.props.renderCustomUploadTabContent && this.props.renderCustomUploadTabContent(this.state.filePickerResult)}
5556
</div>
5657
<div className={styles.actionButtonsContainer}>
5758
<div className={styles.actionButtons}>

src/webparts/controlsTest/components/ControlsTest.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ import {
5656
import { ImageFit } from 'office-ui-fabric-react/lib/Image';
5757
import { FilePicker, IFilePickerResult } from '../../../FilePicker';
5858
import { FolderPicker } from '../../../FolderPicker';
59-
import { FolderExplorer, IFolder, IBreadcrumbItem } from '../../../FolderExplorer';
59+
import { FolderExplorer, IBreadcrumbItem, IFolder } from '../../../FolderExplorer';
6060
import { Pagination } from '../../../controls/pagination';
6161
import CarouselImage from '../../../controls/carousel/CarouselImage';
6262
import { FieldCollectionData, CustomCollectionFieldType } from '../../../FieldCollectionData';
@@ -522,6 +522,11 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
522522
}
523523
}
524524

525+
private rootFolder: IFolder = {
526+
Name: "Site",
527+
ServerRelativeUrl: this.props.context.pageContext.web.serverRelativeUrl
528+
};
529+
525530
private _onFolderSelect = (folder: IFolder): void => {
526531
console.log('selected folder', folder);
527532

@@ -1275,6 +1280,7 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
12751280
</div>
12761281

12771282
<div>
1283+
<h3>File Picker</h3>
12781284
<FilePicker
12791285
bingAPIKey="<BING API KEY>"
12801286
//accepts={[".gif", ".jpg", ".jpeg", ".bmp", ".dib", ".tif", ".tiff", ".ico", ".png", ".jxr", ".svg"]}
@@ -1298,6 +1304,27 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
12981304
}
12991305
</div>
13001306

1307+
<div>
1308+
<h3>File Picker with target folder browser</h3>
1309+
<FilePicker
1310+
bingAPIKey="<BING API KEY>"
1311+
//accepts={[".gif", ".jpg", ".jpeg", ".bmp", ".dib", ".tif", ".tiff", ".ico", ".png", ".jxr", ".svg"]}
1312+
buttonLabel="Upload image"
1313+
buttonIcon="FileImage"
1314+
onSave={this._onFilePickerSave}
1315+
onChange={(filePickerResult: IFilePickerResult) => { console.log(filePickerResult.fileName); }}
1316+
context={this.props.context}
1317+
hideRecentTab={false}
1318+
renderCustomUploadTabContent={() => (
1319+
<FolderExplorer context={this.props.context}
1320+
rootFolder={this.rootFolder}
1321+
defaultFolder={this.rootFolder}
1322+
onSelect={this._onFolderSelect}
1323+
canCreateFolders={true}
1324+
/>)}
1325+
/>
1326+
</div>
1327+
13011328
<p><a href="javascript:;" onClick={this.deleteItem}>Deletes second item</a></p>
13021329
<div>
13031330
<Progress title={'Progress Test'}

0 commit comments

Comments
 (0)