diff --git a/kontakt/contact-scrape.go b/kontakt/contact-scrape.go
index 4805f88..5ec71b5 100644
--- a/kontakt/contact-scrape.go
+++ b/kontakt/contact-scrape.go
@@ -195,19 +195,15 @@ func parseExcelFile(filename string) ([]Contact, error) {
var contacts []Contact
// Parse first table (A-D columns)
- contacts = append(contacts, parseTable(f, sheetName, "A", "D", 1)...)
-
- // Parse second table (F-H columns)
- contacts = append(contacts, parseTable(f, sheetName, "F", "H", 2)...)
+ contacts = append(contacts, parseTable(f, sheetName)...)
return contacts, nil
}
-func parseTable(f *excelize.File, sheetName, startCol, endCol string, tableNum int) []Contact {
+func parseTable(f *excelize.File, sheetName string) []Contact {
var contacts []Contact
var currentContact *Contact
- // Get all rows in the sheet
rows, err := f.GetRows(sheetName)
if err != nil {
log.Printf("Error getting rows: %v", err)
@@ -221,48 +217,23 @@ func parseTable(f *excelize.File, sheetName, startCol, endCol string, tableNum i
return nil
}
- // Column indices
- const (
- nameCol = 0
- phoneCol = 2
- servicePhoneCol = 3
- mobileKlapkaCol = 4
- )
-
for i := startRow; i < endRow; i++ {
row := rows[i]
-
- // Skip if row is too short
- if len(row) <= nameCol {
+ if len(row) < 5 { // Ensure we have all required columns
continue
}
- // Check for "Aktualizace" - end of data
- if len(row) > nameCol && strings.Contains(strings.ToLower(row[nameCol]), "aktualizace") {
- break
- }
-
- // Check for special formatting rows (like "*02(xx)")
- if len(row) > 1 && strings.Contains(row[1], "*") {
- continue
- }
-
- // Get values from columns (new structure: name, position, phone, service phone, mobile)
name := strings.TrimSpace(row[0])
position := strings.TrimSpace(row[1])
phone := strings.TrimSpace(row[2])
servicePhone := strings.TrimSpace(row[3])
- mobileKlapka := ""
- if len(row) > 4 {
- mobileKlapka = strings.TrimSpace(row[4])
- }
+ mobileKlapka := strings.TrimSpace(row[4])
// Clean phone numbers
phone = cleanPhoneNumber(phone)
servicePhone = cleanPhoneNumber(servicePhone)
- // If we have a name, create new contact
- if name != "" && !strings.Contains(name, "(") {
+ if name != "" {
currentContact = &Contact{
Name: name,
Position: position,
diff --git a/kontakt/index.html b/kontakt/index.html
index 312dcce..90ad4dc 100644
--- a/kontakt/index.html
+++ b/kontakt/index.html
@@ -55,6 +55,19 @@
+
+
+
+
+
+
+
@@ -216,26 +229,52 @@
}
function filterContacts() {
- const query = document.getElementById('searchInput').value.toLowerCase().trim();
+ const searchQuery = document.getElementById('searchInput').value.toLowerCase();
- // Apply table filter
- let contacts = allContacts;
- if (currentTableFilter !== 'all') {
- contacts = contacts.filter(contact => contact.table == currentTableFilter);
+ fetch('/api/contacts')
+ .then(response => response.json())
+ .then(data => {
+ // Filter both main and internal contacts
+ const filteredMain = data.contacts.filter(contact =>
+ contact.name.toLowerCase().includes(searchQuery) ||
+ (contact.position && contact.position.toLowerCase().includes(searchQuery)) ||
+ (contact.phone && contact.phone.toLowerCase().includes(searchQuery)) ||
+ (contact.service_phone && contact.service_phone.toLowerCase().includes(searchQuery))
+ );
+
+ const filteredInternal = data.internal_contacts.filter(contact =>
+ contact.name.toLowerCase().includes(searchQuery) ||
+ (contact.position && contact.position.toLowerCase().includes(searchQuery)) ||
+ (contact.phone && contact.phone.toLowerCase().includes(searchQuery)) ||
+ (contact.service_phone && contact.service_phone.toLowerCase().includes(searchQuery))
+ );
+
+ // Update display with filtered results
+ displayFilteredResults(filteredMain, filteredInternal, searchQuery);
+ })
+ .catch(error => {
+ console.error('Error:', error);
+ });
+ }
+
+ function displayFilteredResults(mainContacts, internalContacts, searchQuery) {
+ const mainDiv = document.getElementById('contacts');
+ const internalDiv = document.getElementById('internal-contacts');
+
+ mainDiv.innerHTML = mainContacts.map(contact =>
+ formatContactCard(contact, searchQuery)
+ ).join('');
+
+ internalDiv.innerHTML = internalContacts.map(contact =>
+ formatContactCard(contact, searchQuery)
+ ).join('');
+
+ // Show/hide no results message
+ if (mainContacts.length === 0 && internalContacts.length === 0) {
+ document.getElementById('noResults').classList.remove('hidden');
+ } else {
+ document.getElementById('noResults').classList.add('hidden');
}
-
- // Apply search filter
- if (query) {
- contacts = contacts.filter(contact =>
- (contact.name && contact.name.toLowerCase().includes(query)) ||
- (contact.position && contact.position.toLowerCase().includes(query)) ||
- (contact.phone && contact.phone.replace(/\s/g, '').includes(query.replace(/\s/g, ''))) ||
- (contact.service_phone && contact.service_phone.replace(/\s/g, '').includes(query.replace(/\s/g, '')))
- );
- }
-
- filteredContacts = contacts;
- displayContacts(filteredContacts, query);
}
function highlightText(text, query) {
@@ -244,28 +283,6 @@
return text.replace(regex, '$1');
}
- function displayContacts(contacts, searchQuery = '') {
- const mainContacts = contacts.filter(contact => !contact.internal);
- const internalContacts = contacts.filter(contact => contact.internal);
-
- const mainContactsDiv = document.getElementById('contacts');
- const internalContactsDiv = document.getElementById('internal-contacts');
-
- mainContactsDiv.innerHTML = mainContacts.map(contact =>
- formatContactCard(contact, searchQuery)
- ).join('');
-
- internalContactsDiv.innerHTML = internalContacts.map(contact =>
- formatContactCard(contact, searchQuery)
- ).join('');
-
- if (mainContacts.length === 0 && internalContacts.length === 0) {
- document.getElementById('noResults').classList.remove('hidden');
- } else {
- document.getElementById('noResults').classList.add('hidden');
- }
- }
-
function formatContactCard(contact, searchQuery) {
const name = contact.name || 'Bez jména';
const position = contact.position || '';