Skip to content

Commit 359c0d9

Browse files
author
Annika Kouhia
authored
Adding CSS to Failure Instance Panel (#1063)
* Adding Failure Instance Panel CSS
1 parent 65b4103 commit 359c0d9

10 files changed

+226
-85
lines changed

src/DetailsView/Styles/detailsview.scss

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,15 +221,54 @@ div.insights-file-issue-details-dialog-container {
221221
}
222222
.add-failure-instruction {
223223
font-weight: 500;
224-
margin-bottom: 20px;
225-
margin-top: 20px;
224+
margin: 20px 0px 20px 0px;
226225
}
227226
.header-text {
228227
margin-top: 30px;
229228
font-size: 21px;
230229
}
231-
}
230+
.footer {
231+
padding: 16px 16px 16px 0px;
232+
}
233+
.learn-more {
234+
color: $communication-primary;
235+
text-decoration: none;
236+
display: inline-block;
237+
margin-bottom: 24px;
238+
}
239+
.failure-instance-snippet-title {
240+
margin: 24px 0px 8px 0px;
241+
color: $primary-text;
242+
}
232243

244+
.failure-instance-snippet-empty-body {
245+
margin: 8px 0px 24px 0px;
246+
color: $secondary-text;
247+
}
248+
.failure-instance-snippet-filled-body {
249+
margin: 8px 0px 24px 0px;
250+
padding: 12px 16px 12px 16px;
251+
max-height: 200px;
252+
color: $primary-text;
253+
background-color: $neutral-4;
254+
overflow-y: scroll;
255+
word-wrap: break-word;
256+
}
257+
.failure-instance-snippet-error {
258+
margin: 9px 0px 50px 9px;
259+
color: $secondary-text;
260+
display: flex;
261+
flex-direction: row;
262+
}
263+
.failure-instance-snippet-error-icon {
264+
color: $negative-outcome;
265+
padding: 3px 8px;
266+
}
267+
}
268+
.failure-instance-selector-note {
269+
color: $secondary-text;
270+
margin: 8px 0px 8px 0px;
271+
}
233272
.preview-features-panel {
234273
.preview-feature-toggle-list {
235274
margin-top: 2vh;
@@ -623,9 +662,18 @@ div.insights-file-issue-details-dialog-container {
623662
.assessment-instance-label.not-applicable {
624663
font-size: 10px;
625664
}
626-
.assessment-instance-textContent {
665+
.all-content {
666+
display: flex;
667+
flex-direction: row;
668+
vertical-align: center;
627669
font-size: 14px;
628670
line-height: 24px;
671+
}
672+
.instance-header {
673+
color: $primary-text;
674+
white-space: pre;
675+
}
676+
.assessment-instance-textContent {
629677
overflow: hidden;
630678
white-space: nowrap;
631679
text-overflow: ellipsis;

src/DetailsView/components/assessment-instance-details-column.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as React from 'react';
66

77
export interface AssessmentInstanceDetailsColumnProps {
88
labelText?: string;
9+
headerText?: string;
910
textContent: string;
1011
background: string;
1112
tooltipId: string;
@@ -15,6 +16,7 @@ export interface AssessmentInstanceDetailsColumnProps {
1516
export class AssessmentInstanceDetailsColumn extends React.Component<AssessmentInstanceDetailsColumnProps> {
1617
public render(): JSX.Element {
1718
const showLabel = !!this.props.labelText;
19+
const showHeader = !!this.props.headerText;
1820
const textContent = this.props.textContent;
1921

2022
const classNames = css('assessment-instance-label', this.props.customClassName);
@@ -28,7 +30,10 @@ export class AssessmentInstanceDetailsColumn extends React.Component<AssessmentI
2830
) : null}
2931
<div>
3032
<TooltipHost content={textContent} calloutProps={{ gapSpace: 0 }}>
31-
<div className="assessment-instance-textContent">{textContent}</div>
33+
<div className="all-content">
34+
{showHeader ? <strong className="instance-header">{this.props.headerText} </strong> : null}
35+
<div className="assessment-instance-textContent">{textContent}</div>
36+
</div>
3237
</TooltipHost>
3338
</div>
3439
</div>

src/DetailsView/components/assessment-table-column-config-handler.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,13 @@ export class AssessmentTableColumnConfigHandler {
108108
}
109109

110110
private onRenderCapturedInstanceDetailsColumn(item: CapturedInstanceRowData): JSX.Element {
111+
const headerText = item.instance.description ? 'Comment:' : 'Path:';
112+
const textContent = item.instance.description ? item.instance.description : item.instance.selector;
111113
return (
112114
<AssessmentInstanceDetailsColumn
113115
background={'#767676'}
114-
labelText={'N/A'}
115-
textContent={item.instance.description}
116+
textContent={textContent}
117+
headerText={headerText}
116118
tooltipId={item.instance.id}
117119
customClassName="not-applicable"
118120
/>

src/DetailsView/components/failure-instance-panel-control.tsx

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import { clone, isEqual } from 'lodash';
44
import { ActionButton } from 'office-ui-fabric-react/lib/Button';
55
import { Icon } from 'office-ui-fabric-react/lib/Icon';
6+
import { ILabelStyles } from 'office-ui-fabric-react/lib/Label';
67
import { Link } from 'office-ui-fabric-react/lib/Link';
7-
import { TextField } from 'office-ui-fabric-react/lib/TextField';
8+
import { ITextFieldStyles, TextField } from 'office-ui-fabric-react/lib/TextField';
89
import * as React from 'react';
910

1011
import { AssessmentsProvider } from 'assessments/types/assessments-provider';
@@ -121,8 +122,9 @@ export class FailureInstancePanelControl extends React.Component<FailureInstance
121122
this.props.actionType === CapturedInstanceActionType.CREATE
122123
? FailureInstancePanelControl.addFailureInstanceLabel
123124
: 'Edit failure instance',
124-
hasCloseButton: false,
125-
closeButtonAriaLabel: null,
125+
hasCloseButton: true,
126+
closeButtonAriaLabel: 'Close failure instance panel',
127+
onRenderFooterContent: this.getActionCancelButtons,
126128
};
127129

128130
return (
@@ -135,29 +137,41 @@ export class FailureInstancePanelControl extends React.Component<FailureInstance
135137
/>
136138
<TextField
137139
className="observed-failure-textfield"
138-
label="Comments"
140+
label="Comment"
141+
styles={getStyles}
139142
multiline={true}
140-
rows={8}
143+
rows={4}
141144
value={this.state.currentInstance.failureDescription}
142145
onChange={this.onFailureDescriptionChange}
143146
resizable={false}
144147
/>
148+
</GenericPanel>
149+
);
150+
}
151+
152+
private getActionCancelButtons = (): JSX.Element => {
153+
let primaryButtonText = 'Save';
154+
let primaryButtonOnClick = this.onSaveEditedFailureInstance;
155+
156+
if (this.props.actionType === CapturedInstanceActionType.CREATE) {
157+
primaryButtonText = 'Add failed instance';
158+
primaryButtonOnClick = this.onAddFailureInstance;
159+
}
160+
161+
return (
162+
<div className="footer">
145163
<ActionAndCancelButtonsComponent
146164
isHidden={false}
147165
primaryButtonDisabled={
148166
this.state.currentInstance.failureDescription === null && this.state.currentInstance.path === null
149167
}
150-
primaryButtonText={this.props.actionType === CapturedInstanceActionType.CREATE ? 'Add' : 'Save'}
151-
primaryButtonOnClick={
152-
this.props.actionType === CapturedInstanceActionType.CREATE
153-
? this.onAddFailureInstance
154-
: this.onSaveEditedFailureInstance
155-
}
168+
primaryButtonText={primaryButtonText}
169+
primaryButtonOnClick={primaryButtonOnClick}
156170
cancelButtonOnClick={this.closeFailureInstancePanel}
157171
/>
158-
</GenericPanel>
172+
</div>
159173
);
160-
}
174+
};
161175

162176
private getFailureInstancePanelDetails = (): JSX.Element => {
163177
return (
@@ -224,3 +238,21 @@ export class FailureInstancePanelControl extends React.Component<FailureInstance
224238
this.setState({ isPanelOpen: false });
225239
};
226240
}
241+
242+
function getStyles(): Partial<ITextFieldStyles> {
243+
return {
244+
subComponentStyles: {
245+
label: getLabelStyles,
246+
},
247+
};
248+
}
249+
250+
function getLabelStyles(): ILabelStyles {
251+
return {
252+
root: [
253+
{
254+
paddingBottom: 8,
255+
},
256+
],
257+
};
258+
}
Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33
import { DefaultButton } from 'office-ui-fabric-react/lib/Button';
4-
import { TextField } from 'office-ui-fabric-react/lib/TextField';
4+
import { Icon } from 'office-ui-fabric-react/lib/Icon';
5+
import { ILabelStyles } from 'office-ui-fabric-react/lib/Label';
6+
import { ITextFieldStyles, TextField } from 'office-ui-fabric-react/lib/TextField';
57
import * as React from 'react';
68
import { NamedSFC } from '../../common/react/named-sfc';
79

@@ -13,27 +15,65 @@ export type FailureInstancePanelDetailsProps = {
1315
};
1416

1517
export const FailureInstancePanelDetails = NamedSFC<FailureInstancePanelDetailsProps>('FailureInstancePanelDetails', props => {
18+
const getSnippetInfo = (): JSX.Element => {
19+
if (!props.snippet) {
20+
return (
21+
<div className="failure-instance-snippet-empty-body">Code snippet will auto-populate based on the CSS selector input.</div>
22+
);
23+
} else if (props.snippet.startsWith('No code snippet is map')) {
24+
return (
25+
<div className="failure-instance-snippet-error">
26+
<Icon iconName="statusErrorFull" className="failure-instance-snippet-error-icon" />
27+
<div>{props.snippet}</div>
28+
</div>
29+
);
30+
} else {
31+
return <div className="failure-instance-snippet-filled-body">{props.snippet}</div>;
32+
}
33+
};
1634
return (
1735
<div>
18-
<a className="learn-more"> Learn more about adding failure instances </a>
36+
<a href="#" className="learn-more">
37+
Learn more about adding failure instances
38+
</a>
1939
<TextField
20-
className="selector-failure-textfield"
2140
label="CSS Selector"
41+
styles={getStyles}
2242
multiline={true}
23-
rows={8}
43+
rows={4}
2444
value={props.path}
2545
onChange={props.onSelectorChange}
2646
resizable={false}
27-
defaultValue="CSS selector"
47+
placeholder="CSS Selector"
2848
/>
29-
<div>Note: If the CSS selector maps to multiple snippets, the first will be selected.</div>
30-
<div>
31-
<DefaultButton text="Validate CSS selector" onClick={props.onValidateSelector} disabled={props.path === ''} />
49+
<div className="failure-instance-selector-note">
50+
Note: If the CSS selector maps to multiple snippets, the first will be selected
3251
</div>
3352
<div>
34-
<label>Code Snippet</label>
35-
<div>{props.snippet}</div>
53+
<DefaultButton text="Validate CSS selector" onClick={props.onValidateSelector} disabled={props.path === null} />
54+
</div>
55+
<div aria-live="polite" aria-atomic="true">
56+
<div className="failure-instance-snippet-title">Code Snippet</div>
57+
{getSnippetInfo()}
3658
</div>
3759
</div>
3860
);
3961
});
62+
63+
function getStyles(): Partial<ITextFieldStyles> {
64+
return {
65+
subComponentStyles: {
66+
label: getLabelStyles,
67+
},
68+
};
69+
}
70+
71+
function getLabelStyles(): ILabelStyles {
72+
return {
73+
root: [
74+
{
75+
paddingBottom: 8,
76+
},
77+
],
78+
};
79+
}

src/DetailsView/components/generic-panel.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
3-
import { css } from '@uifabric/utilities';
4-
import { Panel, PanelType } from 'office-ui-fabric-react/lib/Panel';
3+
import { css, IRenderFunction } from '@uifabric/utilities';
4+
import { IPanelProps, Panel, PanelType } from 'office-ui-fabric-react/lib/Panel';
55
import * as React from 'react';
66

77
export interface GenericPanelProps {
@@ -11,6 +11,7 @@ export interface GenericPanelProps {
1111
className?: string;
1212
closeButtonAriaLabel: string;
1313
hasCloseButton: boolean;
14+
onRenderFooterContent?: IRenderFunction<IPanelProps>;
1415
}
1516

1617
export class GenericPanel extends React.Component<GenericPanelProps> {
@@ -27,6 +28,7 @@ export class GenericPanel extends React.Component<GenericPanelProps> {
2728
hasCloseButton={this.props.hasCloseButton}
2829
headerText={this.props.title}
2930
headerClassName="header-text"
31+
onRenderFooter={this.props.onRenderFooterContent}
3032
>
3133
{this.props.children}
3234
</Panel>

0 commit comments

Comments
 (0)