1
1
import * as React from 'react' ;
2
2
import findIndex from 'lodash/findIndex' ;
3
3
import { ISiteFilePickerTabProps } from './ISiteFilePickerTabProps' ;
4
- import { ISiteFilePickerTabState } from './ISiteFilePickerTabState' ;
4
+ import { ISiteFilePickerTabState } from './ISiteFilePickerTabState' ;
5
5
import { DocumentLibraryBrowser } from '../controls/DocumentLibraryBrowser/DocumentLibraryBrowser' ;
6
6
import { FileBrowser } from '../controls/FileBrowser/FileBrowser' ;
7
7
import { PrimaryButton , DefaultButton } from 'office-ui-fabric-react/lib/components/Button' ;
8
8
import { Breadcrumb , IBreadcrumbItem } from 'office-ui-fabric-react/lib/Breadcrumb' ;
9
- import { IFile , ILibrary } from '../../../services/FileBrowserService.types' ;
9
+ import { IFile , IFolder , ILibrary } from '../../../services/FileBrowserService.types' ;
10
10
import { Link } from 'office-ui-fabric-react/lib/Link' ;
11
11
import { IFilePickerResult , FilePickerBreadcrumbItem } from '../FilePicker.types' ;
12
12
13
+ import { SPWeb } from "@microsoft/sp-page-context" ;
14
+
13
15
import styles from './SiteFilePickerTab.module.scss' ;
14
16
import * as strings from 'ControlStrings' ;
15
17
import { urlCombine } from '../../../common/utilities' ;
18
+ import { cloneDeep } from '@microsoft/sp-lodash-subset' ;
16
19
17
20
export default class SiteFilePickerTab extends React . Component < ISiteFilePickerTabProps , ISiteFilePickerTabState > {
21
+ private _defaultLibraryNamePromise : Promise < void | string > = Promise . resolve ( ) ;
22
+
18
23
constructor ( props : ISiteFilePickerTabProps ) {
19
24
super ( props ) ;
20
25
21
26
// Add current site to the breadcrumb or the provided node
22
- const breadcrumbSiteNode : FilePickerBreadcrumbItem = this . props . breadcrumbFirstNode ? this . props . breadcrumbFirstNode : {
23
- isCurrentItem : true ,
27
+ const breadcrumbSiteNode : FilePickerBreadcrumbItem = this . props . breadcrumbFirstNode ? this . props . breadcrumbFirstNode : {
28
+ isCurrentItem : false ,
24
29
text : props . context . pageContext . web . title ,
25
- key : props . context . pageContext . web . id . toString ( )
30
+ key : props . context . pageContext . web . id . toString ( ) ,
31
+ onClick : ( ev , itm ) => { this . onBreadcrumpItemClick ( itm ) ; }
26
32
} ;
27
- breadcrumbSiteNode . onClick = ( ) => { this . onBreadcrumpItemClick ( breadcrumbSiteNode ) ; } ;
33
+
34
+ let breadcrumbItems : FilePickerBreadcrumbItem [ ] = [ breadcrumbSiteNode ] ;
35
+
36
+ let { folderAbsPath = undefined , libraryServRelUrl = undefined , folderServRelPath = undefined , folderBreadcrumbs = [ ] } = props . defaultFolderAbsolutePath
37
+ ? this . _parseInitialLocationState (
38
+ props . defaultFolderAbsolutePath ,
39
+ props . context . pageContext . web
40
+ )
41
+ : { } ;
42
+
43
+ breadcrumbItems . push ( ...folderBreadcrumbs ) ;
44
+
45
+ breadcrumbItems [ breadcrumbItems . length - 1 ] . isCurrentItem = true ;
28
46
29
47
this . state = {
30
48
filePickerResult : null ,
31
- libraryAbsolutePath : undefined ,
32
- libraryUrl : urlCombine ( props . context . pageContext . web . serverRelativeUrl , '/Shared%20Documents' ) ,
33
- libraryPath : undefined ,
49
+ libraryAbsolutePath : folderAbsPath || undefined ,
50
+ libraryUrl : libraryServRelUrl || urlCombine ( props . context . pageContext . web . serverRelativeUrl , '/Shared%20Documents' ) ,
51
+ libraryPath : folderServRelPath ,
34
52
folderName : strings . DocumentLibraries ,
35
- breadcrumbItems : [ breadcrumbSiteNode ]
53
+ breadcrumbItems
36
54
} ;
37
55
}
38
56
57
+ private _parseInitialLocationState ( folderAbsPath : string , { serverRelativeUrl : webServRelUrl , absoluteUrl : webAbsUrl } : SPWeb ) {
58
+ // folderAbsPath: "https://tenant.sharepoint.com/teams/Test/DocLib/Folder"
59
+
60
+ // folderServRelPath: "/teams/Test/DocLib/Folder"
61
+ let folderServRelPath = folderAbsPath && folderAbsPath . substr ( folderAbsPath . indexOf ( webServRelUrl ) ) ;
62
+
63
+ // folderWebRelPath: "/DocLib/Folder"
64
+ let folderWebRelPath = folderServRelPath && folderServRelPath . substr ( webServRelUrl . length ) ;
65
+ let libInternalName = folderWebRelPath && folderWebRelPath . substring ( 1 , Math . max ( folderWebRelPath . indexOf ( "/" , 2 ) , 0 ) || undefined )
66
+
67
+ // libraryServRelUrl: "/teams/Test/DocLib/"
68
+ let libraryServRelUrl = urlCombine ( webServRelUrl , libInternalName ) ;
69
+
70
+ let tenantUrl = folderAbsPath . substring ( 0 , folderAbsPath . indexOf ( webServRelUrl ) ) ;
71
+ let folderBreadcrumbs : FilePickerBreadcrumbItem [ ] = this . parseBreadcrumbsFromPaths (
72
+ libraryServRelUrl ,
73
+ folderServRelPath ,
74
+ folderWebRelPath ,
75
+ webAbsUrl ,
76
+ tenantUrl ,
77
+ libInternalName
78
+ ) ;
79
+
80
+ return { libraryServRelUrl, folderServRelPath, folderAbsPath, folderBreadcrumbs } ;
81
+ }
82
+
83
+ private parseBreadcrumbsFromPaths (
84
+ libraryServRelUrl : string ,
85
+ folderServRelPath : string ,
86
+ folderWebRelPath : string ,
87
+ webAbsUrl : string ,
88
+ tenantUrl : string ,
89
+ libInternalName : string
90
+ ) {
91
+ this . _defaultLibraryNamePromise = this . props . fileBrowserService . getLibraryNameByInternalName ( libInternalName ) ;
92
+ let folderBreadcrumbs : FilePickerBreadcrumbItem [ ] = [ ] ;
93
+ folderBreadcrumbs . push ( {
94
+ isCurrentItem : false ,
95
+ text : libInternalName ,
96
+ key : libraryServRelUrl ,
97
+ libraryData : {
98
+ serverRelativeUrl : libraryServRelUrl ,
99
+ absoluteUrl : urlCombine ( webAbsUrl , libInternalName ) ,
100
+ title : libInternalName
101
+ } ,
102
+ onClick : ( ev , itm ) => { this . onBreadcrumpItemClick ( itm ) ; }
103
+ } ) ;
104
+
105
+ if ( folderServRelPath != libraryServRelUrl ) {
106
+ let folderLibRelPath = folderWebRelPath . substring ( libInternalName . length + 2 ) ;
107
+ let breadcrumbFolderServRelPath = libraryServRelUrl ;
108
+
109
+ let crumbs : FilePickerBreadcrumbItem [ ] = folderLibRelPath . split ( "/" ) . map ( ( currFolderName => {
110
+ breadcrumbFolderServRelPath += `/${ currFolderName } ` ;
111
+ return {
112
+ isCurrentItem : false ,
113
+ text : currFolderName ,
114
+ key : urlCombine ( tenantUrl , breadcrumbFolderServRelPath ) ,
115
+ folderData : {
116
+ name : currFolderName ,
117
+ absoluteUrl : urlCombine ( tenantUrl , breadcrumbFolderServRelPath ) ,
118
+ serverRelativeUrl : breadcrumbFolderServRelPath ,
119
+ } ,
120
+ onClick : ( ev , itm ) => { this . onBreadcrumpItemClick ( itm ) ; }
121
+ } ;
122
+ } ) ) ;
123
+
124
+ folderBreadcrumbs . push ( ...crumbs ) ;
125
+ }
126
+ return folderBreadcrumbs ;
127
+ }
128
+
129
+ public componentDidMount ( ) : void {
130
+ this . _defaultLibraryNamePromise . then ( docLibName => {
131
+ if ( docLibName ) {
132
+ let updatedBCItems = cloneDeep ( this . state . breadcrumbItems ) ;
133
+ updatedBCItems . forEach ( crumb => {
134
+ if ( crumb . libraryData ) {
135
+ crumb . text = docLibName ;
136
+ crumb . libraryData . title = docLibName ;
137
+ }
138
+ } ) ;
139
+ this . setState ( { breadcrumbItems : updatedBCItems } ) ;
140
+ }
141
+ } ) . catch ( ( err ) => {
142
+ console . log ( "[SiteFilePicker] Failed To Fetch defaultLibraryName, defaulting to internal name" ) ;
143
+ } ) ;
144
+ }
145
+
39
146
public render ( ) : React . ReactElement < ISiteFilePickerTabProps > {
40
147
return (
41
- < div className = { styles . tabContainer } >
148
+ < div className = { styles . tabContainer } >
42
149
< div className = { styles . tabHeaderContainer } >
43
- < Breadcrumb items = { this . state . breadcrumbItems } /*onRenderItem={this.renderBreadcrumbItem}*/ className = { styles . breadcrumbNav } />
150
+ < Breadcrumb items = { this . state . breadcrumbItems } /*onRenderItem={this.renderBreadcrumbItem}*/ className = { styles . breadcrumbNav } />
44
151
</ div >
45
152
< div className = { styles . tabFiles } >
46
153
{ this . state . libraryAbsolutePath === undefined &&
@@ -142,7 +249,7 @@ export default class SiteFilePickerTab extends React.Component<ISiteFilePickerTa
142
249
/**
143
250
* Triggered when user opens a file folder
144
251
*/
145
- private _handleOpenFolder = ( folder : IFile , addBreadcrumbNode : boolean ) => {
252
+ private _handleOpenFolder = ( folder : IFolder , addBreadcrumbNode : boolean ) => {
146
253
const { breadcrumbItems } = this . state ;
147
254
148
255
if ( addBreadcrumbNode ) {
@@ -151,9 +258,9 @@ export default class SiteFilePickerTab extends React.Component<ISiteFilePickerTa
151
258
folderData : folder ,
152
259
isCurrentItem : true ,
153
260
text : folder . name ,
154
- key : folder . absoluteUrl
261
+ key : folder . absoluteUrl ,
262
+ onClick : ( ev , itm ) => { this . onBreadcrumpItemClick ( itm ) ; }
155
263
} ;
156
- breadcrumbNode . onClick = ( ) => { this . onBreadcrumpItemClick ( breadcrumbNode ) ; } ;
157
264
breadcrumbItems . push ( breadcrumbNode ) ;
158
265
}
159
266
@@ -177,9 +284,9 @@ export default class SiteFilePickerTab extends React.Component<ISiteFilePickerTa
177
284
libraryData : library ,
178
285
isCurrentItem : true ,
179
286
text : library . title ,
180
- key : library . serverRelativeUrl
287
+ key : library . serverRelativeUrl ,
288
+ onClick : ( ev , itm ) => { this . onBreadcrumpItemClick ( itm ) ; }
181
289
} ;
182
- breadcrumbNode . onClick = ( ) => { this . onBreadcrumpItemClick ( breadcrumbNode ) ; } ;
183
290
breadcrumbItems . push ( breadcrumbNode ) ;
184
291
}
185
292
this . setState ( {
0 commit comments