Skip to content

Commit e6c3886

Browse files
committed
MC-3146: Add new row appearances to configuration
- Refactor part of observable updater to prepare the view model ahead of time - Ensure name is always present in config - Fix some ~16 type issues, introduce 3 new errors, rebuild ts-errors.json
1 parent 71d0203 commit e6c3886

File tree

9 files changed

+328
-340
lines changed

9 files changed

+328
-340
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type-factory.js

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/observable-updater.js

Lines changed: 66 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/preview.js

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type-factory.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,24 @@ export default function createContentType(
6868
/**
6969
* Merge defaults and content type data
7070
*
71-
* @param {Config} config
71+
* @param {ContentTypeConfigInterface} config
7272
* @param {object} data
7373
* @returns {any}
7474
*/
75-
function prepareData(config, data: {}) {
75+
function prepareData(config: ContentTypeConfigInterface, data: {}) {
7676
const defaults: FieldDefaultsInterface = {};
7777
if (config.fields) {
78-
_.each(config.fields, (field: ConfigFieldInterface, key: string | number) => {
78+
_.each(config.fields, (field, key: string | number) => {
7979
defaults[key] = field.default;
8080
});
8181
}
82-
return _.extend(defaults, data);
82+
return _.extend(
83+
defaults,
84+
data,
85+
{
86+
name: config.name,
87+
},
88+
);
8389
}
8490

8591
/**

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/observable-updater.ts

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {DataObject} from "../data-store";
1010
import MassConverterPool from "../mass-converter/converter-pool";
1111
import {fromSnakeToCamelCase} from "../utils/string";
1212
import appearanceConfig from "./appearance-config";
13+
import Master from "./master";
14+
import Preview from "./preview";
1315

1416
export default class ObservableUpdater {
1517
private converterPool: typeof ConverterPool;
@@ -31,15 +33,35 @@ export default class ObservableUpdater {
3133
this.converterResolver = converterResolver;
3234
}
3335

36+
/**
37+
* Prepare a view model for preview data to be updated later
38+
*
39+
* @param {Preview} viewModel
40+
* @param {DataObject} data
41+
*/
42+
public prepare(viewModel: Preview, data: DataObject) {
43+
const appearanceConfiguration = this.getAppearanceConfig(viewModel, data);
44+
45+
for (const elementName of Object.keys(appearanceConfiguration.data_mapping.elements)) {
46+
if (viewModel.data[elementName] === undefined) {
47+
viewModel.data[elementName] = {
48+
attributes: ko.observable({}),
49+
style: ko.observable({}),
50+
css: ko.observable({}),
51+
html: ko.observable({}),
52+
};
53+
}
54+
}
55+
}
56+
3457
/**
3558
* Update preview observables after data changed in data store
3659
*
37-
* @param {object} viewModel
60+
* @param {Preview | Master} viewModel
3861
* @param {DataObject} data
3962
*/
40-
public update(viewModel: object, data: DataObject) {
41-
const appearance = data && data.appearance !== undefined ? data.appearance : undefined;
42-
const appearanceConfiguration = appearanceConfig(viewModel.parent.config.name, appearance);
63+
public update(viewModel: Preview | Master, data: DataObject) {
64+
const appearanceConfiguration = this.getAppearanceConfig(viewModel, data);
4365
if (undefined === appearanceConfiguration
4466
|| undefined === appearanceConfiguration.data_mapping
4567
|| undefined === appearanceConfiguration.data_mapping.elements
@@ -199,4 +221,16 @@ export default class ObservableUpdater {
199221
}
200222
return data;
201223
}
224+
225+
/**
226+
* Retrieve the appearance config
227+
*
228+
* @param {Preview | Master} viewModel
229+
* @param {DataObject} data
230+
* @returns {ContentTypeConfigAppearanceInterface}
231+
*/
232+
private getAppearanceConfig(viewModel: Preview | Master, data: DataObject) {
233+
const appearance = data && data.appearance !== undefined ? data.appearance.toString() : undefined;
234+
return appearanceConfig(viewModel.parent.config.name, appearance);
235+
}
202236
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
interface PreviewDataElementData {
7+
[key: string]: any;
8+
}
9+
10+
export default interface PreviewData {
11+
[key: string]: {
12+
[key: string]: KnockoutObservable<PreviewDataElementData>;
13+
attributes: KnockoutObservable<PreviewDataElementData>;
14+
style: KnockoutObservable<PreviewDataElementData>;
15+
css: KnockoutObservable<PreviewDataElementData>;
16+
html: KnockoutObservable<PreviewDataElementData>;
17+
};
18+
}

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/preview.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ import StyleAttributeMapper, {StyleAttributeMapperResult} from "../master-format
2929
import appearanceConfig from "./appearance-config";
3030
import ObservableObject from "./observable-object.d";
3131
import ObservableUpdater from "./observable-updater";
32+
import PreviewData from "./preview-data";
3233

3334
/**
3435
* @api
3536
*/
3637
export default class Preview {
3738
public parent: ContentTypeCollectionInterface;
3839
public config: ContentTypeConfigInterface;
39-
public data: ObservableObject = {};
40+
public data: PreviewData = {};
4041
public displayLabel: KnockoutObservable<string>;
4142
public wrapperElement: Element;
4243

@@ -77,6 +78,12 @@ export default class Preview {
7778
this.displayLabel = ko.observable(this.config.label);
7879
this.setupDataFields();
7980
this.bindEvents();
81+
82+
// Prepare the observable updater to create all observables required on the view model
83+
this.observableUpdater.prepare(
84+
this,
85+
_.extend({}, this.parent.dataStore.get() as DataObject),
86+
);
8087
}
8188

8289
/**
@@ -432,9 +439,9 @@ export default class Preview {
432439
*/
433440
protected bindEvents() {
434441
this.parent.dataStore.subscribe(
435-
(data: DataObject) => {
442+
_.debounce(() => {
436443
this.updateObservables();
437-
},
444+
}, 10),
438445
);
439446
}
440447

ts-error-stopgap.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ process.stdin.on('end', () => {
5555
});
5656
}
5757

58+
// Uncomment to re-generate
59+
// require('fs').writeFileSync(
60+
// require('path').join(__dirname, 'ts-errors.json'),
61+
// JSON.stringify(compilerErrors, null, 2),
62+
// 'utf8'
63+
// );
64+
5865
const newErrors = [];
5966
const resolvedErrors = [];
6067
// Walk each file to do an error comparison

0 commit comments

Comments
 (0)