Apps feature

This commit is contained in:
rotimi_best
2021-05-29 20:47:46 +03:00
parent 8b4cf30465
commit 674e9c59b8
17 changed files with 319 additions and 64 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
"description": "unidiscuss", "description": "unidiscuss",
"version": "0.0.1", "version": "0.0.1",
"scripts": { "scripts": {
"dev": "nvm use 11.0.0 && sapper dev", "dev": "sapper dev",
"build": "sapper build --legacy", "build": "sapper build --legacy",
"export": "sapper export --legacy", "export": "sapper export --legacy",
"start": "node __sapper__/build" "start": "node __sapper__/build"
@@ -0,0 +1,12 @@
<script>
import PageNav from "../../../PageNav/index.svelte";
import CloseButton from "../../../Buttons/Close/index.svelte";
export let handleClose;
</script>
<PageNav title="LiveChat" overidableStyle="padding: 0 10px">
<div slot="widget">
<CloseButton onClick={handleClose} />
</div>
</PageNav>
@@ -0,0 +1,12 @@
<script>
import PageNav from "../../../PageNav/index.svelte";
import CloseButton from "../../../Buttons/Close/index.svelte";
export let handleClose;
</script>
<PageNav title="Note" overidableStyle="padding: 0 10px">
<div slot="widget">
<CloseButton onClick={handleClose} />
</div>
</PageNav>
@@ -0,0 +1,12 @@
<script>
import PageNav from "../../../PageNav/index.svelte";
import CloseButton from "../../../Buttons/Close/index.svelte";
export let handleClose;
</script>
<PageNav title="Poll" overidableStyle="padding: 0 10px">
<div slot="widget">
<CloseButton onClick={handleClose} />
</div>
</PageNav>
@@ -0,0 +1,12 @@
<script>
import PageNav from "../../../PageNav/index.svelte";
import CloseButton from "../../../Buttons/Close/index.svelte";
export let handleClose;
</script>
<PageNav title="Q/A" overidableStyle="padding: 0 10px">
<div slot="widget">
<CloseButton onClick={handleClose} />
</div>
</PageNav>
+8
View File
@@ -0,0 +1,8 @@
export default {
APPS: {
QANDA: 'QANDA',
NOTES: 'NOTES',
LIVE_CHAT: 'LIVE_CHAT',
POLL: 'POLL',
},
};
+95 -4
View File
@@ -1,12 +1,103 @@
<script> <script>
let expanded = false; import Forum24 from "carbon-icons-svelte/lib/Forum24";
import AlignBoxTopLeft24 from "carbon-icons-svelte/lib/AlignBoxTopLeft24";
import SendAlt24 from "carbon-icons-svelte/lib/SendAlt24";
import ChartPie24 from "carbon-icons-svelte/lib/ChartPie24";
import IconButton from "../IconButton/index.svelte";
import QandA from "./components/QandA/index.svelte";
import LiveChat from "./components/LiveChat/index.svelte";
import Notes from "./components/Notes/index.svelte";
import Poll from "./components/Poll/index.svelte";
import APPS_CONSTANTS from "./constants";
let selectedApp;
function handleClose() {
selectedApp = null;
}
function handleAppClick(appName) {
if (appName === selectedApp) {
handleClose();
} else {
selectedApp = appName;
}
}
</script> </script>
<style> <style lang="scss">
.root { .root {
border-right: 1px solid var(--border-color); height: 95vh;
position: sticky;
top: 0;
border-left: 1px solid var(--border-color); border-left: 1px solid var(--border-color);
display: flex;
flex-direction: row;
& .apps {
padding-top: 20px;
display: flex;
flex-direction: column;
align-items: center;
width: 60px;
border-right: 1px solid var(--border-color);
height: 100%;
}
& .app {
width: 300px;
transition: all 1s ease-out;
}
} }
</style> </style>
<div class="root" /> <div class="root">
<div class="apps">
<IconButton
title="Live Chat"
value={APPS_CONSTANTS.APPS.LIVE_CHAT}
onClick={handleAppClick}
selected={APPS_CONSTANTS.APPS.LIVE_CHAT === selectedApp}>
<SendAlt24 class="carbon-icon" />
</IconButton>
<IconButton
title="QandA"
value={APPS_CONSTANTS.APPS.QANDA}
onClick={handleAppClick}
selected={APPS_CONSTANTS.APPS.QANDA === selectedApp}>
<Forum24 class="carbon-icon" />
</IconButton>
<IconButton
title="Notes"
value={APPS_CONSTANTS.APPS.NOTES}
onClick={handleAppClick}
selected={APPS_CONSTANTS.APPS.NOTES === selectedApp}>
<AlignBoxTopLeft24 class="carbon-icon" />
</IconButton>
<IconButton
title="Poll"
value={APPS_CONSTANTS.APPS.POLL}
onClick={handleAppClick}
selected={APPS_CONSTANTS.APPS.POLL === selectedApp}>
<ChartPie24 class="carbon-icon" />
</IconButton>
</div>
{#if !!selectedApp}
<div class="app">
{#if selectedApp === APPS_CONSTANTS.APPS.QANDA}
<QandA {handleClose} />
{:else if selectedApp === APPS_CONSTANTS.APPS.LIVE_CHAT}
<LiveChat {handleClose} />
{:else if selectedApp === APPS_CONSTANTS.APPS.POLL}
<Poll {handleClose} />
{:else if selectedApp === APPS_CONSTANTS.APPS.NOTES}
<Notes {handleClose} />
{/if}
</div>
{/if}
</div>
+10
View File
@@ -0,0 +1,10 @@
<script>
import Close24 from "carbon-icons-svelte/lib/Close24";
import IconButton from "../../IconButton/index.svelte";
export let onClick;
</script>
<IconButton {onClick} title="Close">
<Close24 class="carbon-icon" title="Close" />
</IconButton>
@@ -0,0 +1,10 @@
<script>
import Close24 from "carbon-icons-svelte/lib/Close24";
import IconButton from "../../../IconButton/index.svelte";
export let onClick;
</script>
<IconButton {onClick}>
<Close24 class="carbon-icon" title="Close" />
</IconButton>
+46 -3
View File
@@ -1,6 +1,49 @@
<style> <script>
import ToolTip from "../ToolTip/index.svelte";
export let onClick;
export let disabled = false;
export let selected = false;
export let value;
export let title;
function handleClick() {
onClick(value);
}
</script>
<style lang="scss">
.root {
flex: 0 0 auto;
color: rgba(0, 0, 0, 0.54);
padding: 12px;
font-size: 1.5rem;
text-align: center;
transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
border-radius: 50%;
border: 0;
cursor: pointer;
margin: 0;
display: flex;
outline: 0;
align-items: center;
justify-content: center;
text-decoration: none;
-webkit-appearance: none;
-webkit-tap-highlight-color: transparent;
width: fit-content;
&:hover {
background-color: rgba(0, 0, 0, 0.04);
}
}
</style> </style>
<button class="hover:grey-500"> <ToolTip title={title}>
<button
class={`root ${selected && 'active'}`}
{disabled}
on:click={handleClick}>
<slot /> <slot />
</button> </button>
</ToolTip>
+1 -9
View File
@@ -3,7 +3,7 @@
import SendAlt32 from "carbon-icons-svelte/lib/SendAlt32"; import SendAlt32 from "carbon-icons-svelte/lib/SendAlt32";
import Catalog32 from "carbon-icons-svelte/lib/Catalog32"; import Catalog32 from "carbon-icons-svelte/lib/Catalog32";
import UserAvatar32 from "carbon-icons-svelte/lib/UserAvatar32"; import UserAvatar32 from "carbon-icons-svelte/lib/UserAvatar32";
import Calendar32 from "carbon-icons-svelte/lib/Calendar32"; // import Calendar32 from "carbon-icons-svelte/lib/Calendar32";
export let segment; export let segment;
let navClass = ""; let navClass = "";
@@ -47,14 +47,6 @@
flex-direction: column; flex-direction: column;
} }
:global(svg.carbon-icon) {
margin-right: 10px;
}
[aria-current] :global(svg.carbon-icon) {
fill: var(--main-primary-color);
}
[aria-current] { [aria-current] {
color: var(--main-primary-color); color: var(--main-primary-color);
} }
+22 -22
View File
@@ -1,6 +1,7 @@
<script> <script>
import NewButton from "../PrimaryContainedButton/index.svelte"; import NewButton from "../PrimaryContainedButton/index.svelte";
export let title = ""; export let title = "";
export let overidableStyle = "";
export let navItems = []; export let navItems = [];
export let addButtonHref; export let addButtonHref;
export let addButtonLabel; export let addButtonLabel;
@@ -11,28 +12,6 @@
Array.isArray(navItems) && navItems.length > 4 ? "bring-down" : ""; Array.isArray(navItems) && navItems.length > 4 ? "bring-down" : "";
</script> </script>
<div
class="header flex items-center justify-between mb-2 {!disableSticky &&
'sticky'} {dynamicRootClass}"
>
{#if !!title}
<h4 class="title">{title}</h4>
{/if}
{#if Array.isArray(navItems) && navItems.length}
<div class="flex justify-evenly items-center">
{#each navItems as item}
<a class="mr-5 text-sm {item.isActive && 'active'}" href={item.href}>
{item.label}
</a>
{/each}
{#if addButtonHref}
<NewButton href={addButtonHref} label={addButtonLabel} />
{/if}
</div>
{/if}
<slot name="widget" />
</div>
<style> <style>
.header { .header {
border-bottom: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);
@@ -87,3 +66,24 @@
} }
} }
</style> </style>
<div
class="header flex items-center justify-between mb-2 {!disableSticky && 'sticky'} {dynamicRootClass}"
style={overidableStyle}>
{#if !!title}
<h4 class="title">{title}</h4>
{/if}
{#if Array.isArray(navItems) && navItems.length}
<div class="flex justify-evenly items-center">
{#each navItems as item}
<a class="mr-5 text-sm {item.isActive && 'active'}" href={item.href}>
{item.label}
</a>
{/each}
{#if addButtonHref}
<NewButton href={addButtonHref} label={addButtonLabel} />
{/if}
</div>
{/if}
<slot name="widget" />
</div>
@@ -0,0 +1 @@
<div />
+5
View File
@@ -31,4 +31,9 @@
code { code {
white-space: pre-wrap; white-space: pre-wrap;
} }
[aria-current] :global(svg.carbon-icon),
button.active :global(svg.carbon-icon) {
fill: var(--main-primary-color);
}
</style> </style>
+44
View File
@@ -0,0 +1,44 @@
<script>
export let title;
</script>
<style>
.tooltip {
position: relative;
display: inline-block;
}
.tooltip .tooltiptext {
color: #fff;
padding: 4px 8px;
font-size: 0.625rem;
max-width: 300px;
word-wrap: break-word;
font-family: "Roboto", "Helvetica", "Arial", sans-serif;
font-weight: 500;
line-height: 1.4em;
border-radius: 4px;
background-color: rgba(97, 97, 97, 0.9);
visibility: hidden;
text-align: center;
/* Position the tooltip */
position: absolute;
z-index: 1;
top: 100%;
left: 0;
}
.tooltip:hover .tooltiptext {
visibility: visible;
}
</style>
{#if !!title}
<div class="tooltip">
<span class="tooltiptext">{title}</span>
<slot />
</div>
{:else}
<slot />
{/if}
+26 -23
View File
@@ -15,6 +15,7 @@
import Scoreboard from "../../components/Course/components/Scoreboard.svelte"; import Scoreboard from "../../components/Course/components/Scoreboard.svelte";
import TimeTable from "../../components/Course/components/TimeTable.svelte"; import TimeTable from "../../components/Course/components/TimeTable.svelte";
import CourseNav from "../../components/Course/components/CourseNav.svelte"; import CourseNav from "../../components/Course/components/CourseNav.svelte";
import Apps from "../../components/Apps/index.svelte";
// export let slug; // export let slug;
export let courseNavItem; export let courseNavItem;
@@ -28,29 +29,6 @@
$: mode = $page.query.mode; $: mode = $page.query.mode;
</script> </script>
<svelte:head>
<title>ReactJS</title>
</svelte:head>
<div class="root">
<CourseNav />
<div class="rightBar">
{#if !courseNavItem}
<Overview />
{:else if courseNavItem === "score"}
<Scoreboard />
{:else if courseNavItem === "timetable"}
<TimeTable />
{:else if courseNavItem === "hometasks"}
<HomeTask />
{:else if courseNavItem === "lecture"}
<Lecture path={$page.path} {tab} {mode} />
{:else if courseNavItem === "people"}
<People />
{/if}
</div>
</div>
<style> <style>
.root { .root {
display: flex; display: flex;
@@ -62,3 +40,28 @@
width: 80%; width: 80%;
} }
</style> </style>
<svelte:head>
<title>ReactJS</title>
</svelte:head>
<div class="root">
<CourseNav />
<div class="rightBar">
{#if !courseNavItem}
<Overview />
{:else if courseNavItem === 'score'}
<Scoreboard />
{:else if courseNavItem === 'timetable'}
<TimeTable />
{:else if courseNavItem === 'hometasks'}
<HomeTask />
{:else if courseNavItem === 'lecture'}
<Lecture path={$page.path} {tab} {mode} />
{:else if courseNavItem === 'people'}
<People />
{/if}
</div>
<Apps />
</div>