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+
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+
20+ // Web component class
21+ class CourseCard extends HTMLElement {
22+
23+ // Creates element with default values
24+ constructor ( ) {
25+ super ( ) ;
26+ }
27+
28+ // Return array of properties to observe
29+ static get observedAttributes ( ) {
30+ return [ 'name' , 'desc' , 'imgsrc' , 'level' , 'cost' , 'badge' , 'time' , 'link' , 'livelevel' , 'livecost' , 'livebadge' , 'livetime' , 'livelink' ] ;
31+ }
32+
33+ // Called when an attribute is defined or changed
34+ attributeChangedCallback ( property , oldValue , newValue ) {
35+ if ( oldValue === newValue ) return ;
36+ this [ property ] = newValue ;
37+ }
38+
39+ // Invoked when element is added to document
40+ connectedCallback ( ) {
41+ // Create shadow root for element
42+ const shadow = this . attachShadow ( { mode : 'closed' } ) ;
43+ 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` ) ;
49+
50+ // Set course name
51+ setContent ( '.course-name' , this . name , shadow ) ;
52+ // Set course desc
53+ setContent ( '.course-desc' , this . desc , shadow ) ;
54+ // Set course level
55+ setContent ( '.course-level' , this . level , shadow ) ;
56+ // Set course cost
57+ setContent ( '.course-cost' , this . cost , shadow ) ;
58+ // Set course badge
59+ setContent ( '.course-badge' , this . badge , shadow ) ;
60+ // Set course time
61+ setContent ( '.course-time' , this . time , shadow ) ;
62+ // Set course link
63+ setLink ( '.course-link' , this . link , this . name , shadow ) ;
64+
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+ }
82+ }
83+ }
84+
85+ customElements . define ( 'course-card' , CourseCard ) ;
86+ }
0 commit comments