activator-oce-exporter
Version:
Extract Activator binder and convert it to valid OCE mono pacakge
239 lines (222 loc) • 6.4 kB
JavaScript
import { html } from '@polymer/lit-element';
import { FusionBase } from '../../base';
import { MJMLColumn } from '../column';
import { applyMixins, VerticalAlignObservable, EmailComponent } from '../../mixins';
class MJMLSection extends applyMixins(FusionBase, [VerticalAlignObservable, EmailComponent]) {
static get properties() {
return {
'background-url': {
type: String,
fieldType: 'Modal',
assetType: 'Image',
value: '',
prop: true,
},
'full-width': {
type: String,
fieldType: 'Select',
value: '',
prop: true,
selectOptions: [
'full-width',
'100%',
'600px',
],
},
'border-radius': {
type: String,
fieldType: 'Number',
value: '0px',
},
'background-color': {
type: String,
fieldType: 'ColorPicker',
value: 'rgba(255, 255, 255, 0)',
},
'background-size': {
type: String,
fieldType: 'Number',
value: '100%',
},
'background-repeat': {
type: String,
fieldType: 'Select',
value: 'repeat',
selectOptions: [
'repeat',
'repeat-x',
'repeat-y',
'no-repeat',
],
},
'text-align': {
type: String,
fieldType: 'Select',
value: 'center',
selectOptions: [
'center',
'justify',
'left',
'right',
],
},
'padding-top': {
type: String,
fieldType: 'Number',
value: '20px',
},
'padding-right': {
type: String,
fieldType: 'Number',
value: '0px',
},
'padding-bottom': {
type: String,
fieldType: 'Number',
value: '20px',
},
'padding-left': {
type: String,
fieldType: 'Number',
value: '0px',
},
direction: {
type: String,
fieldType: 'Select',
value: 'ltr',
selectOptions: [
'ltr',
'rtl',
],
},
};
}
static get options() {
return {
componentName: 'mj-section',
componentUIName: 'Row container',
componentScope: 'standard',
componentType: 'static',
componentCategory: 'UI',
componentDescription: 'Group row container for editor',
componentDomain: 'email',
isRootNested: true,
isTextEdit: false,
nestedTypes: [],
nestedComponents: ['mj-column'],
defaultTemplate: '',
resizable: false,
draggable: false,
rotatable: false,
sortable: true,
};
}
static createListItemData(component) {
const { componentName } = component.options;
return {
component,
name: componentName,
events: {
add: 'rendered',
remove: `${componentName}:removed`,
resize: `${componentName}:resized`,
},
};
}
getExistItems(itemName) {
return Array.from(this.getElementsByTagName(itemName));
}
constructor() {
super();
this.columnItem = MJMLSection.createListItemData(MJMLColumn);
}
connectedCallback() {
super.connectedCallback();
this.columnAddEventFunc = this.columnAddHandler.bind(this);
this.columnRemoveEventFunc = this.changeContentWidth.bind(this);
this.columnResizeEventFunc = this.changeContentWidth.bind(this);
this.addEventListener(this.columnItem.events.add, this.columnAddEventFunc);
this.addColumnsEventListeners();
}
changeContentWidth() {
const columnItems = this.getExistItems(this.columnItem.name);
columnItems.forEach((item) => {
const childItems = Array.from(item.children);
if (childItems.length) MJMLSection.changeChildWidth(childItems);
});
}
static changeChildWidth(childItems) {
childItems.forEach(childItem => childItem.updateWidth());
}
columnAddHandler(e) {
this.changeContentWidth();
e.target.addEventListener(this.columnItem.events.remove, this.columnRemoveEventFunc);
e.target.addEventListener(this.columnItem.events.resize, this.columnResizeEventFunc);
}
disconnectedCallback() {
super.disconnectedCallback();
this.removeColumnsEventListeners();
}
addColumnsEventListeners() {
this.getExistItems(this.columnItem.name).forEach((item) => {
item.addEventListener(this.columnItem.events.remove, this.columnRemoveEventFunc);
item.addEventListener(this.columnItem.events.resize, this.columnResizeEventFunc);
});
}
removeColumnsEventListeners() {
this.getExistItems(this.columnItem.name).forEach((item) => {
item.removeEventListener(this.columnItem.events.remove, this.columnRemoveEventFunc);
item.removeEventListener(this.columnItem.events.add, this.columnAddEventFunc);
item.removeEventListener(this.columnItem.events.resize, this.columnResizeEventFunc);
});
}
update(changedProps) {
super.update(changedProps);
if (changedProps.has('background-url')) {
const url = this['background-url'];
this.style.setProperty('--background-image', `url(${url})`);
}
}
static getStyle() {
const styleRoot = super.getStyle();
return `
${styleRoot}
mj-section {
padding: var(--padding-top) var(--padding-right) var(--padding-bottom) var(--padding-left);
}
:host {
display: block;
min-height: 40px;
border-radius: var(--border-radius);
background-color: var(--background-color);
background-image: var(--background-image);
background-size: var(--background-size);
background-repeat: var(--background-repeat);
background-position: top center;
padding: var(--padding-top) var(--padding-right) var(--padding-bottom) var(--padding-left);
direction: var(--direction);
text-align: var(--text-align);
vertical-align: var(--vertical-align);
}
slot {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: flex-start;
justify-content: center;
}`;
}
render() {
super.render();
return html`
<style>
${MJMLSection.getStyle()}
</style>
<div class='mj-section'>
<slot></slot>
${MJMLSection.getSystemSlotTemplate()}
</div>
`;
}
}
export { MJMLSection };