diff --git a/assets/style.css b/assets/style.css index 6e3f6ef..3504f01 100644 --- a/assets/style.css +++ b/assets/style.css @@ -809,6 +809,10 @@ select { margin-right: 0.25rem; } +.mr-2 { + margin-right: 0.5rem; +} + .mr-3 { margin-right: 0.75rem; } @@ -992,6 +996,10 @@ select { border-radius: 0.5rem; } +.rounded-sm { + border-radius: 0.125rem; +} + .border { border-width: 1px; } @@ -1010,6 +1018,11 @@ select { background-color: rgb(0 0 0 / var(--tw-bg-opacity)); } +.bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + .bg-blue-700 { --tw-bg-opacity: 1; background-color: rgb(29 78 216 / var(--tw-bg-opacity)); @@ -1035,6 +1048,11 @@ select { background-color: rgb(254 226 226 / var(--tw-bg-opacity)); } +.bg-red-700 { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} + .bg-transparent { background-color: transparent; } @@ -1044,6 +1062,11 @@ select { background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } +.bg-yellow-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 249 195 / var(--tw-bg-opacity)); +} + .bg-cover { background-size: cover; } @@ -1052,6 +1075,10 @@ select { background-position: center; } +.p-1 { + padding: 0.25rem; +} + .p-2 { padding: 0.5rem; } @@ -1074,16 +1101,31 @@ select { padding-right: 1rem; } +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } +.py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} + .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; @@ -1109,6 +1151,10 @@ select { padding-top: 4rem; } +.text-center { + text-align: center; +} + .text-2xl { font-size: 1.5rem; line-height: 2rem; @@ -1154,6 +1200,16 @@ select { line-height: 1; } +.text-blue-400 { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity)); +} + +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity)); +} + .text-emerald-500 { --tw-text-opacity: 1; color: rgb(16 185 129 / var(--tw-text-opacity)); @@ -1179,24 +1235,24 @@ select { color: rgb(17 24 39 / var(--tw-text-opacity)); } -.text-green-900 { - --tw-text-opacity: 1; - color: rgb(20 83 45 / var(--tw-text-opacity)); -} - .text-neutral-500 { --tw-text-opacity: 1; color: rgb(115 115 115 / var(--tw-text-opacity)); } +.text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); +} + .text-red-700 { --tw-text-opacity: 1; color: rgb(185 28 28 / var(--tw-text-opacity)); } -.text-red-900 { +.text-red-800 { --tw-text-opacity: 1; - color: rgb(127 29 29 / var(--tw-text-opacity)); + color: rgb(153 27 27 / var(--tw-text-opacity)); } .text-white { @@ -1204,9 +1260,14 @@ select { color: rgb(255 255 255 / var(--tw-text-opacity)); } -.text-yellow-900 { +.text-yellow-400 { --tw-text-opacity: 1; - color: rgb(113 63 18 / var(--tw-text-opacity)); + color: rgb(250 204 21 / var(--tw-text-opacity)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity)); } .opacity-75 { @@ -1256,16 +1317,56 @@ select { transition-timing-function: linear; } +.hover\:bg-blue-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(191 219 254 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(30 64 175 / var(--tw-bg-opacity)); +} + .hover\:bg-gray-100:hover { --tw-bg-opacity: 1; background-color: rgb(243 244 246 / var(--tw-bg-opacity)); } +.hover\:bg-red-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 202 202 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity)); +} + +.hover\:bg-yellow-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 240 138 / var(--tw-bg-opacity)); +} + +.hover\:text-blue-900:hover { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity)); +} + .hover\:text-neutral-700:hover { --tw-text-opacity: 1; color: rgb(64 64 64 / var(--tw-text-opacity)); } +.hover\:text-red-900:hover { + --tw-text-opacity: 1; + color: rgb(127 29 29 / var(--tw-text-opacity)); +} + +.hover\:text-yellow-900:hover { + --tw-text-opacity: 1; + color: rgb(113 63 18 / var(--tw-text-opacity)); +} + .hover\:ease-in-out:hover { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } @@ -1297,6 +1398,11 @@ select { box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } +.focus\:ring-blue-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); +} + .focus\:ring-blue-500:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); @@ -1317,6 +1423,11 @@ select { --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); } +.focus\:ring-red-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity)); +} + .focus\:ring-offset-2:focus { --tw-ring-offset-width: 2px; } @@ -1347,16 +1458,46 @@ select { border-color: rgb(55 65 81 / var(--tw-border-opacity)); } + .dark\:bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + } + + .dark\:bg-blue-900 { + --tw-bg-opacity: 1; + background-color: rgb(30 58 138 / var(--tw-bg-opacity)); + } + .dark\:bg-gray-700 { --tw-bg-opacity: 1; background-color: rgb(55 65 81 / var(--tw-bg-opacity)); } + .dark\:bg-red-600 { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity)); + } + + .dark\:bg-red-900 { + --tw-bg-opacity: 1; + background-color: rgb(127 29 29 / var(--tw-bg-opacity)); + } + + .dark\:bg-yellow-900 { + --tw-bg-opacity: 1; + background-color: rgb(113 63 18 / var(--tw-bg-opacity)); + } + .dark\:text-black { --tw-text-opacity: 1; color: rgb(0 0 0 / var(--tw-text-opacity)); } + .dark\:text-blue-300 { + --tw-text-opacity: 1; + color: rgb(147 197 253 / var(--tw-text-opacity)); + } + .dark\:text-gray-200 { --tw-text-opacity: 1; color: rgb(229 231 235 / var(--tw-text-opacity)); @@ -1372,11 +1513,21 @@ select { color: rgb(229 229 229 / var(--tw-text-opacity)); } + .dark\:text-red-300 { + --tw-text-opacity: 1; + color: rgb(252 165 165 / var(--tw-text-opacity)); + } + .dark\:text-white { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } + .dark\:text-yellow-300 { + --tw-text-opacity: 1; + color: rgb(253 224 71 / var(--tw-text-opacity)); + } + .dark\:placeholder-gray-400::-moz-placeholder { --tw-placeholder-opacity: 1; color: rgb(156 163 175 / var(--tw-placeholder-opacity)); @@ -1387,6 +1538,16 @@ select { color: rgb(156 163 175 / var(--tw-placeholder-opacity)); } + .dark\:hover\:bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-blue-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(30 64 175 / var(--tw-bg-opacity)); + } + .dark\:hover\:bg-gray-600:hover { --tw-bg-opacity: 1; background-color: rgb(75 85 99 / var(--tw-bg-opacity)); @@ -1397,16 +1558,46 @@ select { background-color: rgb(55 65 81 / var(--tw-bg-opacity)); } + .dark\:hover\:bg-red-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-red-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-yellow-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(133 77 14 / var(--tw-bg-opacity)); + } + + .dark\:hover\:text-blue-300:hover { + --tw-text-opacity: 1; + color: rgb(147 197 253 / var(--tw-text-opacity)); + } + .dark\:hover\:text-neutral-400:hover { --tw-text-opacity: 1; color: rgb(163 163 163 / var(--tw-text-opacity)); } + .dark\:hover\:text-red-300:hover { + --tw-text-opacity: 1; + color: rgb(252 165 165 / var(--tw-text-opacity)); + } + .dark\:hover\:text-white:hover { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } + .dark\:hover\:text-yellow-300:hover { + --tw-text-opacity: 1; + color: rgb(253 224 71 / var(--tw-text-opacity)); + } + .dark\:focus\:border-blue-500:focus { --tw-border-opacity: 1; border-color: rgb(59 130 246 / var(--tw-border-opacity)); @@ -1422,10 +1613,20 @@ select { --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); } + .dark\:focus\:ring-blue-800:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity)); + } + .dark\:focus\:ring-gray-600:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity)); } + + .dark\:focus\:ring-red-800:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity)); + } } @media (min-width: 640px) { diff --git a/crates/oswilno-parking-space/src/lib.rs b/crates/oswilno-parking-space/src/lib.rs index 9987608..981a7a7 100644 --- a/crates/oswilno-parking-space/src/lib.rs +++ b/crates/oswilno-parking-space/src/lib.rs @@ -63,6 +63,7 @@ struct AllPartialParkingSpace { locations: Vec>, location_by_id: BTreeMap>, session: Option, + account_id: Option, } #[autometrics] @@ -167,6 +168,7 @@ async fn load_parking_spaces( }); AllPartialParkingSpace { + account_id, account_by_id, parking_space_rents: rents, parking_spaces, @@ -420,12 +422,17 @@ async fn update( location_id: Set(Some(location_id as i32)), spot: Set(spot.map(|n| n as i32)), account_id: Set(session.account_id()), + state: Set(ParkingSpaceState::Pending), ..Default::default() }; if let Err(_e) = model.update(&*db).await { return HttpResponse::BadRequest().body( ParkingSpaceFormPartial { - form: CreateParkingSpace { location_id, spot, id: Some(id) }, + form: CreateParkingSpace { + location_id, + spot, + id: Some(id), + }, t: t.into_inner(), lang, errors: Default::default(), diff --git a/crates/oswilno-parking-space/templates/parking-spaces/all-partial.html b/crates/oswilno-parking-space/templates/parking-spaces/all-partial.html index b31eec0..a15470d 100644 --- a/crates/oswilno-parking-space/templates/parking-spaces/all-partial.html +++ b/crates/oswilno-parking-space/templates/parking-spaces/all-partial.html @@ -59,11 +59,23 @@ {% match parking_space.state %} {% when ParkingSpaceState::Pending %} -
Pending
+
+
+ Pending +
+
{% when ParkingSpaceState::Verified %} -
Accepted
+
+
+ Accepted +
+
{% when ParkingSpaceState::Banned %} -
Rejected
+
+
+ Rejected +
+
{% endmatch %}
Edit + + Delete +
@@ -92,6 +114,7 @@ {% for parking_space_rent in parking_space_rents -%} {% if let Some(parking_space) = parking_space_by_id.get(parking_space_rent.parking_space_id) %} + {% if parking_space.state == ParkingSpaceState::Verified || Some(parking_space.account_id.clone()) == account_id %} {% if let Some(account) = account_by_id.get(parking_space.account_id) %} @@ -105,6 +128,7 @@ {% endif %} {% endif %} + {% endif %} {% endfor -%} diff --git a/crates/oswilno-parking-space/templates/parking-spaces/form-partial.html b/crates/oswilno-parking-space/templates/parking-spaces/form-partial.html index 88fcea8..5b84037 100644 --- a/crates/oswilno-parking-space/templates/parking-spaces/form-partial.html +++ b/crates/oswilno-parking-space/templates/parking-spaces/form-partial.html @@ -4,12 +4,17 @@ {% for error in errors.global() %} {{error|t(lang,t)}} {% endfor %} -
- {% match form.id %} - {% when Some with (id) %} + + {% if let Some(id) = form.id %} - {% when _ %} - {% endmatch %} + {% endif %}