Skip to content

Commit

Permalink
Merge pull request #5 from adrianfish/master
Browse files Browse the repository at this point in the history
More stories
  • Loading branch information
adrianfish authored Jun 9, 2020
2 parents 673a2ce + 11ca6ac commit 945af37
Show file tree
Hide file tree
Showing 10 changed files with 9,981 additions and 53 deletions.
3 changes: 2 additions & 1 deletion .storybook/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module.exports = {
stories: ['../stories/**/*.stories.js'],
addons: [
'@storybook/addon-knobs/register',
'@storybook/addon-actions/register'
'@storybook/addon-actions/register',
'@storybook/addon-cssresources/register'
],
};
9,594 changes: 9,592 additions & 2 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,17 @@
"devDependencies": {
"@babel/core": "^7.10.2",
"@storybook/addon-actions": "^5.3.19",
"@storybook/addon-cssresources": "^5.3.19",
"@storybook/addon-knobs": "^5.3.19",
"@storybook/web-components": "^5.3.19",
"babel-loader": "^8.1.0"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"@lion/dialog": "^0.7.1",
"@lion/tooltip": "file:../lion/packages/tooltip",
"@popperjs/core": "^2.4.0",
"lit-element": "^2.3.1",
"lit-html": "^1.2.1"
}
Expand Down
142 changes: 113 additions & 29 deletions src/sakai-course-card.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { html, css, LitElement } from 'lit-element';
import { dom, library } from '@fortawesome/fontawesome-svg-core';
import { faStar, faEllipsisV, faBell, faComments } from '@fortawesome/free-solid-svg-icons';
import './sakai-icon.js';
import './sakai-options-menu.js';

export class SakaiCourseCard extends LitElement {

Expand All @@ -11,62 +11,146 @@ export class SakaiCourseCard extends LitElement {
display: block;
width: var(--sakai-course-card-width, 240px);
}
.sakai-icon { width: var(--sakai-icon-width, 24px); height: var(--sakai-icon-height), 24px) }
.sakai-disclose-icon { height: var(--sakai-disclose-icon-width, 14px) }
.sakai-tool-alert-icon { color: green; width: var(--sakai-icon-width, 14px); height: var(--sakai-icon-height), 14px) }
.course-block { border: black 1px solid; border-bottom: 0; border-radius: 5px 5px 0px 0px; padding: 5px; background-color: lightgray; }
body {
}
.course-block {
border: 1px solid;
border-color: var(--sakai-course-card-border-color, red);
border-bottom: 0;
border-radius: var(--sakai-course-card-border-radius, 4px) var(--sakai-course-card-border-radius, 4px) 0px 0px;
padding: var(--sakai-course-card-padding, 13px);
background-color: var(--sakai-course-card-background-color, darkgray);
}
.top-bar { display: flex; justify-content: space-between;}
.title-block { flex: 2 }
.title-block span { margin-left: 8px; font-size: var(--sakai-course-card-title-font-size, 20px) }
.title-block {
flex: 2;
color: var(--sakai-course-card-title-color, white);
font-family: var(--sakai-course-card-font-family, arial);
}
.title-block span {
margin-left: 8px;
font-size: var(--sakai-course-card-title-font-size, 18px);
}
.code-block {
color: var(--sakai-course-card-code-color, white);
font-size: var(--sakai-course-card-code-font-size, 14px);
font-family: var(--sakai-course-card-font-family, arial);
}
.disclose-block { flex: 1; text-align: right; }
.tool-alerts-block { align-items: center; justify-content: left; display: flex; height: 30px; border: black 1px solid; border-radius: 0px 0px 5px 5px; border-top: 0; }
.tool-alerts-block {
display: flex;
align-items: center;
justify-content: left;
height: var(--sakai-course-card-tool-alerts-height, 40px);
padding: var(--sakai-course-card-tool-alerts-padding, 5px);
border: 1px solid;
border-color: var(--sakai-course-card-border-color, red);
border-radius: 0px 0px var(--sakai-course-card-border-radius, 4px) var(--sakai-course-card-border-radius, 4px);
border-top: 0;
background-color: var(--sakai-course-card-tool-alerts-background-color, white);
color: var(--sakai-course-card-tool-alerts-color, black);
}
sakai-icon { margin: 0 5px 0 5px; }
.tool-alerts-block div { flex: 0; margin-left: 5px; margin-right: 5px; }
.favourite { color: var(--sakai-icon-favourite-color, yellow) }
#arrow, #arrow::before {
position: absolute;
width: 10px;
height: 10px;
z-index: -1;
margin-top: 1px;
}
#arrow::before {
content: '';
transform: rotate(45deg);
background: white;
}
#tooltip[data-popper-placement^='top'] > #arrow {
bottom: -4px;
}
#tooltip[data-popper-placement^='bottom'] > #arrow {
top: -4px;
}
#tooltip[data-popper-placement^='left'] > #arrow {
right: -4px;
}
#tooltip[data-popper-placement^='right'] > #arrow {
left: -4px;
}
`;
}

static get properties() {

return {
title: String,
code: String,
courseTitle: { attribute: "course-title", type: String },
courseCode: { attribute: "course-code", type: String },
alerts: { type: Array },
};
}

constructor() {

super();
library.add(faEllipsisV);
library.add(faStar);
library.add(faBell);
library.add(faComments);
dom.watch({
autoReplaceSvgRoot: this.shadowRoot,
observeMutationsRoot: this.shadowRoot
});
this.title = 'Course Title';
this.code = 'Course Code';

this.courseTitle = 'Course Title';
this.courseCode = 'Course Code';
this.alerts = ["assignments", "gradebook"];

this.toolnameMap = {
'assignments': 'Assignments',
'gradebook': 'Gradebook',
'forums': 'Forums',
};
}

__showOptions(e) {
console.log('__showOptions');
_toolClicked(e) {

e.stopPropagation();
if (e.target.checked) {
if (!this.alerts.includes(e.target.value)) {
this.alerts.push(e.target.value);
this.alerts = [ ...this.alerts ];
}
} else {
if (this.alerts.includes(e.target.value)) {
this.alerts.splice(this.alerts.indexOf(e.target.value), 1);
this.alerts = [ ...this.alerts ];
}
}

return false;
}

render() {
//<div id="arrow" data-popper-arrow></div>

return html`
<div class="course-block">
<div class="top-bar">
<div class="title-block">
<i class="fas fa-star sakai-icon"></i>
<span>${this.title}</span>
<sakai-icon class="favourite" type="favourite" size="small"></sakai-icon>
<span>${this.courseTitle}</span>
</div>
<div class="disclose-block"><a href="javascript:;" @click=${this.__showOptions}><i class="fas fa-ellipsis-v sakai-disclose-icon"></i></a></div>
<sakai-options-menu>
<div slot="content" id="tooltip">
<div>Select tools to display:</div>
${Object.keys(this.toolnameMap).map(k => html`
<div><input type="checkbox" value="${k}" .checked=${this.alerts.includes(k)} @click=${this._toolClicked} />${this.toolnameMap[k]}</div>
`)}
</div>
</sakai-options-menu>
</div>
<div class="code-block">${this.code}</div>
<div class="code-block">${this.courseCode}</div>
</div>
<div class="tool-alerts-block">
<div><i class="fas fa-bell sakai-tool-alert-icon"></i></div>
<div><i class="fas fa-comments sakai-tool-alert-icon"></i></div>
${this.alerts.map(a => html`<div><sakai-icon type="${a}" size="small" /></div>`)}
</div>
`;
}
Expand Down
65 changes: 65 additions & 0 deletions src/sakai-icon.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { html, css, LitElement } from 'lit-element';
import { icon, library } from '@fortawesome/fontawesome-svg-core';
import { faStar, faEllipsisV, faBell, faComments, faBook, faFileAlt } from '@fortawesome/free-solid-svg-icons';

export class SakaiIcon extends LitElement {

static get styles() {

return css`
.sakai-small-icon { width: var(--sakai-small-icon-width, 14px); height: var(--sakai-small-icon-height, 15px) }
.sakai-medium-icon { width: var(--sakai-medium-icon-width, 24px); height: var(--sakai-medium-icon-height, 24px) }
.sakai-large-icon { width: var(--sakai-large-icon-width, 32px); height: var(--sakai-large-icon-height, 32px) }
.alert {
background-color: var(--sakai-icon-alert-color, red);
width: var(--sakai-icon-alert-width, 4px);
height: var(--sakai-icon-alert-width, 4px);
position: absolute;
margin-top: -18px;
margin-left: 15px;
-webkit-border-radius: calc(var(--sakai-icon-alert-width, 4px) / 2);
-moz-border-radius: calc(var(--sakai-icon-alert-width, 4px) / 2);
border-radius: calc(var(--sakai-icon-alert-width, 4px) / 2);
}
`;
}

static get properties() {

return {
hasAlerts: { attribute: "has-alerts", type: Boolean },
type: String,
size: String,
};
}

constructor() {

super();
this.size = "medium";
}

render() {
return html`${icon(SakaiIcon.lookups.get(this.type), {classes: `sakai-${this.size}-icon`}).node}${this.hasAlerts ? html`<div class="alert"></div>` : ""}`;
}
}

library.add(faEllipsisV); // Menu
library.add(faStar); // Favourite
library.add(faBell); // General alerts
library.add(faComments); // Forums
library.add(faBook); // Gradebook
library.add(faFileAlt); // Assignments

SakaiIcon.lookups = new Map();
SakaiIcon.lookups.set("favourite", faStar);
SakaiIcon.lookups.set("alert", faBell);
SakaiIcon.lookups.set("menu", faEllipsisV);
SakaiIcon.lookups.set("forums", faComments);
SakaiIcon.lookups.set("gradebook", faBook);
SakaiIcon.lookups.set("assignments", faFileAlt);

if (!customElements.get("sakai-icon")) {
customElements.define("sakai-icon", SakaiIcon);
}
88 changes: 88 additions & 0 deletions src/sakai-options-menu.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { html, css, LitElement } from "lit-element";
import { createPopper } from "@popperjs/core";
import './sakai-icon.js';

export class SakaiOptionsMenu extends LitElement {

static get styles() {

return css`
::slotted(div) {
display: none;
background-color: var(--sakai-options-menu-background-color, white);
border-width: var(--sakai-options-menu-border-width, 1px);
border-style: var(--sakai-options-menu-border-style, solid);
border-color: var(--sakai-options-menu-border-color, black);
font-family: var(--sakai-options-menu-font-family, arial, sans-serif);
padding: 5px;
}
#invoker {
color: var(--sakai-options-menu-invoker-color, white);
font-size: var(--sakai-options-menu-invoker-size, 24px);
}
`;
}

static get properties() {

return {
placement: String,
};
}


constructor() {

super();
this.placement = "right";
}

firstUpdated(changed) {

this.content = this.shadowRoot.querySelector('slot[name="content"]').assignedNodes()[0];
this.content.addEventListener("keydown", (e) => this._handleEscape(e));

this.invoker = this.shadowRoot.querySelector("#invoker");
this.invoker.addEventListener("keydown", (e) => this._handleEscape(e));

createPopper(this.invoker, this.content,
{
placement: this.placement,
modifiers: [
{ name: 'offset', options: { offset: [0, 8] }},
]
}
);
}

_handleEscape(e) {

if (this.showing && e.key === "Escape") {
this.content.style.display = "none";
this.showing = false;
this.invoker.focus();
}
}

_toggle() {

if (this.showing) {
this.content.style.display = "none";
} else {
this.content.style.display = "block";
}
this.showing = !this.showing;
}

render() {

return html`
<a id="invoker" href="javascript:;" @click=${this._toggle}><sakai-icon type="menu" size="small" /></a>
<slot name="content"></slot>
`;
}
}

if (!customElements.get("sakai-options-menu")) {
customElements.define("sakai-options-menu", SakaiOptionsMenu);
}
21 changes: 0 additions & 21 deletions stories/index.stories.js

This file was deleted.

Loading

0 comments on commit 945af37

Please sign in to comment.