forked from tsai/budibase
7 changed files with 139 additions and 96 deletions
@ -1,50 +1,25 @@ |
|||||
<script> |
<script> |
||||
|
import { onMount } from "svelte" |
||||
import AppCard from "./AppCard.svelte" |
import AppCard from "./AppCard.svelte" |
||||
import { Heading, Divider } from "@budibase/bbui" |
import { apps } from "stores/portal" |
||||
import Spinner from "components/common/Spinner.svelte" |
|
||||
import { get } from "builderStore/api" |
|
||||
|
|
||||
let promise = getApps() |
onMount(apps.load) |
||||
|
|
||||
async function getApps() { |
|
||||
const res = await get("/api/applications") |
|
||||
const json = await res.json() |
|
||||
|
|
||||
if (res.ok) { |
|
||||
return json |
|
||||
} else { |
|
||||
throw new Error(json) |
|
||||
} |
|
||||
} |
|
||||
</script> |
</script> |
||||
|
|
||||
<div class="root"> |
{#if $apps.length} |
||||
<Heading size="M">Your Apps</Heading> |
<div class="appList"> |
||||
<Divider size="M" /> |
{#each $apps as app} |
||||
{#await promise} |
<AppCard {...app} /> |
||||
<div class="spinner-container"> |
{/each} |
||||
<Spinner size="30" /> |
</div> |
||||
</div> |
{:else} |
||||
{:then apps} |
<div>No apps</div> |
||||
<div class="apps"> |
{/if} |
||||
{#each apps as app} |
|
||||
<AppCard {...app} /> |
|
||||
{/each} |
|
||||
</div> |
|
||||
{:catch err} |
|
||||
<h1 style="color:red">{err}</h1> |
|
||||
{/await} |
|
||||
</div> |
|
||||
|
|
||||
<style> |
<style> |
||||
.root { |
.appList { |
||||
margin-top: 10px; |
|
||||
} |
|
||||
.apps { |
|
||||
margin-top: var(--layout-m); |
|
||||
display: grid; |
display: grid; |
||||
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); |
grid-gap: 50px; |
||||
grid-gap: var(--layout-s); |
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); |
||||
justify-content: start; |
|
||||
} |
} |
||||
</style> |
</style> |
||||
|
|||||
@ -1,27 +1,58 @@ |
|||||
<script> |
<script> |
||||
import { Heading, Layout } from "@budibase/bbui" |
import { |
||||
|
Heading, |
||||
|
Layout, |
||||
|
Button, |
||||
|
ActionButton, |
||||
|
ActionGroup, |
||||
|
Select, |
||||
|
} from "@budibase/bbui" |
||||
|
import AppList from "components/start/AppList.svelte" |
||||
|
|
||||
|
let layout = "grid" |
||||
</script> |
</script> |
||||
|
|
||||
<Layout noPadding> |
<Layout noPadding> |
||||
<div> |
<div class="title"> |
||||
<Heading>Apps</Heading> |
<Heading>Apps</Heading> |
||||
|
<Button primary>Create new app</Button> |
||||
</div> |
</div> |
||||
<div class="appList"> |
<div class="filter"> |
||||
{#each new Array(10) as _} |
<div class="select"> |
||||
<div class="app" /> |
<Select quiet placeholder="Filter by groups" /> |
||||
{/each} |
</div> |
||||
|
<ActionGroup> |
||||
|
<ActionButton |
||||
|
on:click={() => (layout = "grid")} |
||||
|
selected={layout === "grid"} |
||||
|
quiet |
||||
|
icon="ClassicGridView" |
||||
|
/> |
||||
|
<ActionButton |
||||
|
on:click={() => (layout = "table")} |
||||
|
selected={layout === "table"} |
||||
|
quiet |
||||
|
icon="ViewRow" |
||||
|
/> |
||||
|
</ActionGroup> |
||||
</div> |
</div> |
||||
|
{#if layout === "grid"} |
||||
|
<AppList /> |
||||
|
{:else} |
||||
|
Table |
||||
|
{/if} |
||||
</Layout> |
</Layout> |
||||
|
|
||||
<style> |
<style> |
||||
.appList { |
.title, |
||||
display: grid; |
.filter { |
||||
grid-gap: 50px; |
display: flex; |
||||
grid-template-columns: repeat(auto-fill, 300px); |
flex-direction: row; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
} |
} |
||||
.app { |
|
||||
height: 130px; |
.select { |
||||
border-radius: 4px; |
width: 110px; |
||||
background-color: var(--spectrum-global-color-gray-200); |
|
||||
} |
} |
||||
</style> |
</style> |
||||
|
|||||
@ -0,0 +1,27 @@ |
|||||
|
import { writable } from "svelte/store" |
||||
|
import { get } from "builderStore/api" |
||||
|
|
||||
|
export function createAppStore() { |
||||
|
const store = writable([]) |
||||
|
|
||||
|
async function load() { |
||||
|
try { |
||||
|
const res = await get("/api/applications") |
||||
|
const json = await res.json() |
||||
|
if (res.ok && Array.isArray(json)) { |
||||
|
store.set(json) |
||||
|
} else { |
||||
|
store.set([]) |
||||
|
} |
||||
|
} catch (error) { |
||||
|
store.set([]) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
subscribe: store.subscribe, |
||||
|
load, |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export const apps = createAppStore() |
||||
@ -1,2 +1,3 @@ |
|||||
export { organisation } from "./organisation" |
export { organisation } from "./organisation" |
||||
export { admin } from "./admin" |
export { admin } from "./admin" |
||||
|
export { apps } from "./apps" |
||||
|
|||||
Loading…
Reference in new issue