@@ -96,3 +96,211 @@ describe('handlerWorksheet selection', () => {
9696 expect ( sheet . views ! [ 0 ] ?. activeRanges ) . toEqual ( [ 'A1:D4' , 'C3:G8' ] ) ;
9797 } ) ;
9898} ) ;
99+
100+ describe ( 'handlerWorksheet sheetViews' , ( ) => {
101+ it ( 'defaults to no frozen panes' , ( ) => {
102+ const sheet = parseSheet (
103+ SHEET_OPEN +
104+ `<sheetViews>
105+ <sheetView tabSelected = "1" workbookViewId="0" />
106+ </sheetViews>` +
107+ SHEET_CLOSE ,
108+ ) ;
109+ expect ( sheet . views ) . toBeUndefined ( ) ;
110+ } ) ;
111+
112+ it ( 'includes two frozen panes vertically split ' , ( ) => {
113+ const sheetViews = `
114+ <sheetViews>
115+ <sheetView tabSelected="1" workbookViewId="0">
116+ <pane xSplit="1" topLeftCell="C1" activePane="topRight" state="frozen"/>
117+ </sheetView>
118+ </sheetViews>` ;
119+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
120+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
121+ const view = sheet . views ! [ 0 ] ;
122+ expect ( view . panes ) . toEqual ( {
123+ type : 'frozen' ,
124+ columns : 1 ,
125+ firstVisibleCell : 'C1' ,
126+ activePane : 'topEnd' ,
127+ } ) ;
128+ } ) ;
129+
130+ it ( 'includes two frozen panes horizontally split ' , ( ) => {
131+ const sheetViews = `
132+ <sheetViews>
133+ <sheetView tabSelected="1" workbookViewId="0">
134+ <pane ySplit="2" topLeftCell="A3" activePane="bottomLeft" state="frozen"/>
135+ </sheetView>
136+ </sheetViews>` ;
137+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
138+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
139+ const view = sheet . views ! [ 0 ] ;
140+ expect ( view . panes ) . toEqual ( {
141+ type : 'frozen' ,
142+ rows : 2 ,
143+ firstVisibleCell : 'A3' ,
144+ activePane : 'bottomStart' ,
145+ } ) ;
146+ } ) ;
147+
148+ it ( 'includes four frozen panes' , ( ) => {
149+ const sheetViews = `
150+ <sheetViews>
151+ <sheetView tabSelected="1" topLeftCell="A2" zoomScaleNormal="100" workbookViewId="42">
152+ <pane xSplit="1" ySplit="2" topLeftCell="B9" activePane="bottomRight" state="frozen"/>
153+ </sheetView>
154+ </sheetViews>` ;
155+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
156+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
157+ const view = sheet . views ! [ 0 ] ;
158+ expect ( view . workbookView ) . toEqual ( 42 ) ;
159+ expect ( view . panes ) . toEqual ( {
160+ type : 'frozen' ,
161+ columns : 1 ,
162+ rows : 2 ,
163+ firstVisibleCell : 'B9' ,
164+ activePane : 'bottomEnd' ,
165+ } ) ;
166+ } ) ;
167+
168+ it ( 'parses "frozenSplit" panes' , ( ) => {
169+ const sheetViews = `
170+ <sheetViews>
171+ <sheetView tabSelected="1" workbookViewId="0">
172+ <pane xSplit="10" ySplit="19" topLeftCell="K20" activePane="bottomRight" state="frozenSplit"/>
173+ <selection pane="topRight" activeCell="K1" sqref="K1"/>
174+ <selection pane="bottomLeft" activeCell="A20" sqref="A20"/>
175+ <selection pane="bottomRight"/>
176+ </sheetView>
177+ </sheetViews>` ;
178+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
179+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
180+ const view = sheet . views ! [ 0 ] ;
181+ expect ( view . workbookView ) . toEqual ( 0 ) ;
182+ expect ( view . panes ) . toEqual ( {
183+ type : 'frozen' ,
184+ columns : 10 ,
185+ rows : 19 ,
186+ firstVisibleCell : 'K20' ,
187+ activePane : 'bottomEnd' ,
188+ } ) ;
189+ } ) ;
190+
191+ it ( 'ignores default frozen panes' , ( ) => {
192+ const sheetViews = `
193+ <sheetViews>
194+ <sheetView workbookViewId="0">
195+ <pane xSplit="0" ySplit="0" topLeftCell="" activePane="topLeft" state="frozen"/>
196+ </sheetView>
197+ </sheetViews>` ;
198+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
199+ expect ( sheet . views ) . toBeUndefined ( ) ;
200+ } ) ;
201+
202+ it ( 'ignores frozen panes with a zero split but valid topLeftCell and activePane attributes' , ( ) => {
203+ const sheetViews = `
204+ <sheetViews>
205+ <sheetView workbookViewId="0">
206+ <pane xSplit="0" ySplit="0" topLeftCell="C3" activePane="bottomLeft" state="frozen"/>
207+ </sheetView>
208+ </sheetViews>` ;
209+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
210+ expect ( sheet . views ) . toBeUndefined ( ) ;
211+ } ) ;
212+
213+ it ( 'handles default selection in frozen panes' , ( ) => {
214+ const sheetViews = `
215+ <sheetViews>
216+ <sheetView tabSelected="1" workbookViewId="0">
217+ <pane xSplit="2" ySplit="2" topLeftCell="C3" state="frozen"/>
218+ <selection pane="topLeft" activeCell="C1" sqref="C1"/>
219+ </sheetView>
220+ </sheetViews>
221+ ` ;
222+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
223+ expect ( sheet . views ! [ 0 ] . activeCell ) . toEqual ( 'C1' ) ;
224+ } ) ;
225+
226+ it ( 'handles selection in frozen panes' , ( ) => {
227+ const sheetViews = `
228+ <sheetViews>
229+ <sheetView tabSelected="1" workbookViewId="0">
230+ <pane xSplit="2" ySplit="2" topLeftCell="C3" activePane="bottomLeft" state="frozen"/>
231+ <selection pane="topRight" activeCell="C1" sqref="C1"/>
232+ <selection pane="bottomLeft" activeCell="A3" sqref="A3"/>
233+ <selection pane="bottomRight" activeCell="C4" sqref="C4"/>
234+ </sheetView>
235+ </sheetViews>
236+ ` ;
237+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
238+ expect ( sheet . views ! [ 0 ] . activeCell ) . toEqual ( 'A3' ) ;
239+ } ) ;
240+
241+ it ( 'omits firstVisibleCell when a frozen pane has no topLeftCell' , ( ) => {
242+ const sheetViews = `
243+ <sheetViews>
244+ <sheetView tabSelected="1" workbookViewId="0">
245+ <pane xSplit="2" ySplit="2" activePane="bottomLeft" state="frozen"/>
246+ </sheetView>
247+ </sheetViews>
248+ ` ;
249+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
250+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
251+ expect ( sheet . views ! [ 0 ] . panes ) . toBeDefined ( ) ;
252+ expect ( sheet . views ! [ 0 ] . panes ! . firstVisibleCell ) . toBeUndefined ( ) ;
253+ } ) ;
254+
255+ it ( 'omits activePane when a frozen pane uses default activePane="topLeft"' , ( ) => {
256+ const sheetViews = `
257+ <sheetViews>
258+ <sheetView tabSelected="1" workbookViewId="0">
259+ <pane xSplit="2" ySplit="2" activePane="topLeft" state="frozen"/>
260+ </sheetView>
261+ </sheetViews>
262+ ` ;
263+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
264+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
265+ expect ( sheet . views ! [ 0 ] . panes ) . toBeDefined ( ) ;
266+ expect ( sheet . views ! [ 0 ] . panes ! . activePane ) . toBeUndefined ( ) ;
267+ } ) ;
268+
269+ it ( 'discards implicitly split panes (<pane> has no state attribute)' , ( ) => {
270+ const sheetViews = `
271+ <sheetViews>
272+ <sheetView tabSelected="1" workbookViewId="0">
273+ <pane xSplit="6960" ySplit="3000" topLeftCell="F9" activePane="bottomRight"/>
274+ <selection pane="topRight" activeCell="F1" sqref="F1"/>
275+ <selection pane="bottomLeft" activeCell="A9" sqref="A9"/>
276+ <selection pane="bottomRight" activeCell="F9" sqref="F9"/>
277+ </sheetView>
278+ </sheetViews>
279+ ` ;
280+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
281+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
282+ expect ( sheet . views ! [ 0 ] ) . toEqual ( {
283+ activeCell : 'F9' ,
284+ workbookView : 0 ,
285+ } ) ;
286+ } ) ;
287+
288+ it ( 'discards explicitly split panes (<pane state="split">)' , ( ) => {
289+ const sheetViews = `
290+ <sheetViews>
291+ <sheetView tabSelected="1" workbookViewId="0">
292+ <pane state="split" xSplit="6960" ySplit="3000" topLeftCell="F9" activePane="bottomRight"/>
293+ <selection pane="topRight" activeCell="F1" sqref="F1"/>
294+ <selection pane="bottomLeft" activeCell="A9" sqref="A9"/>
295+ <selection pane="bottomRight" activeCell="F9" sqref="F9"/>
296+ </sheetView>
297+ </sheetViews>
298+ ` ;
299+ const sheet = parseSheet ( SHEET_OPEN + sheetViews + SHEET_CLOSE ) ;
300+ expect ( sheet . views ) . toHaveLength ( 1 ) ;
301+ expect ( sheet . views ! [ 0 ] ) . toEqual ( {
302+ activeCell : 'F9' ,
303+ workbookView : 0 ,
304+ } ) ;
305+ } ) ;
306+ } ) ;
0 commit comments