From 86afab045870fbbeea5b4268377a3e106add67d4 Mon Sep 17 00:00:00 2001 From: Floorb <132411956+Neetpone@users.noreply.github.com> Date: Thu, 25 Aug 2022 01:51:54 -0400 Subject: [PATCH] Rejigger the CAPTCHA a bunch, more functionality without JS --- includes/captcha.php | 34 +++++++++-- includes/functions.php | 61 ++++++++++++++++++++ js/main.js | 19 ++++++ public/api/tags_autocomplete.php | 7 +-- public/archive.php | 37 ++++++++++++ public/assets/bundle/archive.js | 19 ++++++ public/assets/bundle/archive.min.js | 2 +- public/assets/bundle/archive.min.js.map | 2 +- public/assets/bundle/generic.js | 19 ++++++ public/assets/bundle/generic.min.js | 2 +- public/assets/bundle/generic.min.js.map | 2 +- public/assets/bundle/user_profile.js | 19 ++++++ public/assets/bundle/user_profile.min.js | 2 +- public/assets/bundle/user_profile.min.js.map | 2 +- public/captcha.php | 19 ++++-- public/index.php | 5 +- public/theme/bulma/css/paste.css | 27 ++++++++- theme/bulma/archive.php | 41 ++++++++----- theme/bulma/common.php | 21 +++---- theme/bulma/login.php | 25 ++++---- theme/bulma/main.php | 15 +++-- 21 files changed, 312 insertions(+), 68 deletions(-) diff --git a/includes/captcha.php b/includes/captcha.php index d0d979b..1312e58 100644 --- a/includes/captcha.php +++ b/includes/captcha.php @@ -67,10 +67,7 @@ function captcha($color, $mul, $allowed) : array { } $captcha_config['code'] = ''; - $length = rand($captcha_config['min_length'], $captcha_config['max_length']); - while (strlen($captcha_config['code']) < $length) { - $captcha_config['code'] .= substr($captcha_config['characters'], rand() % (strlen($captcha_config['characters'])), 1); - } + return $captcha_config; } @@ -97,3 +94,32 @@ if (!function_exists('hex2rgb')) { return null; } } + +function setupCaptcha() : string { + global $captcha_config; + global $redis; + + $code = ''; + for ($i = 0; $i < 5; $i++) { + $code .= substr($captcha_config['allowed'], rand() % (strlen($captcha_config['allowed'])), 1); + } + + $token = pp_random_password(); + + $redis->setex('captcha/' . md5($token), 600, $code); + + return $token; +} + +function checkCaptcha(string $token, string $answer) : bool { + global $redis; + + $redis_answer = $redis->get('captcha/' . $token); + if (!$redis_answer) { + return false; + } + + $redis->del('captcha/' . $token); + + return $redis_answer === $answer; +} diff --git a/includes/functions.php b/includes/functions.php index c056efe..4919f37 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -237,3 +237,64 @@ function addToSitemap(Paste $paste, $priority, $changefreq) { function paste_protocol() : string { return !empty($_SERVER['HTTPS']) ? 'https://' : 'http://'; } + +/* get rid of unintended wildcards in a parameter to LIKE queries; not a security issue, just unexpected behaviour. */ +function escapeLikeQuery(string $query) : string { + return str_replace(['\\', '_', '%'], ['\\\\', '\\_', '\\%'], $query); +} + +function paginate(int $current_page, int $per_page, int $total_records) : string { + $first_page = 0; + $last_page = floor($total_records / $per_page); + $window = 2; + + if ($first_page == $last_page) { + // Do something? + } + + $_page_button = function(int $page, string $text, bool $disabled = false) use ($current_page) : string { + /* We need to update the 'page' parameter in the request URI, or add it if it doesn't exist. */ + $request_uri = parse_url($_SERVER['REQUEST_URI']); + parse_str((string) @$request_uri['query'], $parsed_query); + $parsed_query['page'] = (string) $page; + $page_uri = ((string) @$request_uri['path']) . '?' . http_build_query($parsed_query); + + $selected_class = $current_page == $page ? ' paginator__button--selected' : ''; + + $disabled_text = $disabled ? ' aria-disabled="true"' : ''; + return sprintf("%s", $page_uri, $disabled_text, $text); + }; + + $html = ''; + + /* First and last page the main paginator will show */ + $first_page_show = max(($current_page - $window), $first_page); + $last_page_show = min(($current_page + $window), $last_page); + + /* Whether to show the first and last pages in existence at the ends of the paginator */ + $show_first_page = (abs($first_page - $current_page)) > ($window); + $show_last_page = (abs($last_page - $current_page)) > ($window); + + $prev_button_disabled = $current_page == $first_page ? 'disabled' : ''; + $next_button_disabled = $current_page == $last_page ? 'disabled' : ''; + + $html .= $_page_button($current_page - 1, 'Previous', $prev_button_disabled); + + if ($show_first_page) { + $html .= $_page_button($first_page, $first_page); + $html .= ''; + } + + for ($i = $first_page_show; $i <= $last_page_show; $i++) { + $html .= $_page_button($i, $i); + } + + if ($show_last_page) { + $html .= ''; + $html .= $_page_button($last_page, $last_page); + } + + $html .= $_page_button($current_page + 1, 'Next', $next_button_disabled); + + return $html; +} diff --git a/js/main.js b/js/main.js index 826f55a..5b5ba9a 100644 --- a/js/main.js +++ b/js/main.js @@ -5,6 +5,8 @@ const setupSignupModal = () => { const signupButton = $('[data-target~="#signin"],[data-target~="#signup"]'); if (signupButton) { + signupButton.href = 'javascript:void(0)'; + signupButton.addEventListener('click', () => { $('.modal').classList.add('is-active'); }); @@ -77,6 +79,23 @@ const globalSetup = () => { preloader.remove(); main.id = ''; } + + const captchaContainer = $('.captcha_container'); + + if (captchaContainer) { + const refreshElement = captchaContainer.querySelector('a'); + const imageElement = captchaContainer.querySelector('img'); + + if (refreshElement && imageElement) { + refreshElement.addEventListener('click', () => { + imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random(); + }); + } + } + + Array.prototype.forEach.call($('.js-hidden'), (elem) => { + toggleEl(elem); + }); } export { globalSetup }; \ No newline at end of file diff --git a/public/api/tags_autocomplete.php b/public/api/tags_autocomplete.php index 3e9fb74..a14b9ab 100644 --- a/public/api/tags_autocomplete.php +++ b/public/api/tags_autocomplete.php @@ -4,11 +4,6 @@ require_once(__DIR__ . '/../includes/common.php'); use PonePaste\Models\Tag; -/* get rid of unintended wildcards in a parameter to LIKE queries; not a security issue, just unexpected behaviour. */ -function escapeLikeQuery(string $query) : string { - return str_replace(['\\', '_', '%'], ['\\\\', '\\_', '\\%'], $query); -} - header('Content-Type: application/json'); if (empty($_GET['tag'])) { @@ -23,6 +18,8 @@ $results = Tag::select('name') ->fetchAll() ->toArray(); +/* we want to ensure the tag name that the user input is always returned, + * even if that tag doesn't actually exist yet. */ $tags[] = ['name' => $tag_name]; echo json_encode($tags); diff --git a/public/archive.php b/public/archive.php index af06ac5..bb0a9c8 100644 --- a/public/archive.php +++ b/public/archive.php @@ -5,6 +5,43 @@ require_once(__DIR__ . '/../includes/common.php'); use PonePaste\Models\Paste; +$per_page = 20; +$current_page = 0; +$filter_value = ''; + +if (!empty($_GET['page'])) { + $current_page = max(0, intval($_GET['page'])); +} + +if (!empty($_GET['per_page'])) { + $per_page = max(1, min(100, intval($_GET['per_page']))); +} + +if (!empty($_GET['q'])) { + $filter_value = $_GET['q']; +} + +$pastes = Paste::with([ + 'user' => function($q) { + $q->select('users.id', 'username'); + }, + 'tags' => function($q) { + $q->select('tags.id', 'name', 'slug'); + }]) + ->select('id', 'user_id', 'title', 'created_at') + ->where('visible', Paste::VISIBILITY_PUBLIC) + ->whereRaw("((expiry IS NULL) OR ((expiry != 'SELF') AND (expiry > NOW())))"); + + +if (!empty($filter_value)) { + $pastes = $pastes->where('title', 'LIKE', '%' . escapeLikeQuery($filter_value) . '%'); +} + +$total_results = $pastes->count(); + +$pastes = $pastes->limit($per_page)->offset($per_page * $current_page); + +$pastes = $pastes->get(); // Temp count for untagged pastes $total_untagged = Paste::doesntHave('tags')->count(); diff --git a/public/assets/bundle/archive.js b/public/assets/bundle/archive.js index 8f6f0d9..a27acd1 100644 --- a/public/assets/bundle/archive.js +++ b/public/assets/bundle/archive.js @@ -413,6 +413,8 @@ const setupSignupModal = () => { const signupButton = $('[data-target~="#signin"],[data-target~="#signup"]'); if (signupButton) { + signupButton.href = 'javascript:void(0)'; + signupButton.addEventListener('click', () => { $('.modal').classList.add('is-active'); }); @@ -485,6 +487,23 @@ const globalSetup = () => { preloader.remove(); main.id = ''; } + + const captchaContainer = $('.captcha_container'); + + if (captchaContainer) { + const refreshElement = captchaContainer.querySelector('a'); + const imageElement = captchaContainer.querySelector('img'); + + if (refreshElement && imageElement) { + refreshElement.addEventListener('click', () => { + imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random(); + }); + } + } + + Array.prototype.forEach.call($('.js-hidden'), (elem) => { + toggleEl(elem); + }); }; whenReady(() => { diff --git a/public/assets/bundle/archive.min.js b/public/assets/bundle/archive.min.js index 5e3d687..ca012d0 100644 --- a/public/assets/bundle/archive.min.js +++ b/public/assets/bundle/archive.min.js @@ -1,2 +1,2 @@ -function t(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||a(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=a(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 s,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,s=t},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw s}}}}function a(t,e){if(t){if("string"==typeof t)return n(t,e);var a=Object.prototype.toString.call(t).slice(8,-1);return"Object"===a&&t.constructor&&(a=t.constructor.name),"Map"===a||"Set"===a?Array.from(t):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?n(t,e):void 0}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=new Array(e);a/g,">").replace(/"/g,""").replace(/'/g,"'")},h=function(){function t(e){i(this,t),this.element=e}return s(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){d(this.element);var n=Math.floor(t/e);if(0!==n){var i=a-2<0?0:a-2,r=a+2>n?n:a+2,s=Math.abs(0-a)>2,o=Math.abs(n-a)>2,l=0===a?"disabled":"";this.element.appendChild(c(''))),s&&(this.element.appendChild(c('"))),this.element.appendChild(c('')));for(var u=i;u<=r;u++){var h=u===a?"paginator__button--selected":"";this.element.appendChild(c('")))}o&&(this.element.appendChild(c('')),this.element.appendChild(c('"))));var p=a===n?"disabled":"";this.element.appendChild(c('')))}}}]),t}(),p=function(){function a(t,e){i(this,a),this.element=t,this.container=t.parentElement,this.options=e,this.ajaxCallback=e.ajaxCallback,this.data=[],this.unfilteredData=[],this.totalRecords=-1,this.perPage=20,this.currentPage=0,this.paginator=new h(this.container.querySelector(".paginator")),this.filterCallback=e.filterCallback,this.sortField=null,this.sortDir=!0}return s(a,[{key:"attach",value:function(){var t=this;this.filterField=this.container.querySelector("input.search"),this.filterField&&this.filterCallback&&(this.filterField.addEventListener("keyup",(function(e){e.target&&t._updateFilter(e.target.value)})),this.options.preFilter&&(this.filterField.value=this.options.preFilter)),this.perPageField=this.container.querySelector("select[name=per_page]"),this.perPageField&&this.perPageField.addEventListener("change",(function(e){t.perPage=Number(e.target.value),t._updatePage(0)}));var e=this.element.querySelector("tr.paginator__sort");e&&e.addEventListener("click",(function(e){var a=e.target;if(a.dataset.sortField){if(t.sortField){var n=t.element.querySelector("th[data-sort-field=".concat(t.sortField,"]"));n.classList.remove("paginator__sort--down"),n.classList.remove("paginator__sort--up")}t._updateSort(a.dataset.sortField,!t.sortDir),a.classList.add(t.sortDir?"paginator__sort--up":"paginator__sort--down")}})),this.paginator.attach(this._updatePage.bind(this)),this._loadEntries()}},{key:"_loadEntries",value:function(){var t=this;new Promise(this.ajaxCallback).then((function(e){t.element.classList.remove("hidden"),t.unfilteredData=e.data,t._updateFilter(t.options.preFilter)}))}},{key:"_updateEntries",value:function(t){this.data=t,this.totalRecords=this.data.length;var e=this.element.querySelector("tbody");d(e);for(var a=this.perPage*this.currentPage,n=a+this.perPage>this.totalRecords?this.totalRecords:a+this.perPage,i=a;in[e]?i=1:t[e]1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this.element=e,this.tags=[],this.options=a,this.maxTags=a.maxTags||10,this.inputNode=null,this.containerNode=null}return s(t,[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=c('
'),this.inputNode=c(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var t,a=e(this.element.value.split(","));try{for(a.s();!(t=a.n()).done;){var n=t.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'+u(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())}}]),t}(),v=function(){var t,e;Array.prototype.forEach.call((t=".js-tag-input",document.querySelectorAll(t)||[]),(function(t){new g(t).attach()})),(e=l('[data-target~="#signin"],[data-target~="#signup"]'))&&(e.addEventListener("click",(function(){l(".modal").classList.add("is-active")})),l(".modal-button-close").addEventListener("click",(function(){l(".modal").classList.remove("is-active")})));var a=l(".panel-tools .embed-tool");a&&a.addEventListener("click",(function(t){var e;t.target&&t.target.closest(".panel-tools")&&((e=t.target.closest(".panel-tools").querySelector(".panel-embed")).classList.contains("is-hidden")?e.classList.remove("is-hidden"):e.classList.add("is-hidden"))}));var n=l(".expand-tool");n&&n.addEventListener("click",(function(t){if(t.target&&t.target.closest(".panel")){var e=t.target.closest(".panel");e.classList.contains("panel-fullsize")?e.classList.remove("panel-fullsize"):e.classList.add("panel-fullsize")}})),(document.querySelectorAll(".notification .delete")||[]).forEach((function(t){var e=t.parentNode;t.addEventListener("click",(function(){e.parentNode.removeChild(e)}))}));var i=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);i.length>0&&i.forEach((function(t){t.addEventListener("click",(function(){var e=t.dataset.target,a=document.getElementById(e);t.classList.toggle("is-active"),a.classList.toggle("is-active")}))}));var r=l(".preloader"),s=l("main");r&&s&&(r.remove(),s.id="")};o=function(){v();var t=new URLSearchParams(window.location.search).get("q");new p(document.getElementById("archive"),{ajaxCallback:function(t){fetch("/api/ajax_pastes.php").then((function(t){return t.json()})).then(t)},rowCallback:function(t){return'\n ').concat(u(t.title),'\n ').concat(u(t.author),"\n ").concat(t.tags.map((function(t){var e;return e=-1!==t.name.indexOf("nsfw")?"is-danger":-1!==t.name.indexOf("safe")?"is-success":-1!==t.name.indexOf("/")?"is-primary":"is-info",'\n ').concat(u(t.name),"\n ")})).join(""),"\n ")},filterCallback:f,preFilter:t}).attach()},"loading"!==document.readyState?o():document.addEventListener("DOMContentLoaded",o); +function t(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||a(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=a(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 s,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,s=t},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw s}}}}function a(t,e){if(t){if("string"==typeof t)return n(t,e);var a=Object.prototype.toString.call(t).slice(8,-1);return"Object"===a&&t.constructor&&(a=t.constructor.name),"Map"===a||"Set"===a?Array.from(t):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?n(t,e):void 0}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=new Array(e);a/g,">").replace(/"/g,""").replace(/'/g,"'")},p=function(){function t(e){i(this,t),this.element=e}return s(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){d(this.element);var n=Math.floor(t/e);if(0!==n){var i=a-2<0?0:a-2,r=a+2>n?n:a+2,s=Math.abs(0-a)>2,o=Math.abs(n-a)>2,l=0===a?"disabled":"";this.element.appendChild(c(''))),s&&(this.element.appendChild(c('"))),this.element.appendChild(c('')));for(var u=i;u<=r;u++){var h=u===a?"paginator__button--selected":"";this.element.appendChild(c('")))}o&&(this.element.appendChild(c('')),this.element.appendChild(c('"))));var p=a===n?"disabled":"";this.element.appendChild(c('')))}}}]),t}(),f=function(){function a(t,e){i(this,a),this.element=t,this.container=t.parentElement,this.options=e,this.ajaxCallback=e.ajaxCallback,this.data=[],this.unfilteredData=[],this.totalRecords=-1,this.perPage=20,this.currentPage=0,this.paginator=new p(this.container.querySelector(".paginator")),this.filterCallback=e.filterCallback,this.sortField=null,this.sortDir=!0}return s(a,[{key:"attach",value:function(){var t=this;this.filterField=this.container.querySelector("input.search"),this.filterField&&this.filterCallback&&(this.filterField.addEventListener("keyup",(function(e){e.target&&t._updateFilter(e.target.value)})),this.options.preFilter&&(this.filterField.value=this.options.preFilter)),this.perPageField=this.container.querySelector("select[name=per_page]"),this.perPageField&&this.perPageField.addEventListener("change",(function(e){t.perPage=Number(e.target.value),t._updatePage(0)}));var e=this.element.querySelector("tr.paginator__sort");e&&e.addEventListener("click",(function(e){var a=e.target;if(a.dataset.sortField){if(t.sortField){var n=t.element.querySelector("th[data-sort-field=".concat(t.sortField,"]"));n.classList.remove("paginator__sort--down"),n.classList.remove("paginator__sort--up")}t._updateSort(a.dataset.sortField,!t.sortDir),a.classList.add(t.sortDir?"paginator__sort--up":"paginator__sort--down")}})),this.paginator.attach(this._updatePage.bind(this)),this._loadEntries()}},{key:"_loadEntries",value:function(){var t=this;new Promise(this.ajaxCallback).then((function(e){t.element.classList.remove("hidden"),t.unfilteredData=e.data,t._updateFilter(t.options.preFilter)}))}},{key:"_updateEntries",value:function(t){this.data=t,this.totalRecords=this.data.length;var e=this.element.querySelector("tbody");d(e);for(var a=this.perPage*this.currentPage,n=a+this.perPage>this.totalRecords?this.totalRecords:a+this.perPage,i=a;in[e]?i=1:t[e]1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this.element=e,this.tags=[],this.options=a,this.maxTags=a.maxTags||10,this.inputNode=null,this.containerNode=null}return s(t,[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=c('
'),this.inputNode=c(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var t,a=e(this.element.value.split(","));try{for(a.s();!(t=a.n()).done;){var n=t.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'+h(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())}}]),t}(),m=function(){var t,e;Array.prototype.forEach.call((t=".js-tag-input",document.querySelectorAll(t)||[]),(function(t){new v(t).attach()})),(e=l('[data-target~="#signin"],[data-target~="#signup"]'))&&(e.href="javascript:void(0)",e.addEventListener("click",(function(){l(".modal").classList.add("is-active")})),l(".modal-button-close").addEventListener("click",(function(){l(".modal").classList.remove("is-active")})));var a=l(".panel-tools .embed-tool");a&&a.addEventListener("click",(function(t){t.target&&t.target.closest(".panel-tools")&&u(t.target.closest(".panel-tools").querySelector(".panel-embed"))}));var n=l(".expand-tool");n&&n.addEventListener("click",(function(t){if(t.target&&t.target.closest(".panel")){var e=t.target.closest(".panel");e.classList.contains("panel-fullsize")?e.classList.remove("panel-fullsize"):e.classList.add("panel-fullsize")}})),(document.querySelectorAll(".notification .delete")||[]).forEach((function(t){var e=t.parentNode;t.addEventListener("click",(function(){e.parentNode.removeChild(e)}))}));var i=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);i.length>0&&i.forEach((function(t){t.addEventListener("click",(function(){var e=t.dataset.target,a=document.getElementById(e);t.classList.toggle("is-active"),a.classList.toggle("is-active")}))}));var r=l(".preloader"),s=l("main");r&&s&&(r.remove(),s.id="");var o=l(".captcha_container");if(o){var c=o.querySelector("a"),d=o.querySelector("img");c&&d&&c.addEventListener("click",(function(){d.src=d.src.split("?")[0]+"?rand="+Math.random()}))}Array.prototype.forEach.call(l(".js-hidden"),(function(t){u(t)}))};o=function(){m();var t=new URLSearchParams(window.location.search).get("q");new f(document.getElementById("archive"),{ajaxCallback:function(t){fetch("/api/ajax_pastes.php").then((function(t){return t.json()})).then(t)},rowCallback:function(t){return'\n ').concat(h(t.title),'\n ').concat(h(t.author),"\n ").concat(t.tags.map((function(t){var e;return e=-1!==t.name.indexOf("nsfw")?"is-danger":-1!==t.name.indexOf("safe")?"is-success":-1!==t.name.indexOf("/")?"is-primary":"is-info",'\n ').concat(h(t.name),"\n ")})).join(""),"\n ")},filterCallback:g,preFilter:t}).attach()},"loading"!==document.readyState?o():document.addEventListener("DOMContentLoaded",o); //# sourceMappingURL=archive.min.js.map diff --git a/public/assets/bundle/archive.min.js.map b/public/assets/bundle/archive.min.js.map index 216d124..65bfa62 100644 --- a/public/assets/bundle/archive.min.js.map +++ b/public/assets/bundle/archive.min.js.map @@ -1 +1 @@ -{"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}\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 ``\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n ``\n ));\n this.element.appendChild(makeEl(``));\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 ``\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(``));\n this.element.appendChild(makeEl(\n ``\n ));\n }\n\n const nextButtonDisabled = currentPage === lastPage ? 'disabled' : ''\n /* Next button */\n this.element.appendChild(makeEl(\n ``\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('
');\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 { $, $$, 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.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\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 `\n ${escape(rowData.title)}\n ${escape(rowData.author)}\n ${tagsToHtml(rowData.tags)}\n `;\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 `\n ${escape(tagData.name)}\n `;\n }).join('');\n};\n\nexport { tagsToHtml };\n"],"names":["funcp","$","selector","document","querySelector","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","escape","unsafe","replace","SimplePaginator","element","pageCallback","addEventListener","evt","target","classList","contains","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","remove","_updateSort","add","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","querySelectorAll","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","myParam","URLSearchParams","window","location","search","get","resolve","fetch","r","json","rowData","author","map","tagData","tagColorClass","slug","readyState"],"mappings":"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"} \ No newline at end of file +{"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}\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 ``\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n ``\n ));\n this.element.appendChild(makeEl(``));\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 ``\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(``));\n this.element.appendChild(makeEl(\n ``\n ));\n }\n\n const nextButtonDisabled = currentPage === lastPage ? 'disabled' : ''\n /* Next button */\n this.element.appendChild(makeEl(\n ``\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('
');\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 { $, $$, 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 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 imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();\n });\n }\n }\n\n Array.prototype.forEach.call($('.js-hidden'), (elem) => {\n toggleEl(elem);\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 `\n ${escape(rowData.title)}\n ${escape(rowData.author)}\n ${tagsToHtml(rowData.tags)}\n `;\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 `\n ${escape(tagData.name)}\n `;\n }).join('');\n};\n\nexport { tagsToHtml };\n"],"names":["funcp","$","selector","document","querySelector","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","querySelectorAll","href","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","random","myParam","URLSearchParams","window","location","search","get","resolve","fetch","r","json","rowData","author","map","tagData","tagColorClass","slug","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/public/assets/bundle/generic.js b/public/assets/bundle/generic.js index 8c9826b..787d3d1 100644 --- a/public/assets/bundle/generic.js +++ b/public/assets/bundle/generic.js @@ -144,6 +144,8 @@ const setupSignupModal = () => { const signupButton = $('[data-target~="#signin"],[data-target~="#signup"]'); if (signupButton) { + signupButton.href = 'javascript:void(0)'; + signupButton.addEventListener('click', () => { $('.modal').classList.add('is-active'); }); @@ -216,6 +218,23 @@ const globalSetup = () => { preloader.remove(); main.id = ''; } + + const captchaContainer = $('.captcha_container'); + + if (captchaContainer) { + const refreshElement = captchaContainer.querySelector('a'); + const imageElement = captchaContainer.querySelector('img'); + + if (refreshElement && imageElement) { + refreshElement.addEventListener('click', () => { + imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random(); + }); + } + } + + Array.prototype.forEach.call($('.js-hidden'), (elem) => { + toggleEl(elem); + }); }; whenReady(globalSetup); diff --git a/public/assets/bundle/generic.min.js b/public/assets/bundle/generic.min.js index 3bc641c..d40b6c4 100644 --- a/public/assets/bundle/generic.min.js +++ b/public/assets/bundle/generic.min.js @@ -1,2 +1,2 @@ -function e(e,n){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=function(e,n){if(!e)return;if("string"==typeof e)return t(e,n);var a=Object.prototype.toString.call(e).slice(8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return Array.from(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return t(e,n)}(e))||n&&e&&"number"==typeof e.length){a&&(e=a);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}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 o,s=!0,l=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return s=e.done,e},e:function(e){l=!0,o=e},f:function(){try{s||null==a.return||a.return()}finally{if(l)throw o}}}}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n/g,">").replace(/"/g,""").replace(/'/g,"'")},l=function(){function t(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};n(this,t),this.element=e,this.tags=[],this.options=a,this.maxTags=a.maxTags||10,this.inputNode=null,this.containerNode=null}var i,r,l;return i=t,(r=[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=o('
'),this.inputNode=o(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var t,n=e(this.element.value.split(","));try{for(n.s();!(t=n.n()).done;){var a=t.value;this.addTag(a)}}catch(e){n.e(e)}finally{n.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(e){this.tags.splice(this.tags.indexOf(e.dataset.value.toLowerCase()),1),e.remove(),this.tags.length'+s(e)+''),this.inputNode),this.tags.length>=this.maxTags&&(this.inputNode.disabled=!0))}},{key:"_handleInputKeyUp",value:function(e){var t=this.inputNode.value;"Backspace"===e.key&&""===t?this.inputNode.previousSibling&&(this.deleteTagNode(this.inputNode.previousSibling),this.updateHiddenInputValue()):","===e.key&&(this.addTag(t),this.inputNode.value="",this.updateHiddenInputValue(),e.preventDefault())}},{key:"_handleContainerClick",value:function(e){e.target&&e.target.classList.contains("delete")&&(this.deleteTagNode(e.target.closest(".tag")),this.updateHiddenInputValue())}}])&&a(i.prototype,r),l&&a(i,l),t}();i=function(){var e,t;Array.prototype.forEach.call((e=".js-tag-input",document.querySelectorAll(e)||[]),(function(e){new l(e).attach()})),(t=r('[data-target~="#signin"],[data-target~="#signup"]'))&&(t.addEventListener("click",(function(){r(".modal").classList.add("is-active")})),r(".modal-button-close").addEventListener("click",(function(){r(".modal").classList.remove("is-active")})));var n=r(".panel-tools .embed-tool");n&&n.addEventListener("click",(function(e){var t;e.target&&e.target.closest(".panel-tools")&&((t=e.target.closest(".panel-tools").querySelector(".panel-embed")).classList.contains("is-hidden")?t.classList.remove("is-hidden"):t.classList.add("is-hidden"))}));var a=r(".expand-tool");a&&a.addEventListener("click",(function(e){if(e.target&&e.target.closest(".panel")){var t=e.target.closest(".panel");t.classList.contains("panel-fullsize")?t.classList.remove("panel-fullsize"):t.classList.add("panel-fullsize")}})),(document.querySelectorAll(".notification .delete")||[]).forEach((function(e){var t=e.parentNode;e.addEventListener("click",(function(){t.parentNode.removeChild(t)}))}));var i=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);i.length>0&&i.forEach((function(e){e.addEventListener("click",(function(){var t=e.dataset.target,n=document.getElementById(t);e.classList.toggle("is-active"),n.classList.toggle("is-active")}))}));var o=r(".preloader"),s=r("main");o&&s&&(o.remove(),s.id="")},"loading"!==document.readyState?i():document.addEventListener("DOMContentLoaded",i); +function e(e,n){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=function(e,n){if(!e)return;if("string"==typeof e)return t(e,n);var a=Object.prototype.toString.call(e).slice(8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return Array.from(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return t(e,n)}(e))||n&&e&&"number"==typeof e.length){a&&(e=a);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}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 o,s=!0,l=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return s=e.done,e},e:function(e){l=!0,o=e},f:function(){try{s||null==a.return||a.return()}finally{if(l)throw o}}}}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n/g,">").replace(/"/g,""").replace(/'/g,"'")},c=function(){function t(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};n(this,t),this.element=e,this.tags=[],this.options=a,this.maxTags=a.maxTags||10,this.inputNode=null,this.containerNode=null}var i,r,s;return i=t,(r=[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=o('
'),this.inputNode=o(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var t,n=e(this.element.value.split(","));try{for(n.s();!(t=n.n()).done;){var a=t.value;this.addTag(a)}}catch(e){n.e(e)}finally{n.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(e){this.tags.splice(this.tags.indexOf(e.dataset.value.toLowerCase()),1),e.remove(),this.tags.length'+l(e)+''),this.inputNode),this.tags.length>=this.maxTags&&(this.inputNode.disabled=!0))}},{key:"_handleInputKeyUp",value:function(e){var t=this.inputNode.value;"Backspace"===e.key&&""===t?this.inputNode.previousSibling&&(this.deleteTagNode(this.inputNode.previousSibling),this.updateHiddenInputValue()):","===e.key&&(this.addTag(t),this.inputNode.value="",this.updateHiddenInputValue(),e.preventDefault())}},{key:"_handleContainerClick",value:function(e){e.target&&e.target.classList.contains("delete")&&(this.deleteTagNode(e.target.closest(".tag")),this.updateHiddenInputValue())}}])&&a(i.prototype,r),s&&a(i,s),t}();i=function(){var e,t;Array.prototype.forEach.call((e=".js-tag-input",document.querySelectorAll(e)||[]),(function(e){new c(e).attach()})),(t=r('[data-target~="#signin"],[data-target~="#signup"]'))&&(t.href="javascript:void(0)",t.addEventListener("click",(function(){r(".modal").classList.add("is-active")})),r(".modal-button-close").addEventListener("click",(function(){r(".modal").classList.remove("is-active")})));var n=r(".panel-tools .embed-tool");n&&n.addEventListener("click",(function(e){e.target&&e.target.closest(".panel-tools")&&s(e.target.closest(".panel-tools").querySelector(".panel-embed"))}));var a=r(".expand-tool");a&&a.addEventListener("click",(function(e){if(e.target&&e.target.closest(".panel")){var t=e.target.closest(".panel");t.classList.contains("panel-fullsize")?t.classList.remove("panel-fullsize"):t.classList.add("panel-fullsize")}})),(document.querySelectorAll(".notification .delete")||[]).forEach((function(e){var t=e.parentNode;e.addEventListener("click",(function(){t.parentNode.removeChild(t)}))}));var i=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);i.length>0&&i.forEach((function(e){e.addEventListener("click",(function(){var t=e.dataset.target,n=document.getElementById(t);e.classList.toggle("is-active"),n.classList.toggle("is-active")}))}));var o=r(".preloader"),l=r("main");o&&l&&(o.remove(),l.id="");var d=r(".captcha_container");if(d){var u=d.querySelector("a"),h=d.querySelector("img");u&&h&&u.addEventListener("click",(function(){h.src=h.src.split("?")[0]+"?rand="+Math.random()}))}Array.prototype.forEach.call(r(".js-hidden"),(function(e){s(e)}))},"loading"!==document.readyState?i():document.addEventListener("DOMContentLoaded",i); //# sourceMappingURL=generic.min.js.map diff --git a/public/assets/bundle/generic.min.js.map b/public/assets/bundle/generic.min.js.map index 7a66cc0..7e400e1 100644 --- a/public/assets/bundle/generic.min.js.map +++ b/public/assets/bundle/generic.min.js.map @@ -1 +1 @@ -{"version":3,"file":"generic.min.js","sources":["../../js/dom.js","../../js/tag_input.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 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}\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, 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 { $, $$, 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.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\nexport { globalSetup };"],"names":["funcp","$","selector","document","querySelector","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","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","signupButton","Array","prototype","forEach","call","querySelectorAll","el","attach","add","embedButton","expandButton","panel","$delete","$notification","removeChild","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","readyState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"generic.min.js","sources":["../../../js/dom.js","../../../js/tag_input.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 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}\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, 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 { $, $$, 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 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 imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();\n });\n }\n }\n\n Array.prototype.forEach.call($('.js-hidden'), (elem) => {\n toggleEl(elem);\n });\n}\n\nexport { globalSetup };"],"names":["funcp","$","selector","document","querySelector","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","toggleEl","el","classList","contains","remove","add","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","join","node","splice","indexOf","dataset","toLowerCase","length","disabled","tagValue","push","evt","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","target","closest","signupButton","Array","prototype","forEach","call","querySelectorAll","attach","href","embedButton","expandButton","panel","$delete","$notification","removeChild","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","Math","random","elem","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/public/assets/bundle/user_profile.js b/public/assets/bundle/user_profile.js index 3b9595e..1582d2a 100644 --- a/public/assets/bundle/user_profile.js +++ b/public/assets/bundle/user_profile.js @@ -413,6 +413,8 @@ const setupSignupModal = () => { const signupButton = $('[data-target~="#signin"],[data-target~="#signup"]'); if (signupButton) { + signupButton.href = 'javascript:void(0)'; + signupButton.addEventListener('click', () => { $('.modal').classList.add('is-active'); }); @@ -485,6 +487,23 @@ const globalSetup = () => { preloader.remove(); main.id = ''; } + + const captchaContainer = $('.captcha_container'); + + if (captchaContainer) { + const refreshElement = captchaContainer.querySelector('a'); + const imageElement = captchaContainer.querySelector('img'); + + if (refreshElement && imageElement) { + refreshElement.addEventListener('click', () => { + imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random(); + }); + } + } + + Array.prototype.forEach.call($('.js-hidden'), (elem) => { + toggleEl(elem); + }); }; const getUserInfo = () => { diff --git a/public/assets/bundle/user_profile.min.js b/public/assets/bundle/user_profile.min.js index 83ae5ae..02dc0a5 100644 --- a/public/assets/bundle/user_profile.min.js +++ b/public/assets/bundle/user_profile.min.js @@ -1,2 +1,2 @@ -function t(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||a(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=a(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 s,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,s=t},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw s}}}}function a(t,e){if(t){if("string"==typeof t)return n(t,e);var a=Object.prototype.toString.call(t).slice(8,-1);return"Object"===a&&t.constructor&&(a=t.constructor.name),"Map"===a||"Set"===a?Array.from(t):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?n(t,e):void 0}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=new Array(e);a/g,">").replace(/"/g,""").replace(/'/g,"'")},h=function(){function t(e){i(this,t),this.element=e}return s(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){d(this.element);var n=Math.floor(t/e);if(0!==n){var i=a-2<0?0:a-2,r=a+2>n?n:a+2,s=Math.abs(0-a)>2,o=Math.abs(n-a)>2,l=0===a?"disabled":"";this.element.appendChild(c(''))),s&&(this.element.appendChild(c('"))),this.element.appendChild(c('')));for(var u=i;u<=r;u++){var h=u===a?"paginator__button--selected":"";this.element.appendChild(c('")))}o&&(this.element.appendChild(c('')),this.element.appendChild(c('"))));var p=a===n?"disabled":"";this.element.appendChild(c('')))}}}]),t}(),p=function(){function a(t,e){i(this,a),this.element=t,this.container=t.parentElement,this.options=e,this.ajaxCallback=e.ajaxCallback,this.data=[],this.unfilteredData=[],this.totalRecords=-1,this.perPage=20,this.currentPage=0,this.paginator=new h(this.container.querySelector(".paginator")),this.filterCallback=e.filterCallback,this.sortField=null,this.sortDir=!0}return s(a,[{key:"attach",value:function(){var t=this;this.filterField=this.container.querySelector("input.search"),this.filterField&&this.filterCallback&&(this.filterField.addEventListener("keyup",(function(e){e.target&&t._updateFilter(e.target.value)})),this.options.preFilter&&(this.filterField.value=this.options.preFilter)),this.perPageField=this.container.querySelector("select[name=per_page]"),this.perPageField&&this.perPageField.addEventListener("change",(function(e){t.perPage=Number(e.target.value),t._updatePage(0)}));var e=this.element.querySelector("tr.paginator__sort");e&&e.addEventListener("click",(function(e){var a=e.target;if(a.dataset.sortField){if(t.sortField){var n=t.element.querySelector("th[data-sort-field=".concat(t.sortField,"]"));n.classList.remove("paginator__sort--down"),n.classList.remove("paginator__sort--up")}t._updateSort(a.dataset.sortField,!t.sortDir),a.classList.add(t.sortDir?"paginator__sort--up":"paginator__sort--down")}})),this.paginator.attach(this._updatePage.bind(this)),this._loadEntries()}},{key:"_loadEntries",value:function(){var t=this;new Promise(this.ajaxCallback).then((function(e){t.element.classList.remove("hidden"),t.unfilteredData=e.data,t._updateFilter(t.options.preFilter)}))}},{key:"_updateEntries",value:function(t){this.data=t,this.totalRecords=this.data.length;var e=this.element.querySelector("tbody");d(e);for(var a=this.perPage*this.currentPage,n=a+this.perPage>this.totalRecords?this.totalRecords:a+this.perPage,i=a;in[e]?i=1:t[e]\n ').concat(u(t.name),"\n ")})).join("")},v=function(){function t(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this.element=e,this.tags=[],this.options=a,this.maxTags=a.maxTags||10,this.inputNode=null,this.containerNode=null}return s(t,[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=c('
'),this.inputNode=c(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var t,a=e(this.element.value.split(","));try{for(a.s();!(t=a.n()).done;){var n=t.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'+u(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())}}]),t}(),m=function(){var t,e;Array.prototype.forEach.call((t=".js-tag-input",document.querySelectorAll(t)||[]),(function(t){new v(t).attach()})),(e=l('[data-target~="#signin"],[data-target~="#signup"]'))&&(e.addEventListener("click",(function(){l(".modal").classList.add("is-active")})),l(".modal-button-close").addEventListener("click",(function(){l(".modal").classList.remove("is-active")})));var a=l(".panel-tools .embed-tool");a&&a.addEventListener("click",(function(t){var e;t.target&&t.target.closest(".panel-tools")&&((e=t.target.closest(".panel-tools").querySelector(".panel-embed")).classList.contains("is-hidden")?e.classList.remove("is-hidden"):e.classList.add("is-hidden"))}));var n=l(".expand-tool");n&&n.addEventListener("click",(function(t){if(t.target&&t.target.closest(".panel")){var e=t.target.closest(".panel");e.classList.contains("panel-fullsize")?e.classList.remove("panel-fullsize"):e.classList.add("panel-fullsize")}})),(document.querySelectorAll(".notification .delete")||[]).forEach((function(t){var e=t.parentNode;t.addEventListener("click",(function(){e.parentNode.removeChild(e)}))}));var i=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);i.length>0&&i.forEach((function(t){t.addEventListener("click",(function(){var e=t.dataset.target,a=document.getElementById(e);t.classList.toggle("is-active"),a.classList.toggle("is-active")}))}));var r=l(".preloader"),s=l("main");r&&s&&(r.remove(),s.id="")},y=function(t){return t.dataset.pasteInfo?JSON.parse(t.dataset.pasteInfo):null};o=function(){m();var t=new URLSearchParams(window.location.search).get("q"),e=document.getElementById("archive");new p(e,{ajaxCallback:function(t){t({data:Array.prototype.map.call(e.querySelectorAll("tbody > tr"),y)})},rowCallback:function(t){var e,a=(e=document.getElementById("js-data-holder"))?{userId:e.dataset.userId,csrfToken:e.dataset.csrfToken}:{userId:null,csrfToken:null},n=parseInt(t.user_id)===parseInt(a.userId),i=n?'\n
\n \n \n \n
\n '):"",r=new Date(t.created_at).toLocaleString(),s=n?''.concat(t.visibility,""):"";return'\n ').concat(u(t.title),'\n ').concat(r,"\n ").concat(s,'\n ').concat(t.views||0,"\n ").concat(g(t.tags),"\n ").concat(i,"\n ")},filterCallback:f,preFilter:t}).attach();var a=document.getElementById("favs");a&&new p(a,{ajaxCallback:function(t){t({data:Array.prototype.map.call(a.querySelectorAll("tbody > tr"),y)})},rowCallback:function(t){var e=t.recently_updated?"":"",a=new Date(t.favourited_at).toLocaleString();return'\n ').concat(u(t.title),'\n ').concat(a,'\n ').concat(e,"\n ").concat(g(t.tags),"\n ")},filterCallback:f}).attach()},"loading"!==document.readyState?o():document.addEventListener("DOMContentLoaded",o); +function t(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||a(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=a(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 s,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,s=t},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw s}}}}function a(t,e){if(t){if("string"==typeof t)return n(t,e);var a=Object.prototype.toString.call(t).slice(8,-1);return"Object"===a&&t.constructor&&(a=t.constructor.name),"Map"===a||"Set"===a?Array.from(t):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?n(t,e):void 0}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var a=0,n=new Array(e);a/g,">").replace(/"/g,""").replace(/'/g,"'")},p=function(){function t(e){i(this,t),this.element=e}return s(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){d(this.element);var n=Math.floor(t/e);if(0!==n){var i=a-2<0?0:a-2,r=a+2>n?n:a+2,s=Math.abs(0-a)>2,o=Math.abs(n-a)>2,l=0===a?"disabled":"";this.element.appendChild(c(''))),s&&(this.element.appendChild(c('"))),this.element.appendChild(c('')));for(var u=i;u<=r;u++){var h=u===a?"paginator__button--selected":"";this.element.appendChild(c('")))}o&&(this.element.appendChild(c('')),this.element.appendChild(c('"))));var p=a===n?"disabled":"";this.element.appendChild(c('')))}}}]),t}(),f=function(){function a(t,e){i(this,a),this.element=t,this.container=t.parentElement,this.options=e,this.ajaxCallback=e.ajaxCallback,this.data=[],this.unfilteredData=[],this.totalRecords=-1,this.perPage=20,this.currentPage=0,this.paginator=new p(this.container.querySelector(".paginator")),this.filterCallback=e.filterCallback,this.sortField=null,this.sortDir=!0}return s(a,[{key:"attach",value:function(){var t=this;this.filterField=this.container.querySelector("input.search"),this.filterField&&this.filterCallback&&(this.filterField.addEventListener("keyup",(function(e){e.target&&t._updateFilter(e.target.value)})),this.options.preFilter&&(this.filterField.value=this.options.preFilter)),this.perPageField=this.container.querySelector("select[name=per_page]"),this.perPageField&&this.perPageField.addEventListener("change",(function(e){t.perPage=Number(e.target.value),t._updatePage(0)}));var e=this.element.querySelector("tr.paginator__sort");e&&e.addEventListener("click",(function(e){var a=e.target;if(a.dataset.sortField){if(t.sortField){var n=t.element.querySelector("th[data-sort-field=".concat(t.sortField,"]"));n.classList.remove("paginator__sort--down"),n.classList.remove("paginator__sort--up")}t._updateSort(a.dataset.sortField,!t.sortDir),a.classList.add(t.sortDir?"paginator__sort--up":"paginator__sort--down")}})),this.paginator.attach(this._updatePage.bind(this)),this._loadEntries()}},{key:"_loadEntries",value:function(){var t=this;new Promise(this.ajaxCallback).then((function(e){t.element.classList.remove("hidden"),t.unfilteredData=e.data,t._updateFilter(t.options.preFilter)}))}},{key:"_updateEntries",value:function(t){this.data=t,this.totalRecords=this.data.length;var e=this.element.querySelector("tbody");d(e);for(var a=this.perPage*this.currentPage,n=a+this.perPage>this.totalRecords?this.totalRecords:a+this.perPage,i=a;in[e]?i=1:t[e]\n ').concat(h(t.name),"\n ")})).join("")},m=function(){function t(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this.element=e,this.tags=[],this.options=a,this.maxTags=a.maxTags||10,this.inputNode=null,this.containerNode=null}return s(t,[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=c('
'),this.inputNode=c(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var t,a=e(this.element.value.split(","));try{for(a.s();!(t=a.n()).done;){var n=t.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'+h(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())}}]),t}(),y=function(){var t,e;Array.prototype.forEach.call((t=".js-tag-input",document.querySelectorAll(t)||[]),(function(t){new m(t).attach()})),(e=l('[data-target~="#signin"],[data-target~="#signup"]'))&&(e.href="javascript:void(0)",e.addEventListener("click",(function(){l(".modal").classList.add("is-active")})),l(".modal-button-close").addEventListener("click",(function(){l(".modal").classList.remove("is-active")})));var a=l(".panel-tools .embed-tool");a&&a.addEventListener("click",(function(t){t.target&&t.target.closest(".panel-tools")&&u(t.target.closest(".panel-tools").querySelector(".panel-embed"))}));var n=l(".expand-tool");n&&n.addEventListener("click",(function(t){if(t.target&&t.target.closest(".panel")){var e=t.target.closest(".panel");e.classList.contains("panel-fullsize")?e.classList.remove("panel-fullsize"):e.classList.add("panel-fullsize")}})),(document.querySelectorAll(".notification .delete")||[]).forEach((function(t){var e=t.parentNode;t.addEventListener("click",(function(){e.parentNode.removeChild(e)}))}));var i=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);i.length>0&&i.forEach((function(t){t.addEventListener("click",(function(){var e=t.dataset.target,a=document.getElementById(e);t.classList.toggle("is-active"),a.classList.toggle("is-active")}))}));var r=l(".preloader"),s=l("main");r&&s&&(r.remove(),s.id="");var o=l(".captcha_container");if(o){var c=o.querySelector("a"),d=o.querySelector("img");c&&d&&c.addEventListener("click",(function(){d.src=d.src.split("?")[0]+"?rand="+Math.random()}))}Array.prototype.forEach.call(l(".js-hidden"),(function(t){u(t)}))},b=function(t){return t.dataset.pasteInfo?JSON.parse(t.dataset.pasteInfo):null};o=function(){y();var t=new URLSearchParams(window.location.search).get("q"),e=document.getElementById("archive");new f(e,{ajaxCallback:function(t){t({data:Array.prototype.map.call(e.querySelectorAll("tbody > tr"),b)})},rowCallback:function(t){var e,a=(e=document.getElementById("js-data-holder"))?{userId:e.dataset.userId,csrfToken:e.dataset.csrfToken}:{userId:null,csrfToken:null},n=parseInt(t.user_id)===parseInt(a.userId),i=n?'\n
\n \n \n \n
\n '):"",r=new Date(t.created_at).toLocaleString(),s=n?''.concat(t.visibility,""):"";return'\n ').concat(h(t.title),'\n ').concat(r,"\n ").concat(s,'\n ').concat(t.views||0,"\n ").concat(v(t.tags),"\n ").concat(i,"\n ")},filterCallback:g,preFilter:t}).attach();var a=document.getElementById("favs");a&&new f(a,{ajaxCallback:function(t){t({data:Array.prototype.map.call(a.querySelectorAll("tbody > tr"),b)})},rowCallback:function(t){var e=t.recently_updated?"":"",a=new Date(t.favourited_at).toLocaleString();return'\n ').concat(h(t.title),'\n ').concat(a,'\n ').concat(e,"\n ").concat(v(t.tags),"\n ")},filterCallback:g}).attach()},"loading"!==document.readyState?o():document.addEventListener("DOMContentLoaded",o); //# sourceMappingURL=user_profile.min.js.map diff --git a/public/assets/bundle/user_profile.min.js.map b/public/assets/bundle/user_profile.min.js.map index 2833384..207ceb9 100644 --- a/public/assets/bundle/user_profile.min.js.map +++ b/public/assets/bundle/user_profile.min.js.map @@ -1 +1 @@ -{"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, \"&\")\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 ``\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n ``\n ));\n this.element.appendChild(makeEl(``));\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 ``\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(``));\n this.element.appendChild(makeEl(\n ``\n ));\n }\n\n const nextButtonDisabled = currentPage === lastPage ? 'disabled' : ''\n /* Next button */\n this.element.appendChild(makeEl(\n ``\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 { 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 `\n ${escape(tagData.name)}\n `;\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 || 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 { $, $$, 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.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\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 table = new DataTable(myPastesElem, {\n ajaxCallback: (resolve) => {\n resolve({\n data: Array.prototype.map.call(myPastesElem.querySelectorAll('tbody > tr'), parsePasteInfo)\n });\n },\n rowCallback: (rowData) => {\n const userData = getUserInfo();\n const ownedByUser = (parseInt(rowData.user_id) === parseInt(userData.userId));\n\n const deleteElem = ownedByUser ? `\n
\n \n \n \n
\n ` : '';\n const pasteCreatedAt = new Date(rowData.created_at).toLocaleString();\n const pasteVisibility = ownedByUser ? `${rowData.visibility}` : '';\n\n return `\n ${escape(rowData.title)}\n ${pasteCreatedAt}\n ${pasteVisibility}\n ${rowData.views || 0}\n ${tagsToHtml(rowData.tags)}\n ${deleteElem}\n `;\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 resolve({\n data: Array.prototype.map.call(myFavesElem.querySelectorAll('tbody > tr'), parsePasteInfo)\n });\n },\n rowCallback: (rowData) => {\n const recentUpdate = rowData.recently_updated ?\n `` :\n ``;\n const pasteFavedAt = new Date(rowData.favourited_at).toLocaleString();\n\n // ${escape(rowData.author)}\n return `\n ${escape(rowData.title)}\n ${pasteFavedAt}\n ${recentUpdate}\n ${tagsToHtml(rowData.tags)}\n `;\n },\n filterCallback: dumbFilterCallback\n });\n faveTable.attach();\n});"],"names":["funcp","$","selector","document","querySelector","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","escape","unsafe","replace","SimplePaginator","element","pageCallback","addEventListener","evt","target","classList","contains","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","remove","_updateSort","add","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","tagsToHtml","map","tagData","tagColorClass","slug","join","TagsInput","maxTags","inputNode","containerNode","style","display","parentNode","insertBefore","nextSibling","split","tag","addTag","_handleInputKeyUp","_handleContainerClick","clear","node","splice","disabled","tagValue","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","closest","globalSetup","signupButton","Array","prototype","forEach","call","querySelectorAll","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","parsePasteInfo","pasteInfo","JSON","parse","myParam","URLSearchParams","window","location","search","get","myPastesElem","resolve","rowData","userData","userId","csrfToken","ownedByUser","parseInt","user_id","deleteElem","pasteCreatedAt","Date","created_at","toLocaleString","pasteVisibility","visibility","views","myFavesElem","recentUpdate","recently_updated","pasteFavedAt","favourited_at","readyState"],"mappings":"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"} \ No newline at end of file +{"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, \"&\")\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 ``\n ));\n\n /* First page button */\n if (showFirstPage) {\n this.element.appendChild(makeEl(\n ``\n ));\n this.element.appendChild(makeEl(``));\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 ``\n ));\n }\n\n /* Last page button */\n if (showLastPage) {\n this.element.appendChild(makeEl(``));\n this.element.appendChild(makeEl(\n ``\n ));\n }\n\n const nextButtonDisabled = currentPage === lastPage ? 'disabled' : ''\n /* Next button */\n this.element.appendChild(makeEl(\n ``\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 { 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 `\n ${escape(tagData.name)}\n `;\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 || 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 { $, $$, 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 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 imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();\n });\n }\n }\n\n Array.prototype.forEach.call($('.js-hidden'), (elem) => {\n toggleEl(elem);\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 table = new DataTable(myPastesElem, {\n ajaxCallback: (resolve) => {\n resolve({\n data: Array.prototype.map.call(myPastesElem.querySelectorAll('tbody > tr'), parsePasteInfo)\n });\n },\n rowCallback: (rowData) => {\n const userData = getUserInfo();\n const ownedByUser = (parseInt(rowData.user_id) === parseInt(userData.userId));\n\n const deleteElem = ownedByUser ? `\n
\n \n \n \n
\n ` : '';\n const pasteCreatedAt = new Date(rowData.created_at).toLocaleString();\n const pasteVisibility = ownedByUser ? `${rowData.visibility}` : '';\n\n return `\n ${escape(rowData.title)}\n ${pasteCreatedAt}\n ${pasteVisibility}\n ${rowData.views || 0}\n ${tagsToHtml(rowData.tags)}\n ${deleteElem}\n `;\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 resolve({\n data: Array.prototype.map.call(myFavesElem.querySelectorAll('tbody > tr'), parsePasteInfo)\n });\n },\n rowCallback: (rowData) => {\n const recentUpdate = rowData.recently_updated ?\n `` :\n ``;\n const pasteFavedAt = new Date(rowData.favourited_at).toLocaleString();\n\n // ${escape(rowData.author)}\n return `\n ${escape(rowData.title)}\n ${pasteFavedAt}\n ${recentUpdate}\n ${tagsToHtml(rowData.tags)}\n `;\n },\n filterCallback: dumbFilterCallback\n });\n faveTable.attach();\n});"],"names":["funcp","$","selector","document","querySelector","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","tagsToHtml","map","tagData","tagColorClass","slug","join","TagsInput","maxTags","inputNode","containerNode","style","display","parentNode","insertBefore","nextSibling","split","tag","addTag","_handleInputKeyUp","_handleContainerClick","clear","node","splice","disabled","tagValue","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","closest","globalSetup","signupButton","Array","prototype","forEach","call","querySelectorAll","href","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","random","parsePasteInfo","pasteInfo","JSON","parse","myParam","URLSearchParams","window","location","search","get","myPastesElem","resolve","rowData","userData","userId","csrfToken","ownedByUser","parseInt","user_id","deleteElem","pasteCreatedAt","Date","created_at","toLocaleString","pasteVisibility","visibility","views","myFavesElem","recentUpdate","recently_updated","pasteFavedAt","favourited_at","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/public/captcha.php b/public/captcha.php index 9dc2328..3e1b172 100644 --- a/public/captcha.php +++ b/public/captcha.php @@ -4,6 +4,17 @@ define('IN_PONEPASTE', 1); require_once(__DIR__ . '/../includes/common.php'); require_once(__DIR__ . '/../includes/captcha.php'); +if (empty($_GET['t'])) { + die('No token provided.'); +} + +$captcha_token = 'captcha/' . md5($_GET['t']); +$captcha_code = $redis->get($captcha_token); + +if (!$captcha_code) { + die('No token provided.'); +} + $captcha_config = captcha($captcha_config['colour'], $captcha_config['multiple'], $captcha_config['allowed']); // Pick random background, get info, and start captcha @@ -28,7 +39,7 @@ if (!file_exists($font)) { // Set the font size $font_size = rand($captcha_config['min_font_size'], $captcha_config['max_font_size']); -$text_box_size = imagettfbbox($font_size, $angle, $font, $captcha_config['code']); +$text_box_size = imagettfbbox($font_size, $angle, $font, $captcha_code); // Determine text position $box_width = (int) abs($text_box_size[6] - $text_box_size[2]); @@ -44,12 +55,12 @@ $text_pos_y = rand($text_pos_y_min, $text_pos_y_max); if ($captcha_config['shadow']) { $shadow_color = hex2rgb($captcha_config['shadow_color']); $shadow_color = imagecolorallocate($captcha, $shadow_color['r'], $shadow_color['g'], $shadow_color['b']); - imagettftext($captcha, $font_size, $angle, $text_pos_x + $captcha_config['shadow_offset_x'], $text_pos_y + $captcha_config['shadow_offset_y'], $shadow_color, $font, $captcha_config['code']); + imagettftext($captcha, $font_size, $angle, $text_pos_x + $captcha_config['shadow_offset_x'], $text_pos_y + $captcha_config['shadow_offset_y'], $shadow_color, $font, $captcha_code); } // Draw text -imagettftext($captcha, $font_size, $angle, $text_pos_x, $text_pos_y, $color, $font, $captcha_config['code']); +imagettftext($captcha, $font_size, $angle, $text_pos_x, $text_pos_y, $color, $font, $captcha_code); // Output image header("Content-type: image/png"); -imagepng($captcha); \ No newline at end of file +imagepng($captcha); diff --git a/public/index.php b/public/index.php index 61e45c8..ae93f4c 100644 --- a/public/index.php +++ b/public/index.php @@ -14,9 +14,8 @@ function verifyCaptcha() : string|bool { global $current_user; if ($captcha_config['enabled'] && !$current_user) { - $scode = strtolower(trim($_POST['scode'])); - $cap_code = strtolower($_SESSION['captcha']['code']); - if ($cap_code !== $scode) { + if (empty($_POST['captcha_answer']) || + !checkCaptcha($_POST['captcha_token'], strtolower(trim($_POST['captcha_answer'])))) { return 'Wrong CAPTCHA.'; } } diff --git a/public/theme/bulma/css/paste.css b/public/theme/bulma/css/paste.css index 087f97f..cc3b714 100644 --- a/public/theme/bulma/css/paste.css +++ b/public/theme/bulma/css/paste.css @@ -202,6 +202,13 @@ button.button--no-style { cursor: not-allowed; } +.paginator__button[aria-disabled="true"] { + display: inline-block; + pointer-events: none; + cursor: none; + color: #33333388; +} + .table_filterer { color: #fff; background: #3298dc; @@ -219,8 +226,9 @@ button.button--no-style { font-weight: 400; background: #fff; border: 1px solid #bdc4c9; - width: 80%; + width: 75%; box-shadow: inset 0 1px 0 #f1f0f1; + flex-grow: 4; } .rules h2 { @@ -232,4 +240,19 @@ button.button--no-style { .flash i { margin-right: 0.5rem; font-size: 1.25rem; -} \ No newline at end of file +} + +.captcha_container { + background-color: #f5f5f5; + border-radius: 4px; + position: relative; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; +} + +.captcha_container img { + border-radius: 4px; +} + +.captcha_container i { + color: black; +} diff --git a/theme/bulma/archive.php b/theme/bulma/archive.php index cdf5df8..678669d 100644 --- a/theme/bulma/archive.php +++ b/theme/bulma/archive.php @@ -65,20 +65,23 @@

This pastebin is private.

Pastes Archive

-
+
- Show  - -  per page -
- + + + + @@ -87,7 +90,13 @@ - + + + + + + + @@ -97,10 +106,12 @@
Title
title) ?>user->username) ?>tags) ?>
-
+ -
+
+ +
diff --git a/theme/bulma/common.php b/theme/bulma/common.php index 1de9d3c..5dc1eb2 100644 --- a/theme/bulma/common.php +++ b/theme/bulma/common.php @@ -116,7 +116,7 @@ $flashes = getFlashes(); Events - Sign In + Sign In / Up @@ -210,12 +210,15 @@ $flashes = getFlashes();
-
- CAPTCHA - -

and press - "Enter"

+
+ CAPTCHA Image + + + + + + +

and press "Enter"

@@ -316,7 +319,7 @@ $flashes = getFlashes(); - - \ No newline at end of file diff --git a/theme/bulma/login.php b/theme/bulma/login.php index a950e22..7e7c538 100644 --- a/theme/bulma/login.php +++ b/theme/bulma/login.php @@ -161,20 +161,19 @@ - -
-
-

Where to?

- Login
- Register
- Forgot Password
-
-
-
-
-
-
+
+
+

Where to?

+ Login
+ Register
+ Forgot Password
+
+
+
+
+
+
diff --git a/theme/bulma/main.php b/theme/bulma/main.php index 4ca2936..6f768b7 100644 --- a/theme/bulma/main.php +++ b/theme/bulma/main.php @@ -295,12 +295,15 @@
-
- CAPTCHA - -

and press - "Enter"

+
+ CAPTCHA Image + + + + + + +

and press "Enter"