Company - wszystkie moduły - wersja robocza

This commit is contained in:
2026-03-07 19:14:17 +01:00
parent eed545736d
commit f2e1fa6134
10 changed files with 2469 additions and 113 deletions

View File

@@ -0,0 +1,304 @@
<?php
$enablePrototypeComments = true;
include '../../header-invoice.php';
?>
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="fw-bold py-3 mb-4">
<span class="text-muted fw-light">Zarządzanie zespołem / <a href="app-groups.php"
class="text-muted text-decoration-none">Grupy</a> /</span> Edycja grupy
</h4>
<div class="row">
<!-- Formularz informacji ogólnych -->
<div class="col-md-12 col-lg-4 mb-4">
<div class="card h-100">
<h5 class="card-header border-bottom">Informacje ogólne</h5>
<div class="card-body mt-4">
<form id="formGroupEdit" onsubmit="return false">
<div class="mb-3">
<label for="groupName" class="form-label">Nazwa grupy <span
class="text-danger">*</span></label>
<input type="text" class="form-control" id="groupName" value="Kadra Kierownicza" autofocus>
</div>
<div class="mb-4">
<label for="groupDescription" class="form-label">Opis / Notatka dla użytkowników</label>
<textarea class="form-control" id="groupDescription"
rows="4">Pełny wgląd w raporty finansowe, listę pracowników oraz obieg dokumentów.</textarea>
<div class="form-text">Zwięzły opis pomoże innym administratorom zrozumieć przeznaczenie tej
grupy.</div>
</div>
<div class="mb-3">
<label class="form-label d-block">Status grupy</label>
<div class="form-check form-switch mb-2">
<input class="form-check-input" type="checkbox" id="flexSwitchCheckChecked" checked>
<label class="form-check-label" for="flexSwitchCheckChecked">Aktywna</label>
</div>
<div class="form-text">Wyłączenie grupy tymczasowo odbierze dostęp do jej zasobów wszystkim
uprawnionym użytkownikom, ale nie usunie z niej członków.</div>
</div>
</form>
</div>
</div>
</div>
<!-- Przypisywanie użytkowników -->
<div class="col-md-12 col-lg-8 mb-4">
<div class="card h-100">
<div class="card-header border-bottom d-flex justify-content-between align-items-center">
<h5 class="m-0">Przypisani członkowie zespołu (3)</h5>
<div class="input-group input-group-merge" style="max-width: 250px;">
<span class="input-group-text"><i class="bx bx-search"></i></span>
<input type="text" id="searchUser" class="form-control form-control-sm"
placeholder="Szukaj osoby...">
</div>
</div>
<div class="table-responsive text-nowrap" style="max-height: 500px; overflow-y: auto;">
<table class="table table-hover">
<thead class="table-light sticky-top">
<tr>
<th style="width: 50px;" class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" id="selectAll"
style="cursor: pointer;">
</div>
</th>
<th>Użytkownik</th>
<th>Rola w firmie</th>
</tr>
</thead>
<tbody class="table-border-bottom-0">
<!-- Aktywny przypisany właściciel -->
<tr class="table-primary">
<td class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" checked
style="cursor: pointer;">
</div>
</td>
<td>
<div class="d-flex justify-content-start align-items-center">
<div class="avatar avatar-sm me-3">
<img src="https://ui-avatars.com/api/?name=Bartłomiej+Banaczyk&background=e7e7ff&color=696cff"
alt="Avatar" class="rounded-circle">
</div>
<div class="d-flex flex-column">
<h6 class="mb-0 fw-semibold text-primary">Bartłomiej Banaczyk (Ty)</h6>
<small class="text-muted">banaczyk@magico.pl</small>
</div>
</div>
</td>
<td>
<span class="badge bg-label-warning"><i class="bx bx-crown me-1"></i>
Właściciel</span>
</td>
</tr>
<!-- Aktywny przypisany 1 -->
<tr class="table-primary">
<td class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" checked
style="cursor: pointer;">
</div>
</td>
<td>
<div class="d-flex justify-content-start align-items-center">
<div class="avatar avatar-sm me-3">
<img src="https://ui-avatars.com/api/?name=Jan+Kowalski&background=e7e7ff&color=696cff"
alt="Avatar" class="rounded-circle">
</div>
<div class="d-flex flex-column">
<h6 class="mb-0 fw-semibold text-primary">Jan Kowalski</h6>
<small class="text-muted">jan.kowalski@firma.pl</small>
</div>
</div>
</td>
<td><span class="text-muted small">Menadżer</span></td>
</tr>
<!-- Aktywny przypisany 2 -->
<tr class="table-primary">
<td class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" checked
style="cursor: pointer;">
</div>
</td>
<td>
<div class="d-flex justify-content-start align-items-center">
<div class="avatar avatar-sm me-3">
<img src="https://ui-avatars.com/api/?name=Anna+Nowak&background=ffe7e7&color=ff6969"
alt="Avatar" class="rounded-circle">
</div>
<div class="d-flex flex-column">
<h6 class="mb-0 fw-semibold text-primary">Anna Nowak</h6>
<small class="text-muted">anna.nowak@firma.pl</small>
</div>
</div>
</td>
<td><span class="text-muted small">Menadżer</span></td>
</tr>
<!-- Nieprzypisany 1 -->
<tr>
<td class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" style="cursor: pointer;">
</div>
</td>
<td>
<div class="d-flex justify-content-start align-items-center">
<div class="avatar avatar-sm me-3">
<img src="https://ui-avatars.com/api/?name=Katarzyna+Lewandowska&background=e7f0ff&color=69a6ff"
alt="Avatar" class="rounded-circle">
</div>
<div class="d-flex flex-column">
<h6 class="mb-0 fw-semibold text-body">Katarzyna Lewandowska</h6>
<small class="text-muted">k.lewandowska@firma.pl</small>
</div>
</div>
</td>
<td><span class="text-muted small">Pracownik</span></td>
</tr>
<!-- Nieprzypisany 2 -->
<tr>
<td class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" style="cursor: pointer;">
</div>
</td>
<td>
<div class="d-flex justify-content-start align-items-center">
<div class="avatar avatar-sm me-3">
<img src="https://ui-avatars.com/api/?name=Piotr+Wiśniewski&background=e7ffe7&color=69ff69"
alt="Avatar" class="rounded-circle">
</div>
<div class="d-flex flex-column">
<h6 class="mb-0 fw-semibold text-body">Piotr Wiśniewski</h6>
<small class="text-muted">p.wisniewski@firma.pl</small>
</div>
</div>
</td>
<td><span class="text-muted small">Pracownik</span></td>
</tr>
<!-- Nieprzypisany 3 w trakcie rejestracji -->
<tr>
<td class="text-center align-middle">
<div class="d-flex justify-content-center align-items-center">
<input class="form-check-input m-0" type="checkbox" style="cursor: pointer;">
</div>
</td>
<td>
<div class="d-flex justify-content-start align-items-center opacity-50">
<div class="avatar avatar-sm me-3">
<span class="avatar-initial rounded-circle bg-label-secondary"><i
class="bx bx-time-five"></i></span>
</div>
<div class="d-flex flex-column">
<h6 class="mb-0 fw-semibold text-muted">Zuzanna Szymańska</h6>
<small class="text-muted">zuzanna@firma.pl</small>
</div>
</div>
</td>
<td>
<span class="badge bg-label-secondary">Oczekuje na rejestrację</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div id="footer" class="footer" style="background: #e7e7ff; position: sticky; bottom: 0px; right: 0px; z-index: 1000;">
<footer class="content-footer footer border-top">
<div class="container-xxl d-flex py-3 justify-content-center">
<a href="app-groups.php" class="btn btn-label-secondary btn-lg me-3">Anuluj</a>
<button class="btn btn-primary btn-lg px-5">Zapisz ustawienia grupy</button>
</div>
</footer>
</div>
<div class="content-backdrop fade"></div>
<?php include '../../footer.php'; ?>
<!-- Scripts -->
<script>
document.addEventListener("DOMContentLoaded", function () {
// Logika zaznaczania / odznaczania wszystkich checkboxów
const selectAllCheckbox = document.getElementById('selectAll');
const userCheckboxes = document.querySelectorAll('tbody .form-check-input');
// Klikanie w dowolne miejsce wiersza zaznacza/odznacza checkboxa
const tbodyRows = document.querySelectorAll('tbody tr');
tbodyRows.forEach(row => {
row.style.cursor = 'pointer'; // Kursor łapki na całym wierszu
row.addEventListener('click', function (e) {
// Pomijamy sytuację, gdy kliknięto bezpośrednio w checkbox (żeby nie wywoływać podwójnego toggle)
if (e.target.tagName !== 'INPUT') {
const checkbox = this.querySelector('.form-check-input');
if (checkbox) {
checkbox.checked = !checkbox.checked;
// Ręczne wymuszenie eventu 'change' by reszta skryptów (np. zmiana koloru) prawidłowo zareagowała
checkbox.dispatchEvent(new Event('change'));
}
}
});
});
if (selectAllCheckbox) {
selectAllCheckbox.addEventListener('change', function () {
const isChecked = this.checked;
userCheckboxes.forEach(checkbox => {
checkbox.checked = isChecked;
updateRowHighlight(checkbox);
});
});
}
userCheckboxes.forEach(checkbox => {
checkbox.addEventListener('change', function () {
updateRowHighlight(this);
// Aktualizuj stan selectAll
const allChecked = Array.from(userCheckboxes).every(cb => cb.checked);
if (selectAllCheckbox) selectAllCheckbox.checked = allChecked;
const someChecked = Array.from(userCheckboxes).some(cb => cb.checked);
if (selectAllCheckbox) selectAllCheckbox.indeterminate = someChecked && !allChecked;
});
});
function updateRowHighlight(checkbox) {
const tr = checkbox.closest('tr');
const h6 = tr.querySelector('h6');
if (checkbox.checked) {
tr.classList.add('table-primary');
if (h6) {
h6.classList.remove('text-body');
h6.classList.add('text-primary');
}
} else {
tr.classList.remove('table-primary');
if (h6) {
h6.classList.remove('text-primary');
h6.classList.add('text-body');
}
}
}
});
</script>
</body>
</html>