138 lines
5.2 KiB
Svelte
138 lines
5.2 KiB
Svelte
|
|
|
||
|
|
<script lang="ts">
|
||
|
|
|
||
|
|
import RecipeModuleBtn from "$lib/assets/modules/recipe_btn.png";
|
||
|
|
import MachineInspectBtn from "$lib/assets/modules/monitoring_btn.png";
|
||
|
|
import {animate, JSAnimation, remove as removeAnime, stagger} from "animejs";
|
||
|
|
import { goto } from "$app/navigation";
|
||
|
|
import Button from "$lib/components/ui/button/button.svelte";
|
||
|
|
|
||
|
|
import ArrowRight from '@lucide/svelte/icons/arrow-right';
|
||
|
|
import { permission as currentPermissions } from "$lib/core/stores/permissions";
|
||
|
|
import { get } from "svelte/store";
|
||
|
|
|
||
|
|
let recipeModBtn = $state<HTMLElement | null>(null);
|
||
|
|
let monitorModBtn = $state<HTMLElement | null>(null);
|
||
|
|
|
||
|
|
let gotoDashboardBtn = $state<HTMLElement | null>(null);
|
||
|
|
|
||
|
|
let animationPulseGoto: JSAnimation;
|
||
|
|
|
||
|
|
setInterval(() => {
|
||
|
|
if(gotoDashboardBtn && !animationPulseGoto){
|
||
|
|
animationPulseGoto = animate(gotoDashboardBtn, {
|
||
|
|
opacity: [0.8, 1], // Slight pulse in opacity
|
||
|
|
duration: 800, // Duration of one pulse
|
||
|
|
loop: true, // Repeat forever
|
||
|
|
alternate: true,
|
||
|
|
delay: stagger(100),
|
||
|
|
ease: 'inOutQuad',
|
||
|
|
boxShadow: [
|
||
|
|
'0 0 0px 0 none',
|
||
|
|
'0 0 0px 7px lightblue',
|
||
|
|
],
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}, 1000);
|
||
|
|
|
||
|
|
let perms = get(currentPermissions);
|
||
|
|
|
||
|
|
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<div class="flex h-screen items-center justify-center">
|
||
|
|
<div class="columns-md place-content-center gap-8">
|
||
|
|
<h1 class="text-center font-bold text-4xl m-8">Module Selection</h1>
|
||
|
|
|
||
|
|
|
||
|
|
<div class="flex justify-between items-center">
|
||
|
|
<!-- need permission `document` -->
|
||
|
|
{#if perms.filter((x) => x.startsWith("document.read") || x.startsWith("document.write")).length > 0}
|
||
|
|
<button
|
||
|
|
class="button"
|
||
|
|
id="recipe_mod_btn"
|
||
|
|
bind:this={recipeModBtn}
|
||
|
|
onclick={() => goto('/departments')}
|
||
|
|
onmouseenter={() => {
|
||
|
|
if(recipeModBtn){
|
||
|
|
animate(recipeModBtn, {
|
||
|
|
scale: 1.1,
|
||
|
|
duration: 300,
|
||
|
|
ease: "inOutSine"
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}}
|
||
|
|
onmouseleave={() => {
|
||
|
|
if(recipeModBtn){
|
||
|
|
animate(recipeModBtn, {
|
||
|
|
scale: 1.0,
|
||
|
|
duration: 200,
|
||
|
|
ease: "inOutSine"
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}}>
|
||
|
|
<img
|
||
|
|
src={RecipeModuleBtn}
|
||
|
|
alt="Recipes"
|
||
|
|
loading="lazy"
|
||
|
|
/>
|
||
|
|
</button>
|
||
|
|
{/if}
|
||
|
|
|
||
|
|
<!-- need permission `tools` -->
|
||
|
|
{#if perms.filter((x) => x.startsWith("tools")).length > 0}
|
||
|
|
<button
|
||
|
|
class="button"
|
||
|
|
id="monitor_mod_btn"
|
||
|
|
bind:this={monitorModBtn}
|
||
|
|
onclick={() => goto('/tools')}
|
||
|
|
onmouseenter={() => {
|
||
|
|
if(monitorModBtn){
|
||
|
|
animate(monitorModBtn, {
|
||
|
|
scale: 1.1,
|
||
|
|
duration: 300,
|
||
|
|
ease: "inOutSine"
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}}
|
||
|
|
onmouseleave={() => {
|
||
|
|
if(monitorModBtn){
|
||
|
|
animate(monitorModBtn, {
|
||
|
|
scale: 1.0,
|
||
|
|
duration: 200,
|
||
|
|
ease: "inOutSine"
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}}>
|
||
|
|
<img
|
||
|
|
src={MachineInspectBtn}
|
||
|
|
alt="Recipes"
|
||
|
|
loading="lazy"
|
||
|
|
/>
|
||
|
|
</button>
|
||
|
|
{/if}
|
||
|
|
</div>
|
||
|
|
|
||
|
|
{#if perms.filter((x) => x.startsWith("document.read") || x.startsWith("document.write") || x.startsWith("tools")).length == 0}
|
||
|
|
|
||
|
|
<p class="text-center text-2xl m-8">No modules are available.
|
||
|
|
Please check your account with admin.</p>
|
||
|
|
|
||
|
|
{/if}
|
||
|
|
|
||
|
|
<div class="flex justify-center items-center m-16">
|
||
|
|
<button
|
||
|
|
id="goto_dash_btn"
|
||
|
|
class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap text-sm font-medium outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 bg-primary text-primary-foreground shadow-xs hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 rounded-full h-9 px-4 py-2 has-[>svg]:px-3"
|
||
|
|
bind:this={gotoDashboardBtn}
|
||
|
|
onclick={() => goto('/dashboard')}
|
||
|
|
>
|
||
|
|
Go to Dashboard <ArrowRight size={32}/>
|
||
|
|
</button>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
</div>
|
||
|
|
</div>
|