Skip to content

Commit 3d326b4

Browse files
committed
wip
1 parent c1f3d70 commit 3d326b4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+367
-350
lines changed

src/controls/filePicker/controls/TilesList/TilesList.tsx

+15-17
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ const TILE_HORZ_PADDING: number = 32;
3939
*/
4040
const BOTTOM_MARGIN: number = 36;
4141

42-
const LAYOUT_STORAGE_KEY: string = 'comparerOneDriveLayout';
43-
4442

4543
export class TilesList extends React.Component<ITilesListProps> {
4644
private _columnCount: number;
@@ -53,18 +51,18 @@ export class TilesList extends React.Component<ITilesListProps> {
5351
super(props);
5452
}
5553

56-
public componentDidUpdate(prevProps: ITilesListProps) {
54+
public componentDidUpdate(prevProps: ITilesListProps): void {
5755
if (this.props.filePickerResult !== prevProps.filePickerResult) {
5856
this._listElem.forceUpdate();
5957
}
6058
}
6159

6260
public render(): React.ReactElement<ITilesListProps> {
6361
return (
64-
<SelectionZone selection={this.props.selection} onItemInvoked={(item: IFile) => {this._handleItemInvoked(item);}}>
62+
<SelectionZone selection={this.props.selection} onItemInvoked={(item: IFile) => { this._handleItemInvoked(item); }}>
6563
<FocusZone>
6664
<List
67-
ref={(e:any) => { this._listElem = e; }}
65+
ref={(e: List) => { this._listElem = e; }}
6866
className={styles.folderList}
6967
items={this.props.items}
7068
getItemCountForPage={this._getItemCountForPage}
@@ -79,20 +77,20 @@ export class TilesList extends React.Component<ITilesListProps> {
7977
/**
8078
* Gets called what a file is selected.
8179
*/
82-
private _handleItemInvoked = (item: IFile) => {
83-
// If a file is selected, open the library
84-
if (item.isFolder) {
85-
this.props.onFolderOpen(item);
86-
} else {
87-
// Otherwise, remember it was selected
88-
this.props.onFileSelected(item);
80+
private _handleItemInvoked = (item: IFile): void => {
81+
// If a file is selected, open the library
82+
if (item.isFolder) {
83+
this.props.onFolderOpen(item);
84+
} else {
85+
// Otherwise, remember it was selected
86+
this.props.onFileSelected(item);
87+
}
8988
}
90-
}
9189

9290
/**
9391
* Calculates how many items there should be in the page
9492
*/
95-
private _getItemCountForPage = (itemIndex: number, surfaceRect: IRectangle): number => {
93+
private _getItemCountForPage = (itemIndex: number, surfaceRect: IRectangle): number => {
9694
if (itemIndex === 0) {
9795
this._columnCount = Math.ceil(surfaceRect.width / MAX_ROW_HEIGHT);
9896
this._columnWidth = Math.floor(surfaceRect.width / this._columnCount);
@@ -165,7 +163,7 @@ export class TilesList extends React.Component<ITilesListProps> {
165163
this.props.onNextPageDataRequest();
166164
return null;
167165
}
168-
let isSelected: boolean = this.props.filePickerResult && item.absoluteUrl === this.props.filePickerResult.fileAbsoluteUrl;
166+
const isSelected: boolean = this.props.filePickerResult && item.absoluteUrl === this.props.filePickerResult.fileAbsoluteUrl;
169167

170168
// I know this is a lot of divs and spans inside of each other, but my
171169
// goal was to mimic the HTML and style of the out-of-the-box file picker
@@ -203,7 +201,7 @@ export class TilesList extends React.Component<ITilesListProps> {
203201
}}
204202
onItemInvoked={(itemInvoked: IFile) => this._handleItemInvoked(itemInvoked)}
205203
/>
206-
:
204+
:
207205
<DocumentTile
208206
fileBroserService={this.props.fileBrowserService}
209207
item={item}
@@ -216,7 +214,7 @@ export class TilesList extends React.Component<ITilesListProps> {
216214
}}
217215
onItemInvoked={(itemInvoked: IFile) => this._handleItemInvoked(itemInvoked)}
218216
/>
219-
}
217+
}
220218
</div>
221219
</div>
222220
</div>

src/controls/fileTypeIcon/FileTypeIcon.test.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
/// <reference types="sinon" />
22

33
import * as React from 'react';
4-
import { assert, expect } from 'chai';
4+
import { expect } from 'chai';
55
import { mount, ReactWrapper } from 'enzyme';
66
import { FileTypeIcon } from './FileTypeIcon';
7-
import { IFileTypeIconProps, IconType, ApplicationType, ImageSize } from './IFileTypeIcon';
8-
9-
declare const sinon;
7+
import { IconType, ApplicationType, ImageSize } from './IFileTypeIcon';
108

119
describe('<FileTypeIcon />', () => {
1210
let fileTypeIcon: ReactWrapper;

src/controls/fileTypeIcon/FileTypeIcon.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { findIndex } from '@microsoft/sp-lodash-subset';
33
import { IFileTypeIconProps, ApplicationType, ApplicationIconList, IconType, IconSizes, ImageSize, IImageResult, ICON_GENERIC_16, ICON_GENERIC_48, ICON_GENERIC_96, ImageInformation } from './IFileTypeIcon';
44
import * as telemetry from '../../common/telemetry';
55
import { Icon } from 'office-ui-fabric-react/lib/components/Icon';
6-
import * as styles from './FileTypeIcon.module.scss';
76
import { ICON_GENERIC_20 } from '.';
87

98
const ICON_GENERIC = 'Page';

src/controls/folderExplorer/FolderExplorer/FolderExplorer.tsx

+7-7
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class FolderExplorer extends React.Component<IFolderExplorerProps, IFolde
3131
};
3232
}
3333

34-
public async componentDidMount() {
34+
public async componentDidMount(): Promise<void> {
3535
const targetFolder = this.props.defaultFolder ? this.props.defaultFolder : this.props.rootFolder;
3636
const siteAbsoluteUrl: string = this.props.siteAbsoluteUrl || this.props.context.pageContext.web.absoluteUrl;
3737
// get libraries if site absolute url does not end with folder relative url - if not retrieving document libraries by default
@@ -64,7 +64,7 @@ export class FolderExplorer extends React.Component<IFolderExplorerProps, IFolde
6464
<div>
6565
{this.state.folders.map((folder) => {
6666
return (
67-
<div className={styles.libraryItem} onClick={() => { this._getFolders(folder); }}>
67+
<div className={styles.libraryItem} key={folder.ServerRelativeUrl} onClick={() => { this._getFolders(folder).then(() => { /* no-op; */ }).catch(() => { /* no-op; */ }); }}>
6868
<Icon iconName="FabricFolder" className={styles.folderIcon} />
6969
{folder.Name}
7070
</div>
@@ -77,7 +77,7 @@ export class FolderExplorer extends React.Component<IFolderExplorerProps, IFolde
7777
<NewFolder context={this.props.context}
7878
siteAbsoluteUrl={siteAbsoluteUrl}
7979
selectedFolder={this.state.selectedFolder}
80-
addSubFolder={this._addSubFolder}></NewFolder>
80+
addSubFolder={this._addSubFolder} />
8181
}
8282
</div>
8383
</div>
@@ -91,8 +91,8 @@ export class FolderExplorer extends React.Component<IFolderExplorerProps, IFolde
9191
private _getBreadcrumbDOM = (): JSX.Element => {
9292
let breadCrumbDOM = null;
9393

94-
let breadCrumbItems = this._getCurrentBreadcrumbItems();
95-
let overflowIndex = breadCrumbItems.length > 1 ? 1 : 0;
94+
const breadCrumbItems = this._getCurrentBreadcrumbItems();
95+
const overflowIndex = breadCrumbItems.length > 1 ? 1 : 0;
9696
breadCrumbDOM = <Breadcrumb items={breadCrumbItems} className={styles.breadcrumbPath} maxDisplayedItems={3} overflowIndex={overflowIndex} />;
9797

9898
return breadCrumbDOM;
@@ -109,7 +109,7 @@ export class FolderExplorer extends React.Component<IFolderExplorerProps, IFolde
109109
items = [...this.props.initialBreadcrumbItems];
110110
}
111111

112-
let rootItem: IBreadcrumbItem = { text: this.props.rootFolder.Name, key: 'Root-Item', onClick: this._getFolders.bind(this, this.props.rootFolder) };
112+
const rootItem: IBreadcrumbItem = { text: this.props.rootFolder.Name, key: 'Root-Item', onClick: this._getFolders.bind(this, this.props.rootFolder) };
113113
items.push(rootItem);
114114

115115
if (this.state.selectedFolder && this.state.selectedFolder.ServerRelativeUrl !== this.props.rootFolder.ServerRelativeUrl) {
@@ -125,7 +125,7 @@ export class FolderExplorer extends React.Component<IFolderExplorerProps, IFolde
125125
itemText = lib[0].Name;
126126
}
127127

128-
let folderItem: IBreadcrumbItem = { text: itemText, key: `Folder-${index.toString()}`, onClick: this._getFolders.bind(this, { Name: folderName, ServerRelativeUrl: folderPath }) };
128+
const folderItem: IBreadcrumbItem = { text: itemText, key: `Folder-${index.toString()}`, onClick: this._getFolders.bind(this, { Name: folderName, ServerRelativeUrl: folderPath }) };
129129
items.push(folderItem);
130130
}
131131
});

src/controls/folderExplorer/NewFolder/NewFolder.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class NewFolder extends React.Component<INewFolderProps, INewFolderState>
4747
}} /></span>
4848
}
4949
{!this.state.loading &&
50-
<Icon iconName="FabricNewFolder" className={styles.folderIcon}></Icon>
50+
<Icon iconName="FabricNewFolder" className={styles.folderIcon} />
5151
}
5252
{!this.state.showInput &&
5353
<div className={styles.defaultText} onClick={this._onShowInputChange}>New folder</div>
@@ -82,11 +82,11 @@ export class NewFolder extends React.Component<INewFolderProps, INewFolderState>
8282
);
8383
}
8484

85-
private _onFolderNameChange = (newValue?: string) => {
85+
private _onFolderNameChange = (newValue?: string): void => {
8686
this.setState({ folderName: newValue || '', errorMessage: '' });
8787
}
8888

89-
private _onShowInputChange = (event: React.MouseEvent<HTMLDivElement>) => {
89+
private _onShowInputChange = (event: React.MouseEvent<HTMLDivElement>): void => {
9090
this.setState({ showInput: true });
9191
}
9292

@@ -122,6 +122,6 @@ export class NewFolder extends React.Component<INewFolderProps, INewFolderState>
122122
}
123123

124124
// callback
125-
this.props.addSubFolder(newFolder);
125+
this.props.addSubFolder(newFolder).then(() => { /* no-op; */}).catch(() => { /* no-op; */ });
126126
}
127127
}

src/controls/folderPicker/FolderPicker.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class FolderPicker extends React.Component<IFolderPickerProps, IFolderPic
2727
};
2828
}
2929

30-
public UNSAFE_componentWillReceiveProps(nextProps: IFolderPickerProps) {
30+
public UNSAFE_componentWillReceiveProps(nextProps: IFolderPickerProps): void {
3131

3232
this.setState({
3333
selectedFolder: nextProps.defaultFolder,
@@ -95,15 +95,15 @@ export class FolderPicker extends React.Component<IFolderPickerProps, IFolderPic
9595
);
9696
}
9797

98-
private _showPanel = () => {
98+
private _showPanel = (): void => {
9999
this.setState({ showPanel: true });
100100
}
101101

102-
private _hidePanel = () => {
102+
private _hidePanel = (): void => {
103103
this.setState({ showPanel: false });
104104
}
105105

106-
private _onRenderFooterContent = () => {
106+
private _onRenderFooterContent = (): JSX.Element => {
107107
return (
108108
<div className={styles.actions}>
109109
<PrimaryButton iconProps={{ iconName: 'Save' }} onClick={this._onFolderSave}>

src/controls/gridLayout/GridLayout.test.tsx

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/// <reference types="sinon" />
22

33
import * as React from 'react';
4-
import { assert, expect } from 'chai';
4+
import { expect } from 'chai';
55
import { mount, ReactWrapper } from 'enzyme';
66
import { GridLayout } from './GridLayout';
77

@@ -18,12 +18,18 @@ import {
1818
import { ImageFit } from 'office-ui-fabric-react/lib/Image';
1919
import { ISize } from 'office-ui-fabric-react/lib/Utilities';
2020

21-
22-
declare const sinon;
21+
interface IDummyItem {
22+
thumbnail: string;
23+
title: string;
24+
name: string;
25+
profileImageSrc: string;
26+
location: string;
27+
activity: string;
28+
}
2329

2430
describe('<GridLayout />', () => {
2531
let gridLayout: ReactWrapper;
26-
const dummyItems: any[] = [{
32+
const dummyItems: IDummyItem[] = [{
2733
thumbnail: "https://pixabay.com/get/57e9dd474952a414f1dc8460825668204022dfe05555754d742e7bd6/hot-air-balloons-1984308_640.jpg",
2834
title: "Adventures in SPFx",
2935
name: "Perry Losselyong",
@@ -60,9 +66,7 @@ describe('<GridLayout />', () => {
6066
activity: "5/26/2019"
6167
}];
6268

63-
const dummyOnClick = sinon.spy((evt) => { /* Nothing to do here */ });
64-
65-
const dummyOnRenderGridItem = (item: any, _finalSize: ISize, isCompact: boolean): JSX.Element => {
69+
const dummyOnRenderGridItem = (item: IDummyItem, _finalSize: ISize, isCompact: boolean): JSX.Element => {
6670
const previewProps: IDocumentCardPreviewProps = {
6771
previewImages: [
6872
{
@@ -105,7 +109,7 @@ describe('<GridLayout />', () => {
105109
});
106110

107111
it('Test grid layout', (done) => {
108-
gridLayout = mount(<GridLayout items={dummyItems} onRenderGridItem={(item: any, finalSize: ISize, isCompact: boolean)=>dummyOnRenderGridItem(item, finalSize, isCompact)} />);
112+
gridLayout = mount(<GridLayout items={dummyItems} onRenderGridItem={(item: IDummyItem, finalSize: ISize, isCompact: boolean) => dummyOnRenderGridItem(item, finalSize, isCompact)} />);
109113
expect(gridLayout.find('.ms-List-surface')).to.have.length(1);
110114
done();
111115
});

src/controls/gridLayout/GridLayout.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export class GridLayout extends React.Component<IGridLayoutProps, IGridLayoutSta
9393
/**
9494
* Calls the passed onRenderCell
9595
*/
96-
private _onRenderCell = (item: any, index: number | undefined): JSX.Element => {
96+
private _onRenderCell = (item: any, index: number | undefined): JSX.Element => { // eslint-disable-line @typescript-eslint/no-explicit-any
9797
const isCompact: boolean = this._isCompact;
9898
const cellPadding: number = index % this._columnCount !== this._columnCount - 1 && !isCompact ? PADDING : 0;
9999
const finalSize: ISize = { width: this._columnWidth, height: this._rowHeight };

src/controls/gridLayout/GridLayout.types.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export interface IGridLayoutProps {
55
/**
66
* The array of items to display.
77
*/
8-
items: any[];
8+
items: any[]; // eslint-disable-line @typescript-eslint/no-explicit-any
99

1010
/**
1111
* In case you want to override the underlying list
@@ -16,7 +16,7 @@ export interface IGridLayoutProps {
1616
/**
1717
* The method to render each cell item
1818
*/
19-
onRenderGridItem: (item: any, finalSize: ISize, isCompact: boolean) => JSX.Element;
19+
onRenderGridItem: (item: any, finalSize: ISize, isCompact: boolean) => JSX.Element; // eslint-disable-line @typescript-eslint/no-explicit-any
2020
}
2121

2222
export interface IGridLayoutState {}

src/controls/iFrameDialog/IFrameDialog.tsx

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as React from "react";
2-
import * as ReactDOM from "react-dom";
32
import { Dialog, IDialogContentProps, IDialogProps, IDialogStyleProps, IDialogStyles } from 'office-ui-fabric-react/lib/Dialog';
43
import { IFrameDialogContent } from './IFrameDialogContent';
54
import * as telemetry from '../../common/telemetry';
@@ -16,7 +15,7 @@ export interface IFrameDialogProps extends IDialogProps {
1615
/**
1716
* iframe's onload event handler
1817
*/
19-
iframeOnLoad?: (iframe: any) => void;
18+
iframeOnLoad?: (iframe: HTMLIFrameElement) => void;
2019
/**
2120
* iframe width
2221
*/
@@ -61,7 +60,7 @@ export interface IFrameDialogProps extends IDialogProps {
6160
}
6261

6362
export interface IFrameDialogState {
64-
dialogId: string | null;
63+
dialogId: string | undefined;
6564
isStylingSet?: boolean;
6665
}
6766

@@ -96,7 +95,7 @@ export class IFrameDialog extends React.Component<IFrameDialogProps, IFrameDialo
9695
this.setDialogStyling();
9796
}
9897

99-
public UNSAFE_componentWillReceiveProps(nextProps: IFrameDialogProps) {
98+
public UNSAFE_componentWillReceiveProps(nextProps: IFrameDialogProps): void {
10099
if (nextProps.hidden && nextProps.hidden !== this.props.hidden) {
101100
this.setState({
102101
isStylingSet: false
@@ -126,7 +125,7 @@ export class IFrameDialog extends React.Component<IFrameDialogProps, IFrameDialo
126125
className
127126
} = this.props;
128127

129-
let dlgModalProps = {
128+
const dlgModalProps = {
130129
...modalProps,
131130
onLayerDidMount: () => { this.setDialogStyling(); }
132131
};

0 commit comments

Comments
 (0)