Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/js/landing/ui/form/dynamicblockform/src/
Upload File :
Current File : /var/www/homesaver/www/bitrix/js/landing/ui/form/dynamicblockform/src/dynamicblockform.js

import {Dom, Type} from 'main.core';
import {BaseForm} from 'landing.ui.form.baseform';
import {Env} from 'landing.env';
import {Loc} from 'landing.loc';

/**
 * @memberOf BX.Landing.UI.Form
 */
export class DynamicBlockForm extends BaseForm
{
	constructor(options)
	{
		super(options);

		this.type = options.type;
		this.forms = options.forms;
		this.code = options.code;
		this.onSourceChangeHandler = options.onSourceChange;
		this.dynamicParams = options.dynamicParams;
		this.settingFieldsSelectors = ['source'];

		this.addField(this.createSourceField());
	}

	static getSources(): Array<any>
	{
		return Env.getInstance().getOptions().sources;
	}

	static getSourceById(id: string)
	{
		return DynamicBlockForm.getSources().find((source) => {
			return String(source.id) === String(id);
		});
	}

	static getSourceFieldItems(): {name: string, value: string}
	{
		return DynamicBlockForm.getSources().map((source) => {
			return {name: source.name, value: source.id};
		});
	}

	static isReference(value): boolean
	{
		const sources = DynamicBlockForm.getSources();
		if (Type.isArray(sources))
		{
			return sources.some((source) => {
				if (Type.isArray(source.references))
				{
					return source.references.some((reference) => {
						return reference.id === value;
					});
				}

				return false;
			});
		}

		return false;
	}

	createSourceField(): BX.Landing.UI.Field.Dropdown
	{
		let value = '';

		if (
			Type.isPlainObject(this.dynamicParams)
			&& Type.isPlainObject(this.dynamicParams.wrapper)
			&& Type.isPlainObject(this.dynamicParams.wrapper.settings)
			&& Type.isString(this.dynamicParams.wrapper.settings.source)
		)
		{
			value = this.dynamicParams.wrapper.settings.source;
		}

		let source = DynamicBlockForm.getSourceById(value);
		if (!source)
		{
			[source] = DynamicBlockForm.getSources();
		}

		setTimeout(() => {
			this.onSourceChangeHandler(source);
		}, 0);

		return new BX.Landing.UI.Field.Dropdown({
			title: Loc.getMessage('LANDING_CARDS__SOURCE_FIELD_TITLE'),
			selector: 'source',
			content: value,
			items: DynamicBlockForm.getSourceFieldItems(),
			onValueChange: (field) => {
				this.onSourceChangeHandler(DynamicBlockForm.getSourceById(field.getValue()));
			},
		});
	}

	serialize(): {[key: string]: any}
	{
		return this.fields.reduce((acc, field) => {
			const value = field.getValue();

			if (field.selector === 'source')
			{
				acc.source = value;
				acc.settings[field.selector] = value;
			}
			else if (value === '@hide' || (Type.isPlainObject(value) && value.id === '@hide'))
			{
				acc.references[field.selector] = '@hide';

				if (Dom.hasClass(field.layout, 'landing-ui-field-dynamic-dropdown'))
				{
					acc.stubs[field.selector] = '';
				}
				else if (Dom.hasClass(field.layout, 'landing-ui-field-dynamic-image'))
				{
					acc.stubs[field.selector] = {
						id: -1,
						src: 'data:image/gif;base64,R0lGODlhAQABAIAAAP',
						alt: '',
					};
				}
			}
			else if (DynamicBlockForm.isReference(value))
			{
				acc.references[field.selector] = {id: value};
			}
			else if (Type.isPlainObject(value) && Type.isString(value.id))
			{
				acc.references[field.selector] = value;
			}
			else
			{
				acc.stubs[field.selector] = value;
			}

			return acc;
		}, {settings: {}, references: {}, stubs: {}});
	}
}