Skip to content

Commit 7852bdb

Browse files
committed
live course designation
1 parent aecda08 commit 7852bdb

4 files changed

Lines changed: 84 additions & 34 deletions

File tree

ims-education.html

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,12 +355,29 @@ <h2 id="all">All roles</h2>
355355
<course-card
356356
name="IMS Fundamentals"
357357
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+
imgsrc="wp-content/course-badges/badge_ims_fundamentals.png"
358359
level="Beginner"
359360
cost="None"
360361
badge="Yes"
361362
time="32 hours"
363+
link="https://learn.ibm.com/course/view.php?id=8829"
364+
>
365+
</course-card>
366+
367+
<course-card
368+
name="IMS Fundamentals"
369+
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."
362370
imgsrc="wp-content/course-badges/badge_ims_fundamentals.png"
371+
level="Beginner"
372+
cost="None"
373+
badge="Yes"
374+
time="32 hours"
363375
link="https://learn.ibm.com/course/view.php?id=8829"
376+
livelevel="Beginner"
377+
livecost="$"
378+
livebadge="No"
379+
livetime="30 hours"
380+
livelink="https://learn.ibm.com/course/view.php?id=8829"
364381
>
365382
</course-card>
366383

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,26 @@ img {
2121
/* Styling for a link group */
2222
.link-g {
2323
margin-top: 1.4em;
24+
display: flex;
25+
flex-flow: row wrap;
26+
gap: 2em;
2427
}
2528

2629
/* Styling for inline group (level, time) */
2730
.inline-g {
28-
display: flex;
29-
flex-flow: row wrap;
30-
gap: 1em;
31+
display: grid;
32+
grid-template-columns: repeat(5, 1fr);
33+
width: 75%;
3134
}
3235

3336
.inline-g p {
3437
padding: 0em;
3538
margin: 0em;
39+
font-weight: bold;
40+
}
41+
42+
.inline-g span {
43+
font-weight: normal;
3644
}
3745

3846
/* Styling for course card */

web-components/course-card/course-card.html

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,23 @@
99
<h2 class="course-name"></h2>
1010
<p class="course-desc"></p>
1111
<div class="inline-g">
12-
<p><b>Level: </b><span class="course-level"></span></p>
13-
<p><b>Cost: </b><span class="course-cost"></span></p>
14-
<p><b>Badge: </b><span class="course-badge"></span></p>
15-
<p><b>Time: </b><span class="course-time"></span></p>
12+
<p>Self-paced:</p>
13+
<p>Level: <span class="course-level"></span></p>
14+
<p>Cost: <span class="course-cost"></span></p>
15+
<p>Badge: <span class="course-badge"></span></p>
16+
<p>Time: <span class="course-time"></span></p>
17+
</div>
18+
<div class="inline-g live-course">
19+
<p>Instructor-led:</p>
20+
<p>Level: <span class="live-level"></span></p>
21+
<p>Cost: <span class="live-cost"></span></p>
22+
<p>Badge: <span class="live-badge"></span></p>
23+
<p>Time: <span class="live-time"></span></p>
1624
</div>
1725
</div>
1826
<div class="link-g">
19-
<a class="course-link" target="_blank" rel="noopener noreferrer">Learn more →</a>
27+
<a class="course-link" target="_blank" rel="noopener noreferrer">Self-paced course →</a>
28+
<a class="live-link" target="_blank" rel="noopener noreferrer">Instructor-led course →</a>
2029
</div>
2130
</div>
2231
</div>

web-components/course-card/course-card.js

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ fetch("web-components/course-card/course-card.html")
55

66
// Create web component
77
function createComponent(html) {
8+
9+
function setContent(cssSelector, content, shadow) {
10+
const selector = shadow.querySelector(cssSelector);
11+
selector.textContent = content;
12+
}
13+
14+
function setLink(cssSelector, url, name, shadow) {
15+
const link = shadow.querySelector(cssSelector);
16+
link.href = url;
17+
link.setAttribute('aria-label', `Learn more about ${name}`);
18+
}
19+
820
// Web component class
921
class CourseCard extends HTMLElement {
1022

@@ -15,7 +27,7 @@ function createComponent(html) {
1527

1628
// Return array of properties to observe
1729
static get observedAttributes() {
18-
return ['name', 'desc', 'level', 'cost', 'badge', 'time', 'link', 'imgsrc'];
30+
return ['name', 'desc', 'imgsrc', 'level', 'cost', 'badge', 'time', 'link', 'livelevel', 'livecost', 'livebadge', 'livetime', 'livelink'];
1931
}
2032

2133
// Called when an attribute is defined or changed
@@ -29,40 +41,44 @@ function createComponent(html) {
2941
// Create shadow root for element
3042
const shadow = this.attachShadow({mode: 'closed'});
3143
shadow.innerHTML = html;
44+
45+
// Set course img
46+
const courseImg = shadow.querySelector('.course-img');
47+
courseImg.src = this.imgsrc;
48+
courseImg.setAttribute('alt', `${this.name} badge`);
3249

3350
// Set course name
34-
const courseName = shadow.querySelector('.course-name');
35-
courseName.textContent = this.name;
36-
51+
setContent('.course-name', this.name, shadow);
3752
// Set course desc
38-
const courseDesc = shadow.querySelector('.course-desc');
39-
courseDesc.textContent = this.desc;
40-
53+
setContent('.course-desc', this.desc, shadow);
4154
// Set course level
42-
const courseLevel = shadow.querySelector('.course-level');
43-
courseLevel.textContent = this.level;
44-
55+
setContent('.course-level', this.level, shadow);
4556
// Set course cost
46-
const courseCost = shadow.querySelector('.course-cost');
47-
courseCost.textContent = this.cost;
48-
57+
setContent('.course-cost', this.cost, shadow);
4958
// Set course badge
50-
const courseBadge = shadow.querySelector('.course-badge');
51-
courseBadge.textContent = this.badge;
52-
59+
setContent('.course-badge', this.badge, shadow);
5360
// Set course time
54-
const courseTime = shadow.querySelector('.course-time');
55-
courseTime.textContent = this.time;
56-
61+
setContent('.course-time', this.time, shadow);
5762
// 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}`);
63+
setLink('.course-link', this.link, this.name, shadow);
6164

62-
// Set course img
63-
const courseImg = shadow.querySelector('.course-img');
64-
courseImg.src = this.imgsrc;
65-
courseImg.setAttribute('alt', `${this.name} badge`);
65+
// Hide live course if not available
66+
if (this.livelevel == undefined) {
67+
const liveCourse = shadow.querySelector('.live-course');
68+
const liveCourseLink = shadow.querySelector('.live-link');
69+
liveCourse.style.display = liveCourseLink.style.display = "none";
70+
} else {
71+
// Set course level
72+
setContent('.live-level', this.livelevel, shadow);
73+
// Set course cost
74+
setContent('.live-cost', this.livecost, shadow);
75+
// Set course badge
76+
setContent('.live-badge', this.livebadge, shadow);
77+
// Set course time
78+
setContent('.live-time', this.livetime, shadow);
79+
// Set course link
80+
setLink('.live-link', this.livelink, this.name, shadow);
81+
}
6682
}
6783
}
6884

0 commit comments

Comments
 (0)