fabrica

hanna/fabrica

style(web): rework the migration form

3a40d80 · hanna committed on 2026-07-26

Rename "Migrate from Git" to "New migration" (page and + menu). Move the
Mirror / LFS Files / Private checkboxes into a single row to the right of
the submit button, rename the button to "Migrate", and give the row top
margin so it no longer hugs the description field.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed by hannaSSH key fingerprint: SHA256:4g9cWhkAAw8gwqhJUcVbSnGEvdGwklW+1Aa/fMUu59k
32 files changed · +64 −9UnifiedSplit
crates/web/src/layout.rs +1 −1
@@ -99,7 +99,7 @@ fn create_menu(_chrome: &Chrome) -> Markup {
99 (icon(Icon::Box)) span { "New repository" }99 (icon(Icon::Box)) span { "New repository" }
100 }100 }
101 a class="menu-item" role="menuitem" href="/new/migrate" {101 a class="menu-item" role="menuitem" href="/new/migrate" {
102 (icon(Icon::Download)) span { "Migrate from Git" }102 (icon(Icon::Download)) span { "New migration" }
103 }103 }
104 a class="menu-item" role="menuitem" href="/new/issue" {104 a class="menu-item" role="menuitem" href="/new/issue" {
105 (icon(Icon::Issue)) span { "New issue" }105 (icon(Icon::Issue)) span { "New issue" }
crates/web/src/pages.rs +9 −8
@@ -468,7 +468,7 @@ pub async fn migrate_form(
468) -> Response {468) -> Response {
469 let (jar, chrome) = build_chrome(&state, jar, Some(user.clone()), uri.path().to_string());469 let (jar, chrome) = build_chrome(&state, jar, Some(user.clone()), uri.path().to_string());
470 let body = migrate_body(&chrome.csrf, &user.username, None, "", "");470 let body = migrate_body(&chrome.csrf, &user.username, None, "", "");
471 (jar, page(&chrome, "Migrate from Git", body)).into_response()471 (jar, page(&chrome, "New migration", body)).into_response()
472}472}
473473
474/// Migrate-from-Git form fields.474/// Migrate-from-Git form fields.
@@ -522,7 +522,7 @@ pub async fn migrate_submit(
522 (522 (
523 axum::http::StatusCode::BAD_REQUEST,523 axum::http::StatusCode::BAD_REQUEST,
524 jar,524 jar,
525 page(&chrome, "Migrate from Git", body),525 page(&chrome, "New migration", body),
526 )526 )
527 .into_response()527 .into_response()
528 }528 }
@@ -606,7 +606,7 @@ async fn do_migrate(state: &AppState, user: &User, form: &MigrateForm) -> Result
606fn migrate_body(csrf: &str, owner: &str, error: Option<&str>, url: &str, name: &str) -> Markup {606fn migrate_body(csrf: &str, owner: &str, error: Option<&str>, url: &str, name: &str) -> Markup {
607 html! {607 html! {
608 div class="new-repo" {608 div class="new-repo" {
609 h1 { "Migrate from Git" }609 h1 { "New migration" }
610 @if let Some(msg) = error { div class="notice notice-error" { (msg) } }610 @if let Some(msg) = error { div class="notice notice-error" { (msg) } }
611 div class="card" {611 div class="card" {
612 form method="post" action="/new/migrate" {612 form method="post" action="/new/migrate" {
@@ -619,17 +619,18 @@ fn migrate_body(csrf: &str, owner: &str, error: Option<&str>, url: &str, name: &
619 input type="text" name="username" placeholder="username (optional)" autocomplete="off";619 input type="text" name="username" placeholder="username (optional)" autocomplete="off";
620 input type="password" name="secret" placeholder="password / token (optional)" autocomplete="off";620 input type="password" name="secret" placeholder="password / token (optional)" autocomplete="off";
621 }621 }
622 label { "Migration options" }
623 label class="checkbox" { input type="checkbox" name="mirror" value="1"; " This repository will be a mirror (keep pulling from the source)" }
624 label class="checkbox" { input type="checkbox" name="migrate_lfs" value="1"; " Migrate LFS files" }
625 label { "Owner" }622 label { "Owner" }
626 input type="text" value=(owner) disabled;623 input type="text" value=(owner) disabled;
627 label for="mg-name" { "Repository name" }624 label for="mg-name" { "Repository name" }
628 input type="text" id="mg-name" name="name" value=(name) required;625 input type="text" id="mg-name" name="name" value=(name) required;
629 label class="checkbox" { input type="checkbox" name="private" value="1"; " Make repository private" }
630 label for="mg-desc" { "Description" }626 label for="mg-desc" { "Description" }
631 textarea id="mg-desc" name="description" rows="3" {}627 textarea id="mg-desc" name="description" rows="3" {}
632 button class="btn btn-primary inline-btn" type="submit" { "Migrate repository" }628 div class="admin-form-actions" {
629 button class="btn btn-primary inline-btn" type="submit" { "Migrate" }
630 label class="checkbox" { input type="checkbox" name="mirror" value="1"; " Mirror" }
631 label class="checkbox" { input type="checkbox" name="migrate_lfs" value="1"; " LFS Files" }
632 label class="checkbox" { input type="checkbox" name="private" value="1"; " Private" }
633 }
633 }634 }
634 }635 }
635 }636 }
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/FETCH_HEAD +2 −0
@@ -0,0 +1,2 @@
1eb0238991c5e8cded8232343b4000884094a1b1a branch 'darwin' of https://github.com/hqnna/dots
237157e7f0e8a390c3579e4bfc14dbbbf1d06a711 branch 'main' of https://github.com/hqnna/dots
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/HEAD +1 −0
@@ -0,0 +1 @@
1ref: refs/heads/main
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/config +9 −0
@@ -0,0 +1,9 @@
1[core]
2 bare = true
3 repositoryformatversion = 0
4 filemode = true
5 logallrefupdates = true
6[receive]
7 denyNonFastForwards = false
8[gc]
9 auto = 0
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/description +1 −0
@@ -0,0 +1 @@
1Unnamed repository; edit this file 'description' to name the repository.
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/hooks/README.sample +5 −0
@@ -0,0 +1,5 @@
1#!/bin/sh
2#
3# Place appropriately named executable hook scripts into this directory
4# to intercept various actions that git takes. See `git help hooks` for
5# more information.
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/hooks/post-receive +2 −0
@@ -0,0 +1,2 @@
1#!/bin/sh
2exec "/nix/store/h82ma3xy1n0l30rc08wrzwg1jszpl05l-fabrica-0.1.0/bin/.fabrica-wrapped" hook post-receive
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/hooks/pre-receive +2 −0
@@ -0,0 +1,2 @@
1#!/bin/sh
2exit 0
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/info/exclude +2 −0
@@ -0,0 +1,2 @@
1# File patterns to ignore; see `git help ignore` for more information.
2# Lines that start with '#' are comments.
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/logs/HEAD +1 −0
@@ -0,0 +1 @@
10000000000000000000000000000000000000000 37157e7f0e8a390c3579e4bfc14dbbbf1d06a711 hanna <me@hanna.lol> 1785032967 -0400 fetch --prune --quiet https://github.com/hqnna/dots +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*: storing head
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/logs/refs/heads/darwin +1 −0
@@ -0,0 +1 @@
10000000000000000000000000000000000000000 eb0238991c5e8cded8232343b4000884094a1b1a hanna <me@hanna.lol> 1785032967 -0400 fetch --prune --quiet https://github.com/hqnna/dots +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*: storing head
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/logs/refs/heads/main +1 −0
@@ -0,0 +1 @@
10000000000000000000000000000000000000000 37157e7f0e8a390c3579e4bfc14dbbbf1d06a711 hanna <me@hanna.lol> 1785032967 -0400 fetch --prune --quiet https://github.com/hqnna/dots +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*: storing head
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/objects/pack/pack-2d54248c7887b3f612ba16762309f1f7032c936f.idx +0 −0

Binary file not shown.

data/repos/01/01kye430gcj8z731smf1y2m0tk.git/objects/pack/pack-2d54248c7887b3f612ba16762309f1f7032c936f.pack +0 −0

Binary file not shown.

data/repos/01/01kye430gcj8z731smf1y2m0tk.git/objects/pack/pack-2d54248c7887b3f612ba16762309f1f7032c936f.rev +0 −0

Binary file not shown.

data/repos/01/01kye430gcj8z731smf1y2m0tk.git/refs/heads/darwin +1 −0
@@ -0,0 +1 @@
1eb0238991c5e8cded8232343b4000884094a1b1a
data/repos/01/01kye430gcj8z731smf1y2m0tk.git/refs/heads/main +1 −0
@@ -0,0 +1 @@
137157e7f0e8a390c3579e4bfc14dbbbf1d06a711
data/repos/01/01kye498csyp3krt514nm0pn1p.git/HEAD +1 −0
@@ -0,0 +1 @@
1ref: refs/heads/main
data/repos/01/01kye498csyp3krt514nm0pn1p.git/config +9 −0
@@ -0,0 +1,9 @@
1[core]
2 bare = true
3 repositoryformatversion = 0
4 filemode = true
5 logallrefupdates = true
6[receive]
7 denyNonFastForwards = false
8[gc]
9 auto = 0
data/repos/01/01kye498csyp3krt514nm0pn1p.git/description +1 −0
@@ -0,0 +1 @@
1Unnamed repository; edit this file 'description' to name the repository.
data/repos/01/01kye498csyp3krt514nm0pn1p.git/hooks/README.sample +5 −0
@@ -0,0 +1,5 @@
1#!/bin/sh
2#
3# Place appropriately named executable hook scripts into this directory
4# to intercept various actions that git takes. See `git help hooks` for
5# more information.
data/repos/01/01kye498csyp3krt514nm0pn1p.git/hooks/post-receive +2 −0
@@ -0,0 +1,2 @@
1#!/bin/sh
2exec "/nix/store/h82ma3xy1n0l30rc08wrzwg1jszpl05l-fabrica-0.1.0/bin/.fabrica-wrapped" hook post-receive
data/repos/01/01kye498csyp3krt514nm0pn1p.git/hooks/pre-receive +2 −0
@@ -0,0 +1,2 @@
1#!/bin/sh
2exit 0
data/repos/01/01kye498csyp3krt514nm0pn1p.git/info/exclude +2 −0
@@ -0,0 +1,2 @@
1# File patterns to ignore; see `git help ignore` for more information.
2# Lines that start with '#' are comments.
data/repos/01/01kye498csyp3krt514nm0pn1p.git/logs/HEAD +1 −0
@@ -0,0 +1 @@
10000000000000000000000000000000000000000 60d5eafa40f15c5017e1c46bde454345e223be57 hanna <me@hanna.lol> 1785033180 -0400 push
data/repos/01/01kye498csyp3krt514nm0pn1p.git/logs/refs/heads/main +1 −0
@@ -0,0 +1 @@
10000000000000000000000000000000000000000 60d5eafa40f15c5017e1c46bde454345e223be57 hanna <me@hanna.lol> 1785033180 -0400 push
data/repos/01/01kye498csyp3krt514nm0pn1p.git/objects/0b/35519294f2dc62e1b91d46f9f23461dd4dc8c0 +0 −0

Binary file not shown.

data/repos/01/01kye498csyp3krt514nm0pn1p.git/objects/3e/1848c2b4e70b410cb744a9485bb73280a9d1f0 +0 −0

Binary file not shown.

data/repos/01/01kye498csyp3krt514nm0pn1p.git/objects/60/d5eafa40f15c5017e1c46bde454345e223be57 +0 −0

Binary file not shown.

data/repos/01/01kye498csyp3krt514nm0pn1p.git/objects/ed/7f065089247f7fdd358088746e24cf73a95ee5 +0 −0

Binary file not shown.

data/repos/01/01kye498csyp3krt514nm0pn1p.git/refs/heads/main +1 −0
@@ -0,0 +1 @@
160d5eafa40f15c5017e1c46bde454345e223be57