mirror of
https://github.com/Neetpone/ponepaste.git
synced 2025-03-12 22:50:07 +01:00
1 line
No EOL
26 KiB
Text
1 line
No EOL
26 KiB
Text
{"version":3,"file":"archive.min.js","sources":["../../../js/dom.js","../../../js/data_tables.js","../../../js/tag_input.js","../../../js/main.js","../../../js/archive.js","../../../js/utils.js"],"sourcesContent":["const $ = function(selector) {\n return document.querySelector(selector);\n};\n\nconst $$ = function(selector) {\n return document.querySelectorAll(selector) || [];\n};\n\nconst makeEl = function(html) {\n const template = document.createElement('template');\n\n template.innerHTML = html.trim();\n\n return template.content.firstChild;\n};\n\nconst clearEl = function(el) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n};\n\nconst toggleEl = function(el) {\n if (el.classList.contains('is-hidden')) {\n el.classList.remove('is-hidden');\n } else {\n el.classList.add('is-hidden');\n }\n};\n\nconst escape = function(unsafe) {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nconst whenReady = function(funcp) {\n if (document.readyState !== 'loading') {\n funcp();\n } else {\n document.addEventListener('DOMContentLoaded', funcp);\n }\n}\n\nexport { whenReady, $, $$, makeEl, clearEl, toggleEl, escape };","import { makeEl, clearEl } from \"./dom\";\n\nclass SimplePaginator {\n constructor(element) {\n this.element = element;\n }\n\n attach(pageCallback) {\n this.element.addEventListener('click', evt => {\n if (evt.target && evt.target.classList.contains('paginator__button')) {\n pageCallback(+evt.target.dataset.page);\n }\n });\n }\n\n update(totalRecords, perPage, currentPage) {\n clearEl(this.element);\n\n /* First and last page in existence */\n const firstPage = 0;\n const lastPage = Math.floor(totalRecords / perPage); // ish?\n const numPagesToShow = 2;\n\n if (lastPage === firstPage) {\n return;\n }\n\n /* First and last page the main paginator will show */\n const firstPageShow = (currentPage - numPagesToShow) < firstPage ? firstPage : (currentPage - numPagesToShow);\n const lastPageShow = (currentPage + numPagesToShow) > lastPage ? lastPage : (currentPage + numPagesToShow);\n\n /* Whether to show the first and last pages in existence at the ends of the paginator */\n const showFirstPage = (Math.abs(firstPage - currentPage)) > (numPagesToShow);\n const showLastPage = (Math.abs(lastPage - currentPage)) > (numPagesToShow);\n\n\n const prevButtonDisabled = currentPage === firstPage ? 'disabled' : ''\n\n /* Previous button */\n this.element.appendChild(makeEl(\n `<button class=\"paginator__button previous\" ${prevButtonDisabled} data-page=\"${currentPage - 1}\">Previous</button>`\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n `<button class=\"paginator__button\" data-page=\"${firstPage}\">${firstPage}</button>`\n ));\n this.element.appendChild(makeEl(`<span class=\"ellipsis\">…</span>`));\n }\n\n /* \"window\" buttons */\n for (let i = firstPageShow; i <= lastPageShow; i++) {\n const selected = (i === currentPage ? 'paginator__button--selected' : '');\n this.element.appendChild(makeEl(\n `<button class=\"paginator__button ${selected}\" data-page=\"${i}\">${i}</button>`\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(`<span class=\"ellipsis\">…</span>`));\n this.element.appendChild(makeEl(\n `<button class=\"paginator__button\" data-page=\"${lastPage}\">${lastPage}</button>`\n ));\n }\n\n const nextButtonDisabled = currentPage === lastPage ? 'disabled' : ''\n /* Next button */\n this.element.appendChild(makeEl(\n `<button class=\"paginator__button next\" ${nextButtonDisabled} data-page=\"${currentPage + 1}\">Next</button>`\n ));\n }\n}\n\nclass DataTable {\n constructor(element, options) {\n this.element = element;\n this.container = element.parentElement;\n this.options = options;\n\n this.ajaxCallback = options.ajaxCallback;\n this.data = [];\n this.unfilteredData = [];\n\n this.totalRecords = -1;\n this.perPage = 20;\n this.currentPage = 0;\n\n this.paginator = new SimplePaginator(this.container.querySelector('.paginator'));\n\n this.filterCallback = options.filterCallback;\n this.sortField = null;\n this.sortDir = true;\n }\n\n attach() {\n this.filterField = this.container.querySelector('input.search');\n if (this.filterField && this.filterCallback) {\n this.filterField.addEventListener('keyup', evt => {\n if (evt.target) {\n this._updateFilter(evt.target.value);\n }\n });\n\n if (this.options.preFilter) {\n this.filterField.value = this.options.preFilter;\n }\n }\n\n this.perPageField = this.container.querySelector('select[name=per_page]');\n\n if (this.perPageField) {\n this.perPageField.addEventListener('change', evt => {\n this.perPage = Number(evt.target.value);\n this._updatePage(0);\n });\n }\n\n const header = this.element.querySelector('tr.paginator__sort');\n\n if (header) {\n header.addEventListener('click', evt => {\n const target = evt.target;\n\n if (!target.dataset.sortField) {\n return;\n }\n\n if (this.sortField) {\n const elem = this.element.querySelector(`th[data-sort-field=${this.sortField}]`)\n elem.classList.remove('paginator__sort--down');\n elem.classList.remove('paginator__sort--up');\n }\n\n this._updateSort(target.dataset.sortField, !this.sortDir);\n\n target.classList.add(this.sortDir ? 'paginator__sort--up' : 'paginator__sort--down');\n });\n }\n\n this.paginator.attach(this._updatePage.bind(this));\n this._loadEntries();\n }\n\n /* Load the requested data from the server, and when done, update the DOM. */\n _loadEntries() {\n new Promise(this.ajaxCallback)\n .then(data => {\n this.element.classList.remove('hidden');\n this.unfilteredData = data.data;\n this._updateFilter(this.options.preFilter);\n });\n }\n\n /* Update the DOM to reflect the current state of the data we have loaded */\n _updateEntries(data) {\n this.data = data;\n this.totalRecords = this.data.length;\n\n const bodyElement = this.element.querySelector('tbody');\n clearEl(bodyElement);\n\n const firstIndex = (this.perPage * this.currentPage);\n const lastIndex = (firstIndex + this.perPage) > this.totalRecords ? this.totalRecords : (firstIndex + this.perPage);\n\n\n for (let i = firstIndex; i < lastIndex; i++) {\n const rowElem = makeEl(this.options.rowCallback(this.data[i]));\n rowElem.classList.add(i % 2 === 0 ? 'odd' : 'even');\n\n bodyElement.appendChild(rowElem);\n }\n\n this.paginator.update(this.totalRecords, this.perPage, this.currentPage);\n }\n\n _updatePage(n) {\n this.currentPage = n;\n this.paginator.update(this.totalRecords, this.perPage, this.currentPage);\n this._updateEntries(this.data);\n }\n\n _updateFilter(query) {\n /* clearing the query */\n if (query === null || query === '') {\n this._updateEntries(this.unfilteredData);\n return;\n }\n\n let data = [];\n for (const datum of this.unfilteredData) {\n if (this.filterCallback(datum, query)) {\n data.push(datum);\n }\n }\n\n this._updatePage(0)\n this._updateEntries(data);\n }\n\n _updateSort(field, direction) {\n this.sortField = field;\n this.sortDir = direction;\n\n let newEntries = [...this.data].sort((a, b) => {\n let sorter = 0;\n\n if (a[field] > b[field]) {\n sorter = 1;\n } else if (a[field] < b[field]) {\n sorter = -1;\n }\n\n if (!direction) {\n sorter = -sorter;\n }\n\n return sorter;\n });\n\n this._updatePage(0);\n this._updateEntries(newEntries);\n }\n}\n\nconst dumbFilterCallback = (datum, query) => {\n if (!query) {\n return true;\n }\n\n if (datum.title.indexOf(query) !== -1) {\n return true;\n }\n\n /* this is inefficient */\n for (const tag of datum.tags) {\n if (tag.name.toLowerCase() === query.toLowerCase()) {\n return true;\n }\n }\n\n return false;\n};\n\nexport { DataTable, dumbFilterCallback };\n","import { makeEl, escape } from \"./dom\";\n\nclass TagsInput {\n constructor(element, options = {}) {\n this.element = element;\n this.tags = [];\n this.options = options\n\n this.maxTags = options.maxTags || 10;\n this.inputNode = null;\n this.containerNode = null;\n }\n\n attach() {\n this.element.style.display = 'none';\n\n this.containerNode = makeEl('<div class=\"tags-input\"></div>');\n this.inputNode = makeEl('<input class=\"input\" type=\"text\" placeholder=\"10 tags maximum\" value=\"\" />');\n this.containerNode.appendChild(this.inputNode);\n\n this.element.parentNode.insertBefore(this.containerNode, this.element.nextSibling);\n\n /* Load existing tags from input */\n if (this.element.value) {\n for (const tag of this.element.value.split(',')) {\n this.addTag(tag);\n }\n }\n\n /* Handle addition and removal of tags via key-presses */\n this.containerNode.addEventListener('keydown', this._handleInputKeyUp.bind(this));\n\n /* Handle deletions by clicking the delete button */\n this.containerNode.addEventListener('click', this._handleContainerClick.bind(this));\n }\n\n detach() {\n this.tags.clear();\n this.containerNode.remove();\n this.element.style.display = 'inline-block';\n }\n\n updateHiddenInputValue() {\n this.element.value = this.tags.join(',');\n }\n\n deleteTagNode(node) {\n this.tags.splice(this.tags.indexOf(node.dataset.value.toLowerCase()), 1);\n node.remove();\n\n /* Below the limit? Make sure the input is enabled. */\n if (this.tags.length < this.maxTags) {\n this.inputNode.disabled = false;\n }\n }\n\n addTag(tagValue) {\n tagValue = tagValue.trim();\n\n /* Tag value is probably not empty and we don't already have the same tag. */\n if (tagValue !== '' && this.tags.indexOf(tagValue.toLowerCase()) === -1) {\n this.tags.push(tagValue.toLowerCase());\n\n this.inputNode.parentNode.insertBefore(\n makeEl('<span class=\"tag is-info\" data-value=\"' + escape(tagValue) + '\">' + escape(tagValue) + '<span class=\"delete is-small\" /></span>'),\n this.inputNode\n );\n\n /* Too many tags, disable the input for now. */\n if (this.tags.length >= this.maxTags) {\n this.inputNode.disabled = true;\n }\n }\n }\n\n _handleInputKeyUp(evt) {\n let tagValue = this.inputNode.value;\n\n if (evt.key === 'Backspace' && tagValue === '') {\n // Remove the child\n if (this.inputNode.previousSibling) {\n this.deleteTagNode(this.inputNode.previousSibling);\n\n this.updateHiddenInputValue();\n }\n } else if (evt.key === ',') {\n this.addTag(tagValue);\n\n this.inputNode.value = ''\n this.updateHiddenInputValue();\n\n evt.preventDefault();\n }\n }\n\n _handleContainerClick(evt) {\n if (evt.target && evt.target.classList.contains('delete')) {\n this.deleteTagNode(evt.target.closest('.tag'));\n this.updateHiddenInputValue();\n }\n }\n}\n\nexport { TagsInput };\n","import { $, $$, toggleEl } from './dom';\nimport { TagsInput } from \"./tag_input\";\n\nconst setupSignupModal = () => {\n const signupButton = $('[data-target~=\"#signin\"],[data-target~=\"#signup\"]');\n\n if (signupButton) {\n signupButton.href = 'javascript:void(0)';\n\n signupButton.addEventListener('click', () => {\n $('.modal').classList.add('is-active');\n });\n\n $('.modal-button-close').addEventListener('click', () => {\n $('.modal').classList.remove('is-active');\n });\n }\n}\n\nconst globalSetup = () => {\n Array.prototype.forEach.call($$('.js-tag-input'), (el) => {\n new TagsInput(el).attach();\n });\n\n setupSignupModal();\n\n const embedButton = $('.panel-tools .embed-tool');\n\n if (embedButton){\n embedButton.addEventListener('click', (evt) => {\n if (evt.target && evt.target.closest('.panel-tools')) {\n toggleEl(evt.target.closest('.panel-tools').querySelector('.panel-embed'));\n }\n });\n }\n\n const expandButton = $('.expand-tool');\n\n if (expandButton) {\n expandButton.addEventListener('click', (evt) => {\n if (evt.target && evt.target.closest('.panel')) {\n const panel = evt.target.closest('.panel');\n\n if (panel.classList.contains('panel-fullsize')) {\n panel.classList.remove('panel-fullsize');\n } else {\n panel.classList.add('panel-fullsize');\n }\n }\n });\n }\n\n // Notifications\n (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {\n const $notification = $delete.parentNode;\n\n $delete.addEventListener('click', () => {\n $notification.parentNode.removeChild($notification);\n });\n });\n\n // Hamburger menu\n const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);\n if ($navbarBurgers.length > 0) {\n $navbarBurgers.forEach(el => {\n el.addEventListener('click', () => {\n const target = el.dataset.target;\n const $target = document.getElementById(target);\n el.classList.toggle('is-active');\n $target.classList.toggle('is-active');\n });\n });\n }\n\n const preloader = $('.preloader');\n const main = $('main');\n\n if (preloader && main) {\n preloader.remove();\n main.id = '';\n }\n\n // CAPTCHA refresh\n const captchaContainer = $('.captcha_container');\n\n if (captchaContainer) {\n const refreshElement = captchaContainer.querySelector('a');\n const imageElement = captchaContainer.querySelector('img');\n\n if (refreshElement && imageElement) {\n refreshElement.addEventListener('click', () => {\n let src = imageElement.src;\n\n if (src.indexOf('&refresh') !== -1) {\n // yeah, it's kinda cancerous. fuck off.\n src = src.split('&rand=')[0];\n } else {\n src += '&refresh';\n }\n\n imageElement.src = src + '&rand=' + Math.random();\n });\n }\n }\n\n const hiddenElements = $$('.js-hidden');\n\n if (hiddenElements) {\n Array.prototype.forEach.call(hiddenElements, (elem) => {\n toggleEl(elem);\n });\n }\n}\n\nexport { globalSetup };","import { escape, whenReady } from './dom';\nimport { DataTable, dumbFilterCallback } from './data_tables';\nimport { tagsToHtml } from \"./utils\";\nimport { globalSetup } from './main';\n\nwhenReady(() => {\n globalSetup();\n\n const urlParams = new URLSearchParams(window.location.search);\n const myParam = urlParams.get('q');\n const apiUrl = /* myParam !== null ? '/api/ajax_pastes.php?q=' + myParam : */ '/api/ajax_pastes.php';\n\n const table = new DataTable(document.getElementById('archive'), {\n ajaxCallback: (resolve) => {\n fetch(apiUrl)\n .then(r => r.json())\n .then(resolve);\n },\n rowCallback: (rowData) => {\n return `<tr>\n <td><a href=\"/${rowData.id}\">${escape(rowData.title)}</a></td>\n <td><a href=\"/user/${escape(rowData.author)}\">${escape(rowData.author)}</a></td>\n <td>${tagsToHtml(rowData.tags)}</td>\n </tr>`;\n },\n filterCallback: dumbFilterCallback,\n preFilter: myParam\n });\n table.attach();\n});","import { escape } from \"./dom\";\n\nconst tagsToHtml = (tags) => {\n\n return tags.map(tagData => {\n let tagColorClass;\n if (tagData.name.indexOf('nsfw') !== -1) {\n tagColorClass = 'is-danger';\n } else if (tagData.name.indexOf('safe') !== -1) {\n tagColorClass = 'is-success';\n } else if (tagData.name.indexOf('/') !== -1) {\n tagColorClass = 'is-primary';\n } else {\n tagColorClass = 'is-info';\n }\n\n return `<a href=\"/archive?q=${tagData.slug}\">\n <span class=\"tag ${tagColorClass}\">${escape(tagData.name)}</span>\n </a>`;\n }).join('');\n};\n\nexport { tagsToHtml };\n"],"names":["funcp","$","selector","document","querySelector","$$","querySelectorAll","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","toggleEl","classList","contains","remove","add","escape","unsafe","replace","SimplePaginator","element","pageCallback","addEventListener","evt","target","dataset","page","totalRecords","perPage","currentPage","this","lastPage","Math","floor","firstPageShow","lastPageShow","showFirstPage","abs","showLastPage","prevButtonDisabled","appendChild","i","selected","nextButtonDisabled","DataTable","options","container","parentElement","ajaxCallback","data","unfilteredData","paginator","filterCallback","sortField","sortDir","filterField","_this","_updateFilter","value","preFilter","perPageField","Number","_updatePage","header","elem","_updateSort","attach","bind","_loadEntries","Promise","then","_this2","length","bodyElement","firstIndex","lastIndex","rowElem","rowCallback","update","n","_updateEntries","query","datum","push","field","direction","newEntries","_toConsumableArray","sort","a","b","sorter","dumbFilterCallback","title","indexOf","tags","name","toLowerCase","TagsInput","maxTags","inputNode","containerNode","style","display","parentNode","insertBefore","nextSibling","split","tag","addTag","_handleInputKeyUp","_handleContainerClick","clear","join","node","splice","disabled","tagValue","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","closest","globalSetup","signupButton","Array","prototype","forEach","call","href","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","random","hiddenElements","myParam","URLSearchParams","window","location","search","get","resolve","fetch","r","json","rowData","author","map","tagData","tagColorClass","slug","readyState"],"mappings":"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"} |