Commit Graph

140 Commits

Author SHA1 Message Date
c4e7f45bca Korjaa allekirjoituksen valinta vastattaessa tiketteihin
Poistettu virheellinen fallback joka valitsi ensimmäisen satunnaisen
allekirjoituksen (esim. serverihuone.com) väärään tikettiin. Nyt
generoidaan oikea oletusallekirjoitus tiketin kontekstin perusteella
(käyttäjänimi + yritys + vastaanottava sähköposti + puhelin).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 01:47:58 +02:00
7a20345701 Lisää puhelinnumero yrityksen asetuksiin ja allekirjoituksiin
Puhelinnumero-kenttä yrityksen asetuksissa tallennetaan tietokantaan
ja näkyy automaattisesti kaikissa oletusallekirjoituksissa viimeisenä
rivinä (sekä SMTP- että Zammad-postilaatikoille).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 01:30:11 +02:00
a105ec7cd9 Oletusallekirjoitus kaikille postilaatikoille ja Zammad-sähköposteille
Jos käyttäjä ei ole vielä tallentanut allekirjoitusta, näytetään
oletuksena: Käyttäjänimi / Yrityksen nimi / sähköpostiosoite.
Toimii sekä IMAP/SMTP-postilaatikoille että Zammad-sähköposteille.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 01:18:58 +02:00
890b5d932e Lisää allekirjoitukset Zammad-sähköposteille
Asetukset-sivulla näytetään nyt myös Zammad-sähköpostiosoitteet
(esim. support@web1.fi) allekirjoitusten alla. Allekirjoitus liitetään
automaattisesti Zammad-vastauksiin. Tallennetaan avaimella
"zammad:email@osoite.fi". Uusi ticket_zammad_emails API-endpoint
hakee uniikit vastaanotto-osoitteet tietokannasta.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 01:12:38 +02:00
02a5c08164 Zammad-tiketit: vastaus Zammad API:n kautta + to-osoite + HTML-viestit
1. Zammad-tiketeille näytetään vastaanotto-osoite (esim. support@web1.fi)
   lähettäjäkentässä eikä SMTP-postilaatikkolistaa — vastaus menee
   Zammad API:n kautta.
2. Ensimmäisen artikkelin to-osoite tallennetaan zammad_to_email kenttään
   on-demand artikkelien haussa.
3. Korjattu _dbFetchRow → _dbFetchOne zammad_reply endpointissa.
4. sanitizeHtml() renderöi viestien HTML turvallisesti.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 01:06:43 +02:00
d3ab0d3e76 Korjaa HTML-renderöinti viesteissä + mailbox-valinta Zammad-tiketeille
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>
2026-03-13 01:00:19 +02:00
cbcfdaa2a3 Optimoi Zammad-sync: inkrementaalinen haku oletuksena
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>
2026-03-13 00:39:24 +02:00
ecc0b06ba5 Zammad-sync automaattisesti autopäivityksessä + mailbox-valinta korjaus
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>
2026-03-13 00:33:44 +02:00
8c950bbe8f Hae postit -nappi synkkaa myös Zammadin + suljettu tiketti avautuu uutena
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>
2026-03-13 00:19:51 +02:00
b9a76d76e5 Korjaa Zammad-ryhmien näkyvyys asetuksissa — hae API:sta eikä muistista
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>
2026-03-13 00:15:55 +02:00
909108ec30 Korjaa duplikaatti const showClosed -määrittely renderTickets-funktiossa
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>
2026-03-13 00:11:41 +02:00
053ad2f28e Näytä suljettujen tikettien määrä vain kun Suljetut-täppä valittu
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>
2026-03-13 00:03:10 +02:00
056de5054d Vaihda brändäys: Noxus Intra → Noxus HUB © Empor Oy 2026
Kaikki viittaukset "Noxus Intra" vaihdettu muotoon "Noxus HUB" koko
koodikannassa. Footer ja login-sivu näyttävät nyt "Noxus HUB © Empor Oy 2026".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 23:49:00 +02:00
dd9842abee Lisää sivukoon valinnan event listener tikettilistaukseen
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>
2026-03-12 23:46:13 +02:00
acbf10e570 Fix: puuttuva } renderTicketPagination-funktiossa
Aiheutti SyntaxError: Unexpected end of input → koko sivu tyhjä.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 23:38:49 +02:00
08bce71b5b Paginointi asiakaspalveluun + Zammad-ryhmät näkyvyysasetuksiin
- 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>
2026-03-12 23:20:25 +02:00
cc6e5c2653 Noxus-logo + API-tabi piiloon ilman integraatioita
- 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>
2026-03-12 23:14:17 +02:00
2e5d7e6865 Korjaa captcha: await checkAuth() ennen loadCaptcha() jotta jakavat saman session
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>
2026-03-12 22:05:59 +02:00
d6cbaff159 Korjaa API-tab: Saatavuus-API kortti näkyy aina, Telegram-kortin puuttuva sulkutagi
- 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>
2026-03-12 21:59:38 +02:00
bfa30009a9 Integraatiot: checkboxit vain päälle/pois Yrityksissä, kaikki asetukset API-tabissa
- 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>
2026-03-12 20:11:31 +02:00
4a46ce56f3 Zammad-asetukset API-välilehdelle, integraatio-checkboxit erilliseksi kortiksi, korjaa tyyppi puuttuu -virhe
- 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>
2026-03-12 20:00:36 +02:00
648cb949ac Superadmin-rajoitus: moduulit, integraatiot ja IP-asetukset vain pääkäyttäjälle + captcha-sessiokorjaus
- 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>
2026-03-12 19:49:57 +02:00
1ab669a490 Integraatiot yritystasolla: kaikki kolme tyyppiä (Zammad, Saatavuus-API, Telegram) latautuvat ja tallentuvat oikein
- 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>
2026-03-12 19:39:39 +02:00
fa8aaed11e Lisää Zammad-integraatio ja modulaarinen integraatiot-hallinta
- Uusi integrations-taulu tietokantaan (moduulimalli: type, enabled, config)
- ZammadClient-luokka: tiketit, artikkelit, vastaukset, ryhmät
- API-endpointit: integration_save, integration_test, zammad_sync, zammad_reply, zammad_groups
- Synkronointi: Zammad-tiketit → intran tiketit, artikkelit → viestit
- Vastaukset: Zammad-tiketteihin vastaus kulkee Zammad API:n kautta (→ O365)
- UI: Integraatiot-osio API-välilehdellä, toggle-kytkimet, Zammad-konfiguraatio
- tickets.zammad_ticket_id ja ticket_messages.zammad_article_id linkitys

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:25:51 +02:00
ef25748f03 Asiakaspalvelu: lisää "Vain omat" -suodatin tiketteihin
Suodattaa tiketit joissa assigned_to vastaa kirjautunutta käyttäjää.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:03:06 +02:00
386194659e Korjaa tiketti-näkymä: poista viittaukset poistettuihin overlay-diveihin
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>
2026-03-12 14:46:16 +02:00
656b5042e4 Asiakaspalvelu: alinavi-uudelleenjärjestely + tikettityyppien hallinta
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>
2026-03-12 12:52:54 +02:00
306dc6c5cc Automaattisäännöt: vastaanottaja-ehto, prioriteetti, abuse-tyyppi
- Lisää "Vastaanottaja sisältää" -ehto (to_contains) sääntöihin
- Lisää "Aseta prioriteetti" -toimenpide (set_priority)
- Lisää "Abuse" tikettityyppi
- Korjaa DB-schema: subject_contains, to_contains, enabled, set_priority, set_tags sarakkeet
- Parsii To-headerit sähköposteista säännön matchausta varten
- Mahdollistaa esim. abuse@-postien automaattisen tyypityksen ja prioriteetin

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 12:27:29 +02:00
c0b003c2f9 Dokumentit: drag & drop -tiedostolataus useille tiedostoille
- 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>
2026-03-12 11:24:04 +02:00
70bd095b24 NetAdmin: Gateway-kenttä, IPAM-integraatio VLAN/IP-tietoihin
- 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>
2026-03-12 11:09:52 +02:00
6c38ba7bcb Näytä käyttäjän rooli vain nykyisessä yrityksessä
- 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>
2026-03-12 10:54:10 +02:00
73a97d4e97 Korjaa asiakkaan nimi dokumentit-tabissa refreshin jälkeen
- 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>
2026-03-12 10:21:35 +02:00
1d6c477335 Poista kokousmuistio dokumenttien kategoriavalinnoista
- Poistettu kokousmuistio-vaihtoehto kategoria-dropdownista
- Piilotetaan koko kategoria-kenttä kun luodaan/muokataan kokousmuistiota

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 10:16:13 +02:00
474aa2cbce Korjaa dokumentit-tab: lataa asiakkaat automaattisesti
- 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>
2026-03-12 10:13:11 +02:00
86b8e42485 Lisää 'Kuva' dokumenttikategoria
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 10:08:39 +02:00
991c709257 Erota dokumentit ja kokousmuistiot omiin sub-tabeihin
- 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>
2026-03-12 10:06:56 +02:00
3fe45b217c Dokumenttikansiot asiakaskohtaisiksi
- 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>
2026-03-12 10:04:03 +02:00
711193e1ce Dokumentit: asiakaskohtaiset kansiot
- Dokumentit-tab näyttää ensin asiakaskansioruudukon (jokainen asiakas = oma kansio)
- Klikkaamalla asiakaskansiota → avaa asiakkaan dokumenttilista
- Takaisin-nappi palaa kansionäkymään
- Asiakas-sarake poistettu dokumenttitaulusta (tarpeeton kansiossa)
- Asiakas-dropdown piilotettu dokumentin luonnissa (valitaan automaattisesti)
- Hakukenttä asiakkaiden suodatukseen kansionäkymässä
- Kansiot järjestetty: ensin eniten dokumentteja, sitten aakkosittain
- URL hash tuki: #documents/customerId

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 09:57:56 +02:00
de384b5cb9 Siirrä Ohjeet, Laitetilat ja Arkisto alinaveihin
- 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>
2026-03-12 09:24:16 +02:00
fff4057912 Lisää debug-logitus laitetilan poistoon
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:31:21 +02:00
8e9fa76f9c Yhdistä Sijainnit ja Laitetilat samaksi konseptiksi
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>
2026-03-12 00:54:03 +02:00
13feb31304 Laitetilat: laitelinkit kortteihin + Sijainnit pois yritysasetuksista
Laitetila-laite-yhteys:
- Lisätty laitetila_id -sarake devices-tauluun
- Laite-lomakkeeseen uusi "Laitetila" dropdown (Tekniikka → Laitteet)
- Laitetila-kortit näyttävät laitemäärän ja laitechipit (max 4 + "+N muuta")
- Laitetilan detailnäkymässä taulukko tilan laitteista (nimi, tyyppi, malli, IP, ping)
- dbLoadLaitetilat palauttaa device_count ja devices-listan per laitetila

Yritysasetukset:
- Poistettu Sijainnit-osio yrityksen tiedoista (hallitaan Tekniikka → Sijainnit)
- Sijainnit sub-tab Tekniikassa pysyy ennallaan

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 00:39:45 +02:00
2cacea2a2c Liittymien VLAN/Laite/IP-kentät hakukentiksi + IP/verkko-tuki
- 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>
2026-03-12 00:29:05 +02:00
f913a87b14 Lisää kansion poisto -toiminto dokumenttien hallintaan
- 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>
2026-03-12 00:24:01 +02:00
7ed17c163f Liittymien VLAN/Laite/IP-kentät hakevat nyt tiedot IPAM:sta ja laiterekisteristä
- 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>
2026-03-12 00:20:42 +02:00
d9944922e9 Poista vanha Tiedostot-osio asiakasprofiilista (korvattu Dokumentit-osiolla)
- 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>
2026-03-12 00:01:16 +02:00
cb52dbfabe Dokumenttien poisto kaikille + versioiden säilytysrajoitus
- 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>
2026-03-11 23:35:50 +02:00
f40b387383 Dokumentit: kokousmuistiot, kansiorakenne, sub-tabit, asiakaslinkkaus
- 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>
2026-03-11 23:19:05 +02:00
150c774bb3 Siirrä allekirjoitukset Asiakaspalvelu-välilehdelle + postilaatikoiden piilotus
- Uusi "Omat asetukset" -näkymä Asiakaspalvelu-tabiin (allekirjoitukset + mailbox-näkyvyys)
- Uusi user_hidden_mailboxes-taulu piilotettavien postilaatikoiden tallennukseen
- API: profile_update + check_auth tukevat hidden_mailboxes-listaa
- Tikettilista suodattaa piilotettujen mailboxien tiketit automaattisesti
- Reply-formin mailbox-dropdown piilottaa piilotetut postilaatikot
- Allekirjoitukset poistettu Oma profiili -modalista (siirretty Asiakaspalvelu-asetuksiin)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 22:33:38 +02:00
5d17381f58 Korjaa admin-roolitarkistukset käyttämään isCurrentUserAdmin()
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>
2026-03-11 21:20:16 +02:00