Skip to content

Commit 9ee1d0e

Browse files
author
Piotr Siatka
committed
#227 Provide Carousel control examples.
1 parent 8a57e49 commit 9ee1d0e

File tree

3 files changed

+160
-82
lines changed

3 files changed

+160
-82
lines changed

src/webparts/controlsTest/components/ControlsTest.module.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,15 @@
6464
}
6565
}
6666
}
67+
68+
.carouselContent {
69+
height: 200px;
70+
71+
color: darkblue;
72+
font-style: italic;
73+
}
74+
.carouselButtonsContainer {
75+
background-color: orange !important;
76+
opacity: 0.3;
77+
}
6778
}

src/webparts/controlsTest/components/ControlsTest.tsx

Lines changed: 145 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as React from 'react';
22
import styles from './ControlsTest.module.scss';
33
import { IControlsTestProps, IControlsTestState } from './IControlsTestProps';
4-
import { escape } from '@microsoft/sp-lodash-subset';
54
import { FileTypeIcon, IconType, ApplicationType, ImageSize } from '../../../FileTypeIcon';
65
import { Dropdown, IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown';
76
import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/components/Button';
@@ -18,13 +17,25 @@ import { Environment, EnvironmentType } from '@microsoft/sp-core-library';
1817
import { SecurityTrimmedControl, PermissionLevel } from '../../../SecurityTrimmedControl';
1918
import { SPPermission } from '@microsoft/sp-page-context';
2019
import { PeoplePicker, PrincipalType } from '../../../PeoplePicker';
21-
import { getItemClassNames } from 'office-ui-fabric-react/lib/components/ContextualMenu/ContextualMenu.classNames';
2220
import { ListItemPicker } from "../../../ListItemPicker";
21+
import { Carousel } from '../../../../lib/controls/carousel';
22+
import { CarouselButtonsLocation, CarouselButtonsDisplay } from '../../../controls/carousel';
2323

2424
/**
2525
* Component that can be used to test out the React controls from this project
2626
*/
2727
export default class ControlsTest extends React.Component<IControlsTestProps, IControlsTestState> {
28+
/**
29+
* Static array for carousel control example.
30+
*/
31+
private carouselElements = [
32+
<div id="1" key="1">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis a mattis libero, nec consectetur neque. Suspendisse potenti. Fusce ultrices faucibus consequat. Suspendisse ex diam, ullamcorper sit amet justo ac, accumsan congue neque. Vestibulum aliquam mauris non justo convallis, id molestie purus sodales. Maecenas scelerisque aliquet turpis, ac efficitur ex iaculis et. Vivamus finibus mi eget urna tempor, sed porta justo tempus. Vestibulum et lectus magna. Integer ante felis, ullamcorper venenatis lectus ac, vulputate pharetra magna. Morbi eget nisl tempus, viverra diam ac, mollis tortor. Nam odio ex, viverra bibendum mauris vehicula, consequat suscipit ligula. Nunc sed ultrices augue, eu tincidunt diam.</div>,
33+
<div id="2" key="2">Quisque metus lectus, facilisis id consectetur ac, hendrerit eget quam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut faucibus posuere felis vel efficitur. Maecenas et massa in sem tincidunt finibus. Duis sit amet bibendum nisi. Vestibulum pretium pretium libero, vel tincidunt sem vestibulum sed. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin quam lorem, venenatis id bibendum id, tempus eu nibh. Sed tristique semper ligula, vitae gravida diam gravida vitae. Donec eget posuere mauris, pharetra semper lectus.</div>,
34+
<div id="3" key="3">Pellentesque tempor et leo at tincidunt. Vivamus et leo sed eros vehicula mollis vitae in dui. Duis posuere sodales enim ut ultricies. Cras in venenatis nulla. Ut sed neque dignissim, sollicitudin tellus convallis, placerat leo. Aliquam vestibulum, leo pharetra sollicitudin pretium, ipsum nisl tincidunt orci, in molestie ipsum dui et mi. Praesent aliquam accumsan risus sed bibendum. Cras consectetur elementum turpis, a mollis velit gravida sit amet. Praesent non augue cursus, varius justo at, molestie lorem. Nulla cursus tellus quis odio congue elementum. Vivamus sit amet quam nec lectus hendrerit blandit. Duis ac condimentum sem. Morbi hendrerit elementum purus, non facilisis arcu bibendum vitae. Vivamus commodo tristique euismod.</div>,
35+
<div id="4" key="4">Proin semper egestas porta. Nullam risus nisl, auctor ac hendrerit in, dapibus quis ex. Quisque vitae nisi quam. Etiam vel sapien ut libero ornare rhoncus nec vestibulum dolor. Curabitur lacinia aliquam arcu. Proin ultrices risus velit, in vehicula tellus vehicula at. Sed ultrices et felis fringilla ultricies.</div>,
36+
<div id="5" key="5">Donec orci lorem, imperdiet eu nisi sit amet, condimentum scelerisque tortor. Etiam nec lacinia dui. Duis non turpis neque. Sed pellentesque a erat et accumsan. Pellentesque elit odio, elementum nec placerat nec, ornare in tortor. Suspendisse gravida magna maximus mollis facilisis. Duis odio libero, finibus ac suscipit sed, aliquam et diam. Aenean posuere lacus ex. Donec dapibus, sem ac luctus ultrices, justo libero tempor eros, vitae lacinia ex ante non dolor. Curabitur condimentum, ligula id pharetra dictum, libero libero ullamcorper nunc, eu blandit sem arcu ut felis. Nullam lacinia dapibus auctor.</div>
37+
];
38+
2839
constructor(props: IControlsTestProps) {
2940
super(props);
3041

@@ -34,7 +45,10 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
3445
iFrameDialogOpened: false,
3546
initialValues: [],
3647
authorEmails: [],
37-
selectedList: null
48+
selectedList: null,
49+
canMovePrev: false,
50+
canMoveNext: true,
51+
currentCarouselElement: this.carouselElements[0]
3852
};
3953

4054
this._onIconSizeChange = this._onIconSizeChange.bind(this);
@@ -54,17 +68,17 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
5468
});
5569
});
5670

57-
// // Get Authors in the SharePoint Document library -- For People Picker Testing
58-
// const restAuthorApi = `${this.props.context.pageContext.web.absoluteUrl}/_api/web/lists/GetByTitle('Documents')/Items?$select=Id, Author/EMail&$expand=Author/EMail`;
59-
// this.props.context.spHttpClient.get(restAuthorApi, SPHttpClient.configurations.v1)
60-
// .then(resp => { return resp.json(); })
61-
// .then(items => {
62-
// let emails : string[] = items.value ? items.value.map((item, key)=> { return item.Author.EMail}) : [];
63-
// console.log(emails);
64-
// this.setState({
65-
// authorEmails: emails
66-
// });
67-
// });
71+
// // Get Authors in the SharePoint Document library -- For People Picker Testing
72+
// const restAuthorApi = `${this.props.context.pageContext.web.absoluteUrl}/_api/web/lists/GetByTitle('Documents')/Items?$select=Id, Author/EMail&$expand=Author/EMail`;
73+
// this.props.context.spHttpClient.get(restAuthorApi, SPHttpClient.configurations.v1)
74+
// .then(resp => { return resp.json(); })
75+
// .then(items => {
76+
// let emails : string[] = items.value ? items.value.map((item, key)=> { return item.Author.EMail}) : [];
77+
// console.log(emails);
78+
// this.setState({
79+
// authorEmails: emails
80+
// });
81+
// });
6882
}
6983

7084
/**
@@ -92,14 +106,14 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
92106
console.log('Items:', items);
93107
}
94108

95-
/**
96-
*
97-
*Method that retrieves the selected terms from the taxonomy picker and sets state
98-
* @private
99-
* @param {IPickerTerms} terms
100-
* @memberof ControlsTest
101-
*/
102-
private onServicePickerChange(terms: IPickerTerms): void {
109+
/**
110+
*
111+
*Method that retrieves the selected terms from the taxonomy picker and sets state
112+
* @private
113+
* @param {IPickerTerms} terms
114+
* @memberof ControlsTest
115+
*/
116+
private onServicePickerChange(terms: IPickerTerms): void {
103117
this.setState({
104118
initialValues: terms
105119
});
@@ -110,7 +124,7 @@ private onServicePickerChange(terms: IPickerTerms): void {
110124
* Method that retrieves the selected terms from the taxonomy picker
111125
* @param terms
112126
*/
113-
private _onTaxPickerChange = (terms : IPickerTerms) => {
127+
private _onTaxPickerChange = (terms: IPickerTerms) => {
114128
this.setState({
115129
initialValues: terms
116130
});
@@ -156,6 +170,23 @@ private onServicePickerChange(terms: IPickerTerms): void {
156170
console.log(item);
157171
}
158172

173+
/**
174+
* Triggers element change for the carousel example.
175+
*/
176+
private triggerNextElement = (index: number): void => {
177+
const canMovePrev = index > 0;
178+
const canMoveNext = index < this.carouselElements.length - 1;
179+
const nextElement = this.carouselElements[index];
180+
181+
setTimeout(() => {
182+
this.setState({
183+
canMovePrev,
184+
canMoveNext,
185+
currentCarouselElement: nextElement
186+
});
187+
}, 500);
188+
}
189+
159190
/**
160191
* Renders the component
161192
*/
@@ -268,42 +299,42 @@ private onServicePickerChange(terms: IPickerTerms): void {
268299

269300
<div className="ms-font-m">List picker tester:
270301
<ListPicker context={this.props.context}
271-
label="Select your list(s)"
272-
placeHolder="Select your list(s)"
273-
baseTemplate={100}
274-
includeHidden={false}
275-
multiSelect={true}
276-
onSelectionChanged={this.onListPickerChange} />
302+
label="Select your list(s)"
303+
placeHolder="Select your list(s)"
304+
baseTemplate={100}
305+
includeHidden={false}
306+
multiSelect={true}
307+
onSelectionChanged={this.onListPickerChange} />
277308
</div>
278309

279310
<div className="ms-font-m">Field picker list data tester:
280311
<ListItemPicker listId={this.state.selectedList}
281-
columnInternalName="Title"
282-
itemLimit={5}
283-
context={this.props.context}
284-
onSelectedItem={this.listItemPickerDataSelected} />
312+
columnInternalName="Title"
313+
itemLimit={5}
314+
context={this.props.context}
315+
onSelectedItem={this.listItemPickerDataSelected} />
285316
</div>
286317

287318
<div className="ms-font-m">Services tester:
288319
<TaxonomyPicker
289-
allowMultipleSelections={true}
290-
termsetNameOrID="ef1d77ab-51f6-492f-bf28-223a8ebc4b65" // id to termset that has a custom sort
291-
panelTitle="Select Sorted Term"
292-
label="Service Picker"
293-
context={this.props.context}
294-
onChange={this.onServicePickerChange}
295-
isTermSetSelectable={false}
296-
/>
297-
298-
<TaxonomyPicker
299-
allowMultipleSelections={true}
300-
termsetNameOrID="e813224c-bb1b-4086-b828-3d71434ddcd7" // id to termset that has a default sort
301-
panelTitle="Select Default Sorted Term"
302-
label="Service Picker"
303-
context={this.props.context}
304-
onChange={this.onServicePickerChange}
305-
isTermSetSelectable={false}
306-
/>
320+
allowMultipleSelections={true}
321+
termsetNameOrID="ef1d77ab-51f6-492f-bf28-223a8ebc4b65" // id to termset that has a custom sort
322+
panelTitle="Select Sorted Term"
323+
label="Service Picker"
324+
context={this.props.context}
325+
onChange={this.onServicePickerChange}
326+
isTermSetSelectable={false}
327+
/>
328+
329+
<TaxonomyPicker
330+
allowMultipleSelections={true}
331+
termsetNameOrID="e813224c-bb1b-4086-b828-3d71434ddcd7" // id to termset that has a default sort
332+
panelTitle="Select Default Sorted Term"
333+
label="Service Picker"
334+
context={this.props.context}
335+
onChange={this.onServicePickerChange}
336+
isTermSetSelectable={false}
337+
/>
307338

308339
<TaxonomyPicker
309340
initialValues={this.state.initialValues}
@@ -320,16 +351,16 @@ private onServicePickerChange(terms: IPickerTerms): void {
320351
onChange={this._onTaxPickerChange}
321352
isTermSetSelectable={false} />
322353

323-
<DefaultButton text="Add" onClick={() => {
324-
this.setState({
325-
initialValues: [{
326-
key: "ab703558-2546-4b23-b8b8-2bcb2c0086f5",
327-
name: "HR",
328-
path: "HR",
329-
termSet: "b3e9b754-2593-4ae6-abc2-35345402e186"
330-
}]
331-
});
332-
}} />
354+
<DefaultButton text="Add" onClick={() => {
355+
this.setState({
356+
initialValues: [{
357+
key: "ab703558-2546-4b23-b8b8-2bcb2c0086f5",
358+
name: "HR",
359+
path: "HR",
360+
termSet: "b3e9b754-2593-4ae6-abc2-35345402e186"
361+
}]
362+
});
363+
}} />
333364
</div>
334365
<div className="ms-font-m">iframe dialog tester:
335366
<PrimaryButton
@@ -374,27 +405,59 @@ private onServicePickerChange(terms: IPickerTerms): void {
374405
selectionMode={SelectionMode.single}
375406
selection={this._getSelection} />
376407

377-
<p><a href="javascript:;" onClick={this.deleteItem}>Deletes second item</a></p>
378-
379-
<PeoplePicker
380-
context={this.props.context}
381-
titleText="People Picker"
382-
personSelectionLimit={5}
383-
// groupName={"Team Site Owners"}
384-
showtooltip={true}
385-
isRequired={true}
386-
//defaultSelectedUsers={["tenantUser@domain.onmicrosoft.com", "[email protected]"]}
387-
//defaultSelectedUsers={this.state.authorEmails}
388-
selectedItems={this._getPeoplePickerItems}
389-
showHiddenInUI={false}
390-
principleTypes={[PrincipalType.User]}
391-
suggestionsLimit={2} />
392-
393-
<PeoplePicker
394-
context={this.props.context}
395-
titleText="People Picker (disabled)"
396-
disabled={true}
397-
showtooltip={true} />
408+
<p><a href="javascript:;" onClick={this.deleteItem}>Deletes second item</a></p>
409+
410+
<PeoplePicker
411+
context={this.props.context}
412+
titleText="People Picker"
413+
personSelectionLimit={5}
414+
// groupName={"Team Site Owners"}
415+
showtooltip={true}
416+
isRequired={true}
417+
//defaultSelectedUsers={["tenantUser@domain.onmicrosoft.com", "[email protected]"]}
418+
//defaultSelectedUsers={this.state.authorEmails}
419+
selectedItems={this._getPeoplePickerItems}
420+
showHiddenInUI={false}
421+
principleTypes={[PrincipalType.User]}
422+
suggestionsLimit={2} />
423+
424+
<PeoplePicker
425+
context={this.props.context}
426+
titleText="People Picker (disabled)"
427+
disabled={true}
428+
showtooltip={true} />
429+
430+
<div>
431+
<h3>Carousel with fixed elements:</h3>
432+
<Carousel
433+
buttonsLocation={CarouselButtonsLocation.top}
434+
buttonsDisplay={CarouselButtonsDisplay.block}
435+
436+
contentContainerStyles={styles.carouselContent}
437+
containerButtonsStyles={styles.carouselButtonsContainer}
438+
439+
isInfinite={true}
440+
441+
element={this.carouselElements}
442+
onMoveNextClicked={(index: number) => { console.log(`Next button clicked: ${index}`); }}
443+
onMovePrevClicked={(index: number) => { console.log(`Prev button clicked: ${index}`); }}
444+
/>
445+
</div>
446+
447+
<div>
448+
<h3>Carousel with triggerPageElement:</h3>
449+
<Carousel
450+
buttonsLocation={CarouselButtonsLocation.bottom}
451+
buttonsDisplay={CarouselButtonsDisplay.buttonsOnly}
452+
453+
contentContainerStyles={styles.carouselContent}
454+
455+
canMoveNext={this.state.canMoveNext}
456+
canMovePrev={this.state.canMovePrev}
457+
triggerPageEvent={this.triggerNextElement}
458+
element={this.state.currentCarouselElement}
459+
/>
460+
</div>
398461
</div>
399462
);
400463
}

src/webparts/controlsTest/components/IControlsTestProps.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@ export interface IControlsTestState {
1717
iFrameDialogOpened?: boolean;
1818
authorEmails: string[];
1919
selectedList: string;
20+
21+
currentCarouselElement: JSX.Element;
22+
canMovePrev: boolean;
23+
canMoveNext: boolean;
2024
}

0 commit comments

Comments
 (0)