2021-04-08 17:52:31 +04:00
|
|
|
/*
|
|
|
|
* https://github.com/morethanwords/tweb
|
|
|
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
|
|
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
|
|
|
*/
|
|
|
|
|
2021-05-08 21:46:50 +04:00
|
|
|
import { cancelEvent } from "../helpers/dom/cancelEvent";
|
|
|
|
import { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from "../helpers/dom/clickEvent";
|
2020-12-01 17:38:36 +02:00
|
|
|
import ListenerSetter from "../helpers/listenerSetter";
|
2021-03-21 13:59:59 +04:00
|
|
|
import { i18n, LangPackKey } from "../lib/langPack";
|
2021-04-02 18:32:10 +04:00
|
|
|
import CheckboxField from "./checkboxField";
|
2020-11-23 12:03:53 +02:00
|
|
|
import { closeBtnMenu } from "./misc";
|
2020-10-10 01:36:06 +03:00
|
|
|
import { ripple } from "./ripple";
|
|
|
|
|
2020-12-01 17:38:36 +02:00
|
|
|
export type ButtonMenuItemOptions = {
|
2021-07-19 22:53:52 +03:00
|
|
|
icon?: string,
|
|
|
|
text?: LangPackKey,
|
|
|
|
regularText?: string,
|
2021-11-29 17:51:29 +04:00
|
|
|
onClick: (e: MouseEvent | TouchEvent) => void | boolean,
|
2020-12-01 17:38:36 +02:00
|
|
|
element?: HTMLElement,
|
2021-11-29 17:51:29 +04:00
|
|
|
textElement?: HTMLElement,
|
2021-04-02 18:32:10 +04:00
|
|
|
options?: AttachClickOptions,
|
|
|
|
checkboxField?: CheckboxField,
|
2021-11-29 17:51:29 +04:00
|
|
|
noCheckboxClickListener?: boolean,
|
2021-06-28 01:32:50 +03:00
|
|
|
keepOpen?: boolean
|
2020-12-01 17:38:36 +02:00
|
|
|
/* , cancelEvent?: true */
|
|
|
|
};
|
2020-10-10 01:36:06 +03:00
|
|
|
|
|
|
|
const ButtonMenuItem = (options: ButtonMenuItemOptions) => {
|
|
|
|
if(options.element) return options.element;
|
|
|
|
|
2021-11-29 17:51:29 +04:00
|
|
|
const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;
|
2020-10-10 01:36:06 +03:00
|
|
|
const el = document.createElement('div');
|
2021-07-19 22:53:52 +03:00
|
|
|
el.className = 'btn-menu-item' + (icon ? ' tgico-' + icon : '');
|
2020-10-10 01:36:06 +03:00
|
|
|
ripple(el);
|
2021-07-19 22:53:52 +03:00
|
|
|
|
2021-11-29 17:51:29 +04:00
|
|
|
let textElement = options.textElement;
|
|
|
|
if(!textElement) {
|
|
|
|
textElement = options.textElement = text ? i18n(text) : document.createElement('span');
|
|
|
|
if(options.regularText) textElement.innerHTML = options.regularText;
|
2021-04-02 18:32:10 +04:00
|
|
|
}
|
2021-11-29 17:51:29 +04:00
|
|
|
|
|
|
|
textElement.classList.add('btn-menu-item-text');
|
|
|
|
el.append(textElement);
|
2020-11-24 06:13:16 +02:00
|
|
|
|
2021-11-29 17:51:29 +04:00
|
|
|
const keepOpen = !!checkboxField || !!options.keepOpen;
|
2021-06-28 01:32:50 +03:00
|
|
|
|
|
|
|
// * cancel mobile keyboard close
|
2021-11-29 17:51:29 +04:00
|
|
|
attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {
|
2020-11-24 06:13:16 +02:00
|
|
|
cancelEvent(e);
|
2021-11-29 17:51:29 +04:00
|
|
|
const result = onClick(e);
|
|
|
|
|
|
|
|
if(result === false) {
|
|
|
|
return;
|
|
|
|
}
|
2021-06-28 01:32:50 +03:00
|
|
|
|
|
|
|
if(!keepOpen) {
|
|
|
|
closeBtnMenu();
|
|
|
|
}
|
2021-11-29 17:51:29 +04:00
|
|
|
|
|
|
|
if(checkboxField && !noCheckboxClickListener/* && result !== false */) {
|
|
|
|
checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;
|
|
|
|
}
|
|
|
|
}/* : onClick */, options.options);
|
|
|
|
|
|
|
|
if(checkboxField) {
|
|
|
|
el.append(checkboxField.label);
|
|
|
|
}
|
2020-10-10 01:36:06 +03:00
|
|
|
|
|
|
|
return options.element = el;
|
|
|
|
};
|
|
|
|
|
2020-12-01 17:38:36 +02:00
|
|
|
const ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {
|
2020-10-10 01:36:06 +03:00
|
|
|
const el = document.createElement('div');
|
|
|
|
el.classList.add('btn-menu');
|
|
|
|
|
2020-12-01 17:38:36 +02:00
|
|
|
if(listenerSetter) {
|
|
|
|
buttons.forEach(b => {
|
|
|
|
if(b.options) {
|
|
|
|
b.options.listenerSetter = listenerSetter;
|
|
|
|
} else {
|
|
|
|
b.options = {listenerSetter};
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-10-10 01:36:06 +03:00
|
|
|
const items = buttons.map(ButtonMenuItem);
|
|
|
|
|
|
|
|
el.append(...items);
|
|
|
|
|
|
|
|
return el;
|
|
|
|
};
|
|
|
|
|
2021-03-29 22:42:01 +04:00
|
|
|
export default ButtonMenu;
|