mirror of
https://github.com/Dvorinka/PPve.git
synced 2026-06-03 20:12:59 +00:00
Add files via upload
This commit is contained in:
@@ -302,7 +302,9 @@ func cleanPhoneNumber(phone string) string {
|
|||||||
func processContacts(contacts []Contact) *ContactData {
|
func processContacts(contacts []Contact) *ContactData {
|
||||||
var data ContactData
|
var data ContactData
|
||||||
for _, contact := range contacts {
|
for _, contact := range contacts {
|
||||||
if strings.Contains(contact.Name, "Interní") {
|
// Check if name contains "Interní" (case sensitive)
|
||||||
|
isInternal := strings.Contains(contact.Name, "Interní")
|
||||||
|
if isInternal {
|
||||||
data.InternalContacts = append(data.InternalContacts, contact)
|
data.InternalContacts = append(data.InternalContacts, contact)
|
||||||
} else {
|
} else {
|
||||||
data.Contacts = append(data.Contacts, contact)
|
data.Contacts = append(data.Contacts, contact)
|
||||||
|
|||||||
+7
-53
@@ -55,19 +55,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Filter Buttons -->
|
|
||||||
<div class="mb-6 flex flex-wrap gap-2">
|
|
||||||
<button onclick="filterByTable('all')" class="filter-btn active" data-filter="all">
|
|
||||||
Všechny kontakty
|
|
||||||
</button>
|
|
||||||
<button onclick="filterByTable(1)" class="filter-btn" data-filter="1">
|
|
||||||
Tabulka 1
|
|
||||||
</button>
|
|
||||||
<button onclick="filterByTable(2)" class="filter-btn" data-filter="2">
|
|
||||||
Tabulka 2
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Switcher -->
|
<!-- Switcher -->
|
||||||
<div class="flex items-center justify-center mb-8">
|
<div class="flex items-center justify-center mb-8">
|
||||||
<div class="inline-flex rounded-md shadow-sm" role="group">
|
<div class="inline-flex rounded-md shadow-sm" role="group">
|
||||||
@@ -139,9 +126,8 @@
|
|||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
let allContacts = [];
|
let currentData = {};
|
||||||
let filteredContacts = [];
|
let filteredContacts = [];
|
||||||
let currentTableFilter = 'all';
|
|
||||||
|
|
||||||
async function loadContacts() {
|
async function loadContacts() {
|
||||||
try {
|
try {
|
||||||
@@ -151,13 +137,12 @@
|
|||||||
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
currentData = await response.json();
|
||||||
allContacts = data.contacts || [];
|
|
||||||
|
|
||||||
hideLoading();
|
hideLoading();
|
||||||
showContactsList();
|
showContactsList();
|
||||||
|
|
||||||
updateStats(data);
|
updateStats(currentData);
|
||||||
filterContacts();
|
filterContacts();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading contacts:', error);
|
console.error('Error loading contacts:', error);
|
||||||
@@ -189,22 +174,12 @@
|
|||||||
|
|
||||||
function updateStats(data) {
|
function updateStats(data) {
|
||||||
const lastUpdated = new Date(data.last_updated).toLocaleString('cs-CZ');
|
const lastUpdated = new Date(data.last_updated).toLocaleString('cs-CZ');
|
||||||
const table1Count = allContacts.filter(c => c.table === 1).length;
|
|
||||||
const table2Count = allContacts.filter(c => c.table === 2).length;
|
|
||||||
|
|
||||||
document.getElementById('stats').innerHTML = `
|
document.getElementById('stats').innerHTML = `
|
||||||
<div class="flex flex-wrap items-center gap-4 text-sm">
|
<div class="flex flex-wrap items-center gap-4 text-sm">
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<span class="w-2 h-2 bg-green-500 rounded-full"></span>
|
<span class="w-2 h-2 bg-green-500 rounded-full"></span>
|
||||||
<span><strong>Celkem:</strong> ${allContacts.length} kontaktů</span>
|
<span><strong>Celkem:</strong> ${data.Contacts.length} kontaktů</span>
|
||||||
</div>
|
|
||||||
<div class="flex items-center gap-2">
|
|
||||||
<span class="w-2 h-2 bg-blue-500 rounded-full"></span>
|
|
||||||
<span><strong>Tabulka 1:</strong> ${table1Count}</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-center gap-2">
|
|
||||||
<span class="w-2 h-2 bg-purple-500 rounded-full"></span>
|
|
||||||
<span><strong>Tabulka 2:</strong> ${table2Count}</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<span class="w-2 h-2 bg-gray-400 rounded-full"></span>
|
<span class="w-2 h-2 bg-gray-400 rounded-full"></span>
|
||||||
@@ -214,41 +189,22 @@
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterByTable(tableNum) {
|
|
||||||
currentTableFilter = tableNum;
|
|
||||||
|
|
||||||
// Update filter buttons
|
|
||||||
document.querySelectorAll('.filter-btn').forEach(btn => {
|
|
||||||
btn.classList.remove('active');
|
|
||||||
if (btn.dataset.filter == tableNum) {
|
|
||||||
btn.classList.add('active');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
filterContacts();
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterContacts() {
|
function filterContacts() {
|
||||||
const query = document.getElementById('searchInput').value.toLowerCase().trim();
|
const query = document.getElementById('searchInput').value.toLowerCase().trim();
|
||||||
const activeBtn = document.querySelector('.switcher-btn.active');
|
const activeBtn = document.querySelector('.switcher-btn.active');
|
||||||
|
|
||||||
if (!activeBtn) {
|
if (!activeBtn) {
|
||||||
// Default to main contacts if no active button found
|
// Default to main contacts if no active button found
|
||||||
return displayContacts(allContacts.filter(c => !c.internal), query);
|
return displayContacts(currentData.Contacts, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
const activeTab = activeBtn.dataset.type;
|
const activeTab = activeBtn.dataset.type;
|
||||||
let contacts = [];
|
let contacts = [];
|
||||||
|
|
||||||
if (activeTab === 'main') {
|
if (activeTab === 'main') {
|
||||||
contacts = [...allContacts.filter(c => !c.internal)];
|
contacts = [...currentData.Contacts];
|
||||||
} else if (activeTab === 'internal') {
|
} else if (activeTab === 'internal') {
|
||||||
contacts = [...allContacts.filter(c => c.internal)];
|
contacts = [...currentData.InternalContacts];
|
||||||
}
|
|
||||||
|
|
||||||
// Apply table filter
|
|
||||||
if (currentTableFilter !== 'all') {
|
|
||||||
contacts = contacts.filter(contact => contact.table == currentTableFilter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply search filter
|
// Apply search filter
|
||||||
@@ -295,12 +251,10 @@
|
|||||||
function formatContactCard(contact, searchQuery) {
|
function formatContactCard(contact, searchQuery) {
|
||||||
const name = contact.name || 'Bez jména';
|
const name = contact.name || 'Bez jména';
|
||||||
const position = contact.position || '';
|
const position = contact.position || '';
|
||||||
const tableColor = contact.table === 1 ? 'bg-blue-100 text-blue-800' : 'bg-purple-100 text-purple-800';
|
|
||||||
|
|
||||||
return `<div class="contact-card bg-white p-6 rounded-lg border border-gray-200 hover:shadow-lg transition-all duration-200">
|
return `<div class="contact-card bg-white p-6 rounded-lg border border-gray-200 hover:shadow-lg transition-all duration-200">
|
||||||
<div class="flex items-start justify-between mb-3">
|
<div class="flex items-start justify-between mb-3">
|
||||||
<h3 class="font-bold text-gray-800 text-lg leading-tight">${highlightText(name, searchQuery)}</h3>
|
<h3 class="font-bold text-gray-800 text-lg leading-tight">${highlightText(name, searchQuery)}</h3>
|
||||||
<span class="text-xs ${tableColor} px-2 py-1 rounded-full font-medium flex-shrink-0 ml-2">T${contact.table}</span>
|
|
||||||
</div>
|
</div>
|
||||||
${position ? `<p class="text-gray-600 mb-4 text-sm leading-relaxed">${highlightText(position, searchQuery)}</p>` : ''}
|
${position ? `<p class="text-gray-600 mb-4 text-sm leading-relaxed">${highlightText(position, searchQuery)}</p>` : ''}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
|
|||||||
Reference in New Issue
Block a user