mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-12-28 03:50:10 +00:00
add form, restructure ts
This commit is contained in:
parent
9ae90e0a0f
commit
b0ff1ddfd2
@ -145,7 +145,7 @@
|
|||||||
<div class="card ~neutral !normal mt-half inv-details mt-half unfocused">
|
<div class="card ~neutral !normal mt-half inv-details mt-half unfocused">
|
||||||
<div class="inv-row flex-expand align-top">
|
<div class="inv-row flex-expand align-top">
|
||||||
<div class="inv-profilearea">
|
<div class="inv-profilearea">
|
||||||
<p class="supra mb-1">Profile</p>
|
<p class="supra mb-1 top">Profile</p>
|
||||||
<div class="select ~neutral !normal inv-profileselect inline-block">
|
<div class="select ~neutral !normal inv-profileselect inline-block">
|
||||||
<select>
|
<select>
|
||||||
<option>Friends</option>
|
<option>Friends</option>
|
||||||
@ -164,10 +164,10 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<p class="supra mb-1">Created <strong class="inv-created">10/12/20 18:46</strong></p>
|
<p class="supra mb-1 top">Created <strong class="inv-created">10/12/20 18:46</strong></p>
|
||||||
<p class="supra mb-1">Remaining uses <strong class="inv-remaining">8</strong></p>
|
<p class="supra mb-1">Remaining uses <strong class="inv-remaining">8</strong></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="card ~neutral !low">
|
<div class="card ~neutral !low inv-created-users">
|
||||||
<strong class="supra table-header">Created users</strong>
|
<strong class="supra table-header">Created users</strong>
|
||||||
<table class="table inv-table">
|
<table class="table inv-table">
|
||||||
<thead>
|
<thead>
|
||||||
@ -187,25 +187,72 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="inv">
|
||||||
|
<div class="card ~neutral !normal inv-header flex-expand mt-half">
|
||||||
|
<div class="inv-codearea">
|
||||||
|
<a href="#" class="code monospace mr-1">ZD8ZeC55Jcpmbtv54FuVM3</a>
|
||||||
|
<span class="button ~info !normal">Copy</span>
|
||||||
|
</div>
|
||||||
|
<div class="inv-infoarea">
|
||||||
|
<span class="inv-expiry mr-1">Expires in 30m</span>
|
||||||
|
<span class="button ~critical !normal">Delete</span>
|
||||||
|
<label>
|
||||||
|
<i class="icon ri-arrow-down-s-line not-rotated"></i>
|
||||||
|
<input type="checkbox" class="toggle-details unfocused">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card ~neutral !normal mt-half inv-details mt-half unfocused">
|
||||||
|
<div class="inv-row flex-expand align-top">
|
||||||
|
<div class="inv-profilearea">
|
||||||
|
<p class="supra mb-1 top">Profile</p>
|
||||||
|
<div class="select ~neutral !normal inv-profileselect inline-block">
|
||||||
|
<select>
|
||||||
|
<option>Friends</option>
|
||||||
|
<option>Family</option>
|
||||||
|
<option>No Profile</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="label supra">Notify on:</p>
|
||||||
|
<label class="switch block">
|
||||||
|
<input type="checkbox" class="inv-notify-expiry">
|
||||||
|
<span>On expiry</span>
|
||||||
|
</label>
|
||||||
|
<label class="switch block">
|
||||||
|
<input type="checkbox" class="inv-notify-creation">
|
||||||
|
<span>On user creation</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="block">
|
||||||
|
<p class="supra mb-1 top">Created <strong class="inv-created">10/12/20 18:46</strong></p>
|
||||||
|
<p class="supra mb-1">Remaining uses <strong class="inv-remaining">8</strong></p>
|
||||||
|
</div>
|
||||||
|
<div class="card ~neutral !low inv-created-users empty">
|
||||||
|
<strong class="supra table-header">Created users</strong>
|
||||||
|
<p class="content">None yet!</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card ~neutral !low create-inv">
|
<div class="card ~neutral !low create-inv">
|
||||||
<span class="heading">Create</span>
|
<span class="heading">Create</span>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="card ~neutral !normal col">
|
<div class="card ~neutral !normal col">
|
||||||
<label class="label supra" for="inv-days">Days</label>
|
<label class="label supra" for="inv-days">Days</label>
|
||||||
<div class="select ~neutral !normal mb-1">
|
<div class="select ~neutral !normal mb-1 mt-half">
|
||||||
<select id="inv-days">
|
<select id="inv-days">
|
||||||
<option>0</option>
|
<option>0</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<label class="label supra" for="inv-hours">Hours</label>
|
<label class="label supra" for="inv-hours">Hours</label>
|
||||||
<div class="select ~neutral !normal mb-1">
|
<div class="select ~neutral !normal mb-1 mt-half">
|
||||||
<select id="inv-hours">
|
<select id="inv-hours">
|
||||||
<option>0</option>
|
<option>0</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<label class="label supra" for="inv-minutes">Minutes</label>
|
<label class="label supra" for="inv-minutes">Minutes</label>
|
||||||
<div class="select ~neutral !normal mb-1">
|
<div class="select ~neutral !normal mb-1 mt-half">
|
||||||
<select id="inv-minutes">
|
<select id="inv-minutes">
|
||||||
<option>0</option>
|
<option>0</option>
|
||||||
</select>
|
</select>
|
||||||
@ -213,7 +260,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="card ~neutral !normal col">
|
<div class="card ~neutral !normal col">
|
||||||
<label class="label supra" for="inv-uses">Number of uses</label>
|
<label class="label supra" for="inv-uses">Number of uses</label>
|
||||||
<div class="flex-expand mb-1">
|
<div class="flex-expand mb-1 mt-half">
|
||||||
<input type="number" min="0" id="inv-uses" class="input ~neutral !normal mr-1" value=1>
|
<input type="number" min="0" id="inv-uses" class="input ~neutral !normal mr-1" value=1>
|
||||||
<label for="inv-inf-uses" class="button ~neutral !normal">
|
<label for="inv-inf-uses" class="button ~neutral !normal">
|
||||||
<span>∞</span>
|
<span>∞</span>
|
||||||
@ -222,7 +269,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<p class="support unfocused"><span class="badge ~critical">Warning</span> invites with infinite uses can be used abusively.</p>
|
<p class="support unfocused"><span class="badge ~critical">Warning</span> invites with infinite uses can be used abusively.</p>
|
||||||
<label class="label supra">Profile</label>
|
<label class="label supra">Profile</label>
|
||||||
<div class="select ~neutral !normal mb-1" id="inv-profile">
|
<div class="select ~neutral !normal mb-1 mt-half" id="inv-profile">
|
||||||
<select>
|
<select>
|
||||||
<option>Friends</option>
|
<option>Friends</option>
|
||||||
<option>Family</option>
|
<option>Family</option>
|
||||||
@ -230,13 +277,13 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<label class="label supra">Send to</label>
|
<label class="label supra">Send to</label>
|
||||||
<div class="flex-expand mb-1">
|
<div class="flex-expand mb-1 mt-half">
|
||||||
<input type="email" id="inv-email" class="input ~neutral !normal mr-1" placeholder="example@example.com">
|
<input type="email" id="inv-email" class="input ~neutral !normal mr-1" placeholder="example@example.com">
|
||||||
<label for="inv-email-enabled" class="button ~neutral !normal">
|
<label for="inv-email-enabled" class="button ~neutral !normal">
|
||||||
<input type="checkbox" id="inv-email-enabled" aria-label="Send to address enabled">
|
<input type="checkbox" id="inv-email-enabled" aria-label="Send to address enabled">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<span class="button ~urge !normal supra full-width center button-lg">Create</span>
|
<span class="button ~urge !normal supra full-width center lg">Create</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -316,7 +363,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="modal.js"></script>
|
<script src="js/main.js" type="module"></script>
|
||||||
<script src="main.js"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
24
base.css
24
base.css
@ -104,6 +104,10 @@
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.row.baseline {
|
||||||
|
align-items: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
.col {
|
.col {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin: 0.5rem;
|
margin: 0.5rem;
|
||||||
@ -139,11 +143,19 @@ sup.\~critical, .text-critical {
|
|||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-header {
|
.badge.lg {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inv-created-users strong,p {
|
||||||
padding-left: 0.5rem;
|
padding-left: 0.5rem;
|
||||||
padding-bottom: 0.2rem;
|
padding-bottom: 0.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.inv-created-users.empty strong,p {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.inv {
|
.inv {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
@ -160,8 +172,8 @@ sup.\~critical, .text-critical {
|
|||||||
box-sizing: border-box; /* fixes weird length issue with inputs */
|
box-sizing: border-box; /* fixes weird length issue with inputs */
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-lg {
|
.button.lg {
|
||||||
height: 3rem;
|
height: 2.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.submit {
|
.submit {
|
||||||
@ -269,3 +281,9 @@ input {
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
border: 0 solid var(--color-neutral-300);
|
border: 0 solid var(--color-neutral-300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.top {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
56
form.html
Normal file
56
form.html
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" class="light-theme">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="base.css">
|
||||||
|
<title>create an account - jfa-no</title>
|
||||||
|
</head>
|
||||||
|
<body class="max-w-full overflow-x-hidden section">
|
||||||
|
<div id="modal-success" class="modal">
|
||||||
|
<div class="modal-content card">
|
||||||
|
<span class="heading mb-1">{{ .lang.successHeader }}</span>
|
||||||
|
<p class="content mb-1">{{ .successMessage }}</p>
|
||||||
|
<span class="button ~urge !normal full-width center supra submit" id="create-success-button">{{ .lang.successContinueButton }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="page-container">
|
||||||
|
<div class="card ~neutral !low">
|
||||||
|
<div class="row baseline">
|
||||||
|
<span class="col heading">{{ .lang.createAccountHeader }}</span>
|
||||||
|
<span class="col subheading"> {{ .helpMessage }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<form class="card ~neutral !normal" href="">
|
||||||
|
<label class="label supra" for="create-username">{{ .lang.username }}</label>
|
||||||
|
<input type="text" class="input ~neutral !high mt-half mb-1" placeholder="{{ .lang.username }}" id="create-username" aria-label="{{ .lang.username }}">
|
||||||
|
|
||||||
|
<label class="label supra" for="create-email">{{ .lang.emailAddress }}</label>
|
||||||
|
<input type="email" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .lang.emailAddress }}" id="create-email" aria-label="{{ .lang.emailAddress }}">
|
||||||
|
|
||||||
|
<label class="label supra" for="create-password">{{ .lang.password }}</label>
|
||||||
|
<input type="password" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .lang.password }}" id="create-password" aria-label="{{ .lang.password }}">
|
||||||
|
|
||||||
|
<input type="submit" class="button ~urge !normal full-width center supra submit" value="{{ .lang.createAccountButton }}">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<div class="card ~neutral !normal">
|
||||||
|
<span class="label supra" for="inv-uses">{{ .lang.passwordRequirementsHeader }}</span>
|
||||||
|
<ul>
|
||||||
|
<li class="content" id="{{ $key }}" min="${{ $value }}">
|
||||||
|
{{ requirement }} <span class="badge lg ~positive"><i class="icon ri-check-line"></i></span>
|
||||||
|
</li>
|
||||||
|
<li class="content" id="{{ $key }}" min="${{ $value }}">
|
||||||
|
{{ requirement }} <span class="badge lg ~critical"><i class="icon ri-close-line"></i></span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<aside class="col aside sm ~info">{{ .contactMessage }}</aside>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="modal.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -5,7 +5,7 @@
|
|||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"ts": "nodemon -e ts --watch ts --exec 'sh -c \"esbuild ts/*.ts --sourcemap --outdir=./\"'",
|
"ts": "nodemon -e ts --watch ts --exec 'sh -c \"esbuild ts/*.ts ts/modules/*.ts --sourcemap --outdir=./js/\"'",
|
||||||
"serve": "npx live-server --ignore=\"ts/**,node_modules/**\"",
|
"serve": "npx live-server --ignore=\"ts/**,node_modules/**\"",
|
||||||
"serve-ts": "concurrently --kill-others \"npm run serve\" \"npm run ts\""
|
"serve-ts": "concurrently --kill-others \"npm run serve\" \"npm run ts\""
|
||||||
},
|
},
|
||||||
|
49
ts/main.ts
49
ts/main.ts
@ -1,13 +1,4 @@
|
|||||||
interface Window {
|
import { Modal } from "./modules/modal.js";
|
||||||
transitionEvent: string;
|
|
||||||
animationEvent: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ArrayConstructor {
|
|
||||||
from(arrayLike: any, mapFn?, thisArg?): Array<any>;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare var window: Window;
|
|
||||||
|
|
||||||
function toggleTheme() {
|
function toggleTheme() {
|
||||||
document.documentElement.classList.toggle('dark-theme');
|
document.documentElement.classList.toggle('dark-theme');
|
||||||
@ -170,28 +161,30 @@ for (let tab of tabs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const modalLogin = new Modal(document.getElementById('modal-login'), true);
|
window.modals = {} as Modals;
|
||||||
document.getElementById('form-login').addEventListener('submit', modalLogin.close);
|
|
||||||
document.getElementById('modalButton').onclick = modalLogin.toggle;
|
|
||||||
|
|
||||||
const modalAddUser = new Modal(document.getElementById('modal-add-user'));
|
window.modals.login = new Modal(document.getElementById('modal-login'), true);
|
||||||
(document.getElementById('accounts-add-user') as HTMLSpanElement).onclick = modalAddUser.toggle;
|
document.getElementById('form-login').addEventListener('submit', window.modals.login.close);
|
||||||
document.getElementById('form-add-user').addEventListener('submit', modalAddUser.close);
|
document.getElementById('modalButton').onclick = window.modals.login.toggle;
|
||||||
|
|
||||||
const modalAbout = new Modal(document.getElementById('modal-about'));
|
window.modals.addUser = new Modal(document.getElementById('modal-add-user'));
|
||||||
(document.getElementById('setting-about') as HTMLSpanElement).onclick = modalAbout.toggle;
|
(document.getElementById('accounts-add-user') as HTMLSpanElement).onclick = window.modals.addUser.toggle;
|
||||||
|
document.getElementById('form-add-user').addEventListener('submit', window.modals.addUser.close);
|
||||||
|
|
||||||
const modalModifyUser = new Modal(document.getElementById('modal-modify-user'));
|
window.modals.about = new Modal(document.getElementById('modal-about'));
|
||||||
document.getElementById('form-modify-user').addEventListener('submit', modalModifyUser.close);
|
(document.getElementById('setting-about') as HTMLSpanElement).onclick = window.modals.about.toggle;
|
||||||
(document.getElementById('accounts-modify-user') as HTMLSpanElement).onclick = modalModifyUser.toggle;
|
|
||||||
|
|
||||||
const modalDeleteUser = new Modal(document.getElementById('modal-delete-user'));
|
window.modals.modifyUser = new Modal(document.getElementById('modal-modify-user'));
|
||||||
document.getElementById('form-delete-user').addEventListener('submit', modalDeleteUser.close);
|
document.getElementById('form-modify-user').addEventListener('submit', window.modals.modifyUser.close);
|
||||||
(document.getElementById('accounts-delete-user') as HTMLSpanElement).onclick = modalDeleteUser.toggle;
|
(document.getElementById('accounts-modify-user') as HTMLSpanElement).onclick = window.modals.modifyUser.toggle;
|
||||||
|
|
||||||
const modalRestart = new Modal(document.getElementById('modal-restart'));
|
window.modals.deleteUser = new Modal(document.getElementById('modal-delete-user'));
|
||||||
|
document.getElementById('form-delete-user').addEventListener('submit', window.modals.deleteUser.close);
|
||||||
|
(document.getElementById('accounts-delete-user') as HTMLSpanElement).onclick = window.modals.deleteUser.toggle;
|
||||||
|
|
||||||
const modalRefresh = new Modal(document.getElementById('modal-refresh'));
|
window.modals.settingsRestart = new Modal(document.getElementById('modal-restart'));
|
||||||
|
|
||||||
const modalOmbiDefaults = new Modal(document.getElementById('modal-ombi-defaults'));
|
window.modals.settingsRefresh = new Modal(document.getElementById('modal-refresh'));
|
||||||
document.getElementById('form-ombi-defaults').addEventListener('submit', modalOmbiDefaults.close);
|
|
||||||
|
window.modals.ombiDefaults = new Modal(document.getElementById('modal-ombi-defaults'));
|
||||||
|
document.getElementById('form-ombi-defaults').addEventListener('submit', window.modals.ombiDefaults.close);
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
declare var window: Window;
|
declare var window: Window;
|
||||||
|
|
||||||
class Modal {
|
export class Modal implements Modal {
|
||||||
modal: HTMLDivElement;
|
modal: HTMLElement;
|
||||||
closeButton: HTMLSpanElement;
|
closeButton: HTMLSpanElement;
|
||||||
constructor(modal: HTMLDivElement, important: boolean = false) {
|
constructor(modal: HTMLElement, important: boolean = false) {
|
||||||
this.modal = modal;
|
this.modal = modal;
|
||||||
const closeButton = this.modal.querySelector('span.modal-close')
|
const closeButton = this.modal.querySelector('span.modal-close')
|
||||||
if (closeButton !== null) {
|
if (closeButton !== null) {
|
8
ts/tsconfig.json
Normal file
8
ts/tsconfig.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../js",
|
||||||
|
"target": "es6",
|
||||||
|
"lib": ["dom", "es2017"],
|
||||||
|
"typeRoots": ["./node_modules/@types", "./typings"]
|
||||||
|
}
|
||||||
|
}
|
52
ts/typings/d.ts
Normal file
52
ts/typings/d.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
declare interface Modal {
|
||||||
|
modal: HTMLElement;
|
||||||
|
closeButton: HTMLSpanElement
|
||||||
|
show: () => void;
|
||||||
|
close: (event?: Event) => void;
|
||||||
|
toggle: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ArrayConstructor {
|
||||||
|
from(arrayLike: any, mapFn?, thisArg?): Array<any>;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare interface Window {
|
||||||
|
URLBase: string;
|
||||||
|
modals: Modals;
|
||||||
|
cssFile: string;
|
||||||
|
availableProfiles: Array<any>;
|
||||||
|
jfUsers: Array<Object>;
|
||||||
|
notifications_enabled: boolean;
|
||||||
|
token: string;
|
||||||
|
buttonWidth: number;
|
||||||
|
transitionEvent: string;
|
||||||
|
animationEvent: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare interface Modals {
|
||||||
|
about: Modal;
|
||||||
|
login: Modal;
|
||||||
|
addUser: Modal;
|
||||||
|
modifyUser: Modal;
|
||||||
|
deleteUser: Modal;
|
||||||
|
settingsRestart: Modal;
|
||||||
|
settingsRefresh: Modal;
|
||||||
|
ombiDefaults?: Modal;
|
||||||
|
newAccountSuccess?: Modal;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Invite {
|
||||||
|
code?: string;
|
||||||
|
expiresIn?: string;
|
||||||
|
empty: boolean;
|
||||||
|
remainingUses?: string;
|
||||||
|
email?: string;
|
||||||
|
usedBy?: Array<Array<string>>;
|
||||||
|
created?: string;
|
||||||
|
notifyExpiry?: boolean;
|
||||||
|
notifyCreation?: boolean;
|
||||||
|
profile?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare var config: Object;
|
||||||
|
declare var modifiedConfig: Object;
|
Loading…
Reference in New Issue
Block a user