Your IP : 172.69.7.234


Current Path : /var/www/element/data/www/revenuestory.ru/bitrix/js/landing/ui/form/
Upload File :
Current File : /var/www/element/data/www/revenuestory.ru/bitrix/js/landing/ui/form/dynamic_cards_form.js

;(function() {
	"use strict";

	BX.namespace("BX.Landing.UI.Form");

	BX.Landing.UI.Form.DynamicCardsForm = function(data)
	{
		BX.Landing.UI.Form.BaseForm.apply(this, arguments);
		this.type = data.type;
		this.code = data.code;
		this.presets = data.presets;
		this.sync = data.sync;
		this.forms = data.forms;
		this.id = this.code.replace(".", "") + "-" + BX.Landing.Utils.random();
		this.onSourceChangeHandler = data.onSourceChange;
		this.dynamicParams = data.dynamicParams;
		this.settingFieldsSelectors = [
			"source",
			"pagesCount",
			"detailPage",
			"useSef"
		];

		this.sourceField = this.createSourceField();
		this.pagesField = this.createPagesField();

		this.addField(this.sourceField);
		this.addField(this.pagesField);

		this.detailPageGroup = this.createFieldsGroup([
			this.createLinkField()
		]);

		this.addCard(
			this.detailPageGroup
		);
	};

	BX.Landing.UI.Form.DynamicCardsForm.prototype = {
		constructor: BX.Landing.UI.Form.DynamicCardsForm,
		__proto__: BX.Landing.UI.Form.BaseForm.prototype,

		getSources: function()
		{
			return BX.Landing.Main.getInstance().options.sources;
		},

		getSourceItems: function()
		{
			return this.getSources()
				.map(function(item) {
					return {
						name: item.name,
						value: item.id,
						url: item.url ? item.url.filter : '',
						filter: item.filter,
						sort: {
							items: item.sort.map(function(sortItem) {
								return {name: sortItem.name, value: sortItem.id}
							})
						},
						settings: item.settings
					}
				});
		},

		createSourceField: function()
		{
			var sourceItems = this.getSourceItems();
			var value = {
				source: sourceItems[0].value,
				filter: sourceItems[0].filter,
			};

			if (
				BX.type.isPlainObject(this.dynamicParams)
				&& BX.type.isPlainObject(this.dynamicParams.settings)
				&& BX.type.isPlainObject(this.dynamicParams.settings.source)
			)
			{
				value.source = this.dynamicParams.settings.source.source;
				value.filter = this.dynamicParams.settings.source.filter;
				value.sort = this.dynamicParams.settings.source.sort;
			}

			return new BX.Landing.UI.Field.SourceField({
				selector: "source",
				title: BX.Landing.Loc.getMessage("LANDING_CARDS__SOURCE_FIELD_TITLE"),
				items: sourceItems,
				value: value,
				onValueChange: function(field)
				{
					var value = field.getValue();
					var source = this.getSources().find(function(item) {
						return item.id === value.source;
					});

					setTimeout(function() {
						if (!this.sourceField.isDetailPageAllowed())
						{
							BX.style(this.detailPageGroup.layout, 'display', 'none');
						}
						else
						{
							BX.style(this.detailPageGroup.layout, 'display', null);
						}
						this.onSourceChangeHandler(source);
					}.bind(this), 0);
				}.bind(this)
			});
		},

		createPagesField: function()
		{
			return new BX.Landing.UI.Field.Pages({
				selector: "pagesCount",
				title: BX.Landing.Loc.getMessage("LANDING_CARDS__PAGES_FIELD_TITLE"),
				value: this.dynamicParams.settings.pagesCount
			});
		},

		createLinkField: function()
		{
			var content = {
				text: "",
				href: ""
			};

			if (
				BX.type.isPlainObject(this.dynamicParams)
				&& BX.type.isPlainObject(this.dynamicParams.settings)
				&& BX.type.isPlainObject(this.dynamicParams.settings.detailPage)
			)
			{
				content = this.dynamicParams.settings.detailPage;
			}

			return new BX.Landing.UI.Field.Link({
				selector: "detailPage",
				title: BX.Landing.Loc.getMessage("LANDING_CARDS__DETAIL_PAGE_FIELD_TITLE"),
				textOnly: true,
				disableCustomURL: true,
				disableBlocks: true,
				disallowType: true,
				allowedTypes: [
					BX.Landing.UI.Field.LinkURL.TYPE_PAGE
				],
				detailPageMode: true,
				sourceField: this.fields.find((function(field) {
					return field.selector === 'source';
				})),
				options: {
					siteId: BX.Landing.Main.getInstance().options.site_id,
					landingId: BX.Landing.Main.getInstance().id,
					filter: {
						'=TYPE': BX.Landing.Main.getInstance().options.params.type
					}
				},
				content: content
			});
		},

		createUseSefField: function()
		{
			return new BX.Landing.UI.Field.Checkbox({
				selector: "useSef",
				multiple: false,
				items: [
					{
						name: BX.Landing.Loc.getMessage("LANDING_CARDS__DETAIL_PAGE_USE_SEF"),
						value: true,
						checked: true
					}
				]
			});
		},

		createFieldsGroup: function(items)
		{
			return new BX.Landing.UI.Card.DynamicFieldsGroup({
				items: items
			});
		},

		isReference: function(value)
		{
			var sources = this.getSources();

			if (BX.type.isArray(sources))
			{
				return sources.some(function(source) {
					if (BX.type.isArray(source.references))
					{
						return source.references.some(function(reference) {
							return reference.id === value;
						});
					}

					return false;
				});
			}

			return false;
		},

		serialize: function()
		{
			var isDetailPageAllowed = this.sourceField.isDetailPageAllowed();

			return this.fields.reduce(function(acc, field) {
				if (field.selector === 'detailPage' && !isDetailPageAllowed)
				{
					return acc;
				}

				var value = field.getValue();

				if (this.settingFieldsSelectors.includes(field.selector))
				{
					if (field.selector === 'source')
					{
						acc.source = value.source;
					}

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

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

				return acc;
			}.bind(this), {settings: {}, references: {}, stubs: {}});
		}
	};
})();