403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/js/socialnetwork/membership-request-panel/src/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/js/socialnetwork/membership-request-panel/src/members-list.js
import { ajax, AjaxError, AjaxResponse, Dom, Event, Tag, Text, Type } from 'main.core';
import { Popup } from 'main.popup';
import { Loader } from 'main.loader';
import { Member } from './membership-request-panel';

type Params = {
	groupId: number,
	bindElement: HTMLElement,
	pathToUser: string,
}

export class MembersList
{
	#popup: Popup;
	#loader: Loader;
	#groupId: number;
	#pathToUser: string;
	#pageNum: number;

	#listMembers: Set;

	constructor(params: Params)
	{
		this.#groupId = Type.isInteger(parseInt(params.groupId, 10)) ? parseInt(params.groupId, 10) : 0;

		this.#popup = this.#createPopup(params.bindElement);
		this.#pathToUser = params.pathToUser;

		this.#listMembers = new Set();

		this.#pageNum = 1;
	}

	show()
	{
		this.#popup.toggle();
	}

	#createPopup(bindElement: HTMLElement): Popup
	{
		const popup = new Popup({
			id: 'sn-mrp-members-popup',
			className: 'sn-mrp-members-popup',
			bindElement: bindElement,
			autoHide: true,
			closeByEsc: true,
			content: this.#renderPopupContent(),
			events: {
				onAfterPopupShow: () => {
					const popupContainer = popup.getContentContainer();
					const listContainer = popupContainer.querySelector('.sn-mrp-members-popup-content');
					const list = popupContainer.querySelector('.sn-mrp-members-popup-inner');

					this.#bindPopupScroll(list);

					this.#showLoader(listContainer);

					// eslint-disable-next-line promise/catch-or-return
					this.#appendMembers(list).then(() => {
						this.#destroyLoader();
						this.#bindPopupScroll(list);
					});
				},
			},
		});

		return popup;
	}

	#appendMembers(list: HTMLElement): Promise
	{
		// eslint-disable-next-line promise/catch-or-return
		return this.#getList()
			.then((listMembers: Array<Member>) => {
				listMembers.forEach((member: Member) => {
					this.#listMembers.add(member);
					Dom.append(this.#renderMember(member), list);
				});
			})
		;
	}

	#renderPopupContent(): HTMLElement
	{
		return Tag.render`
			<div class="sn-mrp-members-popup-container">
				<div class="sn-mrp-members-popup-content">
					<div class="sn-mrp-members-popup-content-box">
						<div class="sn-mrp-members-popup-inner"></div>
					</div>
				</div>
			</div>
		`;
	}

	#renderMember(member: Member): HTMLElement
	{
		let photoIcon = '<i></i>';
		if (member.photo)
		{
			photoIcon = `<i style="background-image: url('${encodeURI(member.photo)}')"></i>`;
		}

		return Tag.render`
			<a
				class="sn-mrp-members-popup-item"
				href="${Text.encode(this.#pathToUser.replace('#user_id#', member.id))}"
				data-id="sn-mrp-members-popup-item-${member.id}"
			>
				<span class="sn-mrp-members-popup-avatar-new">
					<div class="ui-icon ui-icon-common-user sn-mrp-members-popup-avatar-img">
						${photoIcon}
					</div>
					<span></span>
				</span>
				<span class="sn-mrp-members-popup-name">
					${Text.encode(member.name)}
				</span>
			</a>
		`;
	}

	#bindPopupScroll(list: HTMLElement)
	{
		Event.bind(list, 'scroll', () => {
			if (list.scrollTop > (list.scrollHeight - list.offsetHeight) / 1.5)
			{
				this.#appendMembers(list);

				Event.unbindAll(list, 'scroll');
			}
		});
	}

	#showLoader(target: HTMLElement)
	{
		this.#loader = new Loader({
			target: target,
			size: 40,
		});

		this.#loader.show();
	}

	#destroyLoader()
	{
		this.#loader.destroy();
	}

	#getList(): Promise
	{
		return new Promise((resolve) => {
			ajax.runAction('socialnetwork.api.workgroup.getListIncomingUsers', {
				data: {
					groupId: this.#groupId,
					pageNum: this.#pageNum,
				},
			})
				.then((response: AjaxResponse) => {
					this.#pageNum++;
					resolve(response.data);
				})
				.catch((error: AjaxError) => {
					this.#consoleError('getList', error);
				})
			;
		});
	}

	#consoleError(action: string, error: AjaxError)
	{
		// eslint-disable-next-line no-console
		console.error(`MembershipRequestPanel.MembersList: ${action} error`, error);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit