{"version":3,"file":"user_profile.min.js","sources":["../../../js/dom.js","../../../js/data_tables.js","../../../js/utils.js","../../../js/tag_input.js","../../../js/main.js","../../../js/user_profile.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, \"&amp;\")\n        .replace(/</g, \"&lt;\")\n        .replace(/>/g, \"&gt;\")\n        .replace(/\"/g, \"&quot;\")\n        .replace(/'/g, \"&#039;\");\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    const queryLower = query.toLowerCase();\n\n    if (queryLower === 'untagged' && datum.tags.length === 0) {\n        return true;\n    }\n\n    if (datum.title.toLowerCase().indexOf(queryLower) !== -1) {\n        return true;\n    }\n\n    if (datum.author.toLowerCase().indexOf(queryLower) !== -1) {\n        return true;\n    }\n\n    /* this is inefficient */\n    for (const tag of datum.tags) {\n        if (tag.name.toLowerCase().indexOf(queryLower) !== -1) {\n            return true;\n        }\n    }\n\n    return false;\n};\n\nexport { DataTable, dumbFilterCallback };\n","import { escape } from \"./dom\";\n\nconst tagsToHtml = (tags) => {\n    return tags.map(tagData => {\n        let tagColorClass;\n        const tagLower = tagData.name.toLowerCase();\n        if (tagLower === 'nsfw' || tagLower === 'explicit') {\n            tagColorClass = 'is-danger';\n        } else if (tagLower === 'safe') {\n            tagColorClass = 'is-success';\n        } else if (tagLower.charAt(0) === '/' && tagLower.charAt(tagLower.length - 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","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 || 32;\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=\"32 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        /* Handle clicks outside the input node to add the past tag */\n        this.inputNode.addEventListener('focusout', (evt) => {\n            if (this.inputNode.value) {\n                this.addTag(this.inputNode.value);\n                this.inputNode.value = \"\";\n                this.updateHiddenInputValue();\n            }\n        });\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        } else if (evt.key !== 'Backspace' && tagValue.length > 255) { // This could be improved to check if it would actually result in a new char being typed...\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\nconst getUserInfo = () => {\n    const elem = document.getElementById('js-data-holder');\n\n    if (!elem) {\n        return { userId: null, csrfToken: null };\n    }\n\n    return { userId: elem.dataset.userId, csrfToken: elem.dataset.csrfToken };\n};\n\nconst parsePasteInfo = (elem) => {\n    if (!elem.dataset.pasteInfo) {\n        return null;\n    }\n\n    return JSON.parse(elem.dataset.pasteInfo);\n};\n\nwhenReady(() => {\n    globalSetup();\n\n    const urlParams = new URLSearchParams(window.location.search);\n    const myParam = urlParams.get('q');\n    const myPastesElem = document.getElementById('archive');\n    const apiUrl = '/api/user_pastes.php?user_id=' + myPastesElem.dataset.userId;\n    console.log('myPastesElem', myPastesElem);\n    const table = new DataTable(myPastesElem, {\n        ajaxCallback: (resolve) => {\n            fetch(apiUrl)\n                .then(r => r.json())\n                .then(resolve);\n        },\n        rowCallback: (rowData) => {\n            console.log('rowData', rowData);\n            const userData = getUserInfo();\n            const ownedByUser = (parseInt(rowData.author_id) === parseInt(userData.userId));\n            console.log(ownedByUser);\n            const deleteElem = ownedByUser ? `<td class=\"td-center\">\n                                         <form action=\"/${rowData.id}\" method=\"POST\">\n                                            <input type=\"hidden\" name=\"delete\" value=\"delete\" />\n                                            <input type=\"hidden\" name=\"csrf_token\" value=\"${userData.csrfToken}\" />\n                                            <input type=\"submit\" value=\"Delete\" />\n                                         </form>\n                                       </td>` : '';\n            const pasteCreatedAt = new Date(rowData.created_at).toLocaleString();\n            const pasteVisibility = ownedByUser ? `<td class=\"td-center\">${['Public', 'Unlisted', 'Private'][rowData.visibility]}</td>` : '';\n\n            return `<tr>\n                        <td><a href=\"/${rowData.id}\">${escape(rowData.title)}</a></td>\n                        <td class=\"td-center\">${pasteCreatedAt}</td>\n                        ${pasteVisibility}\n                        <td class=\"td-center\">${rowData.views || 0}</td>\n                        <td>${tagsToHtml(rowData.tags)}</td>\n                        ${deleteElem}\n                    </tr>`;\n        },\n        filterCallback: dumbFilterCallback,\n        preFilter: myParam\n    });\n    table.attach();\n\n    const myFavesElem = document.getElementById('favs');\n\n    if (!myFavesElem) {\n        return;\n    }\n\n    const faveTable = new DataTable(myFavesElem, {\n        ajaxCallback: (resolve) => {\n            console.log('invoker invoked');\n            resolve({\n                data: Array.prototype.map.call(myFavesElem.querySelectorAll('tbody > tr'), parsePasteInfo)\n            });\n        },\n        rowCallback: (rowData) => {\n            const recentUpdate = rowData.recently_updated ?\n                `<i class='far fa-check-square fa-lg' aria-hidden='true'></i>` :\n                `<i class='far fa-minus-square fa-lg' aria-hidden='true'></i>`;\n            const pasteFavedAt = new Date(rowData.favourited_at).toLocaleString();\n\n            //                         <td><a href=\"/user/${escape(rowData.author)}\">${escape(rowData.author)}</a></td>\n            return `<tr>\n                        <td><a href=\"/${rowData.id}\">${escape(rowData.title)}</a></td>\n                        <td class=\"td-center\">${pasteFavedAt}</td>\n                        <td class=\"td-center\">${recentUpdate}</td>\n                        <td>${tagsToHtml(rowData.tags)}</td>\n                    </tr>`;\n        },\n        filterCallback: dumbFilterCallback\n    });\n    faveTable.attach();\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","_classCallCheck","this","_createClass","key","value","pageCallback","addEventListener","evt","target","dataset","page","totalRecords","perPage","currentPage","lastPage","Math","floor","firstPageShow","lastPageShow","showFirstPage","abs","showLastPage","prevButtonDisabled","appendChild","concat","i","selected","nextButtonDisabled","DataTable","options","container","parentElement","ajaxCallback","data","unfilteredData","paginator","filterCallback","sortField","sortDir","_this","filterField","_updateFilter","preFilter","perPageField","Number","_updatePage","header","elem","_updateSort","attach","bind","_loadEntries","_this2","Promise","then","length","bodyElement","firstIndex","lastIndex","rowElem","rowCallback","update","n","_updateEntries","query","_step","_iterator","_createForOfIteratorHelper","s","done","datum","push","err","e","f","field","direction","newEntries","_toConsumableArray","sort","a","b","sorter","dumbFilterCallback","queryLower","toLowerCase","tags","title","indexOf","author","_step2","_iterator2","name","tagsToHtml","map","tagData","tagColorClass","tagLower","charAt","slug","join","TagsInput","arguments","undefined","maxTags","inputNode","containerNode","_this3","style","display","parentNode","insertBefore","nextSibling","_step3","_iterator3","split","tag","addTag","_handleInputKeyUp","_handleContainerClick","updateHiddenInputValue","clear","node","splice","disabled","tagValue","previousSibling","deleteTagNode","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","parsePasteInfo","pasteInfo","JSON","parse","myParam","URLSearchParams","window","location","search","get","myPastesElem","apiUrl","userId","console","log","resolve","fetch","r","json","rowData","userData","csrfToken","ownedByUser","parseInt","author_id","deleteElem","pasteCreatedAt","Date","created_at","toLocaleString","pasteVisibility","visibility","views","myFavesElem","recentUpdate","recently_updated","pasteFavedAt","favourited_at","readyState"],"mappings":"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"}