1
0
Fork 0
mirror of synced 2024-10-03 19:43:32 +13:00
budibase/packages/standard-components/src/Login.svelte

160 lines
3.3 KiB
Svelte
Raw Normal View History

2019-08-27 18:32:56 +12:00
<script>
2020-02-03 22:50:30 +13:00
import Button from "./Button.svelte"
export let usernameLabel = "Username"
export let passwordLabel = "Password"
export let loginButtonLabel = "Login"
export let logo = ""
export let buttonClass = ""
export let inputClass = ""
export let _bb
let username = ""
let password = ""
let loading = false
let error = false
2020-02-03 22:50:30 +13:00
let _logo = ""
let _buttonClass = ""
let _inputClass = ""
$: {
_logo = _bb.relativeUrl(logo)
_buttonClass = buttonClass || "default-button"
_inputClass = inputClass || "default-input"
}
const login = async () => {
loading = true
2020-05-07 07:29:47 +12:00
const response = await _bb.api.post("/api/authenticate", { username, password });
if (response.status === 200) {
const json = await response.json();
localStorage.setItem("budibase:token", json.token);
// TODO: possibly do something with the user information in the response?
location.reload()
} else {
loading = false
error = true
}
2020-02-03 22:50:30 +13:00
}
2019-08-27 18:32:56 +12:00
</script>
<div class="root">
2020-02-03 22:50:30 +13:00
<div class="content">
{#if _logo}
<div class="logo-container">
<img src={_logo} alt="logo" />
</div>
{/if}
<div class="form-root">
<div class="label">{usernameLabel}</div>
<div class="control">
<input bind:value={username} type="text" class={_inputClass} />
</div>
<div class="label">{passwordLabel}</div>
<div class="control">
<input bind:value={password} type="password" class={_inputClass} />
</div>
</div>
2019-08-27 18:32:56 +12:00
2020-02-03 22:50:30 +13:00
<div class="login-button-container">
<button disabled={loading} on:click={login} class={_buttonClass}>
2020-02-03 22:50:30 +13:00
{loginButtonLabel}
</button>
2019-08-27 18:32:56 +12:00
</div>
{#if error}
2020-02-03 22:50:30 +13:00
<div class="incorrect-details-panel">Incorrect username or password</div>
{/if}
</div>
2019-08-27 18:32:56 +12:00
</div>
<style>
2020-02-03 22:50:30 +13:00
.root {
2019-08-27 18:32:56 +12:00
height: 100%;
2020-02-03 22:50:30 +13:00
display: grid;
2019-08-27 18:32:56 +12:00
grid-template-columns: [left] 1fr [middle] auto [right] 1fr;
grid-template-rows: [top] 1fr [center] auto [bottom] 1fr;
2020-02-03 22:50:30 +13:00
}
2019-08-27 18:32:56 +12:00
2020-02-03 22:50:30 +13:00
.content {
2019-08-27 18:32:56 +12:00
grid-column-start: middle;
grid-row-start: center;
width: 400px;
2020-02-03 22:50:30 +13:00
}
2019-08-27 18:32:56 +12:00
2020-02-03 22:50:30 +13:00
.logo-container {
margin-bottom: 20px;
}
2019-08-27 18:32:56 +12:00
2020-02-03 22:50:30 +13:00
.logo-container > img {
2019-08-27 18:32:56 +12:00
max-width: 100%;
2020-02-03 22:50:30 +13:00
}
2019-08-27 18:32:56 +12:00
2020-02-03 22:50:30 +13:00
.login-button-container {
2019-08-27 18:32:56 +12:00
text-align: right;
margin-top: 20px;
2020-02-03 22:50:30 +13:00
}
2019-08-27 18:32:56 +12:00
2020-02-03 22:50:30 +13:00
.incorrect-details-panel {
margin-top: 30px;
padding: 10px;
border-style: solid;
border-width: 1px;
border-color: maroon;
border-radius: 1px;
text-align: center;
color: maroon;
background-color: mistyrose;
2020-02-03 22:50:30 +13:00
}
2020-02-03 22:50:30 +13:00
.form-root {
display: grid;
grid-template-columns: [label] auto [control] 1fr; /* [overflow] auto;*/
2020-02-03 22:50:30 +13:00
}
2020-02-03 22:50:30 +13:00
.label {
grid-column-start: label;
padding: 5px 10px;
vertical-align: middle;
2020-02-03 22:50:30 +13:00
}
.control {
grid-column-start: control;
padding: 5px 10px;
2020-02-03 22:50:30 +13:00
}
.default-input {
font-family: inherit;
font-size: inherit;
padding: 0.4em;
margin: 0 0 0.5em 0;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 2px;
width: 100%;
2020-02-03 22:50:30 +13:00
}
.default-button {
font-family: inherit;
font-size: inherit;
padding: 0.4em;
margin: 0 0 0.5em 0;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 2px;
2020-03-18 00:16:49 +13:00
color: #000333;
2020-02-03 22:50:30 +13:00
outline: none;
}
.default-button:active {
2020-03-18 00:16:49 +13:00
background-color: #f9f9f9;
2020-02-03 22:50:30 +13:00
}
.default-button:focus {
2020-03-18 00:16:49 +13:00
border-color: #f9f9f9;
2020-02-03 22:50:30 +13:00
}
</style>