add screen to funnel soulmate
This commit is contained in:
parent
fc003e6ada
commit
2c5c525c99
@ -124,7 +124,7 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"rules": [],
|
"rules": [],
|
||||||
"defaultNextScreenId": "relationship-status",
|
"defaultNextScreenId": "partner-gender",
|
||||||
"isEndScreen": false
|
"isEndScreen": false
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
@ -147,6 +147,50 @@
|
|||||||
},
|
},
|
||||||
"variants": []
|
"variants": []
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "partner-gender",
|
||||||
|
"template": "list",
|
||||||
|
"header": {
|
||||||
|
"showBackButton": true,
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"text": "Кто вас интересует?",
|
||||||
|
"show": true,
|
||||||
|
"font": "manrope",
|
||||||
|
"weight": "bold",
|
||||||
|
"size": "2xl",
|
||||||
|
"align": "left",
|
||||||
|
"color": "default"
|
||||||
|
},
|
||||||
|
"bottomActionButton": {
|
||||||
|
"show": false,
|
||||||
|
"cornerRadius": "3xl",
|
||||||
|
"showPrivacyTermsConsent": false
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"rules": [],
|
||||||
|
"defaultNextScreenId": "relationship-status",
|
||||||
|
"isEndScreen": false
|
||||||
|
},
|
||||||
|
"list": {
|
||||||
|
"selectionType": "single",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "male",
|
||||||
|
"label": "Male",
|
||||||
|
"disabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "female",
|
||||||
|
"label": "Female",
|
||||||
|
"disabled": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"registrationFieldKey": "partner.gender"
|
||||||
|
},
|
||||||
|
"variants": []
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "relationship-status",
|
"id": "relationship-status",
|
||||||
"template": "list",
|
"template": "list",
|
||||||
@ -2268,10 +2312,6 @@
|
|||||||
"cornerRadius": "3xl",
|
"cornerRadius": "3xl",
|
||||||
"showPrivacyTermsConsent": false
|
"showPrivacyTermsConsent": false
|
||||||
},
|
},
|
||||||
"navigation": {
|
|
||||||
"rules": [],
|
|
||||||
"isEndScreen": false
|
|
||||||
},
|
|
||||||
"variants": [],
|
"variants": [],
|
||||||
"headerBlock": {
|
"headerBlock": {
|
||||||
"text": {
|
"text": {
|
||||||
|
|||||||
@ -28,7 +28,7 @@ export function BuilderSidebar() {
|
|||||||
const dispatch = useBuilderDispatch();
|
const dispatch = useBuilderDispatch();
|
||||||
const selectedScreen = useBuilderSelectedScreen();
|
const selectedScreen = useBuilderSelectedScreen();
|
||||||
|
|
||||||
const [activeTab, setActiveTab] = useState<"funnel" | "screen">(
|
const [activeTab, setActiveTab] = useState<"funnel" | "screen" | "data">(
|
||||||
selectedScreen ? "screen" : "funnel"
|
selectedScreen ? "screen" : "funnel"
|
||||||
);
|
);
|
||||||
const selectedScreenId = selectedScreen?.id ?? null;
|
const selectedScreenId = selectedScreen?.id ?? null;
|
||||||
@ -360,6 +360,18 @@ export function BuilderSidebar() {
|
|||||||
>
|
>
|
||||||
Экран
|
Экран
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className={cn(
|
||||||
|
"flex-1 rounded-md px-3 py-1.5 transition",
|
||||||
|
activeTab === "data"
|
||||||
|
? "bg-background text-foreground shadow"
|
||||||
|
: "text-muted-foreground hover:text-foreground"
|
||||||
|
)}
|
||||||
|
onClick={() => setActiveTab("data")}
|
||||||
|
>
|
||||||
|
Данные
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -478,6 +490,40 @@ export function BuilderSidebar() {
|
|||||||
</div>
|
</div>
|
||||||
</Section>
|
</Section>
|
||||||
</div>
|
</div>
|
||||||
|
) : activeTab === "data" ? (
|
||||||
|
<div className="flex flex-col gap-4">
|
||||||
|
<Section title="List экраны и опции" alwaysExpanded>
|
||||||
|
{state.screens
|
||||||
|
.filter((screen) => screen.template === "list")
|
||||||
|
.map((screen) => (
|
||||||
|
<div
|
||||||
|
key={screen.id}
|
||||||
|
className="flex flex-col gap-1.5 rounded-lg border border-border/60 bg-muted/20 p-2.5 text-xs"
|
||||||
|
>
|
||||||
|
<div className="font-semibold text-foreground">
|
||||||
|
{screen.id}
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-wrap gap-1">
|
||||||
|
{isListScreen(screen) &&
|
||||||
|
screen.list.options.map((option) => (
|
||||||
|
<code
|
||||||
|
key={option.id}
|
||||||
|
className="rounded bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary font-mono"
|
||||||
|
>
|
||||||
|
{option.id}
|
||||||
|
</code>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
{state.screens.filter((screen) => screen.template === "list")
|
||||||
|
.length === 0 && (
|
||||||
|
<div className="rounded-lg border border-border/60 bg-muted/30 p-3 text-center text-xs text-muted-foreground">
|
||||||
|
Нет list экранов
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Section>
|
||||||
|
</div>
|
||||||
) : selectedScreen ? (
|
) : selectedScreen ? (
|
||||||
<div className="flex flex-col gap-4">
|
<div className="flex flex-col gap-4">
|
||||||
{/* Валидация всегда вверху, без заголовка */}
|
{/* Валидация всегда вверху, без заголовка */}
|
||||||
|
|||||||
@ -67,13 +67,6 @@ export function ListTemplate({
|
|||||||
? buttons.filter((button) => selectionSet.has(String(button.id)))
|
? buttons.filter((button) => selectionSet.has(String(button.id)))
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
const handleRadioChange: RadioAnswersListProps["onChangeSelectedAnswer"] = (
|
|
||||||
answer
|
|
||||||
) => {
|
|
||||||
const id = stringId(answer?.id);
|
|
||||||
onSelectionChange(id ? [id] : []);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleRadioAnswerClick: RadioAnswersListProps["onAnswerClick"] = (
|
const handleRadioAnswerClick: RadioAnswersListProps["onAnswerClick"] = (
|
||||||
answer
|
answer
|
||||||
) => {
|
) => {
|
||||||
@ -93,7 +86,8 @@ export function ListTemplate({
|
|||||||
const radioContent: RadioAnswersListProps = {
|
const radioContent: RadioAnswersListProps = {
|
||||||
answers: buttons,
|
answers: buttons,
|
||||||
activeAnswer,
|
activeAnswer,
|
||||||
onChangeSelectedAnswer: handleRadioChange,
|
// Не передаем onChangeSelectedAnswer чтобы избежать двойного вызова при клике
|
||||||
|
// onAnswerClick достаточно для обработки выбора
|
||||||
onAnswerClick: handleRadioAnswerClick,
|
onAnswerClick: handleRadioAnswerClick,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -433,7 +433,7 @@ export const BAKED_FUNNELS: Record<string, FunnelDefinition> = {
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"rules": [],
|
"rules": [],
|
||||||
"defaultNextScreenId": "relationship-status",
|
"defaultNextScreenId": "partner-gender",
|
||||||
"isEndScreen": false
|
"isEndScreen": false
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
@ -456,6 +456,50 @@ export const BAKED_FUNNELS: Record<string, FunnelDefinition> = {
|
|||||||
},
|
},
|
||||||
"variants": []
|
"variants": []
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "partner-gender",
|
||||||
|
"template": "list",
|
||||||
|
"header": {
|
||||||
|
"showBackButton": true,
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"text": "Кто вас интересует?",
|
||||||
|
"show": true,
|
||||||
|
"font": "manrope",
|
||||||
|
"weight": "bold",
|
||||||
|
"size": "2xl",
|
||||||
|
"align": "left",
|
||||||
|
"color": "default"
|
||||||
|
},
|
||||||
|
"bottomActionButton": {
|
||||||
|
"show": false,
|
||||||
|
"cornerRadius": "3xl",
|
||||||
|
"showPrivacyTermsConsent": false
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"rules": [],
|
||||||
|
"defaultNextScreenId": "relationship-status",
|
||||||
|
"isEndScreen": false
|
||||||
|
},
|
||||||
|
"list": {
|
||||||
|
"selectionType": "single",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "male",
|
||||||
|
"label": "Male",
|
||||||
|
"disabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "female",
|
||||||
|
"label": "Female",
|
||||||
|
"disabled": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"registrationFieldKey": "partner.gender"
|
||||||
|
},
|
||||||
|
"variants": []
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "relationship-status",
|
"id": "relationship-status",
|
||||||
"template": "list",
|
"template": "list",
|
||||||
@ -2577,10 +2621,6 @@ export const BAKED_FUNNELS: Record<string, FunnelDefinition> = {
|
|||||||
"cornerRadius": "3xl",
|
"cornerRadius": "3xl",
|
||||||
"showPrivacyTermsConsent": false
|
"showPrivacyTermsConsent": false
|
||||||
},
|
},
|
||||||
"navigation": {
|
|
||||||
"rules": [],
|
|
||||||
"isEndScreen": false
|
|
||||||
},
|
|
||||||
"variants": [],
|
"variants": [],
|
||||||
"headerBlock": {
|
"headerBlock": {
|
||||||
"text": {
|
"text": {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user