Skip to content

Commit e7dfe4d

Browse files
authored
Merge pull request #44 from andriialbatov/fix/mounting-on-slash-dashboard
Fix(UI): correct dashboard URLs when mounted at root
2 parents d2ee983 + 9b1d233 commit e7dfe4d

File tree

15 files changed

+139
-141
lines changed

15 files changed

+139
-141
lines changed

crudadmin/admin_interface/admin_site.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ async def login_page_inner(
248248
{
249249
"request": request,
250250
"error": "Invalid credentials. Please try again.",
251-
"mount_path": self.mount_path,
251+
"url_prefix": self.get_url_prefix(),
252252
"theme": self.theme,
253253
},
254254
)
@@ -301,7 +301,7 @@ async def login_page_inner(
301301
{
302302
"request": request,
303303
"error": f"Error creating session: {str(e)}",
304-
"mount_path": self.mount_path,
304+
"url_prefix": self.get_url_prefix(),
305305
"theme": self.theme,
306306
},
307307
)
@@ -313,7 +313,7 @@ async def login_page_inner(
313313
{
314314
"request": request,
315315
"error": "An error occurred during login. Please try again.",
316-
"mount_path": self.mount_path,
316+
"url_prefix": self.get_url_prefix(),
317317
"theme": self.theme,
318318
},
319319
)
@@ -397,7 +397,7 @@ async def admin_login_page_inner(
397397
"auth/login.html",
398398
{
399399
"request": request,
400-
"mount_path": self.mount_path,
400+
"url_prefix": self.get_url_prefix(),
401401
"theme": self.theme,
402402
"error": error,
403403
},
@@ -477,7 +477,7 @@ async def get_base_context(
477477
"table_names": self.models.keys(),
478478
"auth_model_counts": auth_model_counts,
479479
"model_counts": model_counts,
480-
"mount_path": self.mount_path,
480+
"url_prefix": self.get_url_prefix(),
481481
"track_events": self.event_integration is not None,
482482
"theme": self.theme,
483483
}

crudadmin/admin_interface/crud_admin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ async def event_log_page_inner(
627627
"event_types": [e.value for e in EventType],
628628
"statuses": [s.value for s in EventStatus],
629629
"users": users["data"],
630-
"mount_path": self.mount_path,
630+
"url_prefix": self.get_url_prefix(),
631631
}
632632
)
633633

@@ -767,7 +767,7 @@ async def event_log_content_inner(
767767
"events": enriched_events,
768768
"page": page,
769769
"total_pages": total_pages,
770-
"mount_path": self.mount_path,
770+
"url_prefix": self.get_url_prefix(),
771771
"start_date": start_date,
772772
"end_date": end_date,
773773
"selected_type": event_type,
@@ -785,7 +785,7 @@ async def event_log_content_inner(
785785
"events": [],
786786
"page": 1,
787787
"total_pages": 1,
788-
"mount_path": self.mount_path,
788+
"url_prefix": self.get_url_prefix(),
789789
},
790790
)
791791

crudadmin/admin_interface/model_view.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ async def form_create_endpoint_inner(
692692
"error": error_message,
693693
"field_errors": field_errors,
694694
"field_values": field_values,
695-
"mount_path": self.admin_site.mount_path if self.admin_site else "",
695+
"url_prefix": self.get_url_prefix(),
696696
}
697697

698698
return self.templates.TemplateResponse(
@@ -851,7 +851,7 @@ async def bulk_delete_endpoint_inner(
851851
"current_page": adjusted_page,
852852
"rows_per_page": rows_per_page,
853853
"primary_key_info": primary_key_info,
854-
"mount_path": self.admin_site.mount_path if self.admin_site else "",
854+
"url_prefix": self.get_url_prefix(),
855855
}
856856

857857
return self.templates.TemplateResponse(
@@ -1002,7 +1002,7 @@ async def get_model_admin_page_inner(
10021002
"rows_per_page": rows_per_page,
10031003
"selected_column": search_column,
10041004
"primary_key_info": primary_key_info,
1005-
"mount_path": self.admin_site.mount_path if self.admin_site else "",
1005+
"url_prefix": self.get_url_prefix(),
10061006
"sort_column": sort_column,
10071007
"sort_order": sort_order,
10081008
"allowed_actions": self.allowed_actions,
@@ -1046,14 +1046,13 @@ def get_model_create_page(
10461046
async def model_create_page(request: Request) -> Response:
10471047
"""Show a blank form for creating a new record."""
10481048
form_fields = _get_form_fields_from_schema(self.create_schema)
1049-
mount_path = self.admin_site.mount_path if self.admin_site else ""
10501049
return self.templates.TemplateResponse(
10511050
template,
10521051
{
10531052
"request": request,
10541053
"model_name": self.model_key,
10551054
"form_fields": form_fields,
1056-
"mount_path": mount_path,
1055+
"url_prefix": self.get_url_prefix(),
10571056
},
10581057
)
10591058

@@ -1098,14 +1097,13 @@ async def get_model_update_page_inner(
10981097
if field_name in item:
10991098
field["value"] = item[field_name]
11001099

1101-
mount_path = self.admin_site.mount_path if self.admin_site else ""
11021100
return self.templates.TemplateResponse(
11031101
template,
11041102
{
11051103
"request": request,
11061104
"model_name": self.model_key,
11071105
"form_fields": form_fields,
1108-
"mount_path": mount_path,
1106+
"url_prefix": self.get_url_prefix(),
11091107
"id": id,
11101108
},
11111109
)
@@ -1267,7 +1265,7 @@ async def form_update_endpoint_inner(
12671265
"error": error_message,
12681266
"field_errors": field_errors,
12691267
"field_values": field_values,
1270-
"mount_path": self.admin_site.mount_path if self.admin_site else "",
1268+
"url_prefix": self.get_url_prefix(),
12711269
"id": id,
12721270
"include_sidebar_and_header": False,
12731271
}

crudadmin/templates/admin/dashboard/dashboard.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
{% set include_sidebar_and_header = True %}
66

77
{% block content %}
8-
<div id="dynamic-content" hx-get="/{{ mount_path }}/dashboard-content" hx-trigger="load" hx-swap="outerHTML">
8+
<div id="dynamic-content" hx-get="{{ url_prefix }}/dashboard-content" hx-trigger="load" hx-swap="outerHTML">
99
<div class="loading-state">
1010
<div class="card">
1111
<div class="loading-message">Loading dashboard content...</div>
@@ -22,14 +22,14 @@
2222
align-items: center;
2323
min-height: 200px;
2424
}
25-
25+
2626
.loading-message {
2727
color: var(--text-secondary-light);
2828
font-size: 1.1rem;
2929
}
30-
30+
3131
.dark-theme .loading-message {
3232
color: var(--text-secondary-dark);
3333
}
3434
</style>
35-
{% endblock %}
35+
{% endblock %}

crudadmin/templates/admin/dashboard/dashboard_content.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
{% if "AdminUser" in auth_table_names %}
9898
<div class="module">
9999
<div class="module-info">
100-
<a href="/{{ mount_path }}/AdminUser" class="module-title">Admin Users</a>
100+
<a href="{{ url_prefix }}/AdminUser" class="module-title">Admin Users</a>
101101
<div class="module-stats">
102102
<span>Active Users:</span>
103103
<span class="stats-badge">{{ auth_model_counts["AdminUser"]|default(0) }}</span>
@@ -109,7 +109,7 @@
109109
{% if "AdminSession" in auth_table_names %}
110110
<div class="module">
111111
<div class="module-info">
112-
<a href="/{{ mount_path }}/AdminSession" class="module-title">Sessions</a>
112+
<a href="{{ url_prefix }}/AdminSession" class="module-title">Sessions</a>
113113
<div class="module-stats">
114114
<span>Active Sessions:</span>
115115
<span class="stats-badge" title="Total / Active">
@@ -127,7 +127,7 @@
127127
{% for table_name in table_names %}
128128
<div class="module">
129129
<div class="module-info">
130-
<a href="/{{ mount_path }}/{{ table_name }}" class="module-title">{{ table_name }}</a>
130+
<a href="{{ url_prefix }}/{{ table_name }}" class="module-title">{{ table_name }}</a>
131131
<div class="module-stats">
132132
<span>Total Records:</span>
133133
<span class="stats-badge">{{ model_counts[table_name]|default(0) }}</span>
@@ -138,4 +138,4 @@
138138
</div>
139139
{% endif %}
140140
</div>
141-
{% endblock %}
141+
{% endblock %}

crudadmin/templates/admin/management/events.html

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -288,16 +288,16 @@
288288
.filter-grid {
289289
grid-template-columns: 1fr;
290290
}
291-
291+
292292
.detail-item {
293293
grid-template-columns: 1fr;
294294
gap: 0.25rem;
295295
}
296-
296+
297297
.filter-actions {
298298
flex-direction: column;
299299
}
300-
300+
301301
.filter-button {
302302
width: 100%;
303303
}
@@ -309,7 +309,7 @@
309309
<div class="dashboard-header">
310310
<h1 class="page-title">Event Logs</h1>
311311
</div>
312-
312+
313313
<div class="filter-section">
314314
<div class="filter-grid">
315315
<div class="filter-group">
@@ -323,7 +323,7 @@ <h1 class="page-title">Event Logs</h1>
323323
{% endfor %}
324324
</select>
325325
</div>
326-
326+
327327
<div class="filter-group">
328328
<label class="filter-label" for="event-type">Event Type</label>
329329
<select id="event-type" name="event_type" class="filter-control">
@@ -350,19 +350,19 @@ <h1 class="page-title">Event Logs</h1>
350350

351351
<div class="filter-group">
352352
<label class="filter-label" for="start-date">Start Date</label>
353-
<input type="date"
353+
<input type="date"
354354
id="start-date"
355-
name="start_date"
356-
class="filter-control"
355+
name="start_date"
356+
class="filter-control"
357357
value="{{ start_date }}">
358358
</div>
359359

360360
<div class="filter-group">
361361
<label class="filter-label" for="end-date">End Date</label>
362-
<input type="date"
362+
<input type="date"
363363
id="end-date"
364-
name="end_date"
365-
class="filter-control"
364+
name="end_date"
365+
class="filter-control"
366366
value="{{ end_date }}">
367367
</div>
368368
</div>
@@ -377,8 +377,8 @@ <h1 class="page-title">Event Logs</h1>
377377
</div>
378378
</div>
379379

380-
<div id="events-content"
381-
hx-get="/{{ mount_path }}/management/events/content"
380+
<div id="events-content"
381+
hx-get="{{ url_prefix }}/management/events/content"
382382
hx-trigger="load">
383383
<div class="event-grid">
384384
<div class="event-card">
@@ -405,14 +405,14 @@ <h1 class="page-title">Event Logs</h1>
405405
function applyFilters() {
406406
const filters = getFilterValues();
407407
const queryParams = new URLSearchParams();
408-
408+
409409
Object.entries(filters).forEach(([key, value]) => {
410410
if (value) {
411411
queryParams.append(key, value);
412412
}
413413
});
414414

415-
const url = `/{{ mount_path }}/management/events/content?${queryParams.toString()}`;
415+
const url = `{{ url_prefix }}/management/events/content?${queryParams.toString()}`;
416416
htmx.ajax('GET', url, {
417417
target: '#events-content',
418418
swap: 'innerHTML'
@@ -434,4 +434,4 @@ <h1 class="page-title">Event Logs</h1>
434434
details.classList.toggle('visible');
435435
}
436436
</script>
437-
{% endblock %}
437+
{% endblock %}

crudadmin/templates/admin/management/events_content.html

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<span class="event-timestamp">{{ event.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}</span>
99
</div>
1010
</div>
11-
11+
1212
<div class="event-summary" onclick="toggleDetails(this)">
1313
<div class="summary-grid">
1414
<div class="summary-item">
@@ -94,21 +94,21 @@ <h4>Request Details</h4>
9494

9595
<div class="pagination">
9696
<button class="pagination-button"
97-
hx-get="/{{ mount_path }}/management/events/content"
97+
hx-get="{{ url_prefix }}/management/events/content"
9898
hx-target="#events-content"
9999
hx-include="[name='event-type'],[name='status'],[name='start-date'],[name='end-date']"
100100
hx-vals='js:{"page": "{{ page - 1 }}"}'
101101
{% if page <= 1 %}disabled{% endif %}>
102102
Previous
103103
</button>
104-
104+
105105
<div class="pagination-info">
106106
Page {{ page }} of {{ total_pages }}
107107
</div>
108-
108+
109109
<button class="pagination-button"
110-
hx-get="/{{ mount_path }}/management/events/content"
111-
hx-target="#events-content"
110+
hx-get="{{ url_prefix }}/management/events/content"
111+
hx-target="#events-content"
112112
hx-include="[name='event-type'],[name='status'],[name='start-date'],[name='end-date']"
113113
hx-vals='js:{"page": "{{ page + 1 }}"}'
114114
{% if page >= total_pages %}disabled{% endif %}>
@@ -120,7 +120,7 @@ <h4>Request Details</h4>
120120
.event-card {
121121
margin-bottom: 1rem;
122122
}
123-
123+
124124
.header-info {
125125
display: flex;
126126
align-items: center;
@@ -188,4 +188,4 @@ <h4>Request Details</h4>
188188
<span>No events found matching the criteria.</span>
189189
</div>
190190
</div>
191-
{% endif %}
191+
{% endif %}

crudadmin/templates/admin/management/health.html

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -209,24 +209,24 @@
209209
<div class="dashboard-header">
210210
<h1 class="page-title">System Health</h1>
211211
<button class="refresh-button"
212-
hx-get="/{{ mount_path }}/management/health/content"
212+
hx-get="{{ url_prefix }}/management/health/content"
213213
hx-target="#health-content"
214214
hx-indicator=".refresh-icon">
215215
<svg class="refresh-icon"
216-
fill="none"
217-
stroke="currentColor"
216+
fill="none"
217+
stroke="currentColor"
218218
viewBox="0 0 24 24">
219-
<path stroke-linecap="round"
220-
stroke-linejoin="round"
221-
stroke-width="2"
219+
<path stroke-linecap="round"
220+
stroke-linejoin="round"
221+
stroke-width="2"
222222
d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
223223
</svg>
224224
Refresh
225225
</button>
226226
</div>
227-
228-
<div id="health-content"
229-
hx-get="/{{ mount_path }}/management/health/content"
227+
228+
<div id="health-content"
229+
hx-get="{{ url_prefix }}/management/health/content"
230230
hx-trigger="load delay:100ms">
231231
<div class="health-grid">
232232
<div class="health-card loading-placeholder">
@@ -238,4 +238,4 @@ <h1 class="page-title">System Health</h1>
238238
</div>
239239
</div>
240240
</div>
241-
{% endblock %}
241+
{% endblock %}

0 commit comments

Comments
 (0)