37338-vm/dashboard.html
2026-01-11 12:14:53 +00:00

937 lines
59 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>My App - Dashboard</title>
<meta name="description" content="A modern web application.">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap Icons -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<!-- Custom CSS -->
<link rel="stylesheet" href="assets/css/custom.css?v=1768129608">
<!-- OG Meta Tags -->
<meta property="og:title" content="My App">
<meta property="og:description" content="A modern web application.">
<meta property="og:image" content="https://via.placeholder.com/1200x630.png?text=Visit+My+App">
<meta property="og:url" content="http://localhost">
<meta property="og:type" content="website">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="My App">
<meta name="twitter:description" content="A modern web application.">
<meta name="twitter:image" content="https://via.placeholder.com/1200x630.png?text=Visit+My+App">
</head>
<body>
<nav class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
<a class="navbar-brand col-md-3 col-lg-2 me-0 px-3" href="#">My App</a>
<button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<ul class="navbar-nav flex-row px-3">
<li class="nav-item text-nowrap">
<span class="nav-link">Witaj, Test Admin</span>
</li>
<li class="nav-item text-nowrap ms-2">
<a class="nav-link" href="logout.php">Wyloguj</a>
</li>
</ul>
</nav>
<div class="container-fluid">
<div class="row">
<nav id="sidebar" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
<div class="position-sticky pt-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">
<i class="bi bi-kanban"></i>
<span class="nav-link-text">Pulpit procesów</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link " href="calendar.php">
<i class="bi bi-calendar-event"></i>
<span class="nav-link-text">Kalendarz</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link collapsed" href="#settings-submenu" data-bs-toggle="collapse" aria-expanded="false">
<i class="bi bi-gear"></i>
<span class="nav-link-text">Ustawienia</span>
</a>
<ul class="nav flex-column collapse" id="settings-submenu" data-bs-parent="#sidebar">
<li class="nav-item submenu-item">
<a class="nav-link " href="event_types.php">
<i class="bi bi-tags"></i>
<span class="nav-link-text">Typy zdarzeń</span>
</a>
</li>
<li class="nav-item submenu-item">
<a class="nav-link " href="bni_groups.php">
<i class="bi bi-people"></i>
<span class="nav-link-text">Grupy BNI</span>
</a>
</li>
<li class="nav-item submenu-item">
<a class="nav-link " href="functions.php">
<i class="bi bi-person-rolodex"></i>
<span class="nav-link-text">Funkcje</span>
</a>
</li>
</ul>
</li>
</ul>
</div>
</nav>
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
<div class="d-flex justify-content-between align-items-center pt-3 pb-2 mb-3 border-bottom">
<h1 class="h2">Dashboard</h1>
<div class="btn-toolbar mb-2 mb-md-0">
<div class="btn-group me-2" id="bulk-actions-group" style="display: none;">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Bulk Actions
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#bulkStatusModal">Bulk Status Update</a></li>
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#bulkEventModal">Bulk Add Event</a></li>
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#bulkInitModal">Bulk Initialize Instances</a></li>
</ul>
</div>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#createPersonModal">
Create Person
</button>
</div>
</div>
<div class="mb-3">
<label class="form-label">Filter by Group:</label>
<div class="btn-group" role="group" aria-label="Group Filter">
<a href="index.php?group_id=" class="btn btn-outline-primary ">All Groups</a>
<a href="index.php?group_id=2" class="btn btn-outline-primary ">
Premium </a>
<a href="index.php?group_id=3" class="btn btn-outline-primary ">
Regio </a>
<a href="index.php?group_id=1" class="btn btn-outline-primary active-filter">
Target </a>
</div>
</div>
<div class="table-responsive">
<table class="table table-bordered table-sm">
<thead class="table-light">
<tr class="text-center">
<th rowspan="2" class="align-middle"><input type="checkbox" id="selectAll"></th>
<th rowspan="2" class="align-middle">Person</th>
<th colspan="4">Spotkania</th>
<th colspan="5">Inne procesy</th>
</tr>
<tr class="text-center">
<th>
Premium<br>
<small>22.01.2026</small>
</th>
<th>
Regio<br>
<small>15.01.2026</small>
</th>
<th>
Target<br>
<small>14.01.2026</small>
</th>
<th>Meeting Handling<br><small>11.01.2026</small></th>
<th class="">
<a href="index.php?group_id=1&active_process_id=4" class="text-decoration-none text-dark">Follow-up</a>
</th>
<th class="">
<a href="index.php?group_id=1&active_process_id=9" class="text-decoration-none text-dark">Obsługa przyjęcia nowego członka</a>
</th>
<th class="">
<a href="index.php?group_id=1&active_process_id=7" class="text-decoration-none text-dark">Wprowadzenie nowego członka</a>
</th>
<th class="">
<a href="index.php?group_id=1&active_process_id=6" class="text-decoration-none text-dark">Szkolenia dla młodego członka</a>
</th>
<th class="">
<a href="index.php?group_id=1&active_process_id=1" class="text-decoration-none text-dark">Mentoring</a>
</th>
</tr>
</thead>
<tbody>
<tr data-group-id="1">
<td class="text-center align-middle"><input type="checkbox" class="person-checkbox" name="person_ids[]" value="3"></td>
<td class="person-cell">
<div class="person-main">
<div class="person-name">Łukasz Jagliński</div>
<div class="person-details">
<span class="d-block">Jagliński sp. z o.o.</span>
<span class="d-block">Generalny wykonawca kubaturowy</span>
<span>Member</span>
<span class="person-group">, Grupa: Target</span>
</div>
</div>
<div class="person-actions">
<div class="status-dots">
<span class="status-dot bg-success" title="GAINS Sheet"></span>
<span class="status-dot bg-danger" title="Top Wanted Contacts"></span>
<span class="status-dot bg-danger" title="Top Owned Contacts"></span>
</div>
<button class="btn btn-sm btn-secondary edit-btn" data-bs-toggle="modal" data-bs-target="#editPersonModal" data-person-id="3" data-person-name="Łukasz Jagliński">
Edit
</button>
</div>
</td>
<td class="text-center align-middle">
</td>
<td class="text-center align-middle">
</td>
<td class="text-center align-middle">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="Status nieokreślony"></span>
</td>
<td class="text-center align-middle">
<span class="badge rounded-circle bg-success" style="width: 20px; height: 20px; display: inline-block; cursor: pointer;" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="3" data-meeting-id="1" data-modal-type="meeting_attendance">
</span>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="3" data-process-id="4">
<span class="badge rounded-circle bg-success" style="width: 20px; height: 20px; display: inline-block;" title="Positive">&nbsp;</span>
<small class="text-muted d-block">10/01/26</small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="3" data-process-id="9">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="3" data-process-id="7">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="3" data-process-id="6">
<span class="badge rounded-circle bg-success" style="width: 20px; height: 20px; display: inline-block;" title="Completed">&nbsp;</span>
<small class="text-muted d-block">10/01/26</small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="3" data-process-id="1">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
</tr>
<tr data-group-id="1">
<td class="text-center align-middle"><input type="checkbox" class="person-checkbox" name="person_ids[]" value="2"></td>
<td class="person-cell">
<div class="person-main">
<div class="person-name">Beata Norkowska</div>
<div class="person-details">
<span class="d-block">Elena Catering</span>
<span class="d-block">Catering i eventy</span>
<span>Member</span>
<span class="person-group">, Grupa: Target</span>
</div>
</div>
<div class="person-actions">
<div class="status-dots">
<span class="status-dot bg-danger" title="GAINS Sheet"></span>
<span class="status-dot bg-danger" title="Top Wanted Contacts"></span>
<span class="status-dot bg-danger" title="Top Owned Contacts"></span>
</div>
<button class="btn btn-sm btn-secondary edit-btn" data-bs-toggle="modal" data-bs-target="#editPersonModal" data-person-id="2" data-person-name="Beata Norkowska">
Edit
</button>
</div>
</td>
<td class="text-center align-middle">
</td>
<td class="text-center align-middle">
</td>
<td class="text-center align-middle">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="Status nieokreślony"></span>
</td>
<td class="text-center align-middle">
<span class="badge rounded-circle bg-success" style="width: 20px; height: 20px; display: inline-block; cursor: pointer;" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="2" data-meeting-id="1" data-modal-type="meeting_attendance">
</span>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="2" data-process-id="4">
<span class="badge rounded-circle bg-success" style="width: 20px; height: 20px; display: inline-block;" title="Positive">&nbsp;</span>
<small class="text-muted d-block">10/01/26</small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="2" data-process-id="9">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="2" data-process-id="7">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="2" data-process-id="6">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
<td class="text-center align-middle" data-bs-toggle="modal" data-bs-target="#instanceModal" data-person-id="2" data-process-id="1">
<span class="badge rounded-circle bg-secondary" style="width: 20px; height: 20px; display: inline-block;" title="None">&nbsp;</span>
<small class="text-muted d-block"></small>
</td>
</tr>
</tbody>
</table>
</div>
</main>
</div>
</div>
<!-- Edit Person Modal -->
<div class="modal fade" id="editPersonModal" tabindex="-1" aria-labelledby="editPersonModalLabel" aria-hidden="true">
<div class="modal-dialog modal-fullscreen-xl">
<div class="modal-content">
<form id="editPersonForm" action="_update_person.php" method="post" enctype="multipart/form-data">
<div class="modal-header">
<h5 class="modal-title" id="editPersonModalLabel">Edytuj osobę</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Zamknij"></button>
</div>
<div class="modal-body">
<input type="hidden" name="id" id="editPersonId">
<div class="row">
<div class="col-md-4">
<div class="mb-3">
<label for="editFirstName" class="form-label">Imię</label>
<input type="text" class="form-control" id="editFirstName" name="firstName" required>
</div>
<div class="mb-3">
<label for="editLastName" class="form-label">Nazwisko</label>
<input type="text" class="form-control" id="editLastName" name="lastName" required>
</div>
<div class="mb-3">
<label for="editPhone" class="form-label">Numer telefonu</label>
<input type="text" class="form-control" id="editPhone" name="phone">
</div>
<div class="mb-3">
<label for="editEmail" class="form-label">Email (login)</label>
<input type="email" class="form-control" id="editEmail" name="email">
</div>
<div class="mb-3">
<label for="editPassword" class="form-label">Nowe hasło</label>
<input type="password" class="form-control" id="editPassword" name="password">
<small class="form-text text-muted">Pozostaw puste, jeśli nie chcesz zmieniać hasła.</small>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="editRole" class="form-label">Rola</label>
<select class="form-select" id="editRole" name="role" required>
<option value="admin">Admin</option>
<option value="member">Członek</option>
<option value="guest">Gość</option>
<option value="team_member">Pracownik Biura</option>
</select>
</div>
<div class="mb-3" id="edit-group-selection-div" style="display: none;">
<label for="editBniGroup" class="form-label">Grupa</label>
<select class="form-select" id="editBniGroup" name="bni_group_id">
<option value="">Wybierz grupę...</option>
<option value="2">Premium</option>
<option value="3">Regio</option>
<option value="1">Target</option>
</select>
</div>
<div class="mb-3">
<label for="editRoles" class="form-label">Funkcje</label>
<select class="form-select" id="editRoles" name="functions[]" multiple size="5">
<!-- Opcje zostaną wstawione przez JavaScript -->
</select>
</div>
<div class="mb-3">
<label for="editCompanyName" class="form-label">Nazwa firmy</label>
<input type="text" class="form-control" id="editCompanyName" name="companyName">
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="editNip" class="form-label">NIP</label>
<input type="text" class="form-control" id="editNip" name="nip">
</div>
<div class="mb-3">
<label for="editIndustry" class="form-label">Branża</label>
<input type="text" class="form-control" id="editIndustry" name="industry">
</div>
<div class="mb-3">
<label for="editCompanySize" class="form-label">Wielkość firmy / Przychody</label>
<input type="text" class="form-control" id="editCompanySize" name="company_size_revenue">
</div>
<div class="mb-3">
<label for="editBusinessDescription" class="form-label">Opis działalności</label>
<textarea class="form-control" id="editBusinessDescription" name="business_description" rows="3"></textarea>
</div>
</div>
</div>
<div class="row member-only-fields" style="display: none;">
<hr class="mt-3">
<div class="col-md-6">
<h5>Pliki firmowe</h5>
<div class="mb-3">
<label for="editCompanyLogo" class="form-label">Logo firmy</label>
<input class="form-control" type="file" id="editCompanyLogo" name="company_logo">
<small id="editCompanyLogoPath" class="form-text text-muted"></small>
</div>
<div class="mb-3">
<label for="editPersonPhoto" class="form-label">Zdjęcie osoby</label>
<input class="form-control" type="file" id="editPersonPhoto" name="person_photo">
<small id="editPersonPhotoPath" class="form-text text-muted"></small>
</div>
</div>
<div class="col-md-6">
<h5>Dokumenty członkowskie</h5>
<div class="mb-3">
<label for="editGainsSheet" class="form-label">Arkusz GAINS</label>
<input class="form-control" type="file" id="editGainsSheet" name="gains_sheet">
<small id="editGainsSheetPath" class="form-text text-muted"></small>
</div>
<div class="mb-3">
<label for="editTopWanted" class="form-label">Lista TOP poszukiwanych kontaktów</label>
<input class="form-control" type="file" id="editTopWanted" name="top_wanted_contacts">
<small id="editTopWantedPath" class="form-text text-muted"></small>
</div>
<div class="mb-3">
<label for="editTopOwned" class="form-label">Lista TOP posiadanych kontaktów</label>
<input class="form-control" type="file" id="editTopOwned" name="top_owned_contacts">
<small id="editTopOwnedPath" class="form-text text-muted"></small>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Zamknij</button>
<button type="submit" class="btn btn-primary">Zapisz zmiany</button>
<button type="button" class="btn btn-danger ms-auto" id="deleteUserBtn" data-bs-toggle="modal" data-bs-target="#deletePersonModal">Usuń</button>
</div>
</form>
</div>
</div>
</div>
<!-- Create Person Modal -->
<div class="modal fade" id="createPersonModal" tabindex="-1" aria-labelledby="createPersonModalLabel" aria-hidden="true">
<div class="modal-dialog modal-fullscreen-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="createPersonModalLabel">Create Person</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="createPersonForm" action="_create_person.php" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-md-4">
<div class="mb-3">
<label for="createFirstName" class="form-label">First Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="createFirstName" name="firstName" required>
</div>
<div class="mb-3">
<label for="createLastName" class="form-label">Last Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="createLastName" name="lastName" required>
</div>
<div class="mb-3">
<label for="createPhone" class="form-label">Phone Number</label>
<input type="text" class="form-control" id="createPhone" name="phone">
</div>
<div class="mb-3">
<label for="createEmail" class="form-label">Email (Login) <span class="text-danger">*</span></label>
<input type="email" class="form-control" id="createEmail" name="email" required>
</div>
<div class="mb-3">
<label for="createPassword" class="form-label">Password <span class="text-danger">*</span></label>
<input type="password" class="form-control" id="createPassword" name="password" required>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="createRole" class="form-label">Rola</label>
<select class="form-select" id="createRole" name="role" required>
<option value="admin">Admin</option>
<option value="member" selected>Członek</option>
<option value="guest">Gość</option>
<option value="team_member">Pracownik Biura</option>
</select>
</div>
<div class="mb-3" id="create-group-selection-div">
<label for="createBniGroup" class="form-label">Grupa</label>
<select class="form-select" id="createBniGroup" name="bni_group_id">
<option value="">Wybierz grupę...</option>
<option value="2">Premium</option>
<option value="3">Regio</option>
<option value="1">Target</option>
</select>
</div>
<div class="mb-3">
<label for="createRoles" class="form-label">Funkcje</label>
<select class="form-select" id="createRoles" name="functions[]" multiple size="5">
<option value="1">Dyrektor Asystujący Regio</option>
<option value="2">Dyrektor Asystujący Target</option>
<option value="3">Dyrektor Asystujący Premium</option>
</select>
</div>
<div class="mb-3">
<label for="createCompanyName" class="form-label">Company Name</label>
<input type="text" class="form-control" id="createCompanyName" name="companyName">
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="createNip" class="form-label">NIP</label>
<input type="text" class="form-control" id="createNip" name="nip">
</div>
<div class="mb-3">
<label for="createIndustry" class="form-label">Branża</label>
<input type="text" class="form-control" id="createIndustry" name="industry">
</div>
<div class="mb-3">
<label for="createCompanySize" class="form-label">Wielkość firmy / Przychody</label>
<input type="text" class="form-control" id="createCompanySize" name="company_size_revenue">
</div>
<div class="mb-3">
<label for="createBusinessDescription" class="form-label">Opis działalności</label>
<textarea class="form-control" id="createBusinessDescription" name="business_description" rows="3"></textarea>
</div>
</div>
</div>
<div class="row member-only-fields" style="display: none;">
<hr class="mt-3">
<div class="col-md-6">
<h5>Pliki firmowe</h5>
<div class="mb-3">
<label for="createCompanyLogo" class="form-label">Logo firmy</label>
<input class="form-control" type="file" id="createCompanyLogo" name="company_logo">
</div>
<div class="mb-3">
<label for="createPersonPhoto" class="form-label">Zdjęcie osoby</label>
<input class="form-control" type="file" id="createPersonPhoto" name="person_photo">
</div>
</div>
<div class="col-md-6">
<h5>Dokumenty członkowskie</h5>
<div class="mb-3">
<label for="createGainsSheet" class="form-label">Arkusz GAINS</label>
<input class="form-control" type="file" id="createGainsSheet" name="gains_sheet">
</div>
<div class="mb-3">
<label for="createTopWanted" class="form-label">Lista TOP poszukiwanych kontaktów</label>
<input class="form-control" type="file" id="createTopWanted" name="top_wanted_contacts">
</div>
<div class="mb-3">
<label for="createTopOwned" class="form-label">Lista TOP posiadanych kontaktów</label>
<input class="form-control" type="file" id="createTopOwned" name="top_owned_contacts">
</div>
</div>
</div>
<button type="submit" class="btn btn-primary mt-3">Create Person</button>
</form>
</div>
</div>
</div>
</div>
<!-- Delete Person Modal -->
<div class="modal fade" id="deletePersonModal" tabindex="-1" aria-labelledby="deletePersonModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deletePersonModalLabel">Potwierdź usunięcie</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Zamknij"></button>
</div>
<div class="modal-body">
Czy na pewno chcesz usunąć użytkownika <strong id="personNameToDelete"></strong>? Tej operacji nie można cofnąć.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button>
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">Tak, usuń</button>
</div>
</div>
</div>
</div>
<!-- Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<!-- jQuery UI -->
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
<!-- Custom JS -->
<script src="assets/js/main.js?v=1768129608"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const sidebarLinks = document.querySelectorAll('#sidebar .nav-link');
const currentPath = window.location.pathname.split('/').pop();
sidebarLinks.forEach(link => {
const linkPath = link.getAttribute('href').split('/').pop();
if (linkPath === currentPath) {
link.classList.add('active');
} else {
link.classList.remove('active');
}
});
});
</script>
</body>
</html>
<!-- Instance Modal -->
<div class="modal fade" id="instanceModal" tabindex="-1" aria-labelledby="instanceModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="instanceModalLabel">Process Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<!-- Content will be loaded here via AJAX -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var instanceModal = document.getElementById('instanceModal');
instanceModal.addEventListener('show.bs.modal', function(event) {
var button = event.relatedTarget;
var personId = button.dataset.personId;
var modalType = button.dataset.modalType;
var modalBody = instanceModal.querySelector('.modal-body');
var modalTitle = instanceModal.querySelector('.modal-title');
if (modalType === 'meeting_attendance') {
var meetingId = button.dataset.meetingId;
modalTitle.textContent = 'Meeting Attendance';
fetch(`_get_meeting_attendance_details.php?personId=${personId}&meetingId=${meetingId}`)
.then(response => response.text())
.then(html => {
modalBody.innerHTML = html;
});
} else {
var processId = button.dataset.processId;
modalTitle.textContent = 'Process Details';
fetch(`_get_instance_details.php?personId=${personId}&processId=${processId}`)
.then(response => response.text())
.then(html => {
modalBody.innerHTML = html;
});
}
});
// Bulk actions
const selectAll = document.getElementById('selectAll');
const checkboxes = document.querySelectorAll('.person-checkbox');
const bulkActionsGroup = document.getElementById('bulk-actions-group');
function toggleBulkActions() {
const anyChecked = Array.from(checkboxes).some(c => c.checked);
bulkActionsGroup.style.display = anyChecked ? 'block' : 'none';
}
selectAll.addEventListener('change', function() {
checkboxes.forEach(c => c.checked = selectAll.checked);
toggleBulkActions();
});
checkboxes.forEach(c => c.addEventListener('change', toggleBulkActions));
// Pass selected people to modals
function setupBulkModal(modalId, hiddenInputId) {
const modal = document.getElementById(modalId);
modal.addEventListener('show.bs.modal', function() {
const selectedIds = Array.from(checkboxes).filter(c => c.checked).map(c => c.value);
document.getElementById(hiddenInputId).value = JSON.stringify(selectedIds);
});
}
setupBulkModal('bulkStatusModal', 'bulkStatusPersonIds');
setupBulkModal('bulkEventModal', 'bulkEventPersonIds');
setupBulkModal('bulkInitModal', 'bulkInitPersonIds');
// Populate edit person modal
const editPersonModal = document.getElementById('editPersonModal');
if (editPersonModal) {
editPersonModal.addEventListener('show.bs.modal', function(event) {
const button = event.relatedTarget;
const personId = button.getAttribute('data-person-id');
var personName = button.getAttribute('data-person-name');
var deleteBtn = document.getElementById('deleteUserBtn');
deleteBtn.dataset.personId = personId;
deleteBtn.dataset.personName = personName;
fetch('_get_person_details.php?id=' + personId)
.then(response => response.json())
.then(data => {
document.getElementById('editPersonId').value = data.person.id;
document.getElementById('editFirstName').value = data.person.firstName;
document.getElementById('editLastName').value = data.person.lastName;
document.getElementById('editEmail').value = data.person.email;
document.getElementById('editCompanyName').value = data.person.companyName;
document.getElementById('editPhone').value = data.person.phone;
document.getElementById('editRole').value = data.person.role;
document.getElementById('editBniGroup').value = data.person.bni_group_id || '';
document.getElementById('editNip').value = data.person.nip || '';
document.getElementById('editIndustry').value = data.person.industry || '';
document.getElementById('editCompanySize').value = data.person.company_size_revenue || '';
document.getElementById('editBusinessDescription').value = data.person.business_description || '';
document.getElementById('editCompanyLogoPath').textContent = data.person.company_logo_path || '';
document.getElementById('editPersonPhotoPath').textContent = data.person.person_photo_path || '';
document.getElementById('editGainsSheetPath').textContent = data.person.gains_sheet_path || '';
document.getElementById('editTopWantedPath').textContent = data.person.top_wanted_contacts_path || '';
document.getElementById('editTopOwnedPath').textContent = data.person.top_owned_contacts_path || '';
// Trigger change to show/hide group div and member-only fields
const editRoleSelect = document.getElementById('editRole');
editRoleSelect.dispatchEvent(new Event('change'));
const functionsSelect = document.getElementById('editRoles');
functionsSelect.innerHTML = ''; // Clear existing options
// Group functions by group_name
const groupedFunctions = data.all_functions.reduce((acc, func) => {
const groupName = func.group_name || 'Other';
if (!acc[groupName]) {
acc[groupName] = [];
}
acc[groupName].push(func);
return acc;
}, {});
// Populate select with optgroups
for (const groupName in groupedFunctions) {
const optgroup = document.createElement('optgroup');
optgroup.label = groupName;
groupedFunctions[groupName].forEach(func => {
const option = document.createElement('option');
option.value = func.id;
option.textContent = func.name;
if (data.person_functions.map(String).includes(String(func.id))) {
option.selected = true;
}
optgroup.appendChild(option);
});
functionsSelect.appendChild(optgroup);
}
});
});
}
// When the delete button in the edit modal is clicked, pass the data to the delete confirmation modal
document.getElementById('deleteUserBtn').addEventListener('click', function() {
var personId = this.dataset.personId;
var personName = this.dataset.personName;
var deletePersonModal = document.getElementById('deletePersonModal');
deletePersonModal.querySelector('#personNameToDelete').textContent = personName;
deletePersonModal.dataset.personId = personId;
});
// Populate delete person modal
var deletePersonModal = document.getElementById('deletePersonModal');
deletePersonModal.addEventListener('show.bs.modal', function(event) {
var button = event.relatedTarget;
if (button.id !== 'deleteUserBtn') {
var personId = button.dataset.personId;
var personName = button.dataset.personName;
document.getElementById('personNameToDelete').textContent = personName;
deletePersonModal.dataset.personId = personId;
}
});
document.getElementById('confirmDeleteBtn').addEventListener('click', function() {
let personIdToDelete = deletePersonModal.dataset.personId;
if (personIdToDelete) {
const formData = new FormData();
formData.append('person_id', personIdToDelete);
fetch('_delete_person.php', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
const modal = bootstrap.Modal.getInstance(deletePersonModal);
modal.hide();
if (data.success) {
window.location.reload();
} else {
let errorAlert = document.querySelector('.alert-danger');
let errorContainer = errorAlert.parentElement;
if (!errorAlert) {
errorContainer = document.querySelector('main'); // fallback
const alertHTML = `
<div class="alert alert-danger alert-dismissible fade show mt-3" role="alert">
${data.error}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>`;
errorContainer.insertAdjacentHTML('afterbegin', alertHTML);
} else {
errorAlert.innerHTML = `${data.error} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>`;
errorAlert.classList.remove('d-none');
}
}
})
.catch(error => {
console.error('Error:', error);
const modal = bootstrap.Modal.getInstance(deletePersonModal);
modal.hide();
});
}
});
// Handle role change for group visibility
const createRoleSelect = document.getElementById('createRole');
const createGroupDiv = document.getElementById('create-group-selection-div');
const createMemberOnlyFields = document.querySelector('#createPersonModal .member-only-fields');
createRoleSelect.addEventListener('change', function() {
const isMember = this.value === 'member';
createGroupDiv.style.display = isMember ? 'block' : 'none';
createMemberOnlyFields.style.display = isMember ? 'block' : 'none';
});
// Initial check
const isMemberCreate = createRoleSelect.value === 'member';
createGroupDiv.style.display = isMemberCreate ? 'block' : 'none';
createMemberOnlyFields.style.display = isMemberCreate ? 'block' : 'none';
const editRoleSelect = document.getElementById('editRole');
const editGroupDiv = document.getElementById('edit-group-selection-div');
const editMemberOnlyFields = document.querySelector('#editPersonModal .member-only-fields');
editRoleSelect.addEventListener('change', function() {
const isMember = this.value === 'member';
editGroupDiv.style.display = isMember ? 'block' : 'none';
editMemberOnlyFields.style.display = isMember ? 'block' : 'none';
});
});
</script>
<!-- Bulk Modals -->
<!-- Bulk Status Update Modal -->
<div class="modal fade" id="bulkStatusModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Bulk Status Update</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form action="_bulk_update_status.php" method="post">
<input type="hidden" name="person_ids" id="bulkStatusPersonIds">
<div class="mb-3">
<label class="form-label">Process</label>
<select name="process_id" class="form-select" required>
<option value="4">Follow-up</option>
<option value="9">Obsługa przyjęcia nowego członka</option>
<option value="7">Wprowadzenie nowego członka</option>
<option value="6">Szkolenia dla młodego członka</option>
<option value="1">Mentoring</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">New Status</label>
<select name="status" class="form-select" required>
<option value="none">None</option>
<option value="negative">Negative</option>
<option value="in_progress">In Progress</option>
<option value="positive">Positive</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Update Status</button>
</form>
</div>
</div>
</div>
</div>
<!-- Bulk Add Event Modal -->
<div class="modal fade" id="bulkEventModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Bulk Add Event</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form action="_bulk_add_event.php" method="post">
<input type="hidden" name="person_ids" id="bulkEventPersonIds">
<div class="mb-3">
<label class="form-label">Process</label>
<select name="process_id" class="form-select" required>
<option value="4">Follow-up</option>
<option value="9">Obsługa przyjęcia nowego członka</option>
<option value="7">Wprowadzenie nowego członka</option>
<option value="6">Szkolenia dla młodego członka</option>
<option value="1">Mentoring</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">Event Description</label>
<textarea name="description" class="form-control" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Add Event</button>
</form>
</div>
</div>
</div>
</div>
<!-- Bulk Initialize Instances Modal -->
<div class="modal fade" id="bulkInitModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Bulk Initialize Instances</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form action="_bulk_init_instances.php" method="post">
<input type="hidden" name="person_ids" id="bulkInitPersonIds">
<div class="mb-3">
<label class="form-label">Process</label> <select name="process_id" class="form-select" required>
<option value="4">Follow-up</option>
<option value="9">Obsługa przyjęcia nowego członka</option>
<option value="7">Wprowadzenie nowego członka</option>
<option value="6">Szkolenia dla młodego członka</option>
<option value="1">Mentoring</option>
</select>
</div>
<p>This will initialize this process for all selected people if it is not already initialized.</p>
<button type="submit" class="btn btn-primary">Initialize</button>
</form>
</div>
</div>
</div>
</div>