1 line
45 KiB
Plaintext
1 line
45 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/helpers/dom/documentFragmentToHTML.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/getRichValue.ts"],"names":["documentFragmentToHTML","fragment","Array","from","childNodes","map","node","nodeType","textContent","outerHTML","join","findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","entities","offset","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","isInputEmpty","element","hasAttribute","value","trim","blobSupported","blobConstruct","e","this","mimeType","size","saveFileCallback","bytes","Uint8Array","write","part","set","truncate","slice","finalize","saveToStorage","blob","getParts","replaceParts","parts","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","response","put","fileName","method","get","then","Blob","Response","headers","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","res","err","clearTimeout","fileSize","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","storage","deleteAll","replaceContent","elem","innerHTML","lastChild","replaceWith","append","init","document","addEventListener","target","text","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","replace","span","createElement","remove","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","window","execCommand","InputState","options","container","classList","add","required","validate","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","input","processInput","label","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","setLabel","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","height","transitionDuration","log","abs","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","state","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","field","withEntities","combineSameEntities","sortEntities"],"mappings":"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","file":"2.c6719cf29f278d18da90.chunk.js","sourcesContent":["import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract<MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityCode' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler'>;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise<Blob>) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise<Cache>;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType<typeof logger> = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise<Cache> {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise<any> {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation<T>(callback: (cache: Cache) => Promise<T>) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise<T>(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(/<style([\\s\\S]*)<\\/style>/, '');\r\n html = html.replace(/<!--([\\s\\S]*)-->/, '');\r\n\r\n const match = html.match(/<body>([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like <p>asd</p>\\n<p>zxc</p>\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n const fragment = RichTextProcessor.wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n <div contenteditable=\"${String(!!canBeEdited)}\" class=\"input-field-input\"></div>\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(RichTextProcessor.wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n"],"sourceRoot":""} |