Skip to content

Commit ceafc1b

Browse files
authored
Merge branch 'feature/move-to-react' into move-to-react-production-build
2 parents 3b64587 + 85a7e52 commit ceafc1b

21 files changed

+501
-275
lines changed

package.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@
99
"react-dom": "^15.5.4"
1010
},
1111
"devDependencies": {
12-
"@types/classnames": "^0.0.32",
12+
"@types/classnames": "^2.2.0",
1313
"@types/enzyme": "^2.8.0",
1414
"@types/es6-shim": "^0.31.33",
1515
"@types/history": "^4.5.1",
1616
"@types/jasmine": "^2.5.47",
1717
"@types/node": "^7.0.18",
1818
"@types/react": "^15.0.24",
19-
"@types/react-dom": "^0.14.23",
19+
"@types/react-dom": "^15.5.0",
2020
"@types/sinon": "^2.2.1",
2121
"@types/webpack": "^2.2.15",
2222
"@types/webpack-env": "^1.13.0",
2323
"awesome-typescript-loader": "^3.1.3",
24-
"cross-env": "^4.0.0",
24+
"cross-env": "^5.0.0",
2525
"css-loader": "^0.28.1",
2626
"enzyme": "^2.8.2",
2727
"es6-promise": "^4.1.0",
@@ -40,10 +40,10 @@
4040
"phantomjs-polyfill-find": "^0.0.1",
4141
"postcss-browser-reporter": "^0.5.0",
4242
"postcss-cssnext": "^2.11.0",
43-
"postcss-import": "^9.1.0",
44-
"postcss-loader": "^1.3.3",
43+
"postcss-import": "^10.0.0",
44+
"postcss-loader": "^2.0.5",
4545
"postcss-reporter": "^3.0.0",
46-
"postcss-url": "^6.0.4",
46+
"postcss-url": "^6.1.0",
4747
"react-addons-test-utils": "^15.5.1",
4848
"react-dev-utils": "^0.5.2",
4949
"react-dom": "^15.5.4",

sampleapp/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<link rel="stylesheet" href="dist/onenotepicker.css">
88
</head>
99
<body style="min-height:100%">
10-
<div id="oneNotePicker" style="width:295px;height:180px;margin:50px;overflow-y:scroll"></div>
10+
<div id="oneNotePicker" style="width:350px;height:350px;margin:50px;overflow-y:scroll"></div>
1111
<script src="dist/sample.js"></script>
1212
</body>
1313
</html>

sampleapp/sample.tsx

+8-7
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@ oneNoteDataProvider.getNotebooks().then((notebooks) => {
2525
oneNoteDataProvider: oneNoteDataProvider,
2626
notebookListUpdater: updater,
2727
callbacks: {
28-
// TODO we should be able to clean up this boilerplate
2928
onNotebookHierarchyUpdated: (newNotebookHierarchy) => {
3029
render(globalProps, newNotebookHierarchy);
3130
},
32-
// onNotebookSelected: (notebook) => {
33-
// globalProps.globals.selectedId = notebook.id;
34-
// render(globalProps, globalProps.globals.notebookListUpdater.get());
35-
// },
36-
onSectionSelected: (section) => {
31+
onSectionSelected: (section, breadcrumbs) => {
3732
globalProps.globals.selectedId = section.id;
33+
34+
console.log(breadcrumbs.map(x => x.name).join(' > '));
35+
3836
render(globalProps, globalProps.globals.notebookListUpdater.get());
3937
},
40-
onPageSelected: (page) => {
38+
onPageSelected: (page, breadcrumbs) => {
4139
globalProps.globals.selectedId = page.id;
40+
41+
console.log(breadcrumbs.map(x => x.name).join(' > '));
42+
4243
render(globalProps, globalProps.globals.notebookListUpdater.get());
4344
}
4445
},

sampleapp/sampleOneNoteDataProvider.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import "../node_modules/onenoteapi/target/oneNoteApi";
1+
import '../node_modules/onenoteapi/target/oneNoteApi';
22

3-
import OneNoteDataProvider from "../src/providers/oneNoteDataProvider";
3+
import OneNoteDataProvider from '../src/providers/oneNoteDataProvider';
44
import Notebook from '../src/oneNoteDataStructures/notebook';
5+
import Section from '../src/oneNoteDataStructures/section';
56
import Page from '../src/oneNoteDataStructures/page';
67
import OneNoteApiResponseTransformer from '../src/oneNoteDataStructures/oneNoteApiResponseTransformer';
78

@@ -219,9 +220,9 @@ class SampleOneNoteDataProvider implements OneNoteDataProvider {
219220
return Promise.resolve(notebooks);
220221
}
221222

222-
getPages(sectionId: string): Promise<Page[]> {
223+
getPages(section: Section): Promise<Page[]> {
223224
let id = '' + (Math.floor(Math.random() * 500000));
224-
let pages = [{ id: id, title: 'Page:' + id }];
225+
let pages = [{ parent: section, id: id, name: 'Page:' + id }];
225226
return Promise.resolve(pages);
226227
}
227228
}

src/components/notebookItem.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import SectionItem from './sectionItem';
44
import SectionGroupItem from './sectionGroupItem';
55
import GlobalProps from '../props/globalProps';
66
import Notebook from '../oneNoteDataStructures/notebook';
7+
import OneNoteItemUtils from '../oneNoteDataStructures/oneNoteItemUtils';
78

89
interface NotebookItemProps extends GlobalProps {
910
notebook: Notebook;
@@ -22,7 +23,7 @@ class NotebookItem extends React.Component<NotebookItemProps, NotebookItemState>
2223
private onClick() {
2324
let onNotebookSelected = this.props.globals.callbacks.onNotebookSelected;
2425
if (!!onNotebookSelected) {
25-
onNotebookSelected(this.props.notebook);
26+
onNotebookSelected(this.props.notebook, OneNoteItemUtils.getAncestry(this.props.notebook));
2627
}
2728

2829
// We are only interested in expanding if either sections/pages are deemed selectable

src/components/pageItem.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as React from 'react';
22

33
import GlobalProps from '../props/globalProps';
44
import Page from '../oneNoteDataStructures/page';
5+
import OneNoteItemUtils from '../oneNoteDataStructures/oneNoteItemUtils';
56

67
interface PageItemProps extends GlobalProps {
78
page: Page;
@@ -11,7 +12,7 @@ class PageItem extends React.Component<PageItemProps, null> {
1112
private onClick() {
1213
let onPageSelected = this.props.globals.callbacks.onPageSelected;
1314
if (!!onPageSelected) {
14-
onPageSelected(this.props.page);
15+
onPageSelected(this.props.page, OneNoteItemUtils.getAncestry(this.props.page));
1516
}
1617
}
1718

@@ -30,7 +31,7 @@ class PageItem extends React.Component<PageItemProps, null> {
3031
<img src={require('../images/section_icon.png')}/>
3132
</div>
3233
<div>
33-
<label className='ms-fontSize-sPlus'>{this.props.page.title}</label>
34+
<label className='ms-fontSize-sPlus'>{this.props.page.name}</label>
3435
</div>
3536
</a>
3637
</li >

src/components/sectionItem.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as React from 'react';
33
import PageItem from './pageItem';
44
import GlobalProps from '../props/globalProps';
55
import Section from '../oneNoteDataStructures/section';
6+
import OneNoteItemUtils from '../oneNoteDataStructures/oneNoteItemUtils';
67

78
interface SectionItemProps extends GlobalProps {
89
section: Section;
@@ -24,7 +25,7 @@ class SectionItem extends React.Component<SectionItemProps, SectionItemState> {
2425
// If selection callback exists, assume this item is selectable, and notify the callback
2526
let onSectionSelected = this.props.globals.callbacks.onSectionSelected;
2627
if (!!onSectionSelected) {
27-
onSectionSelected(section);
28+
onSectionSelected(section, OneNoteItemUtils.getAncestry(section));
2829
}
2930

3031
// We are only interested in expanding if pages are deemed selectable
@@ -45,7 +46,7 @@ class SectionItem extends React.Component<SectionItemProps, SectionItemState> {
4546
let section = this.props.section;
4647

4748
// Trigger external call to fetch pages for this section
48-
globals.oneNoteDataProvider.getPages(section.id).then((pages) => {
49+
globals.oneNoteDataProvider.getPages(section).then((pages) => {
4950
globals.notebookListUpdater.updatePages(section.id, pages);
5051
let newNotebookHierarchy = globals.notebookListUpdater.get();
5152
globals.callbacks.onNotebookHierarchyUpdated(newNotebookHierarchy);

src/oneNoteDataStructures/notebook.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
import OneNoteItem from './oneNoteItem';
12
import Section from './section';
23
import SectionGroup from './sectionGroup';
34

4-
interface Notebook {
5-
id: string;
6-
name: string;
5+
interface Notebook extends OneNoteItem {
76
expanded: boolean;
87
sectionGroups: SectionGroup[];
98
sections: Section[];

src/oneNoteDataStructures/oneNoteApiResponseTransformer.ts

+32-14
Original file line numberDiff line numberDiff line change
@@ -15,43 +15,61 @@ class OneNoteApiResponseTransformer {
1515
}
1616

1717
transformNotebook(notebook: OneNoteApi.Notebook): Notebook {
18-
return {
18+
var transformed: Notebook = {
19+
parent: undefined,
1920
id: notebook.id,
2021
name: notebook.name,
2122
expanded: this.defaultExpanded,
22-
sectionGroups: notebook.sectionGroups.map(sg => this.transformSectionGroup(sg)),
23-
sections: notebook.sections.map(section => this.transformSection(section))
23+
sectionGroups: [],
24+
sections: []
2425
};
26+
27+
transformed.sectionGroups = notebook.sectionGroups.map(sg => this.transformSectionGroup(sg, transformed));
28+
transformed.sections = notebook.sections.map(section => this.transformSection(section, transformed));
29+
30+
return transformed;
2531
}
2632

27-
transformSectionGroup(sectionGroup: OneNoteApi.SectionGroup): SectionGroup {
28-
return {
33+
transformSectionGroup(sectionGroup: OneNoteApi.SectionGroup, parent: Notebook | SectionGroup): SectionGroup {
34+
var transformed: SectionGroup = {
35+
parent: parent,
2936
id: sectionGroup.id,
3037
name: sectionGroup.name,
3138
expanded: this.defaultExpanded,
32-
sectionGroups: sectionGroup.sectionGroups.map(sg => this.transformSectionGroup(sg)),
33-
sections: sectionGroup.sections.map(section => this.transformSection(section))
39+
sectionGroups: [],
40+
sections: []
3441
};
42+
43+
transformed.sectionGroups = sectionGroup.sectionGroups.map(sg => this.transformSectionGroup(sg, transformed));
44+
transformed.sections = sectionGroup.sections.map(section => this.transformSection(section, transformed));
45+
46+
return transformed;
3547
}
3648

37-
transformSection(section: OneNoteApi.Section): Section {
49+
transformSection(section: OneNoteApi.Section, parent: Notebook | SectionGroup): Section {
3850
// Pages may be undefined (e.g., in the getNotebooks call)
39-
return {
51+
var transformed: Section = {
52+
parent: parent,
4053
id: section.id,
4154
name: section.name,
4255
expanded: this.defaultExpanded,
43-
pages: !!section.pages ? section.pages.map(page => this.transformPage(page)) : undefined
56+
pages: []
4457
};
58+
59+
transformed.pages = !!section.pages ? section.pages.map(page => this.transformPage(page, transformed)) : undefined;
60+
61+
return transformed;
4562
}
4663

47-
transformPages(pageList: OneNoteApi.Page[]): Page[] {
48-
return pageList.map(page => this.transformPage(page));
64+
transformPages(pageList: OneNoteApi.Page[], parent: Section): Page[] {
65+
return pageList.map(page => this.transformPage(page, parent));
4966
}
5067

51-
transformPage(page: OneNoteApi.Page): Page {
68+
transformPage(page: OneNoteApi.Page, parent: Section): Page {
5269
return {
70+
parent: parent,
5371
id: page.id,
54-
title: page.title
72+
name: page.title
5573
};
5674
}
5775
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
interface OneNoteItem {
2+
// Undefined is there so we can treat every OneNoteItem as the same
3+
// in our tree-walking, despite notebooks not having parents
4+
parent: OneNoteItem | undefined;
5+
6+
id: string;
7+
name: string;
8+
}
9+
10+
export default OneNoteItem;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import OneNoteItem from './oneNoteItem';
2+
3+
class OneNoteItemUtils {
4+
/**
5+
* Given a OneNote item, returns a list representing the item's
6+
* ancestry, starting from the root notebook.
7+
*/
8+
static getAncestry(item: OneNoteItem): OneNoteItem[] {
9+
let current = item;
10+
11+
let ancestry = [current];
12+
while (!!current.parent) {
13+
current = current.parent;
14+
ancestry.unshift(current);
15+
}
16+
17+
return ancestry;
18+
}
19+
}
20+
21+
export default OneNoteItemUtils;

src/oneNoteDataStructures/page.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
interface Page {
2-
id: string;
3-
title: string;
1+
import OneNoteItem from './oneNoteItem';
2+
3+
interface Page extends OneNoteItem {
44
}
55

66
export default Page;

src/oneNoteDataStructures/section.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import OneNoteItem from './oneNoteItem';
12
import Page from './page';
23

3-
interface Section {
4-
id: string;
5-
name: string;
4+
interface Section extends OneNoteItem {
65
expanded: boolean;
76
pages: Page[] | undefined;
87
}

src/oneNoteDataStructures/sectionGroup.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import OneNoteItem from './oneNoteItem';
12
import Section from './section';
23

3-
interface SectionGroup {
4-
id: string;
5-
name: string;
4+
interface SectionGroup extends OneNoteItem {
65
expanded: boolean;
76
sectionGroups: SectionGroup[];
87
sections: Section[];

0 commit comments

Comments
 (0)