diff --git a/assets/bundle.js b/assets/bundle.js
index 00593c1..3785690 100644
--- a/assets/bundle.js
+++ b/assets/bundle.js
@@ -211,7 +211,6 @@ class DataTable {
attach() {
this.paginator.attach(this._updatePage.bind(this));
this._loadEntries();
-
}
/* Load the requested data from the server, and when done, update the DOM. */
@@ -247,6 +246,10 @@ class DataTable {
this.paginator.update(this.totalRecords, this.perPage, this.currentPage);
this._updateEntries({data: this.data});
}
+
+ _updateSort(field, direction) {
+
+ }
}
const setupSite = function() {
diff --git a/assets/bundle.min.js b/assets/bundle.min.js
index 78a87c9..e1998ac 100644
--- a/assets/bundle.min.js
+++ b/assets/bundle.min.js
@@ -1,2 +1,2 @@
-function t(t,a){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,a){if(!t)return;if("string"==typeof t)return e(t,a);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return e(t,a)}(t))||a&&t&&"number"==typeof t.length){n&&(t=n);var i=0,s=function(){};return{s:s,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw r}}}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=new Array(e);a /g,">").replace(/"/g,""").replace(/'/g,"'")},l=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};a(this,e),this.element=t,this.tags=[],this.options=n,this.maxTags=n.maxTags||10,this.inputNode=null,this.containerNode=null}return i(e,[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=s('
'),this.inputNode=s(' '),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var e,a=t(this.element.value.split(","));try{for(a.s();!(e=a.n()).done;){var n=e.value;this.addTag(n)}}catch(t){a.e(t)}finally{a.f()}}this.containerNode.addEventListener("keydown",this._handleInputKeyUp.bind(this)),this.containerNode.addEventListener("click",this._handleContainerClick.bind(this))}},{key:"detach",value:function(){this.tags.clear(),this.containerNode.remove(),this.element.style.display="inline-block"}},{key:"updateHiddenInputValue",value:function(){this.element.value=this.tags.join(",")}},{key:"deleteTagNode",value:function(t){this.tags.splice(this.tags.indexOf(t.dataset.value.toLowerCase()),1),t.remove(),this.tags.length'+o(t)+' '),this.inputNode),this.tags.length>=this.maxTags&&(this.inputNode.disabled=!0))}},{key:"_handleInputKeyUp",value:function(t){var e=this.inputNode.value;"Backspace"===t.key&&""===e?this.inputNode.previousSibling&&(this.deleteTagNode(this.inputNode.previousSibling),this.updateHiddenInputValue()):","===t.key&&(this.addTag(e),this.inputNode.value="",this.updateHiddenInputValue(),t.preventDefault())}},{key:"_handleContainerClick",value:function(t){t.target&&t.target.classList.contains("delete")&&(this.deleteTagNode(t.target.closest(".tag")),this.updateHiddenInputValue())}}]),e}(),c=function(){function t(e){a(this,t),this.element=e}return i(t,[{key:"attach",value:function(t){this.element.addEventListener("click",(function(e){e.target&&e.target.classList.contains("paginator__button")&&t(+e.target.dataset.page)}))}},{key:"update",value:function(t,e,a){r(this.element);var n=Math.ceil(t/e),i=a-3<0?a:a-3,o=i+3>n?n:i+6,l=Math.abs(0-a)>6,c=Math.abs(n-a)>6;this.element.appendChild(s('Previous '))),l&&(this.element.appendChild(s('').concat(0," "))),this.element.appendChild(s('… ')));for(var u=i;u<=o;u++)this.element.appendChild(s('').concat(u," ")));c&&(this.element.appendChild(s('… ')),this.element.appendChild(s('').concat(n," ")))),this.element.appendChild(s('Next ')))}}]),t}(),u=function(){function t(e,n){a(this,t),this.element=e,this.container=e.parentElement,this.options=n,this.ajaxCallback=n.ajaxCallback,this.data=[],this.totalRecords=-1,this.perPage=10,this.currentPage=0,this.paginator=new c(this.container.querySelector(".paginator"))}return i(t,[{key:"attach",value:function(){this.paginator.attach(this._updatePage.bind(this)),this._loadEntries()}},{key:"_loadEntries",value:function(){new Promise(this.ajaxCallback).then(this._updateEntries.bind(this))}},{key:"_updateEntries",value:function(t){this.data=t.data,this.totalRecords=this.data.length;var e=this.element.querySelector("tbody");r(e);for(var a=this.perPage*this.currentPage,n=a+this.perPage>this.totalRecords?this.totalRecords:a+this.perPage,i=a;i\n ').concat(o(t.name)," \n ")})).join("");return'\n ').concat(o(t.title),' \n ').concat(o(t.author)," \n ").concat(e," \n ")}}).attach()};"loading"!==document.readyState?d():document.addEventListener("DOMContentLoaded",d);
+function t(t,a){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,a){if(!t)return;if("string"==typeof t)return e(t,a);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return e(t,a)}(t))||a&&t&&"number"==typeof t.length){n&&(t=n);var i=0,s=function(){};return{s:s,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw r}}}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=new Array(e);a /g,">").replace(/"/g,""").replace(/'/g,"'")},l=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};a(this,e),this.element=t,this.tags=[],this.options=n,this.maxTags=n.maxTags||10,this.inputNode=null,this.containerNode=null}return i(e,[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=s('
'),this.inputNode=s(' '),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var e,a=t(this.element.value.split(","));try{for(a.s();!(e=a.n()).done;){var n=e.value;this.addTag(n)}}catch(t){a.e(t)}finally{a.f()}}this.containerNode.addEventListener("keydown",this._handleInputKeyUp.bind(this)),this.containerNode.addEventListener("click",this._handleContainerClick.bind(this))}},{key:"detach",value:function(){this.tags.clear(),this.containerNode.remove(),this.element.style.display="inline-block"}},{key:"updateHiddenInputValue",value:function(){this.element.value=this.tags.join(",")}},{key:"deleteTagNode",value:function(t){this.tags.splice(this.tags.indexOf(t.dataset.value.toLowerCase()),1),t.remove(),this.tags.length'+o(t)+' '),this.inputNode),this.tags.length>=this.maxTags&&(this.inputNode.disabled=!0))}},{key:"_handleInputKeyUp",value:function(t){var e=this.inputNode.value;"Backspace"===t.key&&""===e?this.inputNode.previousSibling&&(this.deleteTagNode(this.inputNode.previousSibling),this.updateHiddenInputValue()):","===t.key&&(this.addTag(e),this.inputNode.value="",this.updateHiddenInputValue(),t.preventDefault())}},{key:"_handleContainerClick",value:function(t){t.target&&t.target.classList.contains("delete")&&(this.deleteTagNode(t.target.closest(".tag")),this.updateHiddenInputValue())}}]),e}(),c=function(){function t(e){a(this,t),this.element=e}return i(t,[{key:"attach",value:function(t){this.element.addEventListener("click",(function(e){e.target&&e.target.classList.contains("paginator__button")&&t(+e.target.dataset.page)}))}},{key:"update",value:function(t,e,a){r(this.element);var n=Math.ceil(t/e),i=a-3<0?a:a-3,o=i+3>n?n:i+6,l=Math.abs(0-a)>6,c=Math.abs(n-a)>6;this.element.appendChild(s('Previous '))),l&&(this.element.appendChild(s('').concat(0," "))),this.element.appendChild(s('… ')));for(var u=i;u<=o;u++)this.element.appendChild(s('').concat(u," ")));c&&(this.element.appendChild(s('… ')),this.element.appendChild(s('').concat(n," ")))),this.element.appendChild(s('Next ')))}}]),t}(),u=function(){function t(e,n){a(this,t),this.element=e,this.container=e.parentElement,this.options=n,this.ajaxCallback=n.ajaxCallback,this.data=[],this.totalRecords=-1,this.perPage=10,this.currentPage=0,this.paginator=new c(this.container.querySelector(".paginator"))}return i(t,[{key:"attach",value:function(){this.paginator.attach(this._updatePage.bind(this)),this._loadEntries()}},{key:"_loadEntries",value:function(){new Promise(this.ajaxCallback).then(this._updateEntries.bind(this))}},{key:"_updateEntries",value:function(t){this.data=t.data,this.totalRecords=this.data.length;var e=this.element.querySelector("tbody");r(e);for(var a=this.perPage*this.currentPage,n=a+this.perPage>this.totalRecords?this.totalRecords:a+this.perPage,i=a;i\n ').concat(o(t.name)," \n ")})).join("");return'\n ').concat(o(t.title),' \n ').concat(o(t.author)," \n ").concat(e," \n ")}}).attach()};"loading"!==document.readyState?d():document.addEventListener("DOMContentLoaded",d);
//# sourceMappingURL=bundle.min.js.map
diff --git a/assets/bundle.min.js.map b/assets/bundle.min.js.map
index 9baf363..7db110b 100644
--- a/assets/bundle.min.js.map
+++ b/assets/bundle.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"bundle.min.js","sources":["../js/dom.js","../js/tag_input.js","../js/data_tables.js","../js/main.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 escape = function(unsafe) {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n\nexport { $, $$, makeEl, clearEl, escape };","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('
');\n this.inputNode = makeEl(' ');\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('' + escape(tagValue) + ' '),\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 { makeEl, clearEl } from \"./dom\";\n\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.ceil(totalRecords / perPage); // ish?\n const numPagesToShow = 3;\n\n /* First and last page the main paginator will show */\n const firstPageShow = (currentPage - numPagesToShow < 0) ? currentPage : currentPage - numPagesToShow;\n const lastPageShow = (firstPageShow + numPagesToShow) > lastPage ? lastPage : (firstPageShow + numPagesToShow * 2);\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 * 2);\n const showLastPage = (Math.abs(lastPage - currentPage)) > (numPagesToShow * 2);\n\n\n /* Previous button */\n this.element.appendChild(makeEl(\n `Previous `\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n `${firstPage} `\n ));\n this.element.appendChild(makeEl(`… `));\n }\n\n /* \"window\" buttons */\n for (let i = firstPageShow; i <= lastPageShow; i++) {\n this.element.appendChild(makeEl(\n `${i} `\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(`… `));\n this.element.appendChild(makeEl(\n `${lastPage} `\n ));\n }\n\n /* Next button */\n this.element.appendChild(makeEl(\n `Next `\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\n this.totalRecords = -1;\n this.perPage = 10;\n this.currentPage = 0;\n\n this.paginator = new SimplePaginator(this.container.querySelector('.paginator'));\n\n }\n\n attach() {\n this.paginator.attach(this._updatePage.bind(this));\n this._loadEntries();\n\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(this._updateEntries.bind(this));\n }\n\n /* Update the DOM to reflect the current state of the data we have loaded */\n _updateEntries(data) {\n this.data = 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({data: this.data});\n }\n}\n\nexport { DataTable };\n","import { $$, escape } from './dom';\nimport { TagsInput } from \"./tag_input\";\nimport { DataTable } from \"./data_tables\";\n\nconst setupSite = function() {\n Array.prototype.forEach.call($$('.js-tag-input'), (el) => {\n new TagsInput(el).attach();\n });\n\n if (document.querySelector('#archive')) {\n const table = new DataTable(document.querySelector('#archive'), {\n ajaxCallback: (resolve) => {\n fetch('/api/ajax_pastes.php')\n .then(r => r.json())\n .then(resolve);\n },\n rowCallback: (rowData) => {\n const tags = rowData.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 `\n ${escape(tagData.name)} \n `;\n }).join('');\n\n return `\n ${escape(rowData.title)} \n ${escape(rowData.author)} \n ${tags} \n `;\n }\n });\n table.attach();\n }\n};\n\nif (document.readyState !== 'loading') {\n setupSite();\n} else {\n document.addEventListener('DOMContentLoaded', setupSite);\n}\n"],"names":["makeEl","html","template","document","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","escape","unsafe","replace","TagsInput","element","options","tags","maxTags","inputNode","containerNode","style","display","appendChild","this","parentNode","insertBefore","nextSibling","value","split","tag","addTag","addEventListener","_handleInputKeyUp","bind","_handleContainerClick","clear","remove","join","node","splice","indexOf","dataset","toLowerCase","length","disabled","tagValue","push","evt","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","target","classList","contains","closest","SimplePaginator","pageCallback","page","totalRecords","perPage","currentPage","lastPage","Math","ceil","firstPageShow","lastPageShow","numPagesToShow","showFirstPage","abs","showLastPage","i","DataTable","container","parentElement","ajaxCallback","data","paginator","querySelector","attach","_updatePage","_loadEntries","Promise","then","_updateEntries","bodyElement","firstIndex","lastIndex","rowElem","rowCallback","add","update","n","setupSite","selector","Array","prototype","forEach","call","querySelectorAll","resolve","fetch","r","json","rowData","map","tagData","tagColorClass","name","slug","id","title","author","readyState"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"bundle.min.js","sources":["../js/dom.js","../js/tag_input.js","../js/data_tables.js","../js/main.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 escape = function(unsafe) {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n\nexport { $, $$, makeEl, clearEl, escape };","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('
');\n this.inputNode = makeEl(' ');\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('' + escape(tagValue) + ' '),\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 { makeEl, clearEl } from \"./dom\";\n\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.ceil(totalRecords / perPage); // ish?\n const numPagesToShow = 3;\n\n /* First and last page the main paginator will show */\n const firstPageShow = (currentPage - numPagesToShow < 0) ? currentPage : currentPage - numPagesToShow;\n const lastPageShow = (firstPageShow + numPagesToShow) > lastPage ? lastPage : (firstPageShow + numPagesToShow * 2);\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 * 2);\n const showLastPage = (Math.abs(lastPage - currentPage)) > (numPagesToShow * 2);\n\n\n /* Previous button */\n this.element.appendChild(makeEl(\n `Previous `\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n `${firstPage} `\n ));\n this.element.appendChild(makeEl(`… `));\n }\n\n /* \"window\" buttons */\n for (let i = firstPageShow; i <= lastPageShow; i++) {\n this.element.appendChild(makeEl(\n `${i} `\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(`… `));\n this.element.appendChild(makeEl(\n `${lastPage} `\n ));\n }\n\n /* Next button */\n this.element.appendChild(makeEl(\n `Next `\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\n this.totalRecords = -1;\n this.perPage = 10;\n this.currentPage = 0;\n\n this.paginator = new SimplePaginator(this.container.querySelector('.paginator'));\n\n }\n\n attach() {\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(this._updateEntries.bind(this));\n }\n\n /* Update the DOM to reflect the current state of the data we have loaded */\n _updateEntries(data) {\n this.data = 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({data: this.data});\n }\n\n _updateSort(field, direction) {\n\n }\n}\n\nexport { DataTable };\n","import { $$, escape } from './dom';\nimport { TagsInput } from \"./tag_input\";\nimport { DataTable } from \"./data_tables\";\n\nconst setupSite = function() {\n Array.prototype.forEach.call($$('.js-tag-input'), (el) => {\n new TagsInput(el).attach();\n });\n\n if (document.querySelector('#archive')) {\n const table = new DataTable(document.querySelector('#archive'), {\n ajaxCallback: (resolve) => {\n fetch('/api/ajax_pastes.php')\n .then(r => r.json())\n .then(resolve);\n },\n rowCallback: (rowData) => {\n const tags = rowData.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 `\n ${escape(tagData.name)} \n `;\n }).join('');\n\n return `\n ${escape(rowData.title)} \n ${escape(rowData.author)} \n ${tags} \n `;\n }\n });\n table.attach();\n }\n};\n\nif (document.readyState !== 'loading') {\n setupSite();\n} else {\n document.addEventListener('DOMContentLoaded', setupSite);\n}\n"],"names":["makeEl","html","template","document","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","escape","unsafe","replace","TagsInput","element","options","tags","maxTags","inputNode","containerNode","style","display","appendChild","this","parentNode","insertBefore","nextSibling","value","split","tag","addTag","addEventListener","_handleInputKeyUp","bind","_handleContainerClick","clear","remove","join","node","splice","indexOf","dataset","toLowerCase","length","disabled","tagValue","push","evt","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","target","classList","contains","closest","SimplePaginator","pageCallback","page","totalRecords","perPage","currentPage","lastPage","Math","ceil","firstPageShow","lastPageShow","numPagesToShow","showFirstPage","abs","showLastPage","i","DataTable","container","parentElement","ajaxCallback","data","paginator","querySelector","attach","_updatePage","_loadEntries","Promise","then","_updateEntries","bodyElement","firstIndex","lastIndex","rowElem","rowCallback","add","update","n","field","direction","setupSite","selector","Array","prototype","forEach","call","querySelectorAll","resolve","fetch","r","json","rowData","map","tagData","tagColorClass","name","slug","id","title","author","readyState"],"mappings":"i1CAIA,IAIMA,EAAS,SAASC,OACdC,EAAWC,SAASC,cAAc,mBAExCF,EAASG,UAAYJ,EAAKK,OAEnBJ,EAASK,QAAQC,YAGtBC,EAAU,SAASC,QACdA,EAAGF,YACNE,EAAGC,YAAYD,EAAGF,aAIpBI,EAAS,SAASC,UACbA,EACFC,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,WC1BjBC,wBACUC,OAASC,yDAAU,kBACtBD,QAAUA,OACVE,KAAO,QACPD,QAAUA,OAEVE,QAAUF,EAAQE,SAAW,QAC7BC,UAAY,UACZC,cAAgB,qCAGzB,mBACSL,QAAQM,MAAMC,QAAU,YAExBF,cAAgBrB,EAAO,uCACvBoB,UAAYpB,EAAO,mFACnBqB,cAAcG,YAAYC,KAAKL,gBAE/BJ,QAAQU,WAAWC,aAAaF,KAAKJ,cAAeI,KAAKT,QAAQY,aAGlEH,KAAKT,QAAQa,MAAO,WACFJ,KAAKT,QAAQa,MAAMC,MAAM,qCAAM,KAAtCC,eACFC,OAAOD,wCAKfV,cAAcY,iBAAiB,UAAWR,KAAKS,kBAAkBC,KAAKV,YAGtEJ,cAAcY,iBAAiB,QAASR,KAAKW,sBAAsBD,KAAKV,6BAGjF,gBACSP,KAAKmB,aACLhB,cAAciB,cACdtB,QAAQM,MAAMC,QAAU,qDAGjC,gBACSP,QAAQa,MAAQJ,KAAKP,KAAKqB,KAAK,kCAGxC,SAAcC,QACLtB,KAAKuB,OAAOhB,KAAKP,KAAKwB,QAAQF,EAAKG,QAAQd,MAAMe,eAAgB,GACtEJ,EAAKF,SAGDb,KAAKP,KAAK2B,OAASpB,KAAKN,eACnBC,UAAU0B,UAAW,yBAIlC,SAAOC,GAIc,MAHjBA,EAAWA,EAASzC,UAGkD,IAA/CmB,KAAKP,KAAKwB,QAAQK,EAASH,sBACzC1B,KAAK8B,KAAKD,EAASH,oBAEnBxB,UAAUM,WAAWC,aACtB3B,EAAO,yCAA2CY,EAAOmC,GAAY,KAAOnC,EAAOmC,GAAY,2CAC/FtB,KAAKL,WAILK,KAAKP,KAAK2B,QAAUpB,KAAKN,eACpBC,UAAU0B,UAAW,qCAKtC,SAAkBG,OACVF,EAAWtB,KAAKL,UAAUS,MAEd,cAAZoB,EAAIC,KAAoC,KAAbH,EAEvBtB,KAAKL,UAAU+B,uBACVC,cAAc3B,KAAKL,UAAU+B,sBAE7BE,0BAEU,MAAZJ,EAAIC,WACNlB,OAAOe,QAEP3B,UAAUS,MAAQ,QAClBwB,yBAELJ,EAAIK,uDAIZ,SAAsBL,GACdA,EAAIM,QAAUN,EAAIM,OAAOC,UAAUC,SAAS,iBACvCL,cAAcH,EAAIM,OAAOG,QAAQ,cACjCL,mCC/FXM,wBACU3C,kBACHA,QAAUA,kCAGnB,SAAO4C,QACE5C,QAAQiB,iBAAiB,SAAS,SAAAgB,GAC/BA,EAAIM,QAAUN,EAAIM,OAAOC,UAAUC,SAAS,sBAC5CG,GAAcX,EAAIM,OAAOZ,QAAQkB,+BAK7C,SAAOC,EAAcC,EAASC,GAC1BvD,EAAQgB,KAAKT,aAIPiD,EAAWC,KAAKC,KAAKL,EAAeC,GAIpCK,EAAiBJ,EAHA,EAG+B,EAAKA,EAAcA,EAHlD,EAIjBK,EAAgBD,EAJC,EAIiCH,EAAWA,EAAYG,EAAgBE,EAGzFC,EAAiBL,KAAKM,IATV,EAS0BR,GAAiBM,EACvDG,EAAgBP,KAAKM,IAAIP,EAAWD,GAAiBM,OAItDtD,QAAQQ,YAAYxB,sEACwCgE,EAAc,sBAI3EO,SACKvD,QAAQQ,YAAYxB,oDApBX,eAAA,iBAuBTgB,QAAQQ,YAAYxB,2CAIxB,IAAI0E,EAAIN,EAAeM,GAAKL,EAAcK,SACtC1D,QAAQQ,YAAYxB,oDACsB0E,eAAMA,YAKrDD,SACKzD,QAAQQ,YAAYxB,2CACpBgB,QAAQQ,YAAYxB,oDACsBiE,eAAaA,kBAK3DjD,QAAQQ,YAAYxB,yDAC2BgE,EAAc,2BAKpEW,wBACU3D,EAASC,kBACZD,QAAUA,OACV4D,UAAY5D,EAAQ6D,mBACpB5D,QAAUA,OAEV6D,aAAe7D,EAAQ6D,kBACvBC,KAAO,QAEPjB,cAAgB,OAChBC,QAAU,QACVC,YAAc,OAEdgB,UAAY,IAAIrB,EAAgBlC,KAAKmD,UAAUK,cAAc,+CAItE,gBACSD,UAAUE,OAAOzD,KAAK0D,YAAYhD,KAAKV,YACvC2D,2CAIT,eACQC,QAAQ5D,KAAKqD,cACZQ,KAAK7D,KAAK8D,eAAepD,KAAKV,qCAIvC,SAAesD,QACNA,KAAOA,EAAKA,UACZjB,aAAerC,KAAKsD,KAAKlC,WAExB2C,EAAc/D,KAAKT,QAAQiE,cAAc,SAC/CxE,EAAQ+E,WAEFC,EAAchE,KAAKsC,QAAUtC,KAAKuC,YAClC0B,EAAaD,EAAahE,KAAKsC,QAAWtC,KAAKqC,aAAerC,KAAKqC,aAAgB2B,EAAahE,KAAKsC,QAGlGW,EAAIe,EAAYf,EAAIgB,EAAWhB,IAAK,KACnCiB,EAAU3F,EAAOyB,KAAKR,QAAQ2E,YAAYnE,KAAKsD,KAAKL,KAC1DiB,EAAQnC,UAAUqC,IAAInB,EAAI,GAAM,EAAI,MAAQ,QAE5Cc,EAAYhE,YAAYmE,QAGvBX,UAAUc,OAAOrE,KAAKqC,aAAcrC,KAAKsC,QAAStC,KAAKuC,wCAGhE,SAAY+B,QACH/B,YAAc+B,OACdf,UAAUc,OAAOrE,KAAKqC,aAAcrC,KAAKsC,QAAStC,KAAKuC,kBACvDuB,eAAe,CAACR,KAAMtD,KAAKsD,kCAGpC,SAAYiB,EAAOC,aCxHjBC,EAAY,WHAP,IAASC,GGChBC,MAAMC,UAAUC,QAAQC,MHDRJ,EGCgB,gBHAzBhG,SAASqG,iBAAiBL,IAAa,KGAI,SAACzF,OAC3CK,EAAUL,GAAIwE,YAGlB/E,SAAS8E,cAAc,cACT,IAAIN,EAAUxE,SAAS8E,cAAc,YAAa,CAC5DH,aAAc,SAAC2B,GACXC,MAAM,wBACDpB,MAAK,SAAAqB,UAAKA,EAAEC,UACZtB,KAAKmB,IAEdb,YAAa,SAACiB,OACJ3F,EAAO2F,EAAQ3F,KAAK4F,KAAI,SAACC,OACvBC,SAEAA,GADkC,IAAlCD,EAAQE,KAAKvE,QAAQ,QACL,aACyB,IAAlCqE,EAAQE,KAAKvE,QAAQ,QACZ,cACsB,IAA/BqE,EAAQE,KAAKvE,QAAQ,KACZ,aAEA,mCAGKqE,EAAQG,qEACFF,eAAkBpG,EAAOmG,EAAQE,sDAEjE1E,KAAK,oEAGoBsE,EAAQM,gBAAOvG,EAAOiG,EAAQO,4EACzBxG,EAAOiG,EAAQQ,qBAAYzG,EAAOiG,EAAQQ,8DACzDnG,6CAIpBgE,UAIc,YAAxB/E,SAASmH,WACTpB,IAEA/F,SAAS8B,iBAAiB,mBAAoBiE"}
\ No newline at end of file
diff --git a/img/badges/totpastes.png b/img/badges/total_pastes_0.png
similarity index 100%
rename from img/badges/totpastes.png
rename to img/badges/total_pastes_0.png
diff --git a/img/badges/totpastes3.png b/img/badges/total_pastes_25.png
similarity index 100%
rename from img/badges/totpastes3.png
rename to img/badges/total_pastes_25.png
diff --git a/img/badges/totpastes2.png b/img/badges/total_pastes_5.png
similarity index 100%
rename from img/badges/totpastes2.png
rename to img/badges/total_pastes_5.png
diff --git a/img/badges/totpastes4.png b/img/badges/total_pastes_50.png
similarity index 100%
rename from img/badges/totpastes4.png
rename to img/badges/total_pastes_50.png
diff --git a/img/badges/pasteviews.png b/img/badges/total_views_1000.png
similarity index 100%
rename from img/badges/pasteviews.png
rename to img/badges/total_views_1000.png
diff --git a/img/badges/pasteviews5.png b/img/badges/total_views_10000.png
similarity index 100%
rename from img/badges/pasteviews5.png
rename to img/badges/total_views_10000.png
diff --git a/img/badges/pasteviews2.png b/img/badges/total_views_2000.png
similarity index 100%
rename from img/badges/pasteviews2.png
rename to img/badges/total_views_2000.png
diff --git a/img/badges/pasteviews3.png b/img/badges/total_views_3000.png
similarity index 100%
rename from img/badges/pasteviews3.png
rename to img/badges/total_views_3000.png
diff --git a/img/badges/pasteviews4.png b/img/badges/total_views_5000.png
similarity index 100%
rename from img/badges/pasteviews4.png
rename to img/badges/total_views_5000.png
diff --git a/img/badges/pasteviews6.png b/img/badges/total_views_50000.png
similarity index 100%
rename from img/badges/pasteviews6.png
rename to img/badges/total_views_50000.png
diff --git a/js/data_tables.js b/js/data_tables.js
index 52149fb..3a39539 100644
--- a/js/data_tables.js
+++ b/js/data_tables.js
@@ -86,7 +86,6 @@ class DataTable {
attach() {
this.paginator.attach(this._updatePage.bind(this));
this._loadEntries();
-
}
/* Load the requested data from the server, and when done, update the DOM. */
@@ -122,6 +121,10 @@ class DataTable {
this.paginator.update(this.totalRecords, this.perPage, this.currentPage);
this._updateEntries({data: this.data});
}
+
+ _updateSort(field, direction) {
+
+ }
}
export { DataTable };
diff --git a/theme/bulma/archive.php b/theme/bulma/archive.php
index 16482fc..2748fa1 100644
--- a/theme/bulma/archive.php
+++ b/theme/bulma/archive.php
@@ -44,10 +44,9 @@
There are pastes that still need to be tagged.
-
+
This pastebin is private.
-
+
Pastes Archive
@@ -78,11 +77,7 @@
}
?>
-
+
diff --git a/theme/bulma/errors.php b/theme/bulma/errors.php
index 176cda7..2c8b02d 100644
--- a/theme/bulma/errors.php
+++ b/theme/bulma/errors.php
@@ -24,7 +24,6 @@
-
\ No newline at end of file
diff --git a/theme/bulma/login.php b/theme/bulma/login.php
index 2aeea3e..97a1a88 100644
--- a/theme/bulma/login.php
+++ b/theme/bulma/login.php
@@ -197,7 +197,6 @@
-
\ No newline at end of file
diff --git a/theme/bulma/pages.php b/theme/bulma/pages.php
index 457aed6..e3c7dcd 100644
--- a/theme/bulma/pages.php
+++ b/theme/bulma/pages.php
@@ -16,7 +16,6 @@
}
?>
-
\ No newline at end of file
diff --git a/theme/bulma/profile.php b/theme/bulma/profile.php
index ce48920..74c20c7 100644
--- a/theme/bulma/profile.php
+++ b/theme/bulma/profile.php
@@ -92,7 +92,6 @@
-
\ No newline at end of file
diff --git a/theme/bulma/report.php b/theme/bulma/report.php
index 387fd1e..1bcfd36 100644
--- a/theme/bulma/report.php
+++ b/theme/bulma/report.php
@@ -10,7 +10,6 @@
Archive
Discover
-
\ No newline at end of file
diff --git a/theme/bulma/sidebar.php b/theme/bulma/sidebar.php
deleted file mode 100644
index e69de29..0000000
diff --git a/theme/bulma/user_profile.php b/theme/bulma/user_profile.php
index 083b3d0..0e56b9b 100644
--- a/theme/bulma/user_profile.php
+++ b/theme/bulma/user_profile.php
@@ -40,12 +40,47 @@
});
+
+ '[ProbablyAutistic] Have more than Fifty pastes',
+ 25 => '[Writefag] Have Twenty Five or more pastes',
+ 5 => '[NewWritefag] Have Five or more pastes',
+ 0 => '[NewFriend] Have less than Five pastes',
+ ];
+
+ $unlisted_paste_badges = [
+ 10 => '',
+ 5 => ''
+ ];
+
+ $paste_view_badges = [
+ 50000 => '[HorseAyylmao] Have more than 50,000 total views',
+ 10000 => '[HorseIlluminatii] Have more than 10,000 total views',
+ 5000 => '[HorseMaster] Have more than 5000 total views',
+ 3000 => '[Horseidol] Have more than 3000 total views',
+ 2000 => '[HorseFamous] Have more than 2000 total views',
+ 1000 => '[HorseWriter] Have more than 1000 total views'
+ ];
+
+
+
+ function outputBadges(array $badgeCandidates, int $actualValue, string $imagePrefix) {
+ foreach ($badgeCandidates as $threshold => $badgeTitle) {
+ if ($actualValue >= $threshold) {
+ echo " ";
+ break;
+ }
+ }
+ }
+
+?>
-
= $profile_username ?>'s Pastes
+
= pp_html_escape($profile_username) ?>'s Pastes
joined: = $profile_join_date; ?>
@@ -62,33 +97,8 @@
echo $profile_badge;
}
-
- //Paste count badges
- if ($profile_total_public <= 4) {
- echo '
';
- } elseif (($profile_total_public >= 5) && ($profile_total_public <= 24)) {
- echo '
';
- } elseif (($profile_total_public >= 25) && ($profile_total_public <= 49)) {
- echo '
';
- } elseif (($profile_total_public >= 50) && ($profile_total_public)) {
- echo '
';
- }
-
- //Pasteviews badges
-
- if (($profile_total_paste_views >= 1000) && ($profile_total_paste_views <= 2999)) {
- echo '
';
- } elseif (($profile_total_paste_views >= 2000) && ($profile_total_paste_views <= 2999)) {
- echo '
';
- } elseif (($profile_total_paste_views >= 3000) && ($profile_total_paste_views <= 4999)) {
- echo '
';
- } elseif (($profile_total_paste_views >= 5000) && ($profile_total_paste_views <= 9999)) {
- echo '
';
- } elseif (($profile_total_paste_views >= 10000) && ($profile_total_paste_views <= 49999)) {
- echo '
';
- } elseif ($profile_total_paste_views >= 50000) {
- echo '
';
- }
+ outputBadges($public_paste_badges, $profile_total_public, 'total_pastes');
+ outputBadges($paste_view_badges, $profile_total_paste_views, 'total_views');
if (($profile_total_unlisted >= 5) && ($profile_total_unlisted <= 9)) {
echo '
';
@@ -101,11 +111,11 @@
' . $success . '
';
+ echo '
' . pp_html_escape($success) . '
';
}
foreach ($flashes['error'] as $error) {
- echo '
' . $error . '
';
+ echo '
' . pp_html_escape($error) . '
';
}
?>
@@ -313,7 +323,6 @@
}
?>
-