Skip to content

Commit bb2f26d

Browse files
committed
course card component setup
1 parent f4c4bd2 commit bb2f26d

5 files changed

Lines changed: 111 additions & 6 deletions

File tree

ims-education.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@
7777
<!-- Hamburger menu -->
7878
<script src="wp-includes/js/navbar.js"></script>
7979

80+
<!-- Web components -->
81+
<script src="web-components/course-card/course-card.js" type="module"></script>
82+
8083
</head>
8184

8285
<!-- MASTHEAD_SITENAV_BEGIN -->
@@ -349,6 +352,18 @@ <h1>IMS courses</h1>
349352
<!-- ALL ROLES header -->
350353
<h2 id="all">All roles</h2>
351354

355+
<course-card
356+
name="IMS Fundamentals"
357+
desc="Learn about the main components of IBM IMS: IMS Database Manager (IMS DB), IMS Transaction Manager (IMS TM), and common system services for IMS DB and IMS TM. Learn how these components work and interact with applications, how IMS databases differ from each other and differ from relational databases message types, security, maintenance, troubleshooting, and more."
358+
level="Beginner"
359+
cost="None"
360+
badge="Yes"
361+
time="32 hours"
362+
imgsrc="wp-content/course-badges/badge_ims_fundamentals.png"
363+
link="https://learn.ibm.com/course/view.php?id=8829"
364+
>
365+
</course-card>
366+
352367
<!-- card -->
353368
<div class="ims-course-card">
354369
<div class="course-c-id" id="ims-fundamentals"></div>

web-components/course-card/course-card.css

Whitespace-only changes.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<!-- HTML template -->
2+
<link href="" rel="stylesheet">
3+
<div class="course-card">
4+
<div>
5+
<img class="course-img" src="">
6+
</div>
7+
<div>
8+
<h2 class="course-name"></h2>
9+
<p class="course-desc"></p>
10+
<div class="inline-g">
11+
<p><b>Level: </b><span class="course-level"></span></p>
12+
<p><b>Cost: </b><span class="course-cost"></span></p>
13+
<p><b>Badge: </b><span class="course-badge"></span></p>
14+
<p><b>Time: </b><span class="course-time"></span></p>
15+
</div>
16+
</div>
17+
<div class="link-g">
18+
<a class="course-link" target="_blank" rel="noopener noreferrer">Learn more →</a>
19+
</div>
20+
</div>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Fetch HTML template
2+
fetch("web-components/course-card/course-card.html")
3+
.then(stream => stream.text())
4+
.then(text => createComponent(text))
5+
6+
// Create web component
7+
function createComponent(html) {
8+
// Web component class
9+
class CourseCard extends HTMLElement {
10+
11+
// Creates element with default values
12+
constructor() {
13+
super();
14+
}
15+
16+
// Return array of properties to observe
17+
static get observedAttributes() {
18+
return ['name', 'desc', 'level', 'cost', 'badge', 'time', 'link', 'imgsrc'];
19+
}
20+
21+
// Called when an attribute is defined or changed
22+
attributeChangedCallback(property, oldValue, newValue) {
23+
if (oldValue === newValue) return;
24+
this[property] = newValue;
25+
}
26+
27+
// Invoked when element is added to document
28+
connectedCallback() {
29+
// Create shadow root for element
30+
const shadow = this.attachShadow({mode: 'closed'});
31+
shadow.innerHTML = html;
32+
33+
// Set course name
34+
const courseName = shadow.querySelector('.course-name');
35+
courseName.textContent = this.name;
36+
37+
// Set course desc
38+
const courseDesc = shadow.querySelector('.course-desc');
39+
courseDesc.textContent = this.desc;
40+
41+
// Set course level
42+
const courseLevel = shadow.querySelector('.course-level');
43+
courseLevel.textContent = this.level;
44+
45+
// Set course cost
46+
const courseCost = shadow.querySelector('.course-cost');
47+
courseCost.textContent = this.cost;
48+
49+
// Set course badge
50+
const courseBadge = shadow.querySelector('.course-badge');
51+
courseBadge.textContent = this.badge;
52+
53+
// Set course time
54+
const courseTime = shadow.querySelector('.course-time');
55+
courseTime.textContent = this.time;
56+
57+
// Set course link
58+
const courseLink = shadow.querySelector('.course-link');
59+
courseLink.href = this.link;
60+
courseLink.setAttribute('aria-label', `Learn more about ${this.name}`);
61+
62+
// Set course img
63+
const courseImg = shadow.querySelector('.course-img');
64+
courseImg.src = this.imgsrc;
65+
courseImg.setAttribute('alt', `${this.name} badge`);
66+
}
67+
}
68+
69+
customElements.define('course-card', CourseCard);
70+
}

web-components/video-card/video-card.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,19 @@ function createComponent(html) {
3939

4040
// Set video name
4141
const videoName = shadow.querySelector('.video-name');
42-
videoName.textContent = `${this.name}`;
42+
videoName.textContent = this.name;
4343

4444
// Set video desc
4545
const videoDesc = shadow.querySelector('.video-desc');
46-
videoDesc.textContent = `${this.desc}`;
46+
videoDesc.textContent = this.desc;
4747

4848
// Set video level
4949
const videoLevel = shadow.querySelector('.video-level');
50-
videoLevel.textContent = `${this.level}`;
50+
videoLevel.textContent = this.level;
5151

5252
// Set video time
5353
const videoTime = shadow.querySelector('.video-time');
54-
videoTime.textContent = `${this.time}`;
54+
videoTime.textContent = this.time;
5555

5656
// Set video links
5757
const videoLink = shadow.querySelector('.video-link');
@@ -71,8 +71,8 @@ function createComponent(html) {
7171
// Check if urls have been defined
7272
if (url != undefined) {
7373
linkObj.href = url;
74-
const altText = (linkText != 'now') ? `Watch ${this.name}, ${linkText}` : `Watch ${this.name}`; // Change link text if defined
75-
linkObj.setAttribute('alt', altText);
74+
const ariaText = (linkText != 'now') ? `Watch ${this.name}, ${linkText}` : `Watch ${this.name}`; // Change link text if defined
75+
linkObj.setAttribute('aria-label', ariaText);
7676
linkObj.textContent = `Watch ${linkText} →`;
7777
}
7878
})

0 commit comments

Comments
 (0)