DealDialog — nový obchod, commit; .acrm-dialog.deal, střední 640, React <Dialog size="m"> z @acrm/ui. Prázdný stav: primár je neaktivní, dokud není název — žádná hvězdička, žádná hláška
Nový obchod
Jedno pole, žádné labely. Povinnost názvu nese neaktivní primár — ne hvězdička v labelu a ne chybová hláška po odeslání. Meta lišta je shodná s dialogem úkolu: čtyři chipy, chip nese hodnotu, bez hodnoty název pole. Fáze a Vlastník mají vždy rozumný default (fáze podle místa založení, vlastník = já), takže nejsou nikdy prázdné. Poznámka je obsah, ne meta — proto je afordancí v těle, ne pátým chipem; patička tak zůstává na čtyřech chipech a nepřetéká.
DealDialog — vyplněný, s rozbalenou poznámkou; subjekty jsou tokeny s křížkem (kanon Entity reference (odebíratelná)), poznámka je opt-in blok, ne trvale otevřené pole
Nový obchod
Vstup přes — rozpočet schválený, rozhoduje se do konce září.
Subjekty jsou strukturální vazba — backend z nejstaršího odkazu odvozuje firmu a hlavní kontakt obchodu — proto token s křížkem a afordance „Přidat“, ne volné „Propojit“ jako u úkolu. Odebrání je neutrální, ne červené. Afordance „Přidat poznámku“ zmizí ve chvíli, kdy je blok otevřený; prázdná poznámka se při zavření sama sbalí. V poznámce fungují @ zmínky stejně jako v poznámce na záznamu — zakládá se druhým voláním, aby dostala aktivitu a rozpad zmínek.
Vstupní body — jeden dialog, tři konteksty; liší se JEN předvyplněním, nikdy strukturou ani sadou polí
Z karty firmy — firma je předvyplněný subjekt, název prázdný
Název obchodu…
Poptávka Já
Z karty osoby — osoba je předvyplněný subjekt; její firma se přidá sama, pokud ji má
Název obchodu…
Poptávka Já
Z nástěnky — bez subjektu, fáze podle sloupce, do kterého se zakládá
Název obchodu…
Nabídka Já
Dnes jsou to tři různé implementace — dialog na kartě firmy (s poznámkou), dialog na kartě osoby (bez poznámky) a formulář v šuplíku na nástěnce (s fází, uzavřením a vlastníkem navíc). Uživatel tak zakládá tentýž objekt třemi různými formuláři a se třemi různými sadami polí. Kanon je jedna komponenta s jedním kontraktem: otevírá se přes openDeal({ subjects, stageId, pipelineId }), zbytek je vždy stejný. Na nástěnce zaniká šuplík .pdr — zakládání není detail záznamu.
Stavy — odesílání a částečný úspěch; obchod a poznámka jsou dvě volání, dialog to musí umět říct
Odesílání — primár drží spinner a text, nic se nezavírá dřív, než server odpoví
Částečný úspěch — obchod stojí, poznámka selhala; dialog se zavře a chybu nese kanonický toast s akcí
Obchod vytvořen, poznámku se uložit nepodařilo
Chyba — obchod nevznikl; formulář zůstává vyplněný, text neslibuje víc, než se stalo

Obchod se nepodařilo vytvořit. Zkuste to znovu.

Částečný úspěch je skutečný stav, ne teorie: obchod se zakládá prvním voláním a poznámka druhým. Jakmile obchod existuje, dialog se zavírá jako při úspěchu — obchod se hned objeví na kartě i na nástěnce — a selhání poznámky nese kanonický DS.toast.error s akcí „Uložit znovu“. Dialog se kvůli poznámce znovu neotevírá; akce dopisuje jen poznámku, nikdy nezakládá druhý obchod.
Overlaye — portálované nad dialogem, bez nadpisů; jinak je ořízne overflow pláště
Přidat subjekt — osoby a firmy; produkty a fondy až na obchodu, ne při založení
Objem — částka a měna; plná hodnota, zkracuje se až ve výpisech a railu
CZK
Fáze — fáze zvolené pipeline, bez nadpisu
Poptávka
Jednání
Nabídka
Smlouva
Vlastník — uživatelé CRM, předvyplněn „já“
Mobil — pod 720 px šuplík ze spoda podle kanonu dialogu úkolu: plná šířka, grabber, meta chipy nad jediným CTA, „Vytvořit další“ na mobilu není
Nový obchod
Šuplík dědí plášť i obsah beze změny — mění se jen patička: meta chipy do vodorovně rolovatelného řádku a pod nimi jediné velké CTA přes celou šířku. „Zrušit“ nahrazuje gesto dolů a ✕; rozepsaný obchod se před zahozením zeptá. Overlaye (subjekt, objem, fáze, vlastník, datum) se otevírají jako druhý šuplík nad prvním. Platí kanon z karty Dialog úkolu — obchod nezavádí nic vlastního.
Hranice — proti dialogu úkolu se obchod liší ve třech věcech, a jsou to rozdíly záměrné
Jen commit, žádný dokument. Existující obchod se v dialogu neotevírá — má vlastní detail a drawer (karty Deal detail a Deal drawer). Úkol dialog potřebuje, protože jinou plochu nemá; obchod ji má, a duplikovat ji v dialogu by znamenalo dvě pravdy o témž záznamu.
Subjekty místo Propojit. U úkolu je relace volitelný kontext, u obchodu je to strukturální vazba — z nejstaršího odkazu se odvozuje firma a hlavní kontakt. Proto token s křížkem a „Přidat“ (kanon odebíratelné reference), ne dashed „Propojit“.
Název je pole, ne text. Úkol má jedno textové pole, kde reference žijí v textu. Obchod má krátký název, který se objevuje ve sloupci nástěnky, v railu i ve výpisech — reference do něj nepatří. @ zmínky fungují jen v poznámce.
Pravidla
Plášť je kanon. .acrm-dialog + modifikátor .deal, střední 640, v Reactu <Dialog size="m"> z @acrm/ui. Roste s obsahem do 80vh, pak scrolluje tělo. Mezera mezi akčními tlačítky v patičce = vždy var(--sp-3).
Jeden dialog pro celou app. Jediný host v AppShellu + openDeal({ subjects, stageId, pipelineId }). NewCompanyDealDialog, NewDealDialog i NewDealForm v šuplíku .pdr zanikají — s nimi tři různé sady polí pro tentýž objekt.
Jedno pole. Název je jediný povinný vstup a jediný, který má vizuální váhu. Vše ostatní je meta chip v patičce nebo opt-in blok. Žádné labely nad poli, žádná hvězdička u povinného.
Povinnost nese primár. Bez názvu je „Vytvořit“ neaktivní. Žádná hvězdička v labelu, žádná červená hláška po odeslání — uživatel se o chybě nedozvídá až po pokusu.
Meta lišta bez labelů. Při zakládání jen Fáze · Vlastník — dva chipy, které mají vždy default (podle místa založení, resp. „já“), takže nikdy nejsou prázdné. Objem a Uzavření se při vytváření nezobrazují — v 99 % je obchodník nezná; doplňují se až na obchodu a chip se ukáže, jen když hodnotu nese (viz vyplněná instance). Víc než čtyři meta pole je signál, že pole patří na obchod, ne do zakládání.
Objem, ne „Očekávaný obrat (Kč, nepovinné)“. Jeden název pro jedno pole v celé app. Měnu nese overlay — závorky v labelu mizí. Částka je v dialogu vždy plná; zkracuje se až v railu a na kartách obchodu.
Poznámka je opt-in, a je to obsah. Většina obchodů vzniká bez ní — trvale otevřené velké pole by ubíralo váhu názvu. Proto je afordancí v těle („Přidat poznámku“), ne meta chipem v patičce: meta popisuje obchod, poznámka je samostatný záznam. Prázdná se při zavření sama sbalí. Uvnitř platí @ zmínky a autoformát jako v poznámce na záznamu.
Dvě volání, dva stavy. Obchod vzniká první, poznámka druhá. Jakmile obchod existuje, dialog se zavírá jako při úspěchu — obchod se hned objeví na kartě i na nástěnce — a selhání poznámky nese kanonický DS.toast.error s akcí „Uložit znovu“. Dialog se kvůli poznámce znovu neotevírá a primár se nepřejmenovává: jakmile je obchod založený, tenhle dialog už není formulář na zakládání a nechat ho otevřený by znamenalo lhát o tom, co je. Akce v toastu musí nést text poznámky s sebou — jinak slibuje uložení něčeho, co už uživatel nemá. Nikdy nevznikne druhý obchod.
Ikona entity = businessplan. Jedna ikona obchodu v celé app — v hlavičce dialogu, v railu, v našeptávači i v notifikacích. briefcase na kartě firmy je odchylka a patří kariéře, ne obchodu.
Zakládání není šuplík. Šuplík .pdr je plocha pro čtení a editaci existujícího záznamu. Nový obchod je commit — patří do dialogu, na nástěnce stejně jako všude jinde.
Overlaye portálované, bez nadpisů. Subjekt, objem, fáze, vlastník i datum žijí nad dialogem — jinak je ořízne overflow pláště (.acrm-popover 101 nad dialogem 80/90; bez portálu by ho ořízl overflow). Dropdown nikdy nemá nadpis nad položkami.
Jeden i18n namespace. Dnes je týž dialog přeložený třikrát (company-record.deals, person-record.deals, pipeline.form) a názvy polí se rozcházejí. Kanon má vlastní namespace deal a jediné znění.
Kebab v patičce = vedlejší cesty založení. „Vytvořit a odeslat“ založí obchod s příznakem sendOffer a workflow engine sám zařadí nabídku (mail ze šablony) do fronty „K odeslání“ a založí follow-up úkol +7 dní. Žádný composer se neotevírá — mail jde do odeslání zrušit nebo upravit; toast po založení řekne, že nabídka je ve frontě. „Přidat produkty“ přidá do těla další blok s multiselectem produktů (stejný opt-in vzor jako poznámka). Obě jsou menšinové, proto kebab a ne třetí tlačítko — patička drží jeden primár.
Datum podle konvence. Uzavření se píše „30. 9.“, rok jen když je potřeba, vždy přes i18n/dates.ts. Žádné tabular-nums u data.
Mobil = šuplík ze spoda. Pod 720 px podle kanonu z karty Dialog úkolu: plná šířka, grabber, meta chipy nad jediným velkým CTA, „Vytvořit další“ jen na desktopu. Gesto dolů / scrim = Esc, rozepsaný obchod se ptá.