Commit Graph

34 Commits

Author SHA1 Message Date
68ee03ba21 Add error handling to API for better debugging on Plesk
- writeData now returns JSON error if file write fails
- Global error/exception handler returns JSON instead of blank 500

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:33:54 +02:00
30d57c80c0 Add user list to admin panel and validated/guest badges on posts
Admin panel: new "Käyttäjät" section showing all registered users with
post count, likes count, email and join date.

Posts: submissions by logged-in users show a green "Vahvistettu" badge,
while guest submissions show a random code (e.g. #L01U51) for tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:02:50 +02:00
69902035ab Add bot protection (honeypot + captcha) to registration form
Same spam protection as the post submission and comment forms:
hidden honeypot field and a simple math captcha question.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:53:40 +02:00
5d02a682b0 Switch dev server from Python to PHP built-in server
The Python SimpleHTTPRequestHandler served api.php as a static file
instead of executing it, breaking registration, login and all API calls.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:50:31 +02:00
dcc1205244 Restore contact form and make it functional with email sending
- Replace mailto link with original contact form (name, email, message fields)
- Add contact API endpoint that sends email via mail() and saves to messages.json
- Restore .contact-form CSS styles and translation keys

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:28:26 +02:00
5dfbbacf39 Add user registration/login, persistent likes, category hiding, and contact email
- User auth: register (nickname + password + email), login, logout with PHP sessions
- Persistent likes: logged-in users' likes saved to users.json, anonymous via session
- "Tykkäämäni" filter button next to search — filter liked posts, combinable with search
- Hide empty/sparse categories from filter buttons until posts exist
- Replace broken contact form with simple mailto link (info@tykkaa.fi)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:08:22 +02:00
f14913cb4b Add 19 example posts to fill empty and sparse subcategories
Covers all previously empty subcategories:
kasityot/muut, puutarha/muut, sisustus/tekstiilit,
kirjat/tietokirjat, hyvinvointi/muut

Adds a 2nd post to thin subcategories:
kasityot/ommelu + askartelu, puutarha/kukat,
sisustus/diy + valaistus, kirjat/romaanit,
hyvinvointi/uni, lemmikit/koirat + kissat

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:51:45 +02:00
da6654638a Make entire post card clickable to open post
Clicking anywhere on a card opens the post modal. Like button and
like count have stopPropagation so they work independently. Added
cursor:pointer to card for visual affordance.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:39:23 +02:00
af55297452 Add image lightbox — click gallery image to view full-screen
Clicking any image in a post modal opens it full-screen with a dark
overlay. Close by clicking outside, the ✕ button, or pressing Escape.
Added zoom-in cursor and hover opacity to signal clickability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:36:40 +02:00
7bb5924cf6 Remove recipe/post toggle — auto-detect type from category selection
When user selects Reseptit category, recipe fields (time, servings,
ingredients, steps) appear automatically. All other categories show
the post body field instead. Removed the manual toggle buttons and
cleaned up related CSS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:33:22 +02:00
844e5c338b Restructure categories: merge knitting→käsityöt, kasvit→puutarha, remove matkustus & tips categories
- All 9 neulominen posts moved from 'knitting' to 'kasityot' with subcategory ['neulominen']
- crochet_basket moved to 'kasityot' with subcategory ['virkkaus']
- 3 kasvit posts moved to 'puutarha' with matching subcategories
- 3 matkustus posts (travel_lapland, travel_tallinn, travel_saaristo) removed
- 5 tips posts moved to 'hyvinvointi' (mieli/arki) or 'puutarha' (tip_balcony_garden)
- Added POST_CATEGORY_MAP constant for automatic live-server migration
- getOrInitPosts() now auto-migrates old category references and drops matkustus posts
- Updated code section comments to reflect new structure

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:27:44 +02:00
6be4414da5 Lisää 8 uutta kategoriaa ja esimerkkipostaukset (2-4 per kategoria)
Kategoriat: Käsityöt ✂️, Puutarha 🌱, Sisustus 🏠, Kirjat 📚,
            Hyvinvointi 🧘, Lemmikit 🐾, Kasvit 🪴, Matkustus ✈️
- Jokaisessa 2–4 esimerkkipostausta, yhteensä 26 uutta
- Tekijänimet vähennetty 5:een: Maija-Liisa, Tiina K., Riitta H., Sinikka, Pekka
- Pekka vain resepteissä (bolognese, lihapullat, karjalanpaisti)
- getOrInitCategories() lisää uudet kategoriat automaattisesti live-serverille

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:11:49 +02:00
8c7396304b Poistetaan hero-osio: mennään suoraan headerista julkaisuihin
- Poistettu hero-section HTML:stä
- Poistettu hero-tyylit CSS:stä
- Headerin ja controlsin padding tiivistetty
- CSS cache-busting v3

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:42:00 +02:00
1e2d93e6e6 CSS cache-busting: style.css?v=2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:35:53 +02:00
22a03c10a0 Alikategoria-parannukset: monivalinta, Muut-kategoria, emoji pois administa
- api.php: lisätään 'Muut'-alikategoria Resepteihin, Neulomiseen ja Vinkkeihin
- api.php: getOrInitCategories() lisää puuttuvat alikategoriat automaattisesti
- admin.html: poistetaan emoji-kenttä (emoji tulee kategoriasta automaattisesti)
- admin.html: alikategoriat checkboxeina → voi valita useamman samanaikaisesti
- script.js: subcategory tallennetaan aina taulukkona
- script.js: filterPosts tukee pilkulla eroteltuja alikategorioita (postSubs.includes)
- script.js: renderCards kirjoittaa subcategory-arrayn pilkulla eroteltuna data-attribuuttiin

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:30:10 +02:00
993a137508 Korjaa alikategoria-ongelmat
- api.php: getOrInitCategories() päivittää automaattisesti subcategories-kentän
  olemassaolevaan categories.json-tiedostoon ilman manuaalista seedausta
- index.html: alikategoria-valitsin julkaisulomakkeeseen (näkyy kun kategorialla on alikategoriat)
- script.js: subcategory tallennetaan uuteen julkaisuun
- script.js: filterPosts null-turva + hakukenttä etsii myös alikategoria-id:llä
- script.js: updateSubcategoryPicker() päivittää alikategoriat kategorian vaihtuessa

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:24:24 +02:00
88e17d2b92 Hero-teksti takaisin vanhaan tyyliin, lisätty 'Jaa ja löydä' alkuun
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:18:00 +02:00
ebffa64111 Tekstit yhteisöhenkisiksi: ei enää oma blogi vaan avoin yhteisö
- Tagline: "Jaa asioita joista tykkäät"
- Hero: kuka tahansa voi jakaa
- About: avoin yhteisö kaikille
- Footer: "Avoin yhteisö kaikille"
- About-emoji 👩‍🍳🤝

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:15:23 +02:00
f41eaf72cb Logo 2x isommaksi: font-size 20px → 40px
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 08:12:28 +02:00
60065ac9ef Minecraft-pikselilogo: Press Start 2P Google Font
Vaihdetaan SVG-img-lähestymistapa HTML+CSS-lähestymistapaan, jolloin
fontti latautuu luotettavasti. SVG:nä ladattu kuva ei voi käyttää
sivun ulkoisia fontteja.

- index.html: lisätty Press Start 2P Google Fonts link;
  logo-h1 käyttää pixel-logo-luokkaa (♥tykkää.fi)
- style.css: .pixel-logo fontti+koko+varjo, .logo-heart oranssi,
  .logo-fi cream-väri + pienempi koko

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:54:11 +02:00
416db62e5c Logo, emoji pois lomakkeesta, alikategoria-bugifi
- logo.svg: SVG-tekstilogo (sydän + tykkää kursiivillaa + .fi cream)
  korvaa emoji+h1-yhdistelmän; .logo-svg CSS-luokka headeriin
- index.html: emoji-kenttä poistettu julkaisulomakkeesta;
  kategoria-select ilman erillistä paria
- script.js: emoji haetaan automaattisesti kategoriasta, ei lomakkeen
  kentästä; sub-emoji poistettu reset-listalta
- api.php: seed_categories-toiminto päivittää categories.json:n
  uusilla subcategories-tiedoilla
- admin.html: seedPosts() kutsuu myös seed_categories ensin →
  alikategoriat toimivat nyt heti "Lataa esimerkkisisältö" -napin jälkeen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:52:09 +02:00
f98aa72ca0 Alikategoriat: välilehdet kategorian alla
- defaultCategories(): subcategories-kenttä jokaisella kategorialla
  (reseptit: kasvis/vegaaniset/jälkiruuat, neulominen: aloittelijoille/
  vaatteet/kodin tekstiilit)
- 30 julkaisua merkitty subcategory-kentällä
- script.js: currentSubFilter-tila, setSubFilter(), renderSubFilters()
  renderöi alafiltterit kun kategoria on valittu; filterPosts() ottaa
  molemmat filtterit huomioon; cards saavat data-subcategory-attribuutin
- index.html: #subCategoryFilters-div kategoriafilttereiden alle
- style.css: .sub-filter-btn -tyyli (pienempi, tummanharmaa aktiiviasennossa)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:43:50 +02:00
5fa93a49ad Kopioi ostoslista -nappi + tykkäysten localStorage-muisti
- Ainesluettelon vieressä 'Kopioi ostoslista' -nappi: kopioi
  julkaisun nimen ja ainesosat ostoslistamuodossa leikepöydälle
- Tykkäykset tallennetaan localStorage:en — muistetaan vaikka
  PHP-sessio vanhenisi (selain muistaa oman tykkäyshistoriansa)
- Latauksessa yhdistetään server-sessio ja localStorage

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:39:36 +02:00
4c5b275225 30 julkaisua oletussisältönä, seed-toiminto adminiin
- 17 reseptiä (letut, bolognese, keksit, kasviskeitto, banaanileipä,
  lohikeitto, korvapuustit, mansikkarahka, porkkana-inkiväärikeitto,
  pizza, mustikkapuuro, kanarisotto, mustikkapiirakka, avokadopasta,
  lihapullat, kukkakaalikeitto, karjalanpaisti)
- 9 neulomis-/virkkausohjetta
- 4 vinkkijulkaisua
- "Admin"-tekijät vaihdettu suomalaisiin nimimerkkeihin
- seed_posts-API-toiminto kirjoittaa oletussisällön posts.json:iin
- "Lataa esimerkkisisältö" -nappi admin-headerin oikeaan yläkulmaan

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:37:31 +02:00
bd01662032 Vaihda mime_content_type → getimagesize, lisää testiendpoint
mime_content_type() vaatii fileinfo-laajennuksen joka ei ehkä ole
käytössä Pleskissä → PHP kaatuu fatal erroriin → HTTP 500 tyhjä body.
getimagesize() on osa GD-kirjastoa, lähes aina saatavilla.

Testiendpoint: upload.php?test kertoo onko PHP käynnissä ja mitkä
laajennukset on saatavilla.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:22:44 +02:00
bb9541d526 Parempi virheenkäsittely uploadissa: näytä palvelimen tarkka vastaus
- upload.php: ob_start()+error_reporting(0) estää PHP-varoitusten
  sekoittumisen JSON-vastaukseen; ob_clean() ennen jokaista echoa
- script.js + admin.html: lue vastaus ensin tekstinä, yritä sitten
  JSON-parsinta ja näytä tarkka virheviesti (HTTP-koodi + raakavastaus)
  jos JSON ei onnistu

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:20:20 +02:00
a1a7a2167f Näytä tarkka virheviesti uploadissa 2026-03-08 01:15:51 +02:00
9236aee4a2 Paremmat virheilmoitukset uploadissa, korjaa 8MB→20MB teksti 2026-03-08 01:13:02 +02:00
9872093fb7 Nosta uploadraja 8 MB → 20 MB 2026-03-08 01:09:07 +02:00
d380884248 Automaattinen kuvanpienennys ja paremmat virheilmoitukset uploadissa 2026-03-08 01:06:45 +02:00
2def3d2c3e Lisää hakukenttä admin-julkaisulistaan 2026-03-08 01:02:33 +02:00
Jukka Lampikoski
1cb1c9c6ad Poista englanninkieliset tekstit admin-paneelista 2026-03-08 01:00:28 +02:00
Jukka Lampikoski
ae343212da Vaihda admin-salasana 2026-03-08 00:57:31 +02:00
Jukka Lampikoski
4248e69ab7 Initial commit: tykkää.fi sivusto
- Julkaisualusta resepteille, neuloville, vinkeille
- PHP-backend (api.php) palvelinpuolen datalle
- Admin-paneeli salasanasuojauksella
- Kuvaupload (upload.php)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 00:20:17 +02:00