Skip to content

Commit c014a30

Browse files
author
Piotr Siatka
committed
Add StockImages to FilePicker
1 parent 0f00975 commit c014a30

File tree

10 files changed

+176
-1
lines changed

10 files changed

+176
-1
lines changed

docs/documentation/docs/controls/FilePicker.md

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ The FilePicker component can be configured with the following properties:
6969
| itemsCountQueryLimit | number | no | Number of items to obtain when executing REST queries. Default 100. |
7070
| hideRecentTab | boolean | no | Specifies if RecentTab should be hidden. |
7171
| hideWebSearchTab | boolean | no | Specifies if WebSearchTab should be hidden. |
72+
| hideStockImages | boolean | no | Specifies if StockImagesTab should be hidden. |
7273
| hideOrganisationalAssetTab | boolean | no | Specifies if OrganisationalAssetTab should be hidden. |
7374
| hideOneDriveTab | boolean | no | Specifies if OneDriveTab should be hidden. |
7475
| hideSiteFilesTab | boolean | no | Specifies if SiteFilesTab should be hidden. |

src/controls/filePicker/FilePicker.tsx

+17-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { IFilePickerResult } from './FilePicker.types';
2626
import { FilesSearchService } from '../../services/FilesSearchService';
2727

2828
import * as telemetry from '../../common/telemetry';
29+
import { StockImages } from './StockImagesTab/StockImages';
2930

3031
export class FilePicker extends React.Component<IFilePickerProps, IFilePickerState> {
3132
private fileBrowserService: FileBrowserService;
@@ -170,7 +171,14 @@ export class FilePicker extends React.Component<IFilePickerProps, IFilePickerSta
170171
{...linkTabProps}
171172
/>
172173
}
173-
174+
{
175+
this.state.selectedTab === "keyStockImages" &&
176+
<StockImages
177+
language={this.props.context.pageContext.cultureInfo.currentCultureName}
178+
fileSearchService={this.fileSearchService}
179+
{...linkTabProps}
180+
/>
181+
}
174182
</div>
175183
</Panel>
176184
</div >
@@ -235,6 +243,14 @@ export class FilePicker extends React.Component<IFilePickerProps, IFilePickerSta
235243
key: 'keyRecent',
236244
});
237245
}
246+
if (!this.props.hideStockImages) {
247+
links.push({
248+
name: strings.StockImagesLinkLabel,
249+
url: addUrl ? '#stockImages' : undefined,
250+
key: 'keyStockImages',
251+
icon: 'ImageSearch',
252+
});
253+
}
238254
if (this.props.bingAPIKey && !this.props.hideWebSearchTab) {
239255
links.push({
240256
name: strings.WebSearchLinkLabel,

src/controls/filePicker/IFilePickerProps.ts

+5
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ export interface IFilePickerProps {
7272
*/
7373
hideRecentTab?: boolean;
7474

75+
/**
76+
* Specifies if StockImagesTab should be hidden.
77+
*/
78+
hideStockImages?: boolean;
79+
7580
/**
7681
* Specifies if WebSearchTab should be hidden.
7782
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { IFilePickerTab } from "..";
2+
import { FilesSearchService } from "../../../services/FilesSearchService";
3+
4+
export interface IStockImagesProps extends IFilePickerTab {
5+
language: string;
6+
fileSearchService: FilesSearchService;
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
@import "../FilePicker.module.scss";
2+
3+
.stockImagesPickerContainer {
4+
width: 100%;
5+
height: 100%;
6+
}
7+
.stockImagesPicker {
8+
width: 100%;
9+
height: 100%;
10+
11+
background-color: transparent;
12+
border: 0px none transparent;
13+
padding: 0px;
14+
overflow: hidden;
15+
16+
margin-top:-30px;
17+
margin-left: -35px;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import * as React from 'react';
2+
import styles from './StockImages.module.scss';
3+
import { StockImagesEvent, SubmitValue, IStockImagesProps } from '.';
4+
import { GeneralHelper } from '../../../Utilities';
5+
import { IFilePickerResult } from '..';
6+
7+
export class StockImages extends React.Component<IStockImagesProps> {
8+
public componentDidMount() {
9+
window.addEventListener("message", this._handleImageIframeEvent);
10+
}
11+
12+
public componentWillUnmount() {
13+
window.removeEventListener("message", this._handleImageIframeEvent);
14+
}
15+
16+
public render(): React.ReactElement<IStockImagesProps> {
17+
const { language } = this.props;
18+
19+
const themesColor = `&themecolors=${encodeURIComponent(this.getCurrentThemeConfiguration())}`;
20+
const contentPickerUrl = `https://hubblecontent.osi.office.net/contentsvc/external/m365contentpicker/index.html?p=3&app=1001&aud=prod&channel=devmain&setlang=${language}&msel=0&env=prod&premium=1${themesColor}`;
21+
22+
return (
23+
<div className={styles.tabContainer}>
24+
<div className={styles.tab}>
25+
<div className={styles.stockImagesPickerContainer}>
26+
<iframe className={styles.stockImagesPicker} role={"application"} id={"stockImagesIFrame"}
27+
src={contentPickerUrl} />
28+
</div>
29+
</div>
30+
</div>
31+
);
32+
}
33+
34+
private _handleImageIframeEvent = (event) => {
35+
if (!event || !event.origin || event.origin.indexOf("https://hubblecontent.osi.office.net") !== 0) {
36+
return;
37+
}
38+
39+
const eventData: StockImagesEvent = JSON.parse(event.data);
40+
41+
if (eventData.MessageId === "AddItem") {
42+
this._handleSave(eventData);
43+
} else if (eventData.MessageId === "CancelDialog") {
44+
this._handleClose();
45+
}
46+
}
47+
48+
/**
49+
* Called when user saves
50+
*/
51+
private _handleSave = (event: StockImagesEvent) => {
52+
let filePickerResult: IFilePickerResult = null;
53+
const cdnFileInfo: SubmitValue = event.Values && (event.Values as SubmitValue[]).length > 0 ? (event.Values as SubmitValue[])[0] : null;
54+
if (cdnFileInfo) {
55+
filePickerResult = {
56+
downloadFileContent: () => { return this.props.fileSearchService.downloadBingContent(cdnFileInfo.sourceUrl, GeneralHelper.getFileNameFromUrl(GeneralHelper.getFileNameFromUrl(cdnFileInfo.sourceUrl))); },
57+
fileAbsoluteUrl: cdnFileInfo.sourceUrl,
58+
fileName: GeneralHelper.getFileNameFromUrl(cdnFileInfo.sourceUrl),
59+
fileNameWithoutExtension: GeneralHelper.getFileNameWithoutExtension(cdnFileInfo.sourceUrl)
60+
};
61+
}
62+
63+
this.props.onSave(filePickerResult);
64+
}
65+
66+
/**
67+
* Called when user closes tab
68+
*/
69+
private _handleClose = () => {
70+
this.props.onClose();
71+
}
72+
73+
private getCurrentThemeConfiguration() {
74+
if (!window["__themeState__"] || !window["__themeState__"].theme) {
75+
return "";
76+
}
77+
78+
const primaryColor = window["__themeState__"].theme["themePrimary"];
79+
const textColor = window["__themeState__"].theme["primaryText"];
80+
const primaryBackground = window["__themeState__"].theme["bodyBackground"];
81+
const neutralLighter = window["__themeState__"].theme["neutralLighter"];
82+
83+
const theme = `{"primaryColor":"${primaryColor}","textColor":"${textColor}","backgroundColor":"${primaryBackground}","neutralLighterColor":"${neutralLighter}"}`;
84+
return theme;
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
export interface EventFlags {
2+
dataCategories: number;
3+
diagnosticLevel: number;
4+
}
5+
6+
export interface DataField {
7+
name: string;
8+
dataType: number;
9+
value: string;
10+
classification: number;
11+
}
12+
13+
export interface TelemetryProperties {
14+
ariaTenantToken: string;
15+
nexusTenantToken: number;
16+
}
17+
18+
export interface EventValue {
19+
eventName: string;
20+
eventFlags: EventFlags;
21+
dataFields: DataField[];
22+
telemetryProperties: TelemetryProperties;
23+
}
24+
export interface SubmitValue {
25+
action: string;
26+
contenttype: string;
27+
sourceUrl: string;
28+
caption: string;
29+
}
30+
31+
export interface StockImagesEvent {
32+
MessageId: string;
33+
Values: EventValue | SubmitValue[];
34+
SendTime: number;
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from "./StockImagesModel";
2+
export * from "./IStockImagesProps";
3+
export * from "./StockImages";

src/loc/en-us.ts

+2
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ define([], () => {
324324
UploadImageHeader: "Upload image",
325325
UploadLinkLabel: "Upload",
326326
WebSearchLinkLabel: "Web search",
327+
StockImagesLinkLabel: "Stock images",
328+
StockImagesHeader: "Stock Images",
327329
Yes: "Yes",
328330

329331
NewFolderNamePlaceholder: "Enter your folder name",

src/loc/mystrings.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ declare interface IControlStrings {
289289
UploadImageHeader: string;
290290
UploadLinkLabel: string;
291291
WebSearchLinkLabel: string;
292+
StockImagesLinkLabel: string;
293+
StockImagesHeader: string;
292294
Yes: string;
293295

294296
// folder explorer

0 commit comments

Comments
 (0)