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/landing/ui/card/iconlistcard/src/ |
Upload File : |
import {Dom, Event, Tag, Type} from 'main.core'; import {BaseEvent} from "main.core.events"; import {Loc} from 'landing.loc'; import {BaseCard} from 'landing.ui.card.basecard'; import {IconOptionsCard} from 'landing.ui.card.iconoptionscard'; import 'ui.fonts.opensans'; import './css/style.css'; /** * @memberOf BX.Landing.UI.Card */ export class IconListCard extends BaseCard { items: Map; activeIcon: ?string; itemsContainer: ?HTMLDivElement; constructor( options: { id?: string, header?: string, description?: string, context?: string, icon?: string, angle?: boolean, closeable?: boolean, hideActions?: boolean, restoreState?: boolean, more?: string | () => {}, }, ) { super(options); this.setEventNamespace('BX.Landing.UI.Card.IconListCard'); this.title = ''; this.items = new Map(); this.activeIcon = null; this.previewOptionsCard = new IconOptionsCard(); this.previewOptionsCard.subscribe('onChange', this.onPreviewOptionClick.bind(this)); Dom.append(this.previewOptionsCard.getLayout(), this.getPreviewOptions()); } getLayout(): HTMLDivElement { return this.cache.remember('layout', () => { return Tag.render` <div class="landing-ui-card landing-ui-card-icons"> <div class="landing-ui-card-header-wrapper"> ${this.getHeader()} ${this.getPreview()} </div> <div class="landing-ui-card-body-wrapper"> ${this.getBody()} </div> </div> `; }); } getPreview(): HTMLDivElement { return this.cache.remember('preview', () => { return Tag.render` <div class="landing-ui-card-preview --hide"> <div class="landing-ui-card-preview-icon"></div> <div class="landing-ui-card-preview-options"></div> </div> `; }); } getPreviewIcon(): HTMLElement { return this.getPreview().querySelector('.landing-ui-card-preview-icon'); } getPreviewOptions(): HTMLElement { return this.getPreview().querySelector('.landing-ui-card-preview-options'); } setPreviewIcon(className: string) { const icon = Tag.render`<span class="${className}"></span>`; Dom.clean(this.getPreviewIcon()); Dom.append(icon, this.getPreviewIcon()); } addItem(item: string, additional: ?{}) { if (this.getBody().childElementCount === 0) { this.itemsContainer = Tag.render`<div class="landing-ui-card-icons-container"></div>`; Dom.append(this.itemsContainer, this.getBody()); } const icon = Tag.render` <div class="landing-ui-card landing-ui-card-icon"> <span class="${item}"></span> </div> `; Event.bind(icon, 'click', this.onItemClick.bind(this, icon, additional)); Dom.append(icon, this.itemsContainer); // todo: need? // duplicate control const styles = getComputedStyle(icon.querySelector('span'), ':before'); requestAnimationFrame(() => { const content = styles.getPropertyValue('content'); if (content === 'none') { console.warn('Attention, item "' + item + '" has no content'); } if (this.items.has(content)) { icon.hidden = true; } else { this.items.set(content, true); } }); } onItemClick(item: HTMLElement, additional: ?{}): void { const prevActive = this.getBody().querySelector('.landing-ui-card-icon.--active'); if (prevActive) { Dom.removeClass(prevActive, '--active'); } Dom.addClass(item, '--active'); this.activeIcon = item.firstElementChild.className; if (Type.isObject(additional)) { this.setPreviewIcon(additional.defaultOption); this.previewOptionsCard.setOptions(additional.options, additional.defaultOption); } else { this.setPreviewIcon(this.activeIcon); this.previewOptionsCard.setOptions([this.activeIcon], this.activeIcon); } Dom.removeClass(this.getPreview(), '--hide'); } onPreviewOptionClick(event: BaseEvent) { const option = event.getData().option; this.activeIcon = option; this.setPreviewIcon(option); } getActiveIcon(): ?string { return this.activeIcon; } getActiveOptions(): [string] { return this.previewOptionsCard.getOptions(); } }