Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/js/rest/form-constructor/src/fields/
Upload File :
Current File : /var/www/homesaver/www/bitrix/js/rest/form-constructor/src/fields/base-field.js

import { Type, Text, Dom, Tag } from 'main.core';
import type { FieldConfig } from '../types';
import { EventEmitter } from 'main.core.events';

export class BaseField extends EventEmitter
{
	options: FieldConfig;
	readySave: boolean;
	value: any;
	#errorBlock: HTMLElement;

	constructor(options: FieldConfig)
	{
		super();
		this.setEventNamespace('BX.Rest.EInvoice.Field');
		this.options = options;
		this.value = this.options.value ?? null;
		this.readySave = !(Type.isNil(this.value) || this.value === '');
		this.options.id = Type.isStringFilled(this.options.id) ? this.options.id : Text.getRandom(8);
	}

	getId(): string
	{
		return this.options.id;
	}

	getName(): string
	{
		return this.options.name;
	}

	getContent(): HTMLElement
	{
		const wrapper = Tag.render`
			<div class="container"></div>
		`;
		Dom.append(this.renderFieldContainer(), wrapper);
		Dom.append(this.renderErrorsContainer(), wrapper);
		Dom.hide(this.renderErrorsContainer());
		this.subscribe('error', (event) => {
			const messages = event.data.messages;
			this.renderErrorsContainer().innerHTML = Type.isArray(messages) ? messages.join('<br>') : messages;
			Dom.show(this.renderErrorsContainer());

			if (!Dom.hasClass(wrapper, 'ui-ctl-warning'))
			{
				Dom.addClass(wrapper, 'ui-ctl-warning');
			}
		});

		return wrapper;
	}

	renderFieldContainer(): HTMLElement
	{
		throw new Error('Must be implemented in a child class');
	}

	isReadySave(): boolean
	{
		return this.readySave;
	}

	renderErrorsContainer(): HTMLElement
	{
		if (!this.#errorBlock)
		{
			this.#errorBlock = Tag.render`
				<div class="ui-ctl-bottom bitrix-einvoice-error-block"></div>
			`;
		}

		return this.#errorBlock;
	}

	getValue(): any
	{
		return this.value;
	}
}