Skip to content

Commit 98f7075

Browse files
authoredJun 17, 2019
feat(ui5-card): add "headerInteractive" property (#439)
1 parent c59c43e commit 98f7075

File tree

6 files changed

+81
-23
lines changed

6 files changed

+81
-23
lines changed
 

‎packages/main/src/Card.hbs

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
@click="{{_headerClick}}"
77
@keydown="{{_headerKeydown}}"
88
@keyup="{{_headerKeyup}}"
9-
tabindex="0">
9+
tabindex="{{tabindex}}"
10+
role="{{role}}">
1011
{{#if image}}
1112
<img src="{{avatar}}" aria-label="Avatar" class="sapFCardAvatar sapFCardHeaderImg">
1213
{{/if}}

‎packages/main/src/Card.js

+37-4
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ const metadata = {
6464
type: String,
6565
},
6666

67+
/**
68+
* Defines if the <code>ui5-card</code> header would be interactive,
69+
* e.g gets hover effect, gets focused and <code>headerPress</code> event is fired, when it is pressed.
70+
* @type {boolean}
71+
* @defaultvalue false
72+
* @public
73+
*/
74+
headerInteractive: {
75+
type: Boolean,
76+
},
77+
6778
/**
6879
* Defines image source URI or built-in icon font URI.
6980
* </br></br>
@@ -75,7 +86,6 @@ const metadata = {
7586
*/
7687
avatar: {
7788
type: String,
78-
defaultValue: null,
7989
},
8090

8191
_headerActive: {
@@ -87,7 +97,8 @@ const metadata = {
8797
/**
8898
* Fired when the <code>ui5-card</code> header is pressed
8999
* by click/tap or by using the Enter or Space key.
90-
*
100+
* <br><br>
101+
* <b>Note:</b> The event would be fired only if the <code>headerInteractive</code> property is set to true.
91102
* @event
92103
* @public
93104
* @since 0.10.0
@@ -106,6 +117,9 @@ const metadata = {
106117
* The header can be used through several properties, such as:
107118
* <code>heading</code>, <code>subtitle</code>, <code>status</code> and <code>avatar</code>.
108119
*
120+
* <h3>Keyboard handling</h3>
121+
* In case you enable <code>headerInteractive</cdoe> property, you can press the <code>ui5-card</code> header by Space and Enter keys.
122+
*
109123
* <h3>ES6 Module Import</h3>
110124
*
111125
* <code>import "@ui5/webcomponents/dist/Card";</code>
@@ -142,7 +156,8 @@ class Card extends UI5Element {
142156
},
143157
header: {
144158
"sapFCardHeader": true,
145-
"sapFCardHeaderActive": this._headerActive,
159+
"sapFCardHeaderInteractive": this.headerInteractive,
160+
"sapFCardHeaderActive": this.headerInteractive && this._headerActive,
146161
},
147162
};
148163
}
@@ -155,17 +170,31 @@ class Card extends UI5Element {
155170
return !!this.avatar && !this.icon;
156171
}
157172

173+
get role() {
174+
return this.headerInteractive ? "button" : undefined;
175+
}
176+
177+
get tabindex() {
178+
return this.headerInteractive ? "0" : undefined;
179+
}
180+
158181
static async define(...params) {
159182
await Icon.define();
160183

161184
super.define(...params);
162185
}
163186

164187
_headerClick() {
165-
this.fireEvent("headerPress");
188+
if (this.headerInteractive) {
189+
this.fireEvent("headerPress");
190+
}
166191
}
167192

168193
_headerKeydown(event) {
194+
if (!this.headerInteractive) {
195+
return;
196+
}
197+
169198
const enter = isEnter(event);
170199
const space = isSpace(event);
171200

@@ -182,6 +211,10 @@ class Card extends UI5Element {
182211
}
183212

184213
_headerKeyup(event) {
214+
if (!this.headerInteractive) {
215+
return;
216+
}
217+
185218
const space = isSpace(event);
186219

187220
this._headerActive = false;

‎packages/main/src/themes/Card.css

+3-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ ui5-card:not([hidden]) {
4343
outline: none;
4444
}
4545

46-
.sapFCardHeader:focus:before {
46+
.sapFCardHeader.sapFCardHeaderInteractive:focus:before {
4747
content: "";
4848
position: absolute;
4949
border: var(--_ui5_card_header_focus_border);
@@ -54,13 +54,13 @@ ui5-card:not([hidden]) {
5454
bottom: 1px;
5555
}
5656

57-
.sapFCardHeader:hover {
57+
.sapFCardHeader.sapFCardHeaderInteractive:hover {
5858
cursor: pointer;
5959
background: var(--_ui5_card_header_hover_bg);
6060
}
6161

6262
.sapFCardHeader.sapFCardHeaderActive,
63-
.sapFCardHeader:active {
63+
.sapFCardHeader.sapFCardHeaderInteractive:active {
6464
background: var(--_ui5_card_header_active_bg);
6565
}
6666

‎packages/main/test/sap/ui/webcomponents/main/pages/Card.html

+15-5
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,36 @@
2323
}
2424
</style>
2525
</head>
26-
<body>
26+
27+
<body role="application">
2728

2829
<ui5-card
2930
id="card"
3031
status="4 of 10"
3132
heading="Quick Links"
33+
header-interactive
3234
class="myCard">
3335
<ui5-list id="myList3" separators="Inner">
3436
<ui5-li icon="sap-icon://horizontal-bullet-chart" >Template Based Segmentation</ui5-li>
3537
<ui5-li icon="sap-icon://opportunity" >Segmentation Models</ui5-li>
3638
<ui5-li icon="sap-icon://line-charts" >Marketing plans</ui5-li>
37-
<ui5-li icon="sap-icon://horizontal-bar-chart" >Target Groups</ui5-li>
38-
<ui5-li icon="sap-icon://org-chart" >Program Structure</ui5-li>
39-
<ui5-li icon="sap-icon://bar-chart" >AdWords Campaigns</ui5-li>
40-
<ui5-li icon="sap-icon://tools-opportunity" >Winter Campaign Results</ui5-li>
4139
</ui5-list>
4240

4341
<ui5-input id="field" value="0"></ui5-input>
4442
</ui5-card>
4543

44+
<ui5-card
45+
id="card2"
46+
status="4 of 10"
47+
heading="Quick Links"
48+
class="myCard">
49+
<ui5-list id="myList3" separators="Inner">
50+
<ui5-li icon="sap-icon://horizontal-bullet-chart" >Template Based Segmentation</ui5-li>
51+
<ui5-li icon="sap-icon://opportunity" >Segmentation Models</ui5-li>
52+
</ui5-list>
53+
54+
</ui5-card>
55+
4656
<script>
4757
card.addEventListener("ui5-headerPress", function (event) {
4858
console.log(event);

‎packages/main/test/sap/ui/webcomponents/main/samples/Card.sample.html

+16-10
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,19 @@ <h2 class="control-header">Card</h2>
103103
<section>
104104
<h3>Card with List</h3>
105105
<div class="snippet card-container">
106-
<ui5-card avatar="sap-icon://group" heading="Team 6" subtitle="Direct Reports" status="6 of 6" class="medium" >
106+
<ui5-card avatar="sap-icon://group" heading="Team Space" subtitle="Direct Reports" status="3 of 10" class="medium">
107107
<div class="card-content">
108-
<ui5-list separators="None" class="card-content-child">
108+
<ui5-list separators="None" class="card-content-child" style="width: 100%">
109109
<ui5-li image="../../../../../../www/samples/images/man_avatar_1.png" description="User Researcher">Alain Chevalier</ui5-li>
110110
<ui5-li image="../../../../../../www/samples/images/woman_avatar_1.png" description="Artist">Monique Legrand</ui5-li>
111111
<ui5-li image="../../../../../../www/samples/images/woman_avatar_2.png" description="UX Specialist">Michael Adams</ui5-li>
112112
</ui5-list>
113-
<ui5-list separators="None" class="card-content-child">
113+
114+
</div>
115+
</ui5-card>
116+
<ui5-card avatar="sap-icon://group" heading="This header is interactive" header-interactive subtitle="Click, press Enter or Space" status="3 of 6" class="medium">
117+
<div class="card-content">
118+
<ui5-list separators="None" class="card-content-child" style="width: 100%">
114119
<ui5-li image="../../../../../../www/samples/images/man_avatar_2.png" description="Software Architect">Richard Wilson</ui5-li>
115120
<ui5-li image="../../../../../../www/samples/images/woman_avatar_3.png" description="Visual Designer">Elena Petrova</ui5-li>
116121
<ui5-li image="../../../../../../www/samples/images/man_avatar_3.png" description="Quality Specialist">John Miller</ui5-li>
@@ -129,18 +134,19 @@ <h3>Card with List</h3>
129134
}
130135
</style>
131136

132-
<ui5-card avatar="sap-icon://group"
133-
heading="Team 6"
134-
subtitle="Direct Reports"
135-
status="6 of 6"
136-
class="medium">
137+
<ui5-card avatar="sap-icon://group" heading="Team Space" subtitle="Direct Reports" status="3 of 10" class="medium">
137138
<div class="card-content">
138-
<ui5-list separators="None" class="card-content-child">
139+
<ui5-list separators="None" class="card-content-child" style="width: 100%">
139140
<ui5-li image="../../../../../../www/samples/images/man_avatar_1.png" description="User Researcher">Alain Chevalier</ui5-li>
140141
<ui5-li image="../../../../../../www/samples/images/woman_avatar_1.png" description="Artist">Monique Legrand</ui5-li>
141142
<ui5-li image="../../../../../../www/samples/images/woman_avatar_2.png" description="UX Specialist">Michael Adams</ui5-li>
142143
</ui5-list>
143-
<ui5-list separators="None" class="card-content-child">
144+
145+
</div>
146+
</ui5-card>
147+
<ui5-card avatar="sap-icon://group" heading="This header is interactive" header-interactive subtitle="Click, press Enter or Space" status="3 of 6" class="medium">
148+
<div class="card-content">
149+
<ui5-list separators="None" class="card-content-child" style="width: 100%">
144150
<ui5-li image="../../../../../../www/samples/images/man_avatar_2.png" description="Software Architect">Richard Wilson</ui5-li>
145151
<ui5-li image="../../../../../../www/samples/images/woman_avatar_3.png" description="Visual Designer">Elena Petrova</ui5-li>
146152
<ui5-li image="../../../../../../www/samples/images/man_avatar_3.png" description="Quality Specialist">John Miller</ui5-li>

‎packages/main/test/specs/Card.spec.js

+8
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,20 @@ describe("Card general interaction", () => {
44

55
it("fires headerPress upon click, Enter and Space", () => {
66
const cardHeader = browser.findElementDeep("#card >>> .sapFCardHeader");
7+
const cardHeader2 = browser.findElementDeep("#card2 >>> .sapFCardHeader");
78
const field = browser.$("#field");
89

910
cardHeader.click();
1011
cardHeader.keys("Space");
1112
cardHeader.keys("Enter");
1213

1314
assert.strictEqual(field.getProperty("value"), "3", "headerPress should be called 3 times");
15+
16+
17+
cardHeader2.click();
18+
cardHeader2.keys("Space");
19+
cardHeader2.keys("Enter");
20+
21+
assert.strictEqual(field.getProperty("value"), "3", "events count should remain 3 as the header is not interactive.");
1422
});
1523
});

0 commit comments

Comments
 (0)
Please sign in to comment.