1. Sähköpostiviestien HTML renderöidään oikein (br, p, div, a, b, i jne.)
sen sijaan että tagit näkyisivät raakatekstinä. Sanitoi vaarallisen
sisällön (script, iframe, on*-attribuutit) pois turvallisesti.
2. Zammad-tiketeillä ei ole mailbox_id:tä, joten aiemmin valittiin aina
listan ensimmäinen (tuki@serverihuone.com). Nyt näytetään
"Valitse lähettäjä" placeholder kunnes käyttäjä valitsee oikean.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-refresh hakee nyt vain viimeisen synkkauksen jälkeen muuttuneet
tiketit (updated_at + 5min marginaali). Artikkelit haetaan vain
uusille tai muuttuneille tiketeille. "Hae postit" -nappi tekee
edelleen full syncin (full=true). Nopeuttaa autopäivitystä merkittävästi.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Auto-refresh synkkaa Zammadin taustalla ennen tikettien latausta
(joka minuutti tms. käyttäjän asetuksen mukaan).
2. Tikettiin vastatessa oletuksena valittuna se postilaatikko johon
viesti alun perin tuli — korjattu string/number vertailu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Hae postit -nappi ajaa nyt myös zammad_sync automaattisesti
sähköpostien haun jälkeen (ohitetaan hiljaa jos Zammad ei käytössä).
2. Kun suljettuun/ratkaistuun tikettiin tulee uusi viesti,
tiketti avautuu uudelleen "uusi"-tilaan (aiemmin "käsittelyssä").
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Zammad-ryhmät eivät näkyneet postilaatikoiden näkyvyydessä koska ne
haettiin tickets-globaalista joka on tyhjä ennen tiketti-tabin avaamista.
Lisätty ticket_zammad_groups API-endpoint joka hakee uniikit ryhmät
suoraan tietokannasta.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Aiheutti SyntaxError: Identifier 'showClosed' has already been declared,
joka kaatoi koko sivun (vain footer näkyi).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Normaalisti näytetään vain "X avointa tikettiä". Suljettujen määrä
tulee näkyviin suluissa vasta kun käyttäjä ruksaa Suljetut-checkboxin.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sivukoon valinta (25/50/100/250) toimii nyt - muuttaa TICKETS_PER_PAGE ja
renderöi tikettilistan uudelleen ensimmäiseltä sivulta.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Paginointi: 100 tikettiä/sivu, navigointipalkki sivujen välillä
- Filtterit resetoivat sivunumeron 1:ksi
- Select All valitsee vain nykyisen sivun tiketit
- Zammad-synkronointi tallentaa source=zammad ja zammad_group
- Postilaatikoiden näkyvyysasetuksissa Zammad-ryhmät (Zammad)-merkinnällä
- Zammad-ryhmien piilotus filtteröi tiketit samalla tavalla kuin postilaatikot
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Luotu Noxus SVG-logo (violetti heksagoni + N)
- Demo-yritys nimetty uudelleen Noxukseksi violetilla värillä
- API-tabi piilotettuna ellei yrityksellä ole integraatioita päällä
(superadmin näkee aina)
- check_auth palauttaa has_integrations-lipun
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Aiemmin loadCaptcha() ja checkAuth() kutsuttiin rinnakkain ilman awaitia,
jolloin ensimmäisellä kerralla (ei PHPSESSID-cookieta) kumpikin loi oman
sessionin. Captcha-vastaus tallentui eri sessioon kuin login-kutsu käytti.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Saatavuus-API kortti (API-avain, CORS, ohjeet) näkyy aina API-tabissa
- Telegram ja Zammad kortit näkyvät vain kun integraatio on päällä
- Korjattu puuttuva </div> Telegram-kortista (rikkoi Zammad-kortin sisäkkäisyyden)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Yritykset-tab: integraatio-checkboxit tallentavat vain enabled-tilan
- API-tab: Zammad/Saatavuus/Telegram kortit näkyvät kun integraatio päällä
- Zammad-asetukset (URL, token, ryhmät, synkronointi) kokonaan API-tabissa
- integration_save: tyhjä config ei ylikirjoita olemassaolevia asetuksia
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Integraatiot erillinen table-card yrityksen asetuksissa (vain superadmin)
- Zammad-konfiguraatio (URL, token, ryhmät, synkronointi) siirretty API-tabiin
- Saatavuus-API, Telegram ja Zammad kortit näkyvät API-tabissa kun integraatio on enabloitu
- Korjattu integration_save ja integration_test: puuttuva $input json_decode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Moduulit, integraatiot ja IP-rajoitukset piilotetaan yritysadminilta (vain superadmin näkee)
- Saatavuus-API ja Telegram checkboxit tallentavat tilan heti muutoksessa
- session_regenerate_id(false) estää race conditionin kirjautumisen jälkeen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- loadCompanyIntegrations() asettaa kaikkien checkboxien tilan
- Saatavuus-API ja Telegram checkboxit tallentavat tilan heti muutoksessa
- API-sivun kortit näkyvät/piiloutuvat integraatiotilan mukaan
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tiketin avaaminen ja listaan palaaminen viittasivat vanhoihin
ticket-rules-view/ticket-templates-view/ticket-settings-view
elementteihin jotka poistettiin alinavi-muutoksessa.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Vastauspohjat, Säännöt ja Asetukset siirretty omiksi alinaveikseen
tikettilistan overlay-napeista. Säännöt-välilehdelle lisätty
tikettityyppien hallinta (lisää/poista). Tyypit tallennetaan
tietokantaan yrityskohtaisesti ja populoidaan dynaamisesti
kaikkiin dropdown-valikoihin.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Drop zone dokumenttilistan alaosaan (raahaa tai klikkaa)
- Multi-file upload: luo dokumentit ja lataa tiedostot automaattisesti
- Edistymispalkki näyttää latauksen tilanteen
- Kansioiden raahaus: luo automaattisesti alikansio + tiedostot
- Kategoria-tunnistus tiedostopäätteen mukaan (kuva/muu)
- Multi-file input fallback perinteiselle tiedostovalinnalle
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lisää Gateway-sarake ja -valitsin NetAdmin-näkymään (devices-linkitys)
- VLAN ja IP näytetään IPAM:sta automaattisesti asiakkaan nimellä
- Muokkausmodaalissa asiakkaan IPAM VLANit/IP:t näkyvät ensimmäisinä
- DB: gateway_device_id LEFT JOIN devices, IPAM-enrichment API:ssa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rooli-sarakkeessa näytetään nyt vain valitun yrityksen rooli
- Ei enää tuplabadgeja jos käyttäjä on admin useassa yrityksessä
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Odota loadDocuments() (joka lataa customers-listan) ennen openDocCustomerFolder()-kutsua
- Estää ID:n näkymisen nimen sijasta kun sivu ladataan hashilla
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poistettu kokousmuistio-vaihtoehto kategoria-dropdownista
- Piilotetaan koko kategoria-kenttä kun luodaan/muokataan kokousmuistiota
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- loadDocuments() lataa nyt customers-listan jos se on tyhjä
- Kansionäkymä näyttää dokumenttien ja kokousmuistioiden määrät erikseen
- Korjaa tyhjä kansionäkymä kun Dokumentit-tab avataan ennen Asiakkaat-tabia
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Dokumentit-tab ei näytä kokousmuistioita (category !== kokousmuistio)
- Kokoukset-tab näyttää vain kokousmuistiot
- Poistettu kategoria-suodatin ja -sarake dokumenttilistasta
- Parannettu otsikot: näyttää asiakkaan nimen sub-tabin yhteydessä
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lisää customer_id sarake document_folders-tauluun (ALTER TABLE migraatio)
- dbLoadFolders() tukee nyt customer_id suodatusta
- dbSaveFolder() tallentaa customer_id:n kansioon
- API document_folders endpoint vastaanottaa customer_id parametrin
- JS: kansiot ladataan ja luodaan asiakaskohtaisesti (currentDocCustomerId)
- Jokaisen asiakkaan kansiorakenne on nyt itsenäinen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ohjeet → Asiakaspalvelu-tabin alle sub-tabiksi
- Laitetilat → Tekniikka-tabin alle sub-tabiksi
- Arkisto → Asiakkaat-tabin alle sub-tabiksi
- Päivitä hash-reititys ja vanhojen linkkien yhteensopivuus
- Lisää switchSupportSubTab() ja switchCustomerSubTab()
- Siivoa debug-logitukset laitetila-poistosta
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sijainnit (sites) ja Laitetilat olivat käytännössä sama asia.
Nyt kaikki hallitaan Laitetilat-välilehdeltä:
- DB-migraatio kopioi vanhat sites → laitetilat (sama ID säilyy)
- Laitteiden site_id päivitetty automaattisesti laitetila_id:ksi
- IPAM JOINaa nyt laitetilat-taulua sites:n sijaan
- Sijainnit sub-tab poistettu Tekniikasta
- Laiteformissa yksi "Sijainti / Laitetila" dropdown
- Sites API-endpointit poistettu (sites palauttaa laitetilat)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Korvattu select-dropdownit hakukentillä (searchable combobox)
- Kirjoittamalla suodattaa tuloksia nimellä, IP:llä, sijainnilla jne.
- Nuolinäppäimillä navigointi, Enter valitsee, Esc sulkee
- Vapaan tekstin syöttö mahdollista jos IPAM:sta ei löydy
- IP-kenttä tukee nyt myös verkkoja (subnet/prefix) IP-osoitteiden lisäksi
- Vapaat IP:t, varatut IP:t ja verkot ryhmitelty omiin osioihinsa
- Badge-värit: vihreä (vapaa), punainen (varattu), sininen (subnet)
- Sama hakukenttä-komponentti sekä netadmin-modalissa että asiakasformissa
- API palauttaa nyt subnetit IP-listan mukana
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poisto-nappi (🗑) näkyy kansion päällä hover-tilassa
- Vahvistusikkuna ennen poistoa
- Kansion dokumentit ja alikansiot siirtyvät ylätasolle poistettaessa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- NetAdmin liittymälomakkeen VLAN, Laite ja IP muutettu tekstikentistä dropdown-valikoiksi
- Asiakasformin liittymäkentät samoin muutettu dropdown-valikoiksi
- Dropdownit populoidaan IPAM:n VLANeista, IP-osoitteista ja Tekniikan laiterekisteristä
- IP-dropdown ryhmittelee vapaat ja varatut IP:t optgroupeilla
- Laite-dropdown näyttää ping-statuksen, hallintaosoitteen ja mallin
- VLAN-dropdown näyttää VLAN ID:n, nimen ja sijainnin
- Jos nykyinen arvo ei ole IPAM/laiterekisterissä, näytetään se (manuaalinen)-lisätekstillä
- IPAM-tilan automaattipäivitys: kun liittymälle asetetaan IP, IPAM merkitsee sen varatuksi
- Kun IP poistetaan tai vaihdetaan, vanha IP vapautetaan IPAM:ssa automaattisesti
- API palauttaa nyt vlans ja ips -listat netadmin_connections-endpointissa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poistettu Tiedostot-section, loadFiles-kutsu ja file-upload event listener
- Poistettu loadFiles() ja deleteFile() funktiot (formatFileSize jää käyttöön)
- Dokumentit-osio korvaa vanhan tiedostojärjestelmän versioituina dokumentteina
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poisto-nappi näkyy dokumentin luojalle (ei enää vain admin)
- API: document_delete sallii poiston adminille tai luojalle
- Uusi max_versions-sarake documents-tauluun (oletus 10)
- Versioiden automaattinen pruning: uuden version tallennuksen yhteydessä
poistetaan vanhimmat versiot jos yli max_versions (tiedostot levyltä myös)
- Valittavissa per dokumentti: 5, 10, 20, 50 tai rajaton
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Uusi dokumenttityyppi "kokousmuistio" jolla inline tekstieditori (ei tiedostopohjainen)
- document_versions.content -sarake kokousmuistioiden tekstin tallennukseen
- Sub-tabit Dokumentit-välilehdelle (Kaikki / Kokoukset) Tekniikka-mallin mukaan
- Kansiorakenne: document_folders-taulu, kansionavigaatio breadcrumbsilla
- Uudet API-endpointit: document_folders, document_folder_save/delete, document_content_save, document_move
- Asiakasprofiilin Dokumentit-osio: näyttää linkitetyt dokumentit + pikanapit luontiin
- Asiakasprofiilista voi avata dokumentin suoraan tai luoda uuden linkitettynä asiakkaaseen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kaikki kohdat jotka tarkistivat currentUser.role === 'admin' on päivitetty
käyttämään isCurrentUserAdmin()-funktiota, joka tarkistaa yrityskohtaisen
company_role-arvon. Korjaa mm. tehtävien lisäysnapin katoamisen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lisää role-sarake user_companies-tauluun (admin/user per yritys)
- Migraatio: kopioi vanhat admin-roolit user_companies-tauluun, muuta globaali admin → user
- Päivitä dbSaveUser/dbLoadUsers/dbGetUser/dbGetUserByUsername käsittelemään company_roles
- isCompanyAdmin() tarkistaa nyt yrityskohtaisen roolin (session company_role)
- requireAdmin() käyttää isCompanyAdmin():ia
- requireCompany() tarkistaa IP-rajoituksen (siirretty login/check_auth:sta)
- Login ei enää estä kirjautumista IP:n perusteella, vaan merkitsee ip_blocked
- check_auth näyttää kaikki yritykset, IP-estetyt merkitään ip_blocked:lla
- company_switch palauttaa company_role ja päivittää session
- Frontend: käyttäjälomakkeessa yrityskohtaiset rooli-dropdownit (admin/käyttäjä)
- Frontend: yritysvaihto päivittää admin-näkyvyyden company_rolen mukaan
- Frontend: yritysvalitsimessa IP-estetyt yritykset näkyvät "(IP-rajoitus)" -tekstillä
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
💡-nappi sivun alareunassa avaa kehitysehdotuslomakkeen suoraan
(navigoi todo/features-välilehdelle ja avaa uuden ehdotuksen).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Liittymärivin klikkaus avaa modal-ikkunan jossa voi muokata kaikkia
kenttiä (osoite, nopeus, VLAN, laite, portti, IP). Yhteysnopeus
muutettu dropdown-valikoksi sekä NetAdmin-modalissa että asiakkaan
liittymälomakkeessa. Vakionopeudet: 10/10 - 10000/10000.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Kokoaa kaikki asiakkaiden liittymät yhteen näkymään haulla ja suodattimilla.
Sarakkeet: asiakas, osoite, kaupunki, nopeus, VLAN, laite, portti, IP, hinta.
Suodattimet: kaupunki, nopeus, laite. Laitetietojen ping-status näkyvissä.
Klikkaus avaa asiakkaan muokkaukseen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>