Many many changes
This commit is contained in:
parent
2a080ffc31
commit
4dd4c22db6
@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Vite + Svelte</title>
|
<title>Budgetly</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
@ -1,28 +1,36 @@
|
|||||||
<script>
|
<script>
|
||||||
import Router from 'svelte-spa-router';
|
import Router from 'svelte-spa-router';
|
||||||
|
import { replace } from 'svelte-spa-router';
|
||||||
|
|
||||||
|
import { isAuthed } from './store';
|
||||||
|
|
||||||
import Nav from './lib/Nav.svelte';
|
|
||||||
import Home from './routes/Home.svelte';
|
import Home from './routes/Home.svelte';
|
||||||
import NotFound from './routes/NotFound.svelte';
|
import NotFound from './routes/NotFound.svelte';
|
||||||
import Budgets from './routes/Budgets.svelte';
|
import Budgets from './routes/Budgets.svelte';
|
||||||
import Settings from './routes/Settings.svelte';
|
import Settings from './routes/Settings.svelte';
|
||||||
import Timeline from './routes/Timeline.svelte'
|
import Timeline from './routes/Timeline.svelte'
|
||||||
|
import Login from './routes/Login.svelte';
|
||||||
|
import Logout from './routes/Logout.svelte';
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
const routes = {
|
const routes = {
|
||||||
'/': Home,
|
'/': Home,
|
||||||
'/timeline': Timeline,
|
'/timeline': Timeline,
|
||||||
"/budgets": Budgets,
|
"/budgets": Budgets,
|
||||||
'/settings': Settings,
|
'/settings': Settings,
|
||||||
|
'/login': Login,
|
||||||
|
'/logout': Logout,
|
||||||
'*': NotFound,
|
'*': NotFound,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onMount(()=> {
|
||||||
|
console.log($isAuthed)
|
||||||
|
if(!$isAuthed){
|
||||||
|
replace('/login')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<Router {routes}/>
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<Nav/>
|
|
||||||
<main class="responsive">
|
|
||||||
<Router {routes}/>
|
|
||||||
</main>
|
|
||||||
|
78
src/fakeData.js
Normal file
78
src/fakeData.js
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
export const FAKE_BUDGET_ITEMS = [
|
||||||
|
{
|
||||||
|
"key":"Eating Out",
|
||||||
|
"amount":200,
|
||||||
|
"currencyFormat": "usd",
|
||||||
|
"isEnabled": true,
|
||||||
|
"entries":[
|
||||||
|
{
|
||||||
|
"name": "Test Entry",
|
||||||
|
"amount": 20,
|
||||||
|
"description": "Extra info if wanted",
|
||||||
|
"date": 1665610094149
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Test Entry 2",
|
||||||
|
"amount": 12.38,
|
||||||
|
"description": "Some other thing",
|
||||||
|
"date": 1665610095000
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"Gasoline",
|
||||||
|
"amount":400,
|
||||||
|
"currencyFormat": "usd",
|
||||||
|
"isEnabled": true,
|
||||||
|
"entries":[
|
||||||
|
{
|
||||||
|
"name": "Fill up",
|
||||||
|
"amount": 50,
|
||||||
|
"description": "",
|
||||||
|
"date": 1665610094149
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"Third Item",
|
||||||
|
"amount":10,
|
||||||
|
"currencyFormat": "usd",
|
||||||
|
"isEnabled": true,
|
||||||
|
"entries":[
|
||||||
|
{
|
||||||
|
"name": "OVERSPEND",
|
||||||
|
"amount": 500,
|
||||||
|
"description": "",
|
||||||
|
"date": 1665610094149
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"Third Item",
|
||||||
|
"amount":10,
|
||||||
|
"currencyFormat": "usd",
|
||||||
|
"isEnabled": true,
|
||||||
|
"entries":[
|
||||||
|
{
|
||||||
|
"name": "OVERSPEND",
|
||||||
|
"amount": 500,
|
||||||
|
"description": "",
|
||||||
|
"date": 1665610094149
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"Third Item",
|
||||||
|
"amount":10,
|
||||||
|
"currencyFormat": "usd",
|
||||||
|
"isEnabled": true,
|
||||||
|
"entries":[
|
||||||
|
{
|
||||||
|
"name": "OVERSPEND",
|
||||||
|
"amount": 500,
|
||||||
|
"description": "",
|
||||||
|
"date": 1665610094149
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
8
src/layouts/BaseLayout.svelte
Normal file
8
src/layouts/BaseLayout.svelte
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<script>
|
||||||
|
import Nav from '../lib/Nav.svelte';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Nav/>
|
||||||
|
<main class="responsive">
|
||||||
|
<slot></slot>
|
||||||
|
</main>
|
4
src/layouts/NoNavLayout.svelte
Normal file
4
src/layouts/NoNavLayout.svelte
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<main class="responsive max">
|
||||||
|
<slot />
|
||||||
|
</main>
|
||||||
|
|
@ -2,11 +2,12 @@
|
|||||||
import {link} from 'svelte-spa-router'
|
import {link} from 'svelte-spa-router'
|
||||||
import { activeNav } from '../store';
|
import { activeNav } from '../store';
|
||||||
|
|
||||||
let activeitem = 0;
|
let activeitem = $activeNav;
|
||||||
activeNav.subscribe(value => {
|
|
||||||
activeitem = value;
|
function updateActiveItem(num){
|
||||||
console.log(activeitem)
|
activeNav.set(num)
|
||||||
})
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@ -19,23 +20,21 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<nav class="m l left">
|
<nav class="m l left">
|
||||||
<!-- svelte-ignore a11y-missing-attribute -->
|
|
||||||
<a>
|
<img class="circle" src="/vite.svg" alt="Favicon">
|
||||||
<img class="circle" src="/favicon.png" alt="Favicon">
|
<a href="/" class:active="{activeitem === 0}" on:click={()=>updateActiveItem(0)} use:link>
|
||||||
</a>
|
|
||||||
<a href="/" class:active="{activeitem === 0}" on:click={()=>activeitem = 0} use:link>
|
|
||||||
<i>home</i>
|
<i>home</i>
|
||||||
<span>Home</span>
|
<span>Home</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="/budgets" class:active="{activeitem === 1}" on:click={()=>activeitem = 1} use:link>
|
<a href="/budgets" class:active="{activeitem === 1}" on:click={()=>updateActiveItem(1)} use:link>
|
||||||
<i>payments</i>
|
<i>payments</i>
|
||||||
<span>Budgets</span>
|
<span>Budgets</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="/timeline" class:active="{activeitem === 2}" on:click={()=>activeitem = 2} use:link>
|
<a href="/timeline" class:active="{activeitem === 2}" on:click={()=>updateActiveItem(2)} use:link>
|
||||||
<i>timeline</i>
|
<i>timeline</i>
|
||||||
<span>Spending</span>
|
<span>Spending</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="/settings" class:active="{activeitem === 3}" on:click={()=>activeitem = 3} use:link>
|
<a href="/settings" class:active="{activeitem === 3}" on:click={()=>updateActiveItem(3)} use:link>
|
||||||
<i>settings</i>
|
<i>settings</i>
|
||||||
<span>Settings</span>
|
<span>Settings</span>
|
||||||
</a>
|
</a>
|
||||||
@ -50,19 +49,19 @@
|
|||||||
|
|
||||||
<nav class="s bottom">
|
<nav class="s bottom">
|
||||||
|
|
||||||
<a href="/" class:active="{activeitem === 0}" on:click={()=>activeitem = 0} use:link>
|
<a href="/" class:active="{activeitem === 0}" on:click={()=>updateActiveItem(0)} use:link>
|
||||||
<i>home</i>
|
<i>home</i>
|
||||||
<span>Home</span>
|
<span>Home</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="/budgets" class:active="{activeitem === 1}" on:click={()=>activeitem = 1} use:link>
|
<a href="/budgets" class:active="{activeitem === 1}" on:click={()=>updateActiveItem(1)} use:link>
|
||||||
<i>payments</i>
|
<i>payments</i>
|
||||||
<span>Budgets</span>
|
<span>Budgets</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="/timeline" class:active="{activeitem === 2}" on:click={()=>activeitem = 2} use:link>
|
<a href="/timeline" class:active="{activeitem === 2}" on:click={()=>updateActiveItem(2)} use:link>
|
||||||
<i>timeline</i>
|
<i>timeline</i>
|
||||||
<span>Spending</span>
|
<span>Spending</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="/settings" class:active="{activeitem === 3}" on:click={()=>activeitem = 3} use:link>
|
<a href="/settings" class:active="{activeitem === 3}" on:click={()=>updateActiveItem(3)} use:link>
|
||||||
<i>settings</i>
|
<i>settings</i>
|
||||||
<span>Settings</span>
|
<span>Settings</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -1,7 +1,46 @@
|
|||||||
<script>
|
<script>
|
||||||
|
import BaseLayout from "../layouts/BaseLayout.svelte";
|
||||||
|
import { FAKE_BUDGET_ITEMS } from "../fakeData";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<BaseLayout>
|
||||||
<div>
|
<nav>
|
||||||
Budgets
|
<h5>Budget Items</h5>
|
||||||
</div>
|
</nav>
|
||||||
|
<div class="space" />
|
||||||
|
<hr />
|
||||||
|
<article class="responsive">
|
||||||
|
<table class="border medium-space">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Amount</th>
|
||||||
|
<th />
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each FAKE_BUDGET_ITEMS as ITEM}
|
||||||
|
<tr>
|
||||||
|
<td>{ITEM.key}</td>
|
||||||
|
<td>{ITEM.amount}</td>
|
||||||
|
<td>
|
||||||
|
<nav class="right-align">
|
||||||
|
<button class="none">
|
||||||
|
<i>more_vert</i>
|
||||||
|
<div class="dropdown left no-wrap">
|
||||||
|
<!-- svelte-ignore a11y-missing-attribute -->
|
||||||
|
<a>Edit</a>
|
||||||
|
<!-- svelte-ignore a11y-missing-attribute -->
|
||||||
|
<a>Disable</a>
|
||||||
|
<!-- svelte-ignore a11y-missing-attribute -->
|
||||||
|
<a>Delete</a>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</nav>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</article>
|
||||||
|
</BaseLayout>
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
<script>
|
<script>
|
||||||
|
import BaseLayout from "../layouts/BaseLayout.svelte";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<BaseLayout>
|
||||||
Home
|
<div>
|
||||||
</div>
|
Home
|
||||||
|
</div>
|
||||||
|
</BaseLayout>
|
||||||
|
|
||||||
|
50
src/routes/Login.svelte
Normal file
50
src/routes/Login.svelte
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<script>
|
||||||
|
import { replace } from 'svelte-spa-router';
|
||||||
|
import { isAuthed } from '../store';
|
||||||
|
import NoNavLayout from '../layouts/NoNavLayout.svelte';
|
||||||
|
|
||||||
|
function doLogin(){
|
||||||
|
replace("/");
|
||||||
|
isAuthed.set(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<NoNavLayout>
|
||||||
|
<article class="absolute middle center">
|
||||||
|
<img class="responsive small" src="/vite.svg" alt="">
|
||||||
|
<h4>Budgetly Login</h4>
|
||||||
|
|
||||||
|
<p>Username:</p>
|
||||||
|
<div class="field border">
|
||||||
|
<input type="text">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>Password:</p>
|
||||||
|
<div class="field border">
|
||||||
|
<input type="text">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="responsive" on:click={doLogin}>
|
||||||
|
<i>login</i>
|
||||||
|
<span>Login</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<hr>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<button class="border">
|
||||||
|
<img src="https://upload.wikimedia.org/wikipedia/commons/5/53/Google_%22G%22_Logo.svg" alt="">
|
||||||
|
<span>Login with Google</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button class="border">
|
||||||
|
<img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="">
|
||||||
|
<span>Login with Github</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</NoNavLayout>
|
7
src/routes/Logout.svelte
Normal file
7
src/routes/Logout.svelte
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<script>
|
||||||
|
import { resetStore } from '../store';
|
||||||
|
import {replace} from 'svelte-spa-router';
|
||||||
|
|
||||||
|
resetStore();
|
||||||
|
replace("/login");
|
||||||
|
</script>
|
@ -1,4 +1,10 @@
|
|||||||
<article class="padding absolute middle center">
|
<script>
|
||||||
<h4>Uh Oh...</h4>
|
import NoNavLayout from "../layouts/NoNavLayout.svelte";
|
||||||
<div>We can't find that right now.</div>
|
</script>
|
||||||
</article>
|
|
||||||
|
<NoNavLayout>
|
||||||
|
<article class="padding absolute middle center">
|
||||||
|
<h4>Uh Oh...</h4>
|
||||||
|
<div>We can't find that right now.</div>
|
||||||
|
</article>
|
||||||
|
</NoNavLayout>
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
<script>
|
<script>
|
||||||
|
import BaseLayout from "../layouts/BaseLayout.svelte";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<div>
|
<BaseLayout>
|
||||||
Settings
|
<div>
|
||||||
|
Settings
|
||||||
</div>
|
</div>
|
||||||
|
</BaseLayout>
|
||||||
|
@ -1,6 +1,65 @@
|
|||||||
<script>
|
<script>
|
||||||
|
import BaseLayout from "../layouts/BaseLayout.svelte";
|
||||||
|
import { FAKE_BUDGET_ITEMS } from "../fakeData";
|
||||||
|
|
||||||
|
let items = FAKE_BUDGET_ITEMS;
|
||||||
|
let filterText = "";
|
||||||
|
|
||||||
|
function filter() {
|
||||||
|
items = FAKE_BUDGET_ITEMS.filter((obj) => {
|
||||||
|
return obj.key.toLowerCase().includes(filterText);
|
||||||
|
});
|
||||||
|
console.log(items);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<BaseLayout>
|
||||||
timeline
|
<nav class="">
|
||||||
</div>
|
<h5>Spending Timeline</h5>
|
||||||
|
<div class="max" />
|
||||||
|
<div class="field label suffix border">
|
||||||
|
<input type="text" bind:value={filterText} on:input={filter} />
|
||||||
|
<!-- svelte-ignore a11y-label-has-associated-control -->
|
||||||
|
<label>Search</label>
|
||||||
|
<i>search</i>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<div class="space" />
|
||||||
|
<hr />
|
||||||
|
{#each items as ITEM}
|
||||||
|
<article class="responsive">
|
||||||
|
<h5>{ITEM.key}</h5>
|
||||||
|
<p>Spent: $0</p>
|
||||||
|
<p>Remaining: $0</p>
|
||||||
|
|
||||||
|
<table class="border">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Amount</th>
|
||||||
|
<th>Date</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each ITEM.entries as entry}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<!-- svelte-ignore a11y-missing-attribute -->
|
||||||
|
<a>
|
||||||
|
{entry.name}
|
||||||
|
<div class="tooltip bottom">{entry.description}</div>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>{entry.amount}</td>
|
||||||
|
<td>
|
||||||
|
{new Date(entry.date).toLocaleDateString() +
|
||||||
|
", " +
|
||||||
|
new Date(entry.date).toLocaleTimeString()}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</article>
|
||||||
|
{/each}
|
||||||
|
</BaseLayout>
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
import { writable } from 'svelte/store';
|
import { writable } from 'svelte/store';
|
||||||
|
|
||||||
export const DARK_THEME_PREF = writable(true);
|
export const isAuthed = writable(false);
|
||||||
export const activeNav = writable(0);
|
export const activeNav = writable(0);
|
||||||
|
|
||||||
|
export function resetStore() {
|
||||||
|
isAuthed.set(false);
|
||||||
|
activeNav.set(0);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user