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 = ""
|
2020-05-06 21:33:30 +12:00
|
|
|
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"
|
|
|
|
}
|
|
|
|
|
2020-05-06 21:33:30 +12:00
|
|
|
const login = async () => {
|
|
|
|
loading = true
|
2020-05-07 21:53:34 +12:00
|
|
|
const response = await _bb.api.post("/api/authenticate", {
|
|
|
|
username,
|
|
|
|
password,
|
|
|
|
})
|
2020-05-06 21:33:30 +12:00
|
|
|
|
|
|
|
if (response.status === 200) {
|
2020-05-07 21:53:34 +12:00
|
|
|
const json = await response.json()
|
|
|
|
localStorage.setItem("budibase:token", json.token)
|
2020-05-06 21:33:30 +12:00
|
|
|
// 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">
|
2020-05-06 21:33:30 +12:00
|
|
|
<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>
|
|
|
|
|
2020-05-06 21:33:30 +12:00
|
|
|
{#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 {
|
2019-09-19 15:35:40 +12:00
|
|
|
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
|
|
|
}
|
2019-09-19 15:35:40 +12:00
|
|
|
|
2020-02-03 22:50:30 +13:00
|
|
|
.form-root {
|
2019-09-19 15:35:40 +12:00
|
|
|
display: grid;
|
|
|
|
grid-template-columns: [label] auto [control] 1fr; /* [overflow] auto;*/
|
2020-02-03 22:50:30 +13:00
|
|
|
}
|
2019-09-19 15:35:40 +12:00
|
|
|
|
2020-02-03 22:50:30 +13:00
|
|
|
.label {
|
2019-09-19 15:35:40 +12:00
|
|
|
grid-column-start: label;
|
|
|
|
padding: 5px 10px;
|
|
|
|
vertical-align: middle;
|
2020-02-03 22:50:30 +13:00
|
|
|
}
|
|
|
|
.control {
|
2019-09-19 15:35:40 +12:00
|
|
|
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;
|
2019-09-29 18:40:06 +13:00
|
|
|
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>
|