Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: [ENG-8172] Content Inputs of type "list" do not update in the preview when changed #3967

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .changeset/short-poets-reflect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@builder.io/sdk-angular": patch
"@builder.io/sdk-react-nextjs": patch
"@builder.io/sdk-qwik": patch
"@builder.io/sdk-react": patch
"@builder.io/sdk-react-native": patch
"@builder.io/sdk-solid": patch
"@builder.io/sdk-svelte": patch
"@builder.io/sdk-vue": patch
---

Fix: list-type inputs within symbols were not updating in the preview
22 changes: 22 additions & 0 deletions packages/sdks-tests/src/e2e-tests/editing.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { MODIFIED_EDITING_COLUMNS } from '../specs/editing-columns-inner-layout.
import { ADD_A_TEXT_BLOCK } from '../specs/duplicated-content-using-nested-symbols.js';
import { EDITING_STYLES } from '../specs/editing-styles.js';
import { ACCORDION_WITH_NO_DETAIL } from '../specs/accordion.js';
import { NESTED_SYMBOL_CONTENT } from '../specs/nested-symbol.js';
import { NEW_BLOCK_ADD, NEW_BLOCK_ADD_2 } from '../specs/new-block-add.js';
import { SECTION_CHILDREN } from '../specs/section-children.js';

Expand Down Expand Up @@ -646,6 +647,27 @@ test.describe('Visual Editing', () => {
});
});

test('Symbol should update the data when nested values are updated', async ({ page, basePort, sdk, packageName }) => {

test.skip(excludeGen1(sdk));
test.skip(packageName === 'nextjs-sdk-next-app');

await launchEmbedderAndWaitForSdk({ path: '/nested-symbol', basePort, page, sdk });

const newContent = cloneContent(NESTED_SYMBOL_CONTENT);

await sendPatchOrUpdateMessage({
page,
content: newContent,
model: 'page',
sdk,
path: '/data/blocks/0/component/options/symbol/data/language/1/code',
updateFn: () => 'AFK',
});

await page.frameLocator('iframe').getByText('AFK').waitFor();
});

test.describe('New Block addition and deletion with components using props.children / slots', () => {
test('should add new block below the last block', async ({
page,
Expand Down
2 changes: 2 additions & 0 deletions packages/sdks-tests/src/specs/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ import { DYNAMIC_ELEMENT } from './dynamic-element.js';
import { CUSTOM_CODE_DOM_UPDATE } from './custom-code-dom-update.js';
import { NEW_BLOCK_ADD } from './new-block-add.js';
import { DYNAMIC_BUTTON } from './dynamic-button.js';
import { NESTED_SYMBOL_CONTENT } from './nested-symbol.js';
import { COLUMNS_VERTICAL_CENTERING } from './columns-vertical-centering.js';
import { SECTION_CHILDREN } from './section-children.js';

Expand Down Expand Up @@ -139,6 +140,7 @@ export const PAGES: Record<string, Page> = {
'/image-high-priority': { content: imageHighPriority },
'/image-no-webp': { content: imageNoWebp },
'/data-bindings': { content: dataBindings },
'/nested-symbol': { content: NESTED_SYMBOL_CONTENT },
'/data-binding-styles': { content: dataBindingStyles },
'/react-native-strict-style-mode': { content: REACT_NATIVE_STRICT_STYLE_MODE_CONTENT },
'/react-native-strict-style-mode-disabled': { content: REACT_NATIVE_STRICT_STYLE_MODE_CONTENT },
Expand Down
170 changes: 170 additions & 0 deletions packages/sdks-tests/src/specs/nested-symbol.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
export const NESTED_SYMBOL_CONTENT = {
data: {
title: 'react-sdk',
themeId: false,
blocks: [
{
'@type': '@builder.io/sdk:Element',
'@version': 2,
id: 'builder-fdc6514a5f0e4bcab8d3a981e5adb164',
component: {
name: 'Symbol',
options: {
symbol: {
content: {
data: {
inputs: [
{
'@type': '@builder.io/core:Field',
meta: {},
name: 'language',
type: 'list',
defaultValue: [{ code: 'HN' }],
required: false,
subFields: [
{
'@type': '@builder.io/core:Field',
meta: {},
name: 'code',
type: 'text',
required: false,
subFields: [],
helperText: '',
autoFocus: false,
simpleTextOnly: false,
disallowRemove: false,
broadcast: false,
bubble: false,
hideFromUI: false,
hideFromFieldsEditor: false,
showTemplatePicker: true,
permissionsRequiredToEdit: '',
advanced: false,
copyOnAdd: true,
onChange: '',
behavior: '',
showIf: '',
mandatory: false,
hidden: false,
noPhotoPicker: false,
model: '',
supportsAiGeneration: false,
defaultCollapsed: false,
},
],
helperText: '',
autoFocus: false,
simpleTextOnly: false,
disallowRemove: false,
broadcast: false,
bubble: false,
hideFromUI: false,
hideFromFieldsEditor: false,
showTemplatePicker: true,
permissionsRequiredToEdit: '',
advanced: false,
copyOnAdd: true,
onChange: '',
behavior: '',
showIf: '',
mandatory: false,
hidden: false,
noPhotoPicker: false,
model: '',
supportsAiGeneration: false,
defaultCollapsed: false,
},
{
'@type': '@builder.io/core:Field',
meta: {},
name: 'newField1',
type: 'text',
required: false,
subFields: [],
helperText: '',
autoFocus: false,
simpleTextOnly: false,
disallowRemove: false,
broadcast: false,
bubble: false,
hideFromUI: false,
hideFromFieldsEditor: false,
showTemplatePicker: true,
permissionsRequiredToEdit: '',
advanced: false,
copyOnAdd: true,
onChange: '',
behavior: '',
showIf: '',
mandatory: false,
hidden: false,
noPhotoPicker: false,
model: '',
supportsAiGeneration: false,
defaultCollapsed: false,
},
],
blocks: [
{
'@type': '@builder.io/sdk:Element',
'@version': 2,
bindings: {
'component.options.text':
'var _virtual_index=state.languageItem.code;return _virtual_index',
},
code: { bindings: { 'component.options.text': 'state.languageItem.code' } },
repeat: { collection: 'state.language' },
id: 'builder-080852d1360b4f08a54f436bbfe32b44',
meta: {
previousId: 'builder-8ede3ef8afbc499f9eb0152d1c3d63fc',
bindingActions: {
_newProperty: null,
component: { options: { text: null } },
},
},
component: { name: 'Text', options: { text: 'Enter some text...' } },
responsiveStyles: {
large: {
display: 'flex',
flexDirection: 'column',
position: 'relative',
flexShrink: '0',
boxSizing: 'border-box',
marginTop: '20px',
lineHeight: 'normal',
height: 'auto',
},
},
},
],
},
},
data: {
language: [
{
code: 'HN',
},
{
code: 'EN',
},
],
},
model: 'symbol',
entry: 'acd89180466e478d9e9c2f0ca803e650',
ownerId: 'c59dc54530484a9cac6cbb759f637b2d',
},
},
},
responsiveStyles: {
large: {
display: 'flex',
flexDirection: 'column',
position: 'relative',
flexShrink: '0',
boxSizing: 'border-box',
},
},
},
],
},
};
4 changes: 2 additions & 2 deletions packages/sdks/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@
"upgrade-example:all": "yarn loop upgrade-example latest"
},
"dependencies": {
"@builder.io/mitosis": "^0.6.1",
"@builder.io/mitosis-cli": "^0.6.1",
"@builder.io/mitosis": "^0.7.3",
"@builder.io/mitosis-cli": "^0.7.3",
"isolated-vm": "^5.0.0",
"node-fetch": "^2.6.1",
"seedrandom": "^3.0.5",
Expand Down
8 changes: 8 additions & 0 deletions packages/sdks/src/components/block/block.helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { extractTextStyles } from '../../functions/extract-text-styles.js';
import { getStyle } from '../../functions/get-style.js';
import type { BuilderBlock } from '../../types/builder-block.js';
import type { RepeatData } from './types.js';
import { TARGET } from '../../constants/target.js';

const checkIsComponentRestricted = (
component: RegisteredComponent | null | undefined,
Expand Down Expand Up @@ -160,3 +161,10 @@ export const provideBuilderContext = (

return {};
};

export const generateKey = (index: number) => {
if (TARGET === 'qwik') {
return `${index}-${Date.now()}`;
}
return index.toString();
};
5 changes: 3 additions & 2 deletions packages/sdks/src/components/block/block.lite.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import type { BuilderBlock } from '../../types/builder-block.js';
import DynamicDiv from '../dynamic-div.lite.jsx';
import { bindAnimations } from './animator.js';
import {
generateKey,
getComponent,
getInheritedStyles,
getRepeatItemData,
Expand Down Expand Up @@ -278,7 +279,7 @@ export default function Block(props: BlockProps) {
<For each={state.repeatItem}>
{(data, index) => (
<RepeatedBlock
key={index}
key={generateKey(index)}
repeatContext={data.context}
block={data.block}
registeredComponents={props.registeredComponents}
Expand Down Expand Up @@ -310,7 +311,7 @@ export default function Block(props: BlockProps) {
<For each={state.repeatItem}>
{(data, index) => (
<RepeatedBlock
key={index}
key={generateKey(index)}
repeatContext={data.context}
block={data.block}
registeredComponents={props.registeredComponents}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { setContext, useMetadata, useState } from '@builder.io/mitosis';
import { setContext, useMetadata, useState, onUpdate } from '@builder.io/mitosis';
import BuilderContext from '../../../context/builder.context.lite.js';
import type { BuilderContextInterface } from '../../../context/types.js';
import type { BlockProps } from '../block.lite.jsx';
Expand Down Expand Up @@ -33,6 +33,10 @@ export default function RepeatedBlock(props: Props) {

setContext(BuilderContext, store);

onUpdate(() => {
store.value = props.repeatContext;
}, [props.repeatContext]);

return (
<Block
block={props.block}
Expand Down
22 changes: 11 additions & 11 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5544,11 +5544,11 @@ __metadata:
languageName: node
linkType: hard

"@builder.io/mitosis-cli@npm:^0.6.1":
version: 0.6.1
resolution: "@builder.io/mitosis-cli@npm:0.6.1"
"@builder.io/mitosis-cli@npm:^0.7.3":
version: 0.7.3
resolution: "@builder.io/mitosis-cli@npm:0.7.3"
dependencies:
"@builder.io/mitosis": 0.6.1
"@builder.io/mitosis": 0.7.3
debug: ^4.3.4
dedent: ^0.7.0
esbuild: ^0.12.16
Expand All @@ -5561,13 +5561,13 @@ __metadata:
ts-morph: ^19.0.0
bin:
mitosis: bin/mitosis
checksum: 2e98cd763b9c18ca7248a45d2f8dda3974822e6bf02327f0e9dbfb1253b8c71e5c71361d99957fe1cdea719a2c22f3154dea65d04c453ad8aa1e2b510fe2fe02
checksum: 9971cc4eed1c00cbd6e8d613a72b4d028be4205296d07b9c4bf381248b86ef1a09c74e29828f34560b7de2aec70765057495e10544c317f467746e4701153a06
languageName: node
linkType: hard

"@builder.io/mitosis@npm:0.6.1, @builder.io/mitosis@npm:^0.6.1":
version: 0.6.1
resolution: "@builder.io/mitosis@npm:0.6.1"
"@builder.io/mitosis@npm:0.7.3, @builder.io/mitosis@npm:^0.7.3":
version: 0.7.3
resolution: "@builder.io/mitosis@npm:0.7.3"
dependencies:
"@angular/compiler": ^11.2.11
"@babel/core": 7.14.5
Expand All @@ -5592,7 +5592,7 @@ __metadata:
svelte-preprocess: ^5.0.3
ts-morph: ^19.0.0
typescript: ^5.3.2
checksum: 258b7ee6edb275af5cf8d2822598057b603239b4a1e46d0e6c4f1bb67e39d3d78c4f2b1805c4f6316426b4317fa1d382e1e8fd46547727f8ee13b3fb22e5e94c
checksum: 6edbe375f8dfb121ab12eb694bc57bfae93bd6cb5a04d661cb8d9aa8f780e7dec6063553ca01657d54fcf0d9c3cdc07685685c924c06b811a4652cfbd0fd0e44
languageName: node
linkType: hard

Expand Down Expand Up @@ -5997,8 +5997,8 @@ __metadata:
dependencies:
"@arethetypeswrong/cli": ^0.13.3
"@builder.io/eslint-plugin-mitosis": ^0.0.16
"@builder.io/mitosis": ^0.6.1
"@builder.io/mitosis-cli": ^0.6.1
"@builder.io/mitosis": ^0.7.3
"@builder.io/mitosis-cli": ^0.7.3
"@types/node-fetch": ^2.5.12
"@types/seedrandom": ^3.0.4
"@types/traverse": ^0.6.32
Expand Down
Loading