Telegram Web K with changes to work inside I2P https://web.telegram.i2p/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

188 lines
6.0 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import CheckboxField from "./checkboxField";
import RadioField from "./radioField";
import { ripple } from "./ripple";
import { SliderSuperTab } from "./slider";
import RadioForm from "./radioForm";
import { i18n, LangPackKey } from "../lib/langPack";
import replaceContent from "../helpers/dom/replaceContent";
import setInnerHTML from "../helpers/dom/setInnerHTML";
export default class Row {
public container: HTMLElement;
public title: HTMLDivElement;
public titleRight: HTMLElement;
public subtitle: HTMLElement;
public media: HTMLElement;
public checkboxField: CheckboxField;
public radioField: RadioField;
public freezed = false;
constructor(options: Partial<{
icon: string,
subtitle: string | HTMLElement | DocumentFragment,
subtitleLangKey: LangPackKey,
subtitleLangArgs: any[],
radioField: Row['radioField'],
checkboxField: Row['checkboxField'],
noCheckboxSubtitle: boolean,
title: string | HTMLElement,
titleLangKey: LangPackKey,
titleRight: string | HTMLElement,
titleRightSecondary: string | HTMLElement,
clickable: boolean | ((e: Event) => void),
navigationTab: SliderSuperTab,
havePadding: boolean,
noRipple: boolean
}> = {}) {
this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');
this.container.classList.add('row');
this.subtitle = document.createElement('div');
this.subtitle.classList.add('row-subtitle');
this.subtitle.setAttribute('dir', 'auto');
if(options.subtitle) {
if(typeof(options.subtitle) === 'string') {
setInnerHTML(this.subtitle, options.subtitle);
} else {
this.subtitle.append(options.subtitle);
}
} else if(options.subtitleLangKey) {
this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));
}
this.container.append(this.subtitle);
let havePadding = !!options.havePadding;
if(options.radioField || options.checkboxField) {
if(options.radioField) {
this.radioField = options.radioField;
this.container.append(this.radioField.label);
havePadding = true;
}
if(options.checkboxField) {
this.checkboxField = options.checkboxField;
const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');
if(isToggle) {
this.container.classList.add('row-with-toggle');
options.titleRight = this.checkboxField.label;
} else {
havePadding = true;
this.container.append(this.checkboxField.label);
}
if(!options.noCheckboxSubtitle && !isToggle) {
this.checkboxField.input.addEventListener('change', () => {
replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));
});
}
}
const i = options.radioField || options.checkboxField;
i.label.classList.add('disable-hover');
}
if(options.title || options.titleLangKey) {
let c: HTMLElement;
const titleRight = options.titleRight || options.titleRightSecondary;
if(titleRight) {
c = document.createElement('div');
c.classList.add('row-title-row');
this.container.append(c);
} else {
c = this.container;
}
this.title = document.createElement('div');
this.title.classList.add('row-title');
this.title.setAttribute('dir', 'auto');
if(options.title) {
if(typeof(options.title) === 'string') {
this.title.innerHTML = options.title;
} else {
this.title.append(options.title);
}
} else {
this.title.append(i18n(options.titleLangKey));
}
c.append(this.title);
if(titleRight) {
const titleRightEl = this.titleRight = document.createElement('div');
titleRightEl.classList.add('row-title', 'row-title-right');
if(options.titleRightSecondary) {
titleRightEl.classList.add('row-title-right-secondary');
}
if(typeof(titleRight) === 'string') {
titleRightEl.innerHTML = titleRight;
} else {
titleRightEl.append(titleRight);
}
c.append(titleRightEl);
}
}
if(options.icon) {
havePadding = true;
this.title.classList.add('tgico', 'tgico-' + options.icon);
this.container.classList.add('row-with-icon');
}
if(havePadding) {
this.container.classList.add('row-with-padding');
}
if(options.navigationTab) {
options.clickable = () => options.navigationTab.open();
}
if(options.clickable || options.radioField || options.checkboxField) {
if(typeof(options.clickable) === 'function') {
this.container.addEventListener('click', (e) => {
if(this.freezed) return;
(options.clickable as any)(e);
});
}
this.container.classList.add('row-clickable', 'hover-effect');
if(!options.noRipple) {
ripple(this.container, undefined, undefined, true);
}
/* if(options.radioField || options.checkboxField) {
this.container.prepend(this.container.lastElementChild);
} */
}
}
public createMedia(size?: 'small') {
this.container.classList.add('row-with-padding');
const media = this.media = document.createElement('div');
media.classList.add('row-media');
if(size) {
media.classList.add('row-media-' + size);
}
this.container.append(media);
return media;
}
}
export const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {
return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);
};