Files
DistrictCentral/imports/ui/App.svelte

243 lines
6.0 KiB
Svelte
Raw Normal View History

<script>
import {Meteor} from "meteor/meteor";
import {Route, router} from 'tinro';
import {onMount} from 'svelte';
import {useTracker} from 'meteor/rdb:svelte-meteor-data';
import {Roles} from 'meteor/alanning:roles';
import Chromebooks from './Chromebooks.svelte';
import Users from './Users.svelte';
import TestTable from './TestTable.svelte';
import ListUsers from './ListUsers.svelte';
import Admin from './Admin.svelte';
import Announcer from './Announcer.svelte';
import {BlazeTemplate} from 'meteor/svelte:blaze-integration';
import ServiceConfiguration from "meteor/service-configuration";
// When the URL changes, run the code... in this case to scroll to the top.
router.subscribe(_ => window.scrollTo(0, 0));
// onMount(async () => {
// // Meteor.subscribe('records');
// });
// $: incompleteCount = useTracker(() => Tasks.find({checked: {$ne: true}}).count());
$: currentUser = useTracker(() => Meteor.user());
$: canManageLaptops = false;
$: isAdmin = false;
Tracker.autorun(() => {
// For some reason currentUser is always null here, and is not reactive (user changes and this does not get re-called).
let user = Meteor.user();
canManageLaptops = user && Roles.userIsInRole(user._id, 'laptop-management', 'global');
isAdmin = user && Roles.userIsInRole(user._id, 'admin', 'global');
});
// const taskStore = Tasks.find({}, {sort: {createdAt: -1}});
// $: {
// tasks = $taskStore;
// if (hideCompleted) {
// tasks = tasks.filter(task => !task.checked);
// }
// }
// function handleSubmit(event) {
// Meteor.call("tasks.insert", newTask);
// // Clear form
// newTask = "";
// }
function performLogin() {
//Login style can be "popup" or "redirect". I am not sure we need to request and offline token.
Meteor.loginWithGoogle({loginStyle: "popup", requestOfflineToken: true}, (err) => {
if (err) {
console.log(err);
} else {
//console.log("Logged in");
}
})
}
function performLogout() {
Meteor.logout();
}
</script>
<Announcer/>
<div class="container">
<header class="row">
<div class="col-12 logoContainer">
<img class="logo" src="/images/logo.svg"/>
<div class="login">
{#if !$currentUser}
<button type="button" role="button" on:click={performLogin}>Login</button>
{:else}
<button type="button" role="button" on:click={performLogout}>Logout</button>
{/if}
</div>
</div>
<div class="col-12 center" style="margin-bottom: 0"><h1 style="margin-bottom: 0">District Central</h1></div>
<div class="col-12 center">
<div class="nav-separator"></div>
</div>
<nav class="col-12 center">
<a href="/">Home</a>
{#if canManageLaptops}
<a href="/chromebooks">Chromebooks</a>
{/if}
{#if canManageLaptops}
<a href="/users">Users</a>
{/if}
{#if isAdmin}
<a href="/admin">Admin</a>
{/if}
<!-- <a href="/TestTable">Test</a>-->
<!-- <a href="/ListUsers">List Users</a>-->
</nav>
</header>
</div>
<Route path="/">
<div class="container">
<div class="row">
TODO: Some statistics and such.
</div>
</div>
</Route>
<Route path="/ListUsers">
<!-- <ListUsers/>-->
</Route>
<Route path="/admin">
{#if isAdmin}
<Admin/>
{/if}
</Route>
<Route path="/TestTable/*">
<!-- <TestTable/>-->
</Route>
<Route path="/chromebooks/*">
{#if canManageLaptops}
<Chromebooks/>
{:else}
<!-- User not authorized to use this UI. Don't render anything because it is likely the user is still loading and will have access in a moment. -->
{/if}
</Route>
<Route path="/users/*">
{#if isAdmin}
<Users/>
{:else}
<!-- User not authorized to use this UI. Don't render anything because it is likely the user is still loading and will have access in a moment. -->
{/if}
</Route>
<style>
@font-face {
font-family: 'KaushanScript-Regular';
font-style: normal;
font-weight: 400;
src: url('/fonts/KaushanScript-Regular.ttf') format('truetype');
}
.nav-separator {
height: 0.2rem;
width: 40%;
margin-left: 30%;
background-color: white;
}
nav {
font-size: 1.4rem;
}
nav a {
display: inline-block;
color: #a6a6ea;
text-decoration: none;
}
nav a:hover {
color: #6363ee;
text-decoration: underline;
}
nav a + a {
margin-left: 2rem;
}
html {
background-color: #000121;
font-family: 'Roboto', sans-serif;
}
header {
background: #2c031c;
color: white;
/*background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%);*/
padding: 20px 15px 15px 15px;
position: relative;
}
h1 {
color: white;
font-family: "KaushanScript-Regular", sans-serif;
font-size: 4rem;
}
.logo {
position: absolute;
left: 0;
top: 0;
width: 8rem;
}
.logoContainer {
height: 0;
position: relative;
}
.login {
position: absolute;
right: 0;
top: 0;
}
.login button {
background: #7171ec;
border-radius: 999px;
box-shadow: #5E5DF0 0 10px 20px -10px;
box-sizing: border-box;
color: #FFFFFF;
cursor: pointer;
font-family: Inter, Helvetica, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Noto Color Emoji", "Segoe UI Symbol", "Android Emoji", EmojiSymbols, -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", sans-serif;
font-weight: 700;
line-height: 24px;
opacity: 1;
outline: 0 solid transparent;
padding: 8px 18px;
user-select: none;
-webkit-user-select: none;
touch-action: manipulation;
width: fit-content;
word-break: break-word;
border: 0;
}
@media (max-width: 600px) {
.logo {
position: absolute;
left: 0;
right: 0;
top: 0;
margin: 0 auto;
width: 8rem;
}
.logoContainer {
height: 6rem;
}
}
</style>