# Florial CHANGELOG — consumer upgrade notes

> **Standartinis update (VISADA tinka, leidžiamas kiekvieną deploy):**
>
> ```bash
> composer update
> php artisan migrate --force
> php artisan florial:upgrade --force
> php artisan themes:publish-assets
> php artisan vendor:publish --tag=package-assets --force
> php artisan optimize
> ```
>
> `florial:upgrade` yra **idempotentinis** ir absorbuoja beveik viską, ką dev serverio
> užduotys prideda: naujus permission'us / role'es (per `cms:sync-permissions`),
> naujus baseline seeder'ius, temų eilutes ir per-aplinkos temų default'us.
> Migracijas paima atskiras `migrate --force` (bėga PRIEŠ upgrade — schema turi
> egzistuoti anksčiau nei ją liečia seeder'iai).
>
> **Žemiau — TIK žingsniai, kurių ta komanda NEabsorbuoja** (naujas `.env`,
> Satis rebuild, breaking change, vienkartinis turinio seed'as). Jei užduoties čia
> nėra — vadinasi, standartinio update pakanka.

---

## task-107 — consumer deps + `deploy:sync` Florial žingsnis

- **Naujų `require` NEATSIRADO.** Dep-auditas (`.claude/tools/florial-dep-audit.php`,
  praplėstas trimis aptikimo sluoksniais) patvirtino, kad visi 12 Florial paketų
  deklaruoja viską, ką naudoja HARD; likusios 23 cross-paketo nuorodos yra task-95
  soft-ref'ai (string const + runtime resolve). **`composer update` dėl šito task'o
  NEPRIVALOMAS** — bet lieka privalomas dėl task-106 (`va-modules/menus`).
- ⚠️ **`deploy:sync` (`composer sync`) dabar pats leidžia `florial:upgrade --force`.**
  Host'ams, naudojantiems `composer sync`, atskiro rankinio žingsnio nebereikia.
  Consumer'io Forge skriptas nesikeičia (jis komandą kviečia eksplicitiškai) — dvigubas
  paleidimas nekenkia, komanda idempotentinė. **Keičiasi `va-core/core`** → foundation
  train'as tag'inamas PIRMAS, tik tada florial.
- ⚠️ **`florial:upgrade` nebeperima `web` numatytosios temos**, jei ją jau turi kita
  ĮDIEGTA tema. Vieno produkto install'e (ofisai) elgsena nepakito — kitos web temos ten
  neįdiegtos. Multi-produkto host'e tai apsauga: be jos kiekvienas `composer sync` būtų
  tyliai atėmęs `/` iš esamos temos. Kabinetų default'ai perimami kaip anksčiau.

## task-106 — DB-valdomas nav + footer

- ⚠️ **`.env`:** pridėk `MENUS_DB_DRIVEN=true`. Be jo viešas nav + footer lieka blade
  fallback'e ir **`/admin/menus` redagavimas ekrane nieko nekeičia** (tylus no-op, kuris
  skaitosi kaip sugedęs admin ekranas). Platformos default'as yra `false`, nes jis
  bendras visoms temoms — todėl jį įjungti reikia per consumer'io `.env`.
- ⚠️ **`composer update` PRIVALOMAS** — tema dabar deklaruoja naują priklausomybę
  `va-modules/menus` (iki šiol ji buvo naudojama nedeklaruota).
- ⚠️ **Vienkartinai:** `php artisan florial:upgrade --with-content --force` — jis užsėja
  naują **`web.footer`** meniu (Paslaugos · Pagalba · teisinė eilutė) ir perseed'ina
  `web.main` su per-locale nuorodomis. Be šito žingsnio footer'is toliau render'ins
  blade fallback'ą (t. y. atrodys taip pat, tik nebus redaguojamas).
- `php artisan florial:activate` nuo dabar ĮSPĖJA, jei `MENUS_DB_DRIVEN` išjungtas.
- Sekantis standartinis update (`themes:publish-assets` + `optimize`) yra būtinas —
  pasikeitė `components.css` (teisinės eilutės nuorodų stiliai).

## task-100 — demo-preview panelė + demo slaptažodis

- `/login` nebeturi „— ARBA DEMO PERŽIŪRA —" bloko su 4 kabinetų nuorodomis (ofisai
  prototipo UI, rodytas kiekvienam svečiui). Kabinetai pasiekiami įprastu prisijungimu.
  Standartinio update pakanka (`optimize` išvalo view cache).
- ⚠️ **Vienkartinis, TIK jei ankstesnis deploy'as leido `florial:install --with-content`
  arba `florial:seed-content --demo`:** demo subscriber (`florial-subscriber@viartas.lt`)
  turi **viešai žinomą** slaptažodį `florial-demo` — nuo task-100 seeder'is jo nebededa,
  bet `firstOrCreate` esamo user'io NEperhash'ina, tad seną reikia rotuoti rankomis:

  ```bash
  php artisan tinker --execute="\ViartasCore\Users\Models\User::where('email','florial-subscriber@viartas.lt')->delete();"
  ```

  (arba nustatyk naują slaptažodį per admin'ą — trynimas tinka tik jei demo prenumeratos
  nereikalingos.) Naujuose install'uose slaptažodis generuojamas atsitiktinai — paskyra
  sukuriama, bet neprisijungiama, kol admin'as jos neatstato.

## QA batch — demo tenant, no-company UX, sales-rep login, DB nav

- `florial:install/upgrade --with-content` DABAR seed'ina ir **demo tenant'ą**
  (įmonė + company_admin `imone@florial.lt` + darbuotojai + sales_rep
  `pardavejas@florial.lt` + B2C subscriber `florial-subscriber@viartas.lt`) — kabinetai
  pasiekiami iškart po install'o. Idempotentiška; trink rankomis kai atsiras realūs.
- **web.main** perseed'inamas į Florial landing'us + numetamas shop `web.brands`
  (`FlorialMenusSeeder`, content chain). Front nav DB-redaguojamas su `.env`
  `MENUS_DB_DRIVEN=true`; be jo — hardcoded (per-locale), 0 regresijos. Tik meniu be
  demo/turinio: `db:seed --class="ViartasThemes\Florial\Database\Seeders\FlorialMenusSeeder" --force`.
- Savitarna: erdvės/darbuotojo kūrimas be įmonės nebeduoda 404 (disable submit +
  onboarding + draugiškas redirect); planai rodomi (ne „Planų dar nėra").
- Admin sales-rep formoj — „prisijungimo vartotojas" select + `sales_rep` rolė →
  `pardavimai/imones` nebeduoda 403.
- Formų laukai: `aria-required` (native `required` sąmoningai paliktas išjungtas —
  server-authority sprendimas; ` *` žymė + server validacija jau buvo).
- **CKEditor (#9):** `form-builder` dabar deklaruoja `va-core/ckeditor` → puslapio
  „Turinys" WYSIWYG laukas rodo CKEditor (ne plika textarea su raw HTML). Ateina per
  `composer update`, assets per `vendor:publish --tag=package-assets`.

## task-99 — `florial:upgrade` + deploy un-gate

- **Vienkartinis:** atnaujink Forge deploy skriptą pagal [`INSTALL.md`](INSTALL.md)
  („Forge / production deploy"). Anksčiau `florial:install` buvo **marker-gated**
  (`if [ ! -f storage/app/.viartas-installed ]`) → bėgo TIK pirmą kartą, todėl
  vėlesnės užduotys consumer'io nepasiekdavo. Dabar `florial:upgrade --force`
  paleidžiamas **kiekvieną deploy**, o marker'is dengia tik tikrą first-time
  bootstrap'ą (`CmsBootSeeder`).
- Marker'io trinti NEREIKIA — jis toliau teisingai saugo pirmojo karto seed'ą.

## task-98 — Satis dist 404

- **Ops (ne app):** perkelk atnaujintą `deploy/satis.json` (`archive.skip-dev: false`)
  į Satis host'ą ir paleisk `php bin/satis build satis.json public/` (arba palauk
  cron'o). Be to `composer update` toliau klonuoja per git vietoj dist zip'o.
  Receptas: `.claude/runbooks/satis-dist-404.md`.

## task-96 / task-97 — viešų sekcijų turinys

- **Vienkartinis:** `php artisan florial:upgrade --with-content --force` — užpildo
  paketų galeriją, B2C / erdvių planus, Content copy, DUK ir atsiliepimus.
  ⚠️ Standartiniame update `--with-content` **nenaudojamas** sąmoningai: jis
  RE-ASSERT'ina seed'intus default'us, tad perrašytų per admin redaguotą katalogo
  copy / kainas (nuo QA batch — ir demo tenant'ą + `web.main` meniu). Leisk vieną
  kartą (arba kai CHANGELOG'as pasako, kad atsirado naujų viešų sekcijų duomenų).
- Kol tai nepaleista, sekcijos NElieka tuščios — homepage galerija rodo 6
  iliustruotas demo korteles (task-96 fallback).
