Compare commits

...

2 Commits

Author SHA1 Message Date
Jonathan Carter
71011fcafd Move files to actual applets 2024-09-12 18:01:52 +02:00
Jonathan Carter
8661952137 Work on initial partition edit UI 2024-09-09 20:42:20 +02:00
29 changed files with 398 additions and 184 deletions

View File

@@ -0,0 +1,7 @@
from flask import Blueprint
bp = Blueprint('disks', __name__,
template_folder='')
from applets.disks import routes

View File

@@ -0,0 +1,108 @@
{% extends "layout.html" %}
{% block body %}
<h1 class="is-size-3"> Disks and Partitions </h1>
<br>
<div class="tabs">
<ul>
<li><a href="/welcome">Welcome</a></li>
<li><a href="/users">Users</a></li>
<li class="is-active"><a href="/disks">Disks</a></li>
<li><a href="/software">Software</a></li>
<li><a href="/summary">Summary</a></li>
</ul>
</div>
<br>
<p> How would you like to install Debian?</p>
<br>
<div class="radios">
<label class="radio">
<input type="radio" name="rsvp" />
Erase entire disk
</label>
<label class="radio">
<input type="radio" name="rsvp" />
Install alongside another operating system
</label>
<label class="radio">
<input type="radio" name="rsvp" disabled />
Define your own disk and partitioning setup
</label>
</div>
<br>
<p> Proposed layout: </p>
<br>
<div style="background-color: gray; padding: 15px; border-radius: 15px;">
<p> <span style="width: 100%;" class="tag is-black">Physical disk: TOSHIBA HDWD120 (2000 GB)<span class="tag is-primary">Healthy</span></span> </p>
<div class="columns">
<div class="column is-narrow is-primary">
<div class="box" style="width: 220px;">
<p class="is-tiny">/dev/sda1</p>
<p class="title is-5"><span class="tag is-black">/boot/efi</span>
<span class="tag is-dark">200 MB</span>
<span class="tag is-link">vfat</span>
</p>
</div>
</div>
<a hx-get="/disks/partition/sda" hx-swap="outerHTML"/>
<div class="column">
<div class="box">
<p class="is-tiny">/dev/sda2</p>
<p class="title is-5"><span class="tag is-black">/</span> <span class="tag is-dark">18 GB</span> <span class="tag is-link">btrfs</span></p>
</div>
</a>
</div>
</div>
</div>
<br><br>
<div style="background-color: gray; padding: 15px; border-radius: 15px;">
<p> <span style="width: 100%;" class="tag is-black">Physical disk: TOSHIBA HDWD120 (2000 GB)<span class="tag is-primary">Healthy</span></span> </p>
<div class="columns">
<div class="column is-narrow is-primary">
<div class="box" style="width: 220px;">
<p class="is-tiny">/dev/sda1</p>
<p class="title is-5"><span class="tag is-black">/boot/efi</span>
<span class="tag is-dark">200 MB</span>
<span class="tag is-link">vfat</span>
</p>
</div>
</div>
<a hx-get="/disks/partition/sda" hx-swap="outerHTML"/>
<div class="column">
<div class="box">
<p class="is-tiny">/dev/sda2</p>
<p class="title is-5"><span class="tag is-black">/</span> <span class="tag is-dark">18 GB</span> <span class="tag is-link">btrfs</span></p>
</div>
</a>
</div>
</div>
</div>
<br><br>
<div class="columns">
<div class="column"><button class="button is-light">Cancel</button></div>
<a href="/software"><div class="column"><button class="button is-link">Continue</button></div></a>
</div>
</div>
</div>
</div>
<br><br>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,88 @@
<div class="modal is-active">
<div class="modal-background"></div>
<div class="modal-content">
<div style="background-color: #424242; padding: 15px; border-radius: 15px; boders: none; color: white;">
<h1 class="is-size-4"> Edit partition: /dev/sda2 </h1>
<p class="title is-6"><span class="tag is-black">Primary Partition</span>
<span>
<p>Select usage: <div class="control is-link">
<div class="select">
<select>
<option>Local file system</option>
<option>Remote file system</option>
<option>Logical volume for ZFS zpool</option>
<option>Logical volume for LVM</option>
<option>Logical volume for LUKS encryption</option>
<option>Logical volume for Linux (mdadm) RAID</option>
<option>Logical volume for Microsoft LDM RAID</option>
<option>Swap partition</option>
<option>Do not configure</option>
</select>
</div>
</div>
</span>
<span>
<p>Select Mount Point: <div class="control is-link">
<div class="select">
<select>
<option>/</option>
<option>/usr</option>
<option>/var</option>
<option>Other...</option>
</select>
</div>
</div>
</span>
<span>
<p>Select Filesystem: <div class="control is-link">
<div class="select">
<select>
<option is-active>btrfs</option>
<option>ext4</option>
<option>ext3</option>
<option>ext2</option>
<option>xfs</option>
<option>jfs</option>
<option>ntfs</option>
<option>vfat</option>
<option>nfs</option>
<option>nbd</option>
<option>samba</option>
</select>
</div>
</div>
</span>
</p>
<div class="checkboxes">
<label class="checkbox">
<input type="checkbox" />
noatime
</label>
<label class="checkbox">
<input type="checkbox" />
nodiratime
</label>
<label class="checkbox">
<input type="checkbox" />
discard
</label>
</div>
<br>
<div class="columns">
<a href="/disks">
<div class="column"><button class="button is-light">Cancel</button></div>
</a>
<a href="/disks"><div class="column"><button class="button is-link">Continue</button></div></a>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,21 @@
from applets.disks import bp
from flask import Flask, request, session, redirect, \
url_for, render_template, flash, Blueprint
import dmm.lsblk as lsblk
@bp.route('/disks/')
def disks():
"""
Disks screen for the webui.
"""
return render_template('disks.html')
@bp.route('/disks/partition/<part>')
def disks_partition(part):
"""
Partition modal for the webui partition screen.
"""
return render_template('disks_partition.html')

View File

@@ -1,6 +1,7 @@
from flask import Blueprint
bp = Blueprint('main', __name__)
bp = Blueprint('main', __name__,
template_folder='')
from applets.main import routes

View File

@@ -0,0 +1,7 @@
from flask import Blueprint
bp = Blueprint('software', __name__,
template_folder='')
from applets.software import routes

View File

@@ -0,0 +1,11 @@
from applets.software import bp
from flask import Flask, request, session, redirect, \
url_for, render_template, flash, Blueprint
@bp.route('/software')
def webui_software():
"""
Software screen for the webui.
"""
return render_template('software.html')

View File

@@ -0,0 +1,39 @@
{% extends "layout.html" %}
{% block body %}
<h1 class="is-size-3"> Select Software </h1>
<br>
<div class="tabs">
<ul>
<li><a href="/welcome">Welcome</a></li>
<li><a href="/users">Users</a></li>
<li><a href="/disks">Disks</a></li>
<li class="is-active"><a href="/software">Software</a></li>
<li><a href="/summary">Summary</a></li>
</ul>
</div>
<br>
<p> Would you like fries with that?</p>
<br>
<ul>
<li>Desktop environment</li>
<li>Server software</li>
</ul>
<br><br>
<div class="columns">
<div class="column"><button class="button is-light">Back</button></div>
<a href="./summary"><div class="column"><button class="button is-link">Next</button></div></a>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,7 @@
from flask import Blueprint
bp = Blueprint('summary', __name__,
template_folder='')
from applets.summary import routes

View File

@@ -0,0 +1,13 @@
from applets.summary import bp
from flask import Flask, request, session, redirect, \
url_for, render_template, flash, Blueprint
@bp.route('/summary',methods=['GET', 'POST', 'PUT'])
def summary_index():
"""
The page you'd get if you access the root of
this app in a browser.
"""
return render_template('summary.html')

View File

@@ -10,8 +10,7 @@
<div class="bg"></div>
<div style="margin-top: 50px; color: white;" class="container">
<div style="min-height: 80%; left: 22%; right: 22%; top: 50px; bottom: 50px; position: absolute; width:1000px;" class="container">
<div class="notification is-dark">
<h1 class="is-size-3"> Summary </h1>

View File

@@ -0,0 +1,7 @@
from flask import Blueprint
bp = Blueprint('users', __name__,
template_folder='')
from applets.users import routes

View File

@@ -0,0 +1,11 @@
from applets.software import bp
from flask import Flask, request, session, redirect, \
url_for, render_template, flash, Blueprint
@bp.route('/users')
def users_root():
"""
Users screen for the webui.
"""
return render_template('users.html')

View File

@@ -10,8 +10,7 @@
<div class="bg"></div>
<div style="margin-top: 50px; color: white;" class="container">
<div style="min-height: 80%; left: 22%; right: 22%; top: 50px; bottom: 50px; position: absolute; width:1000px;" class="container">
<div class="notification is-dark">
<h1 class="is-size-3"> Configure User </h1>
@@ -36,14 +35,14 @@
<br>
<div class="field">
<label class="label">Name</label>
<label>Full Name</label>
<div class="control">
<input class="input" type="text" placeholder="Text input">
</div>
</div>
<div class="field">
<label class="label">Username</label>
<label>Username</label>
<div class="control has-icons-left has-icons-right">
<input class="input is-success" type="text" placeholder="Text input" value="user">
<span class="icon is-small is-left">
@@ -56,6 +55,20 @@
<p class="help is-success">This username is available</p>
</div>
<div class="field">
<label class="password">Password</label>
<div class="control">
<input class="input" type="password" placeholder="Enter password">
</div>
</div>
<div class="field">
<label class="password">Password (confirm)</label>
<div class="control">
<input class="input" type="password" placeholder="Enter password (confirm)">
</div>
</div>
<br><br>
<div class="columns">

View File

@@ -70,6 +70,14 @@ def webui_disks():
return render_template('disks.html')
@bp.route('/webui/disks/partition/<part>')
def webui_disks_partition(part):
"""
Partition modal for the webui partition screen.
"""
return render_template('disks_partition.html')
@bp.route('/webui/software')
def webui_software():
"""

View File

@@ -1,6 +1,7 @@
from flask import Blueprint
bp = Blueprint('welcome', __name__)
bp = Blueprint('welcome', __name__,
template_folder='')
from applets.welcome import routes

View File

@@ -21,11 +21,3 @@ def welcome2_index():
return ("Changins some text in our htmx front-end")
@bp.route('/api/')
def api_home():
"""
Wel
"""
return ("Welcome to the welcome API")

View File

@@ -1 +0,0 @@
test:

View File

@@ -11,7 +11,7 @@
<div class="bg"></div>
<div style="min-height: 80%; left: 22%; right: 22%; top: 50px; bottom: 50px; position: absolute;" class="container">
<div style="min-height: 80%; left: 22%; right: 22%; top: 50px; bottom: 50px; position: absolute; width:1000px;" class="container">
<div class="notification is-dark">
<h1 class="is-size-3"> Welcome to System Installer </h1>
@@ -35,6 +35,10 @@
<br>
<div class="columns">
<div class="column">
<img src="/static/icons/keyboard.svg" width="180px" />
<div class="control is-link">
<div class="select">
<select>
@@ -43,9 +47,12 @@
</select>
</div>
</div>
</div
<br>
<div class="column">
<img src="/static/icons/keyboard.svg" width="180px" />
<div class="control is-link">
<div class="select">
<select>
@@ -54,9 +61,12 @@
</select>
</div>
</div>
</div>
<br>
<div class="column">
<img src="/static/icons/keyboard.svg" width="180px" />
<div class="control is-link">
<div class="select">
<select>
@@ -65,6 +75,9 @@
</select>
</div>
</div>
</div>
</div> <!-- end columns -->
<br><br><br><br><br><br>

1
src/static/htmx.min.js vendored Symbolic link
View File

@@ -0,0 +1 @@
/usr/share/javascript/htmx/htmx.min.js

View File

@@ -1 +0,0 @@
/usr/share/javascript/htmx/htmx.min.js.gz

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g font-weight="400" fill="#474747"><path d="M3.702 1C2.17 1 .984 2.32.984 3.844v8.344c0 1.524 1.185 2.843 2.718 2.843h8.58c1.532 0 2.75-1.32 2.75-2.844V3.845c0-1.525-1.218-2.844-2.75-2.844zm.782 1.031c3.526.256 5.317.134 7.047 0 .754-.058 1.532.616 1.532 1.438v7.375c0 .665-.532 1.095-1.188 1.187-2.836.397-4.753.44-7.673 0-.655-.099-1.187-.522-1.187-1.187V3.5c0-.822.714-1.524 1.469-1.469z" style="line-height:normal;-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none" color="#bebebe" font-family="Bitstream Vera Sans" overflow="visible"/><path d="M10.564 5.977l-2.939.044.016 1 2.879-.043c.2.018.33.076.396.135.067.06.105.121.105.293l-.008.604H8.517l.037.002a1.457 1.457 0 00-1.164.43 1.558 1.558 0 00-.416 1.023c-.013.367.092.75.352 1.053.26.303.687.496 1.162.482h3.482l.051-3.59v-.004c0-.402-.16-.786-.435-1.035-.276-.249-.63-.364-.998-.393zM8.48 9.01h2.519l-.014.99H8.457c-.22.007-.302-.051-.371-.133a.553.553 0 01-.112-.367.587.587 0 01.141-.371c.079-.083.163-.134.363-.12zm2.862-5.985l-3 1 .316.95 3-1z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" color="#000" font-family="sans-serif" overflow="visible"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -10,12 +10,13 @@ from flask import Flask, request, session, redirect, \
from waitress import serve
import logging
import dmm.lsblk as lsblk
import importlib
# configuration
VERSION = "0.00"
SECRET_KEY = "exampls"
DEV_MODE = 1
APPS = "main welcome"
APPS = "main welcome users disks software summary"
if DEV_MODE == 1:
print("Note: Starting in devmode!")
@@ -29,13 +30,16 @@ app.config.from_object(__name__)
# Register blueprints here
for APP in APPS.split(" "):
print("Loading applet: %s " % APP)
from applets.main import bp as main_bp
app.register_blueprint(main_bp)
from applets.welcome import bp as welcome_bp
app.register_blueprint(welcome_bp)
from applets.webui import bp as webui_bp
app.register_blueprint(webui_bp)
print(f"Loading applet: {APP} ")
# Dynamically import the blueprint module
module = importlib.import_module(f"applets.{APP}")
# Get the blueprint (bp) from the imported module
bp = getattr(module, "bp")
# Register the blueprint with the app
app.register_blueprint(bp)
# configure logs

View File

@@ -1,104 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/static/bulma.css" rel="stylesheet">
<link href="/static/welcome.css" rel="stylesheet">
</head>
<body>
<div class="bg"></div>
<div style="margin-top: 50px;" class="container">
<div class="notification is-dark">
<h1 class="is-size-3"> Disks and Partitions </h1>
<br>
<div class="tabs">
<ul>
<li><a href="./welcome">Welcome</a></li>
<li><a href="./users">Users</a></li>
<li class="is-active"><a href="./disks">Disks</a></li>
<li><a href="./software">Software</a></li>
<li><a href="./summary">Summary</a></li>
</ul>
</div>
<br>
<p> How would you like to install Debian?</p>
<br>
<div class="radios">
<label class="radio">
<input type="radio" name="rsvp" />
Erase entire disk
</label>
<label class="radio">
<input type="radio" name="rsvp" />
Install alongside another operating system
</label>
<label class="radio">
<input type="radio" name="rsvp" disabled />
Define your own disk and partitioning setup
</label>
</div>
<br>
<p> Proposed layout: </p>
<br>
<div style="background-color: gray; padding: 15px; border-radius: 15px;">
<p> <span style="width: 100%;" class="tag is-black">Physical disk: TOSHIBA HDWD120 (20 GB)</span> </p>
<div class="columns">
<div class="column is-narrow is-primary">
<div class="box" style="width: 220px;">
<p class="subtitle">/dev/sda1</p>
<p class="title is-5"><span class="tag is-black">/boot/efi</span> <span class="tag is-dark">200 MB</span> <span class="tag is-link">vfat</span></p>
</div>
</div>
<div class="column">
<div class="box">
<p class="subtitle">/dev/sda2</p>
<p class="title is-5"><span class="tag is-black">/</span> <span class="tag is-dark">18 GB</span> <span class="tag is-link">btrfs</span></p>
</div>
</div>
</div>
</div>
<div class="modal">
<div class="modal-background"></div>
<div class="modal-content">
<!-- Any other Bulma elements you want -->
<p>Welcome to partition disk editor.</p>
<p>This is quite cool.</p>
<div class="columns">
<div class="column"><button class="button is-light">Back</button></div>
<a href="./software"><div class="column"><button class="button is-link">Next</button></div></a>
</div>
</div>
</div>
<br><br><br>
<div class="columns">
<div class="column"><button class="button is-light">Back</button></div>
<a href="./software"><div class="column"><button class="button is-link">Next</button></div></a>
</div>
</div>
</div>
</body>
</html>

21
src/templates/layout.html Normal file
View File

@@ -0,0 +1,21 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/static/bulma.css" rel="stylesheet">
<link href="/static/welcome.css" rel="stylesheet">
<script src="/static/htmx.min.js" crossorigin="anonymous"></script>
</head>
<body>
<div class="bg"></div>
<div style="min-height: 80%; left: 22%; right: 22%; top: 50px; bottom: 50px; position: absolute; width:1000px; height:800;" class="container">
<div class="notification is-dark">
{% block body %}
{% endblock %}
</body>
</html>

View File

@@ -1,53 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/static/bulma.css" rel="stylesheet">
<link href="/static/welcome.css" rel="stylesheet">
</head>
<body>
<div class="bg"></div>
<div style="margin-top: 50px; color: white;" class="container">
<div class="notification is-dark">
<h1 class="is-size-3"> Select Software </h1>
<br>
<div class="tabs">
<ul>
<li><a href="./welcome">Welcome</a></li>
<li><a href="./users">Users</a></li>
<li><a href="./disks">Disks</a></li>
<li class="is-active"><a href="./software">Software</a></li>
<li><a href="./summary">Summary</a></li>
</ul>
</div>
<br>
<p> Would you like fries with that?</p>
<br>
<ul>
<li>Desktop environment</li>
<li>Server software</li>
</ul>
<br><br>
<div class="columns">
<div class="column"><button class="button is-light">Back</button></div>
<a href="./summary"><div class="column"><button class="button is-link">Next</button></div></a>
</div>
</div>
</div>
</body>
</html>