Skip to content

Commit 00df645

Browse files
committed
Add Bootstrap assets and tweak CSS
Add Bootstrap 5.3 CSS/JS assets and adjust app styles. app.css: reduce .nav-link vertical padding, remove spacing between stacked .card elements, and align .ims-filter-buttons to the start. Also update dashboard/profile and layout views to integrate the new assets and corresponding markup/layout adjustments.
1 parent 0b219a6 commit 00df645

7 files changed

Lines changed: 143 additions & 18 deletions

File tree

public/assets/css/app.css

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ code {
8585

8686
.nav-link {
8787
display: block;
88-
padding: 11px 14px;
88+
padding: 2px 14px;
8989
border-radius: 14px;
9090
color: #e5edf8;
9191
margin-bottom: 5px;
@@ -140,7 +140,7 @@ code {
140140
box-shadow: var(--shadow-sm);
141141
}
142142

143-
.card + .card { margin-top: 18px; }
143+
.card + .card { margin-top: 0; }
144144

145145
.card-header {
146146
padding: 18px 22px;
@@ -1391,7 +1391,7 @@ textarea.form-input {
13911391
.ims-filter-buttons {
13921392
display: flex;
13931393
gap: 10px;
1394-
justify-content: flex-end;
1394+
justify-content: flex-start;
13951395
align-items: end;
13961396
}
13971397

public/assets/css/bootstrap.min.css

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/assets/js/bootstrap.bundle.min.js

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/views/dashboard/inquiries.php

Lines changed: 118 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,32 +253,42 @@
253253
<div class="ims-toolbar ims-toolbar-tight">
254254
<form id="bulkInquiryForm" method="post" action="<?= e(base_url('inquiries/bulk')) ?>" class="ims-bulk-form ims-bulk-form-tight">
255255
<input type="hidden" name="_csrf" value="<?= e($csrfToken) ?>">
256+
256257
<div class="ims-toolbar-field">
257258
<label class="form-label mb-0">
258259
<span>Bulk action</span>
259-
<select name="bulk_action" class="form-input form-input-sm">
260+
<select id="bulkActionSelect" name="bulk_action" class="form-input form-input-sm">
260261
<option value="">Choose an action</option>
261262
<option value="mark_unread">Mark unread</option>
262263
<option value="mark_read">Mark read</option>
263264
<option value="mark_spam">Mark spam</option>
264265
<option value="move_trash">Move to trash</option>
265-
<option value="assign_owner">Assign owner</option>
266-
<option value="clear_owner">Clear owner</option>
266+
<option value="assign_selected">Assign owner</option>
267+
<option value="clear_assignee">Clear owner</option>
267268
</select>
268269
</label>
269270
</div>
270-
<div class="ims-toolbar-field">
271+
272+
<div id="bulkOwnerField" class="ims-toolbar-field d-none">
271273
<label class="form-label mb-0">
272274
<span>Owner</span>
273-
<select name="assigned_admin_id" class="form-input form-input-sm">
275+
<select id="bulkOwnerSelect" name="bulk_assigned_admin_id" class="form-input form-input-sm" disabled>
274276
<option value="">Choose owner</option>
275277
<?php foreach ($admins as $admin): ?>
276278
<option value="<?= (int) $admin['id'] ?>"><?= e($admin['nickname'] ?: $admin['username']) ?></option>
277279
<?php endforeach; ?>
278280
</select>
279281
</label>
280282
</div>
281-
<button type="submit" class="btn btn-primary ims-bulk-submit">Run bulk action</button>
283+
284+
<div class="ims-toolbar-field ims-toolbar-meta">
285+
<div class="form-label mb-0">
286+
<span>Selected on this page</span>
287+
<div id="bulkSelectionSummary" class="ims-selection-summary">0 rows selected</div>
288+
</div>
289+
</div>
290+
291+
<button id="bulkRunButton" type="submit" class="btn btn-primary ims-bulk-submit" disabled>Run bulk action</button>
282292
</form>
283293
</div>
284294

@@ -373,4 +383,106 @@
373383
<?php endif; ?>
374384
</div>
375385
</section>
386+
387+
<script>
388+
document.addEventListener('DOMContentLoaded', function () {
389+
const bulkForm = document.getElementById('bulkInquiryForm');
390+
if (!bulkForm) return;
391+
392+
const selectAll = document.getElementById('selectAllRows');
393+
const rowChecks = Array.from(document.querySelectorAll('.row-check'));
394+
const bulkAction = document.getElementById('bulkActionSelect');
395+
const ownerField = document.getElementById('bulkOwnerField');
396+
const ownerSelect = document.getElementById('bulkOwnerSelect');
397+
const runButton = document.getElementById('bulkRunButton');
398+
const summary = document.getElementById('bulkSelectionSummary');
399+
400+
const getSelectedCount = () => rowChecks.filter(function (checkbox) {
401+
return checkbox.checked;
402+
}).length;
403+
404+
const updateHeaderCheckbox = () => {
405+
const selectedCount = getSelectedCount();
406+
const totalCount = rowChecks.length;
407+
408+
if (!selectAll) return;
409+
410+
if (selectedCount === 0) {
411+
selectAll.checked = false;
412+
selectAll.indeterminate = false;
413+
} else if (selectedCount === totalCount) {
414+
selectAll.checked = true;
415+
selectAll.indeterminate = false;
416+
} else {
417+
selectAll.checked = false;
418+
selectAll.indeterminate = true;
419+
}
420+
};
421+
422+
const updateOwnerVisibility = () => {
423+
const needsOwner = bulkAction && bulkAction.value === 'assign_selected';
424+
if (!ownerField || !ownerSelect) return;
425+
426+
ownerField.classList.toggle('d-none', !needsOwner);
427+
ownerSelect.disabled = !needsOwner;
428+
429+
if (!needsOwner) {
430+
ownerSelect.value = '';
431+
}
432+
};
433+
434+
const updateToolbarState = () => {
435+
const selectedCount = getSelectedCount();
436+
const action = bulkAction ? bulkAction.value : '';
437+
const needsOwner = action === 'assign_selected';
438+
const ownerReady = !needsOwner || (ownerSelect && ownerSelect.value !== '');
439+
440+
if (summary) {
441+
summary.textContent = selectedCount + (selectedCount === 1 ? ' row selected' : ' rows selected');
442+
}
443+
444+
if (runButton) {
445+
runButton.disabled = !(selectedCount > 0 && action && ownerReady);
446+
}
447+
448+
updateHeaderCheckbox();
449+
updateOwnerVisibility();
450+
};
451+
452+
if (selectAll) {
453+
selectAll.addEventListener('change', function () {
454+
rowChecks.forEach(function (checkbox) {
455+
checkbox.checked = selectAll.checked;
456+
});
457+
updateToolbarState();
458+
});
459+
}
460+
461+
rowChecks.forEach(function (checkbox) {
462+
checkbox.addEventListener('change', updateToolbarState);
463+
});
464+
465+
if (bulkAction) {
466+
bulkAction.addEventListener('change', updateToolbarState);
467+
}
468+
469+
if (ownerSelect) {
470+
ownerSelect.addEventListener('change', updateToolbarState);
471+
}
472+
473+
bulkForm.addEventListener('submit', function (event) {
474+
const selectedCount = getSelectedCount();
475+
const action = bulkAction ? bulkAction.value : '';
476+
const needsOwner = action === 'assign_selected';
477+
const ownerReady = !needsOwner || (ownerSelect && ownerSelect.value !== '');
478+
479+
if (!(selectedCount > 0 && action && ownerReady)) {
480+
event.preventDefault();
481+
}
482+
});
483+
484+
updateToolbarState();
485+
});
486+
</script>
487+
376488
</div>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="card form-card"><div class="card-header"><h2>My Profile</h2></div><form method="post" action="<?= e(base_url('profile')) ?>" class="form-grid profile-form"><input type="hidden" name="_csrf" value="<?= e($csrfToken) ?>"><label class="form-label"><span>Username</span><input type="text" class="form-input" value="<?= e($user['username'] ?? '') ?>" disabled></label><label class="form-label"><span>Role</span><input type="text" class="form-input" value="<?= e(strtoupper((string) ($user['role'] ?? 'admin'))) ?>" disabled></label><label class="form-label"><span>Status</span><input type="text" class="form-input" value="<?= e((string) ($user['status'] ?? 'active')) ?>" disabled></label><label class="form-label"><span>Nickname</span><input type="text" name="nickname" class="form-input" value="<?= e($user['nickname'] ?? '') ?>" required></label><label class="form-label"><span>Email</span><input type="email" name="email" class="form-input" value="<?= e($user['email'] ?? '') ?>" required></label><label class="form-label"><span>Website</span><input type="url" name="website" class="form-input" value="<?= e($user['website'] ?? '') ?>"></label><label class="form-label small-width"><span>Page Size</span><input type="number" name="page_size" class="form-input" value="<?= e((string) ($user['page_size'] ?? 20)) ?>" min="10" max="100"></label><label class="form-label full-width"><span>Bio</span><textarea name="bio" class="form-input" rows="5"><?= e($user['bio'] ?? '') ?></textarea></label><label class="form-label"><span>New Password</span><input type="password" name="password" class="form-input"></label><label class="form-label"><span>Confirm Password</span><input type="password" name="password_confirm" class="form-input"></label><div class="full-width"><button type="submit" class="btn btn-primary">Save Changes</button></div></form></div>
1+
<div class="card form-card"><div class="card-header"><h2>My Profile</h2></div><form method="post" action="<?= e(base_url('profile')) ?>" class="form-grid profile-form p-4"><input type="hidden" name="_csrf" value="<?= e($csrfToken) ?>"><label class="form-label"><span>Username</span><input type="text" class="form-input" value="<?= e($user['username'] ?? '') ?>" disabled></label><label class="form-label"><span>Role</span><input type="text" class="form-input" value="<?= e(strtoupper((string) ($user['role'] ?? 'admin'))) ?>" disabled></label><label class="form-label"><span>Status</span><input type="text" class="form-input" value="<?= e((string) ($user['status'] ?? 'active')) ?>" disabled></label><label class="form-label"><span>Nickname</span><input type="text" name="nickname" class="form-input" value="<?= e($user['nickname'] ?? '') ?>" required></label><label class="form-label"><span>Email</span><input type="email" name="email" class="form-input" value="<?= e($user['email'] ?? '') ?>" required></label><label class="form-label"><span>Website</span><input type="url" name="website" class="form-input" value="<?= e($user['website'] ?? '') ?>"></label><label class="form-label small-width"><span>Page Size</span><input type="number" name="page_size" class="form-input" value="<?= e((string) ($user['page_size'] ?? 20)) ?>" min="10" max="100"></label><label class="form-label full-width"><span>Bio</span><textarea name="bio" class="form-input" rows="5"><?= e($user['bio'] ?? '') ?></textarea></label><label class="form-label"><span>New Password</span><input type="password" name="password" class="form-input"></label><label class="form-label"><span>Confirm Password</span><input type="password" name="password_confirm" class="form-input"></label><div class="full-width"><button type="submit" class="btn btn-primary">Save Changes</button></div></form></div>

resources/views/layouts/guest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
66
<title><?= e(($pageTitle ?? 'System') . ' - ' . config('app.name')) ?></title>
7-
<link rel="stylesheet" href="<?= e(asset('css/app.css?v=1.0.2')) ?>">
7+
<link rel="stylesheet" href="<?= e(asset('css/app.css?v=1.0.6')) ?>">
88
</head>
99
<body class="guest-body">
1010
<?= $content ?>

resources/views/layouts/main.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
<!doctype html>
22
<html lang="en">
33
<head>
4-
<meta charset="UTF-8">
5-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6-
<title><?= e(($pageTitle ?? 'System') . ' - ' . config('app.name')) ?></title>
7-
<link rel="preconnect" href="https://cdn.jsdelivr.net">
8-
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
9-
<link rel="stylesheet" href="<?= e(asset('css/app.css?v=1.0.2')) ?>">
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title><?= e(($pageTitle ?? 'System') . ' - ' . config('app.name')) ?></title>
7+
<link rel="stylesheet" href="<?= e(asset('css/bootstrap.min.css')) ?>">
8+
<link rel="stylesheet" href="<?= e(asset('css/app.css?v=1.0.6')) ?>">
109
</head>
1110
<body class="app-body">
1211
<?php $authUser = \App\Core\Auth::user(); ?>
@@ -74,7 +73,8 @@
7473
<?= $content ?>
7574
</main>
7675
</div>
77-
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
76+
77+
<script src="<?= e(asset('js/bootstrap.bundle.min.js')) ?>"></script>
7878
<script src="<?= e(asset('js/app.js')) ?>"></script>
7979
</body>
8080
</html>

0 commit comments

Comments
 (0)