Skip to content

Commit 5d04223

Browse files
committed
#638 - Changes to make the new Accordion control work in v1
1 parent 9326643 commit 5d04223

File tree

7 files changed

+157
-0
lines changed

7 files changed

+157
-0
lines changed

src/Accordion.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./controls/accordion";
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
@import "~office-ui-fabric-react/dist/sass/References.scss";
2+
3+
.accordion {
4+
background: #fafafa;
5+
6+
& > button {
7+
min-height: 44px;
8+
border: 2px solid transparent;
9+
outline: 1px solid transparent;
10+
outline-offset: -3px;
11+
background: #f0f0f0; // Microsoft web site doesn't use Fabric colors!
12+
color: rgba(0, 0, 0, 0.8); // Microsoft web site doesn't use Fabric colors!
13+
text-align: left;
14+
width: 100%;
15+
border-bottom: 1px solid rgba(0, 0, 0, 0.2); // Microsoft web site doesn't use Fabric colors!
16+
17+
:global(.ms-Button-label) {
18+
font-weight: 400;
19+
}
20+
21+
&:hover,
22+
&:focus {
23+
box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.16); // Microsoft web site doesn't use Fabric colors!
24+
color: $ms-color-black;
25+
background: #f0f0f0; // Microsoft web site doesn't use Fabric colors!
26+
}
27+
28+
&:focus {
29+
border-width: 2px;
30+
border-style: solid;
31+
border-color: $ms-color-black;
32+
outline-color: rgba(255, 255, 255, 0.6); // Microsoft web site doesn't use Fabric colors!
33+
}
34+
}
35+
36+
.drawer {
37+
padding: 24px 12px 24px 12px;
38+
background: #fafafa; // Microsoft web site doesn't use Fabric colors!
39+
font-weight: 400;
40+
font-size: 15px;
41+
line-height: 20px;
42+
}
43+
}
44+
45+
.accordionChevron {
46+
font-size: 16px;
47+
margin-left: -6px;
48+
color: rgba(0, 0, 0, 0.8);
49+
}

src/controls/accordion/Accordion.tsx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import * as React from 'react';
2+
import styles from './Accordion.module.scss';
3+
import { IAccordionProps, IAccordionState } from './index';
4+
import { css } from "@uifabric/utilities/lib/css";
5+
import { DefaultButton } from 'office-ui-fabric-react/lib/components/Button';
6+
import { IIconProps } from 'office-ui-fabric-react/lib/Icon';
7+
8+
/**
9+
* Icon styles. Feel free to change them
10+
*/
11+
const collapsedIcon: IIconProps = { iconName: 'ChevronRight', className: styles.accordionChevron };
12+
const expandedIcon: IIconProps = { iconName: 'ChevronDown', className: styles.accordionChevron };
13+
14+
export class Accordion extends React.Component<IAccordionProps, IAccordionState> {
15+
private _drawerDiv: HTMLDivElement = undefined;
16+
constructor(props: IAccordionProps) {
17+
super(props);
18+
19+
this.state = {
20+
expanded: props.defaultCollapsed == null ? false : !props.defaultCollapsed
21+
};
22+
}
23+
24+
public render(): React.ReactElement<IAccordionProps> {
25+
return (
26+
<div className={css(styles.accordion, this.props.className)}>
27+
<DefaultButton
28+
toggled={true}
29+
checked={this.state.expanded}
30+
text={this.props.title}
31+
iconProps={this.state.expanded ? expandedIcon : collapsedIcon}
32+
onClick={() => {
33+
this.setState({
34+
expanded: !this.state.expanded
35+
});
36+
}}
37+
aria-expanded={this.state.expanded}
38+
aria-controls={this._drawerDiv && this._drawerDiv.id}
39+
/>
40+
{this.state.expanded &&
41+
<div className={styles.drawer} ref={(el) => { this._drawerDiv = el; }}>
42+
{this.props.children}
43+
</div>
44+
}
45+
</div>
46+
);
47+
}
48+
}
49+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
export interface IAccordionProps {
3+
defaultCollapsed?: boolean;
4+
title: string;
5+
className?: string;
6+
}
7+
8+
export interface IAccordionState {
9+
expanded: boolean;
10+
}

src/controls/accordion/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './Accordion';
2+
export * from './IAccordion.types';

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ export * from './FieldTextRenderer';
3333
export * from './FieldTitleRenderer';
3434
export * from './FieldUrlRenderer';
3535
export * from './FieldUserRenderer';
36+
export * from './Accordion';

src/webparts/controlsTest/components/ControlsTest.tsx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import { FolderExplorer, IFolder, IBreadcrumbItem } from '../../../FolderExplore
6060
import { Pagination } from '../../../controls/pagination';
6161
import CarouselImage from '../../../controls/carousel/CarouselImage';
6262
import { FieldCollectionData, CustomCollectionFieldType } from '../../../FieldCollectionData';
63+
import { Accordion } from '../../..';
6364

6465
/**
6566
* The sample data below was randomly generated (except for the title). It is used by the grid layout
@@ -101,6 +102,39 @@ const sampleGridData: any[] = [{
101102
activity: "5/26/2019"
102103
}];
103104

105+
const sampleItems = [
106+
{
107+
Langue: { Nom: 'Français' },
108+
Question: 'Charger des fichiers et dossiers',
109+
Reponse: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
110+
},
111+
{
112+
Langue: { Nom: 'Français' },
113+
Question: 'Enregistrer un fichier',
114+
Reponse: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
115+
},
116+
{
117+
Langue: { Nom: 'Français' },
118+
Question: 'Troisième exemple',
119+
Reponse: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
120+
},
121+
{
122+
Langue: { Nom: 'Français' },
123+
Question: 'Quatrième exemple',
124+
Reponse: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
125+
},
126+
{
127+
Langue: { Nom: 'Français' },
128+
Question: 'Cinquième exemple',
129+
Reponse: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
130+
},
131+
{
132+
Langue: { Nom: 'Français' },
133+
Question: 'Sixième exemple',
134+
Reponse: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
135+
}
136+
];
137+
104138
/**
105139
* Component that can be used to test out the React controls from this project
106140
*/
@@ -600,6 +634,17 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
600634
<Link href="https://pnp.github.io/sp-dev-fx-controls-react/">See all</Link>
601635
} />
602636

637+
{
638+
sampleItems.map((item, index) => (
639+
<Accordion title={item.Question} defaultCollapsed={true} className={"itemCell"} key={index}>
640+
<div className={"itemContent"}>
641+
<div className={"itemResponse"}>{item.Reponse}</div>
642+
<div className={"itemIndex"}>{`Langue : ${item.Langue.Nom}`}</div>
643+
</div>
644+
</Accordion>
645+
))
646+
}
647+
603648
<div className="ms-font-m">Services tester:
604649
<TaxonomyPicker
605650
allowMultipleSelections={true}

0 commit comments

Comments
 (0)