Skip to content

Commit 59b80be

Browse files
authoredMar 26, 2019
feat(ui5-card): fires headerPress event upon header click (#250)
1 parent 298a165 commit 59b80be

File tree

6 files changed

+124
-3
lines changed

6 files changed

+124
-3
lines changed
 

‎packages/main/src/Card.hbs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<div {{> controlData}} class="sapFCard">
2-
<header class="sapFCardHeader">
2+
<header class="{{classes.header}}"
3+
@click="{{ctr._headerClick}}"
4+
@keydown="{{ctr._headerKeydown}}"
5+
@keyup="{{ctr._headerKeyup}}"
6+
tabindex="0">
37
{{#if image}}
48
<img src="{{ctr.avatar}}" aria-label="Avatar" class="sapFCardAvatar sapFCardHeaderImg">
59
{{/if}}

‎packages/main/src/Card.js

+74
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import URI from "@ui5/webcomponents-base/src/types/URI";
33
import Bootstrap from "@ui5/webcomponents-base/src/Bootstrap";
44
import ShadowDOM from "@ui5/webcomponents-base/src/compatibility/ShadowDOM";
55
import { isIconURI } from "@ui5/webcomponents-base/src/IconPool";
6+
import { isSpace, isEnter } from "@ui5/webcomponents-base/src/events/PseudoEvents";
7+
import Function from "@ui5/webcomponents-base/src/types/Function";
68
import CardRenderer from "./build/compiled/CardRenderer.lit";
79
import Icon from "./Icon";
810

@@ -82,6 +84,34 @@ const metadata = {
8284
type: URI,
8385
defaultValue: null,
8486
},
87+
88+
_headerActive: {
89+
type: Boolean,
90+
},
91+
92+
_headerClick: {
93+
type: Function,
94+
},
95+
96+
_headerKeydown: {
97+
type: Function,
98+
},
99+
100+
_headerKeyup: {
101+
type: Function,
102+
},
103+
},
104+
events: /** @lends sap.ui.webcomponents.main.Card.prototype */ {
105+
106+
/**
107+
* Fired when the <code>ui5-card</code> header is pressed
108+
* by click/tap or by using the Enter or Space key.
109+
*
110+
* @event
111+
* @public
112+
* @since 0.10.0
113+
*/
114+
headerPress: {},
85115
},
86116
};
87117

@@ -107,6 +137,14 @@ const metadata = {
107137
* @public
108138
*/
109139
class Card extends WebComponent {
140+
constructor() {
141+
super();
142+
143+
this._headerClick = this.headerClick.bind(this);
144+
this._headerKeydown = this.headerKeydown.bind(this);
145+
this._headerKeyup = this.headerKeyup.bind(this);
146+
}
147+
110148
static get metadata() {
111149
return metadata;
112150
}
@@ -125,6 +163,12 @@ class Card extends WebComponent {
125163
image,
126164
ctr: state,
127165
renderIcon: state.icon && !state.image,
166+
classes: {
167+
header: {
168+
"sapFCardHeader": true,
169+
"sapFCardHeaderActive": state._headerActive,
170+
},
171+
},
128172
};
129173
}
130174

@@ -133,6 +177,36 @@ class Card extends WebComponent {
133177

134178
super.define(...params);
135179
}
180+
181+
headerClick() {
182+
this.fireEvent("headerPress");
183+
}
184+
185+
headerKeydown(event) {
186+
const enter = isEnter(event);
187+
const space = isSpace(event);
188+
189+
this._headerActive = enter || space;
190+
191+
if (enter) {
192+
this.fireEvent("headerPress");
193+
return;
194+
}
195+
196+
if (space) {
197+
event.preventDefault();
198+
}
199+
}
200+
201+
headerKeyup(event) {
202+
const space = isSpace(event);
203+
204+
this._headerActive = false;
205+
206+
if (space) {
207+
this.fireEvent("headerPress");
208+
}
209+
}
136210
}
137211

138212
Bootstrap.boot().then(_ => {

‎packages/main/src/themes/base/Card.less

+19
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@_ui5_card_header_active_bg: #f0f0f0;
1010
@_ui5_card_header_hover_bg: lighten(@_ui5_card_header_active_bg, 4);
1111
@_ui5_card_header_border_color: darken(@sapUiTileBackground, 20);
12+
@_ui5_card_focus_border_width: 1px;
1213

1314
:host(ui5-card) {
1415
display: inline-block;
@@ -34,17 +35,35 @@ ui5-card {
3435
}
3536

3637
.sapFCardHeader {
38+
position: relative;
3739
display: flex;
3840
align-items: flex-start;
3941
background: @sapUiTileBackground;
4042
border-bottom: 1px solid @_ui5_card_header_border_color;
4143
padding: @_ui5_card_content_padding;
4244
}
4345

46+
.sapFCardHeader:focus {
47+
outline: none;
48+
}
49+
50+
.sapFCardHeader:focus:before {
51+
content: "";
52+
position: absolute;
53+
border: @_ui5_card_focus_border_width dotted @sapUiContentFocusColor;
54+
pointer-events: none;
55+
top: 1px;
56+
left: 1px;
57+
right: 1px;
58+
bottom: 1px;
59+
}
60+
4461
.sapFCardHeader:hover {
62+
cursor: pointer;
4563
background: @_ui5_card_header_hover_bg;
4664
}
4765

66+
.sapFCardHeader.sapFCardHeaderActive,
4867
.sapFCardHeader:active {
4968
background: @_ui5_card_header_active_bg;
5069
}

‎packages/main/src/themes/sap_belize_hcb/Card.less

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212

1313
@_ui5_card_header_hover_bg: @sapUiHighlight;
1414
@_ui5_card_header_active_bg: @sapUiHighlight;
15-
@_ui5_card_header_border_color: @sapUiTileBorderColor;
15+
@_ui5_card_header_border_color: @sapUiTileBorderColor;
16+
@_ui5_card_focus_border_width: 0.125rem;

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

+9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<body>
2727

2828
<ui5-card
29+
id="card"
2930
status="4 of 10"
3031
heading="Quick Links"
3132
class="myCard">
@@ -38,7 +39,15 @@
3839
<ui5-li icon="sap-icon://bar-chart" >AdWords Campaigns</ui5-li>
3940
<ui5-li icon="sap-icon://tools-opportunity" >Winter Campaign Results</ui5-li>
4041
</ui5-list>
42+
43+
<ui5-input id="field" value="0"></ui5-input>
4144
</ui5-card>
4245

46+
<script>
47+
card.addEventListener("headerPress", function (event) {
48+
console.log(event);
49+
field.value = parseInt(field.value) + 1;
50+
});
51+
</script>
4352
</body>
4453
</html>

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

+15-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,15 @@
1-
const assert = require('assert');
1+
const assert = require('assert');
2+
describe("Card general interaction", () => {
3+
browser.url("http://localhost:8080/test-resources/sap/ui/webcomponents/main/pages/Card.html");
4+
5+
it("fires headerPress upon click, Enter and Space", () => {
6+
const cardHeader = browser.findElementDeep("#card >>> .sapFCardHeader");
7+
const field = browser.$("#field");
8+
9+
cardHeader.click();
10+
cardHeader.keys("Space");
11+
cardHeader.keys("Enter");
12+
13+
assert.strictEqual(field.getProperty("value"), "3", "headerPress should be called 3 times");
14+
});
15+
});

0 commit comments

Comments
 (0)