diff --git a/admin/ajax_pastes.php b/admin/ajax_pastes.php
deleted file mode 100644
index 1de5207..0000000
--- a/admin/ajax_pastes.php
+++ /dev/null
@@ -1,53 +0,0 @@
- 'id', 'dt' => 0),
- array('db' => 'member', 'dt' => 1),
- array('db' => 'ip', 'dt' => 2),
- array('db' => 'visible', 'dt' => 3)
-);
-
-$columns2 = array(
- array('db' => 'id', 'dt' => 0),
- array('db' => 'member', 'dt' => 1),
- array('db' => 'ip', 'dt' => 2),
- array('db' => 'visible', 'dt' => 3),
- array('db' => 'details', 'dt' => 4),
- array('db' => 'view', 'dt' => 5),
- array('db' => 'delete', 'dt' => 6)
-);
-
-
-// SQL server connection information
-$sql_details = array(
- 'user' => $db_user,
- 'pass' => $db_pass,
- 'db' => $db_schema,
- 'host' => $db_host
-);
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * If you just want to use the basic configuration for DataTables with PHP
- * server-side, there is no need to edit below this line.
- */
-
-require('ssp.pastes.php');
-
-echo json_encode(
- SSP::simple($_GET, $sql_details, $table, $primaryKey, $columns, $columns2)
-);
diff --git a/admin/common.php b/admin/common.php
index 9b08540..11c12ef 100644
--- a/admin/common.php
+++ b/admin/common.php
@@ -8,7 +8,7 @@ require_once('../includes/common.php');
use PonePaste\Models\AdminLog;
use PonePaste\Models\User;
-function updateAdminHistory(User $admin, int $action) {
+function updateAdminHistory(User $admin, int $action) : void {
$log = new AdminLog([
'user_id' => $admin->id,
'action' => $action,
diff --git a/admin/configuration.php b/admin/configuration.php
index 1885aea..2b0d8e0 100644
--- a/admin/configuration.php
+++ b/admin/configuration.php
@@ -7,7 +7,7 @@ require_once('common.php');
const CONFIG_FILE_PATH = '../config/site.php';
-function updateConfiguration(string $path, array $new_config) {
+function updateConfiguration(string $path, array $new_config) : void {
$fp = fopen($path, 'w');
$new_config_text = var_export($new_config, true);
diff --git a/admin/index.php b/admin/index.php
index 5a4284f..426f726 100644
--- a/admin/index.php
+++ b/admin/index.php
@@ -5,7 +5,7 @@ require_once(__DIR__ . '/../includes/common.php');
use PonePaste\Models\User;
use PonePaste\Models\AdminLog;
-function updateAdminHistory(User $admin, int $action) {
+function updateAdminHistory(User $admin, int $action) : void {
$log = new AdminLog([
'user_id' => $admin->id,
'action' => $action,
diff --git a/composer.lock b/composer.lock
index 7199b85..0d7d67f 100644
--- a/composer.lock
+++ b/composer.lock
@@ -7,29 +7,84 @@
"content-hash": "bc050acf9c5c5997281c5c3a6f33c811",
"packages": [
{
- "name": "doctrine/inflector",
- "version": "2.0.4",
+ "name": "brick/math",
+ "version": "0.11.0",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/inflector.git",
- "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
+ "url": "https://github.com/brick/math.git",
+ "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
- "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
+ "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478",
+ "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpunit/phpunit": "^9.0",
+ "vimeo/psalm": "5.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "brick",
+ "math"
+ ],
+ "support": {
+ "issues": "https://github.com/brick/math/issues",
+ "source": "https://github.com/brick/math/tree/0.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/BenMorel",
+ "type": "github"
+ }
+ ],
+ "time": "2023-01-15T23:15:59+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
+ "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
- "doctrine/coding-standard": "^8.2",
- "phpstan/phpstan": "^0.12",
- "phpstan/phpstan-phpunit": "^0.12",
- "phpstan/phpstan-strict-rules": "^0.12",
- "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
- "vimeo/psalm": "^4.10"
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.3",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "vimeo/psalm": "^4.25"
},
"type": "library",
"autoload": {
@@ -79,7 +134,7 @@
],
"support": {
"issues": "https://github.com/doctrine/inflector/issues",
- "source": "https://github.com/doctrine/inflector/tree/2.0.4"
+ "source": "https://github.com/doctrine/inflector/tree/2.0.6"
},
"funding": [
{
@@ -95,7 +150,7 @@
"type": "tidelift"
}
],
- "time": "2021-10-22T20:16:43+00:00"
+ "time": "2022-10-20T09:10:12+00:00"
},
{
"name": "erusev/parsedown",
@@ -149,16 +204,16 @@
},
{
"name": "illuminate/collections",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
- "reference": "22c4bb17f4e6c6fb470b5957e8232b1b5baf76b0"
+ "reference": "0168d0e44ea0c4fe5451fe08cde7049b9e9f9741"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/collections/zipball/22c4bb17f4e6c6fb470b5957e8232b1b5baf76b0",
- "reference": "22c4bb17f4e6c6fb470b5957e8232b1b5baf76b0",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/0168d0e44ea0c4fe5451fe08cde7049b9e9f9741",
+ "reference": "0168d0e44ea0c4fe5451fe08cde7049b9e9f9741",
"shasum": ""
},
"require": {
@@ -200,20 +255,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-03-07T15:02:25+00:00"
+ "time": "2023-02-22T11:32:27+00:00"
},
{
"name": "illuminate/conditionable",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/conditionable.git",
- "reference": "56b4ba1166c264064bf63896f498a2bee320d16a"
+ "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/conditionable/zipball/56b4ba1166c264064bf63896f498a2bee320d16a",
- "reference": "56b4ba1166c264064bf63896f498a2bee320d16a",
+ "url": "https://api.github.com/repos/illuminate/conditionable/zipball/bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364",
+ "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364",
"shasum": ""
},
"require": {
@@ -246,20 +301,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-02-28T16:37:46+00:00"
+ "time": "2023-02-01T21:42:32+00:00"
},
{
"name": "illuminate/container",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
- "reference": "66f9049b19fb34e74134c6eeff92a442cee068e5"
+ "reference": "1641dda2d0750b68bb1264a3b37ff3973f2e6265"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/container/zipball/66f9049b19fb34e74134c6eeff92a442cee068e5",
- "reference": "66f9049b19fb34e74134c6eeff92a442cee068e5",
+ "url": "https://api.github.com/repos/illuminate/container/zipball/1641dda2d0750b68bb1264a3b37ff3973f2e6265",
+ "reference": "1641dda2d0750b68bb1264a3b37ff3973f2e6265",
"shasum": ""
},
"require": {
@@ -297,20 +352,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-03-03T14:08:19+00:00"
+ "time": "2023-01-24T16:54:18+00:00"
},
{
"name": "illuminate/contracts",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
- "reference": "ce68106c575410c71f92ac1c91c5d95c561033bc"
+ "reference": "44f65d723b13823baa02ff69751a5948bde60c22"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/contracts/zipball/ce68106c575410c71f92ac1c91c5d95c561033bc",
- "reference": "ce68106c575410c71f92ac1c91c5d95c561033bc",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/44f65d723b13823baa02ff69751a5948bde60c22",
+ "reference": "44f65d723b13823baa02ff69751a5948bde60c22",
"shasum": ""
},
"require": {
@@ -345,35 +400,37 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-03-04T18:18:32+00:00"
+ "time": "2023-02-08T14:36:30+00:00"
},
{
"name": "illuminate/database",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/database.git",
- "reference": "0fffd6ba91eb58330cbf7331c77ea38c2a16b5d9"
+ "reference": "fc7e9cf5d4c7c4c0a2800c0d345cc9985fb1b040"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/database/zipball/0fffd6ba91eb58330cbf7331c77ea38c2a16b5d9",
- "reference": "0fffd6ba91eb58330cbf7331c77ea38c2a16b5d9",
+ "url": "https://api.github.com/repos/illuminate/database/zipball/fc7e9cf5d4c7c4c0a2800c0d345cc9985fb1b040",
+ "reference": "fc7e9cf5d4c7c4c0a2800c0d345cc9985fb1b040",
"shasum": ""
},
"require": {
- "ext-json": "*",
+ "brick/math": "^0.9.3|^0.10.2|^0.11",
+ "ext-pdo": "*",
"illuminate/collections": "^9.0",
"illuminate/container": "^9.0",
"illuminate/contracts": "^9.0",
"illuminate/macroable": "^9.0",
"illuminate/support": "^9.0",
"php": "^8.0.2",
- "symfony/console": "^6.0"
+ "symfony/console": "^6.0.9"
},
"suggest": {
"doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).",
- "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "ext-filter": "Required to use the Postgres database driver.",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.21).",
"illuminate/console": "Required to use the database commands (^9.0).",
"illuminate/events": "Required to use the observers with Eloquent (^9.0).",
"illuminate/filesystem": "Required to use the migrations (^9.0).",
@@ -413,20 +470,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-03-07T01:28:38+00:00"
+ "time": "2023-02-12T20:16:50+00:00"
},
{
"name": "illuminate/macroable",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
- "reference": "25a2c6dac2b7541ecbadef952702e84ae15f5354"
+ "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/macroable/zipball/25a2c6dac2b7541ecbadef952702e84ae15f5354",
- "reference": "25a2c6dac2b7541ecbadef952702e84ae15f5354",
+ "url": "https://api.github.com/repos/illuminate/macroable/zipball/e3bfaf6401742a9c6abca61b9b10e998e5b6449a",
+ "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a",
"shasum": ""
},
"require": {
@@ -459,31 +516,32 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-02-01T14:44:21+00:00"
+ "time": "2022-08-09T13:29:29+00:00"
},
{
"name": "illuminate/support",
- "version": "v9.4.1",
+ "version": "v9.52.4",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
- "reference": "568ed7a21a75e0bd9ca641b6c4a626872ee26d6f"
+ "reference": "63dcb4523ccdfc01cdf5be17791f07cc20982a1e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/support/zipball/568ed7a21a75e0bd9ca641b6c4a626872ee26d6f",
- "reference": "568ed7a21a75e0bd9ca641b6c4a626872ee26d6f",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/63dcb4523ccdfc01cdf5be17791f07cc20982a1e",
+ "reference": "63dcb4523ccdfc01cdf5be17791f07cc20982a1e",
"shasum": ""
},
"require": {
"doctrine/inflector": "^2.0",
- "ext-json": "*",
+ "ext-ctype": "*",
+ "ext-filter": "*",
"ext-mbstring": "*",
"illuminate/collections": "^9.0",
"illuminate/conditionable": "^9.0",
"illuminate/contracts": "^9.0",
"illuminate/macroable": "^9.0",
- "nesbot/carbon": "^2.53.1",
+ "nesbot/carbon": "^2.62.1",
"php": "^8.0.2",
"voku/portable-ascii": "^2.0"
},
@@ -493,8 +551,9 @@
"suggest": {
"illuminate/filesystem": "Required to use the composer class (^9.0).",
"league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).",
- "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).",
+ "ramsey/uuid": "Required to use Str::uuid() (^4.7).",
"symfony/process": "Required to use the composer class (^6.0).",
+ "symfony/uid": "Required to use Str::ulid() (^6.0).",
"symfony/var-dumper": "Required to use the dd function (^6.0).",
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)."
},
@@ -528,20 +587,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-03-08T14:39:38+00:00"
+ "time": "2023-02-13T16:54:43+00:00"
},
{
"name": "nesbot/carbon",
- "version": "2.57.0",
+ "version": "2.66.0",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "4a54375c21eea4811dbd1149fe6b246517554e78"
+ "reference": "496712849902241f04902033b0441b269effe001"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a54375c21eea4811dbd1149fe6b246517554e78",
- "reference": "4a54375c21eea4811dbd1149fe6b246517554e78",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001",
+ "reference": "496712849902241f04902033b0441b269effe001",
"shasum": ""
},
"require": {
@@ -552,14 +611,16 @@
"symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
},
"require-dev": {
- "doctrine/dbal": "^2.0 || ^3.0",
+ "doctrine/dbal": "^2.0 || ^3.1.4",
"doctrine/orm": "^2.7",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
+ "ondrejmirtes/better-reflection": "*",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^0.12.54 || ^1.0",
- "phpunit/phpunit": "^7.5.20 || ^8.5.14",
+ "phpstan/phpstan": "^0.12.99 || ^1.7.14",
+ "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
"squizlabs/php_codesniffer": "^3.4"
},
"bin": [
@@ -616,15 +677,19 @@
},
"funding": [
{
- "url": "https://opencollective.com/Carbon",
- "type": "open_collective"
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
},
{
- "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
"type": "tidelift"
}
],
- "time": "2022-02-13T18:13:33+00:00"
+ "time": "2023-01-29T18:53:47+00:00"
},
{
"name": "psr/container",
@@ -810,20 +875,21 @@
},
{
"name": "symfony/console",
- "version": "v6.0.5",
+ "version": "v6.2.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "3bebf4108b9e07492a2a4057d207aa5a77d146b1"
+ "reference": "3e294254f2191762c1d137aed4b94e966965e985"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/3bebf4108b9e07492a2a4057d207aa5a77d146b1",
- "reference": "3bebf4108b9e07492a2a4057d207aa5a77d146b1",
+ "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985",
+ "reference": "3e294254f2191762c1d137aed4b94e966965e985",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/string": "^5.4|^6.0"
@@ -885,7 +951,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.0.5"
+ "source": "https://github.com/symfony/console/tree/v6.2.5"
},
"funding": [
{
@@ -901,20 +967,87 @@
"type": "tidelift"
}
],
- "time": "2022-02-25T10:48:52+00:00"
+ "time": "2023-01-01T08:38:09+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.25.0",
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.2.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+ "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-25T10:21:52+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
"shasum": ""
},
"require": {
@@ -929,7 +1062,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -967,7 +1100,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
},
"funding": [
{
@@ -983,20 +1116,20 @@
"type": "tidelift"
}
],
- "time": "2021-10-20T20:35:02+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.25.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "81b86b50cf841a64252b439e738e97f4a34e2783"
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783",
- "reference": "81b86b50cf841a64252b439e738e97f4a34e2783",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
"shasum": ""
},
"require": {
@@ -1008,7 +1141,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1048,7 +1181,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
},
"funding": [
{
@@ -1064,20 +1197,20 @@
"type": "tidelift"
}
],
- "time": "2021-11-23T21:10:46+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.25.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"shasum": ""
},
"require": {
@@ -1089,7 +1222,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1132,7 +1265,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
},
"funding": [
{
@@ -1148,20 +1281,20 @@
"type": "tidelift"
}
],
- "time": "2021-02-19T12:13:01+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.25.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825",
- "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": ""
},
"require": {
@@ -1176,7 +1309,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1215,7 +1348,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@@ -1231,20 +1364,20 @@
"type": "tidelift"
}
],
- "time": "2021-11-30T18:21:41+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.25.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
- "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"shasum": ""
},
"require": {
@@ -1253,7 +1386,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1298,7 +1431,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
},
"funding": [
{
@@ -1314,24 +1447,24 @@
"type": "tidelift"
}
],
- "time": "2022-03-04T08:16:47+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.0.0",
+ "version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603"
+ "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/36715ebf9fb9db73db0cb24263c79077c6fe8603",
- "reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75",
+ "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
"psr/container": "^2.0"
},
"conflict": {
@@ -1343,7 +1476,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "3.3-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -1353,7 +1486,10 @@
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Service\\": ""
- }
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1380,7 +1516,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.0.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.2.0"
},
"funding": [
{
@@ -1396,24 +1532,24 @@
"type": "tidelift"
}
],
- "time": "2021-11-04T17:53:12+00:00"
+ "time": "2022-11-25T10:21:52+00:00"
},
{
"name": "symfony/string",
- "version": "v6.0.3",
+ "version": "v6.2.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2"
+ "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2",
- "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2",
+ "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0",
+ "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
@@ -1425,6 +1561,7 @@
"require-dev": {
"symfony/error-handler": "^5.4|^6.0",
"symfony/http-client": "^5.4|^6.0",
+ "symfony/intl": "^6.2",
"symfony/translation-contracts": "^2.0|^3.0",
"symfony/var-exporter": "^5.4|^6.0"
},
@@ -1465,7 +1602,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.0.3"
+ "source": "https://github.com/symfony/string/tree/v6.2.5"
},
"funding": [
{
@@ -1481,24 +1618,24 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2023-01-01T08:38:09+00:00"
},
{
"name": "symfony/translation",
- "version": "v6.0.6",
+ "version": "v6.2.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "f6639cb9b5e0c57fe31e3263b900a77eedb0c908"
+ "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/f6639cb9b5e0c57fe31e3263b900a77eedb0c908",
- "reference": "f6639cb9b5e0c57fe31e3263b900a77eedb0c908",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/60556925a703cfbc1581cde3b3f35b0bb0ea904c",
+ "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
"symfony/polyfill-mbstring": "~1.0",
"symfony/translation-contracts": "^2.3|^3.0"
},
@@ -1514,6 +1651,7 @@
"symfony/translation-implementation": "2.3|3.0"
},
"require-dev": {
+ "nikic/php-parser": "^4.13",
"psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0",
"symfony/console": "^5.4|^6.0",
@@ -1523,10 +1661,12 @@
"symfony/http-kernel": "^5.4|^6.0",
"symfony/intl": "^5.4|^6.0",
"symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^5.4|^6.0",
"symfony/service-contracts": "^1.1.2|^2|^3",
"symfony/yaml": "^5.4|^6.0"
},
"suggest": {
+ "nikic/php-parser": "To use PhpAstExtractor",
"psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
@@ -1560,7 +1700,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v6.0.6"
+ "source": "https://github.com/symfony/translation/tree/v6.2.5"
},
"funding": [
{
@@ -1576,24 +1716,24 @@
"type": "tidelift"
}
],
- "time": "2022-03-02T12:58:14+00:00"
+ "time": "2023-01-05T07:00:27+00:00"
},
{
"name": "symfony/translation-contracts",
- "version": "v3.0.0",
+ "version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77"
+ "reference": "68cce71402305a015f8c1589bfada1280dc64fe7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1b6ea5a7442af5a12dba3dbd6d71034b5b234e77",
- "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7",
+ "reference": "68cce71402305a015f8c1589bfada1280dc64fe7",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "php": ">=8.1"
},
"suggest": {
"symfony/translation-implementation": ""
@@ -1601,7 +1741,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "3.3-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -1611,7 +1751,10 @@
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Translation\\": ""
- }
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1638,7 +1781,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/translation-contracts/tree/v3.0.0"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0"
},
"funding": [
{
@@ -1654,7 +1797,7 @@
"type": "tidelift"
}
],
- "time": "2021-09-07T12:43:40+00:00"
+ "time": "2022-11-25T10:21:52+00:00"
},
{
"name": "voku/portable-ascii",
@@ -1745,5 +1888,5 @@
"ext-redis": "*"
},
"platform-dev": [],
- "plugin-api-version": "2.2.0"
+ "plugin-api-version": "2.3.0"
}
diff --git a/includes/Helpers/AbilityHelper.php b/includes/Helpers/AbilityHelper.php
index 83d2595..97caf25 100644
--- a/includes/Helpers/AbilityHelper.php
+++ b/includes/Helpers/AbilityHelper.php
@@ -32,4 +32,4 @@ class AbilityHelper {
return false;
}
-}
\ No newline at end of file
+}
diff --git a/includes/Helpers/SessionHelper.php b/includes/Helpers/SessionHelper.php
index a13970f..b1b3e99 100644
--- a/includes/Helpers/SessionHelper.php
+++ b/includes/Helpers/SessionHelper.php
@@ -25,7 +25,7 @@ class SessionHelper {
return null;
}
- public static function destroySession() {
+ public static function destroySession() : void {
$token = $_COOKIE[SessionHelper::REMEMBER_TOKEN_COOKIE];
UserSession::where('token', $token)->delete();
diff --git a/includes/Models/Badge.php b/includes/Models/Badge.php
new file mode 100644
index 0000000..0491d7e
--- /dev/null
+++ b/includes/Models/Badge.php
@@ -0,0 +1,13 @@
+hasMany(Paste::class)
->whereRaw("((expiry IS NULL) OR ((expiry != 'SELF') AND (expiry > NOW())))");
}
+
+ public function badges() {
+ return $this->hasMany(Badge::class);
+ }
}
diff --git a/includes/captcha.php b/includes/captcha.php
index c44ccfa..5b35dbc 100644
--- a/includes/captcha.php
+++ b/includes/captcha.php
@@ -1,5 +1,5 @@
setex('captcha/' . md5($token), 600, $code);
diff --git a/includes/common.php b/includes/common.php
index 353e3cd..3656d39 100644
--- a/includes/common.php
+++ b/includes/common.php
@@ -6,6 +6,7 @@ require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/config.php');
require_once(__DIR__ . '/functions.php');
require_once(__DIR__ . '/passwords.php');
+require_once(__DIR__ . '/captcha.php');
use Illuminate\Database\Capsule\Manager as Capsule;
use PonePaste\Helpers\SessionHelper;
@@ -18,10 +19,10 @@ use PonePaste\Helpers\AbilityHelper;
/* View functions */
function javascriptIncludeTag(string $name) : string {
if (PP_DEBUG) {
- return "";
+ return "";
}
- return "";
+ return "";
}
function urlForPage($page = '') : string {
@@ -76,7 +77,7 @@ function optionsForSelect(array $displays, array $values, string $currentSelecti
/**
* @throws Exception if the flash level is invalid
*/
-function flash(string $level, string $message) {
+function flash(string $level, string $message) : void {
if (!isset($_SESSION['flashes'])) {
$_SESSION['flashes'] = [
'success' => [],
@@ -93,15 +94,15 @@ function flash(string $level, string $message) {
}
-function flashError(string $message) {
+function flashError(string $message) : void {
flash('error', $message);
}
-function flashWarning(string $message) {
+function flashWarning(string $message) : void {
flash('warning', $message);
}
-function flashSuccess(string $message) {
+function flashSuccess(string $message) : void {
flash('success', $message);
}
@@ -117,8 +118,8 @@ function getFlashes() {
return $flashes;
}
-function outputFlashes($flashes) {
- function __outputFlash($level, $flash) {
+function outputFlashes($flashes) : void {
+ function __outputFlash($level, $flash) : void {
echo '
'
. pp_html_escape($flash) .
diff --git a/includes/functions.php b/includes/functions.php
index 4919f37..6c2d848 100644
--- a/includes/functions.php
+++ b/includes/functions.php
@@ -56,7 +56,7 @@ function tagsToHtmlUser(string | array | Collection $tags, $profile_username) :
return $output;
}
-function linkify($value, $protocols = array('http', 'mail'), array $attributes = array()) {
+function linkify($value, $protocols = array('http', 'mail'), array $attributes = array()) : array|string|null {
// Link attributes
$attr = '';
foreach ($attributes as $key => $val) {
@@ -90,7 +90,7 @@ function linkify($value, $protocols = array('http', 'mail'), array $attributes =
}, $value);
}
-function formatBytes($size, $precision = 2) {
+function formatBytes($size, $precision = 2) : string {
$base = log($size, 1024);
$suffixes = ['B', 'KB', 'MB', 'GB', 'TB'];
@@ -118,7 +118,7 @@ function friendlyDateDifference(DateTime $lesser, DateTime $greater) : string {
foreach ($parts as $part => $value) {
if ($value !== 0) {
$pluralizer = ($value === 1 ? '' : 's');
- $friendly .= "${value} ${part}${pluralizer} ";
+ $friendly .= "{$value} {$part}{$pluralizer} ";
}
}
@@ -148,7 +148,7 @@ function truncate(string $input, int $maxWords, int $maxChars) : string {
return $result . ($input == $result ? '' : '[...]');
}
-function embedView($paste_id, $p_title, $content, $title) {
+function embedView($paste_id, $p_title, $content, $title) : bool {
$stats = false;
if ($content) {
// Build the output
@@ -216,7 +216,7 @@ function embedView($paste_id, $p_title, $content, $title) {
return $stats;
}
-function addToSitemap(Paste $paste, $priority, $changefreq) {
+function addToSitemap(Paste $paste, $priority, $changefreq) : void {
$c_date = date('Y-m-d');
$site_data = file_get_contents("sitemap.xml");
$site_data = str_replace("", "", $site_data);
diff --git a/js/main.js b/js/main.js
index 5b5ba9a..b90a407 100644
--- a/js/main.js
+++ b/js/main.js
@@ -80,6 +80,7 @@ const globalSetup = () => {
main.id = '';
}
+ // CAPTCHA refresh
const captchaContainer = $('.captcha_container');
if (captchaContainer) {
@@ -88,14 +89,27 @@ const globalSetup = () => {
if (refreshElement && imageElement) {
refreshElement.addEventListener('click', () => {
- imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();
+ let src = imageElement.src;
+
+ if (src.indexOf('&refresh') !== -1) {
+ // yeah, it's kinda cancerous. fuck off.
+ src = src.split('&rand=')[0];
+ } else {
+ src += '&refresh';
+ }
+
+ imageElement.src = src + '&rand=' + Math.random();
});
}
}
- Array.prototype.forEach.call($('.js-hidden'), (elem) => {
- toggleEl(elem);
- });
+ const hiddenElements = $$('.js-hidden');
+
+ if (hiddenElements) {
+ Array.prototype.forEach.call(hiddenElements, (elem) => {
+ toggleEl(elem);
+ });
+ }
}
export { globalSetup };
\ No newline at end of file
diff --git a/public/assets/bundle/archive.js b/public/assets/bundle/archive.js
index a27acd1..e10b9d1 100644
--- a/public/assets/bundle/archive.js
+++ b/public/assets/bundle/archive.js
@@ -488,6 +488,7 @@ const globalSetup = () => {
main.id = '';
}
+ // CAPTCHA refresh
const captchaContainer = $('.captcha_container');
if (captchaContainer) {
@@ -496,14 +497,27 @@ const globalSetup = () => {
if (refreshElement && imageElement) {
refreshElement.addEventListener('click', () => {
- imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();
+ let src = imageElement.src;
+
+ if (src.indexOf('&refresh') !== -1) {
+ // yeah, it's kinda cancerous. fuck off.
+ src = src.split('&rand=')[0];
+ } else {
+ src += '&refresh';
+ }
+
+ imageElement.src = src + '&rand=' + Math.random();
});
}
}
- Array.prototype.forEach.call($('.js-hidden'), (elem) => {
- toggleEl(elem);
- });
+ const hiddenElements = $$('.js-hidden');
+
+ if (hiddenElements) {
+ Array.prototype.forEach.call(hiddenElements, (elem) => {
+ toggleEl(elem);
+ });
+ }
};
whenReady(() => {
diff --git a/public/assets/bundle/archive.min.js b/public/assets/bundle/archive.min.js
index ca012d0..0ff2c44 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,"'")},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;i
n[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);
+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,"'")},f=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){u(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(d(''))),s&&(this.element.appendChild(d('"))),this.element.appendChild(d('…')));for(var c=i;c<=r;c++){var h=c===a?"paginator__button--selected":"";this.element.appendChild(d('")))}o&&(this.element.appendChild(d('…')),this.element.appendChild(d('"))));var p=a===n?"disabled":"";this.element.appendChild(d('')))}}}]),t}(),g=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 f(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");u(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=d(''),this.inputNode=d(''),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'+p(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;Array.prototype.forEach.call(c(".js-tag-input"),(function(t){new m(t).attach()})),(t=l('[data-target~="#signin"],[data-target~="#signup"]'))&&(t.href="javascript:void(0)",t.addEventListener("click",(function(){l(".modal").classList.add("is-active")})),l(".modal-button-close").addEventListener("click",(function(){l(".modal").classList.remove("is-active")})));var e=l(".panel-tools .embed-tool");e&&e.addEventListener("click",(function(t){t.target&&t.target.closest(".panel-tools")&&h(t.target.closest(".panel-tools").querySelector(".panel-embed"))}));var a=l(".expand-tool");a&&a.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 n=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);n.length>0&&n.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 i=l(".preloader"),r=l("main");i&&r&&(i.remove(),r.id="");var s=l(".captcha_container");if(s){var o=s.querySelector("a"),d=s.querySelector("img");o&&d&&o.addEventListener("click",(function(){var t=d.src;-1!==t.indexOf("&refresh")?t=t.split("&rand=")[0]:t+="&refresh",d.src=t+"&rand="+Math.random()}))}var u=c(".js-hidden");u&&Array.prototype.forEach.call(u,(function(t){h(t)}))};o=function(){y();var t=new URLSearchParams(window.location.search).get("q");new g(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(p(t.title),' | \n ').concat(p(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(p(t.name),"\n ")})).join("")," | \n
")},filterCallback:v,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 65bfa62..39f8873 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.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
+{"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 // CAPTCHA refresh\n const captchaContainer = $('.captcha_container');\n\n if (captchaContainer) {\n const refreshElement = captchaContainer.querySelector('a');\n const imageElement = captchaContainer.querySelector('img');\n\n if (refreshElement && imageElement) {\n refreshElement.addEventListener('click', () => {\n let src = imageElement.src;\n\n if (src.indexOf('&refresh') !== -1) {\n // yeah, it's kinda cancerous. fuck off.\n src = src.split('&rand=')[0];\n } else {\n src += '&refresh';\n }\n\n imageElement.src = src + '&rand=' + Math.random();\n });\n }\n }\n\n const hiddenElements = $$('.js-hidden');\n\n if (hiddenElements) {\n Array.prototype.forEach.call(hiddenElements, (elem) => {\n toggleEl(elem);\n });\n }\n}\n\nexport { globalSetup };","import { escape, whenReady } from './dom';\nimport { DataTable, dumbFilterCallback } from './data_tables';\nimport { tagsToHtml } from \"./utils\";\nimport { globalSetup } from './main';\n\nwhenReady(() => {\n globalSetup();\n\n const urlParams = new URLSearchParams(window.location.search);\n const myParam = urlParams.get('q');\n const apiUrl = /* myParam !== null ? '/api/ajax_pastes.php?q=' + myParam : */ '/api/ajax_pastes.php';\n\n const table = new DataTable(document.getElementById('archive'), {\n ajaxCallback: (resolve) => {\n fetch(apiUrl)\n .then(r => r.json())\n .then(resolve);\n },\n rowCallback: (rowData) => {\n return `\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","$$","querySelectorAll","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","toggleEl","classList","contains","remove","add","escape","unsafe","replace","SimplePaginator","element","pageCallback","addEventListener","evt","target","dataset","page","totalRecords","perPage","currentPage","this","lastPage","Math","floor","firstPageShow","lastPageShow","showFirstPage","abs","showLastPage","prevButtonDisabled","appendChild","i","selected","nextButtonDisabled","DataTable","options","container","parentElement","ajaxCallback","data","unfilteredData","paginator","filterCallback","sortField","sortDir","filterField","_this","_updateFilter","value","preFilter","perPageField","Number","_updatePage","header","elem","_updateSort","attach","bind","_loadEntries","Promise","then","_this2","length","bodyElement","firstIndex","lastIndex","rowElem","rowCallback","update","n","_updateEntries","query","datum","push","field","direction","newEntries","_toConsumableArray","sort","a","b","sorter","dumbFilterCallback","title","indexOf","tags","name","toLowerCase","TagsInput","maxTags","inputNode","containerNode","style","display","parentNode","insertBefore","nextSibling","split","tag","addTag","_handleInputKeyUp","_handleContainerClick","clear","join","node","splice","disabled","tagValue","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","closest","globalSetup","signupButton","Array","prototype","forEach","call","href","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","random","hiddenElements","myParam","URLSearchParams","window","location","search","get","resolve","fetch","r","json","rowData","author","map","tagData","tagColorClass","slug","readyState"],"mappings":"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"}
\ No newline at end of file
diff --git a/public/assets/bundle/generic.js b/public/assets/bundle/generic.js
index 787d3d1..0faeba8 100644
--- a/public/assets/bundle/generic.js
+++ b/public/assets/bundle/generic.js
@@ -219,6 +219,7 @@ const globalSetup = () => {
main.id = '';
}
+ // CAPTCHA refresh
const captchaContainer = $('.captcha_container');
if (captchaContainer) {
@@ -227,14 +228,27 @@ const globalSetup = () => {
if (refreshElement && imageElement) {
refreshElement.addEventListener('click', () => {
- imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();
+ let src = imageElement.src;
+
+ if (src.indexOf('&refresh') !== -1) {
+ // yeah, it's kinda cancerous. fuck off.
+ src = src.split('&rand=')[0];
+ } else {
+ src += '&refresh';
+ }
+
+ imageElement.src = src + '&rand=' + Math.random();
});
}
}
- Array.prototype.forEach.call($('.js-hidden'), (elem) => {
- toggleEl(elem);
- });
+ const hiddenElements = $$('.js-hidden');
+
+ if (hiddenElements) {
+ Array.prototype.forEach.call(hiddenElements, (elem) => {
+ toggleEl(elem);
+ });
+ }
};
whenReady(globalSetup);
diff --git a/public/assets/bundle/generic.min.js b/public/assets/bundle/generic.min.js
index d40b6c4..ed5c8ee 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,"'")},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);
+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,"'")},d=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,o;return i=t,(r=[{key:"attach",value:function(){if(this.element.style.display="none",this.containerNode=s(''),this.inputNode=s(''),this.containerNode.appendChild(this.inputNode),this.element.parentNode.insertBefore(this.containerNode,this.element.nextSibling),this.element.value){var 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'+c(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),o&&a(i,o),t}();i=function(){var e;Array.prototype.forEach.call(o(".js-tag-input"),(function(e){new d(e).attach()})),(e=r('[data-target~="#signin"],[data-target~="#signup"]'))&&(e.href="javascript:void(0)",e.addEventListener("click",(function(){r(".modal").classList.add("is-active")})),r(".modal-button-close").addEventListener("click",(function(){r(".modal").classList.remove("is-active")})));var t=r(".panel-tools .embed-tool");t&&t.addEventListener("click",(function(e){e.target&&e.target.closest(".panel-tools")&&l(e.target.closest(".panel-tools").querySelector(".panel-embed"))}));var n=r(".expand-tool");n&&n.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 a=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);a.length>0&&a.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 i=r(".preloader"),s=r("main");i&&s&&(i.remove(),s.id="");var c=r(".captcha_container");if(c){var u=c.querySelector("a"),h=c.querySelector("img");u&&h&&u.addEventListener("click",(function(){var e=h.src;-1!==e.indexOf("&refresh")?e=e.split("&rand=")[0]:e+="&refresh",h.src=e+"&rand="+Math.random()}))}var p=o(".js-hidden");p&&Array.prototype.forEach.call(p,(function(e){l(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 7e400e1..3be1295 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.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
+{"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 // CAPTCHA refresh\n const captchaContainer = $('.captcha_container');\n\n if (captchaContainer) {\n const refreshElement = captchaContainer.querySelector('a');\n const imageElement = captchaContainer.querySelector('img');\n\n if (refreshElement && imageElement) {\n refreshElement.addEventListener('click', () => {\n let src = imageElement.src;\n\n if (src.indexOf('&refresh') !== -1) {\n // yeah, it's kinda cancerous. fuck off.\n src = src.split('&rand=')[0];\n } else {\n src += '&refresh';\n }\n\n imageElement.src = src + '&rand=' + Math.random();\n });\n }\n }\n\n const hiddenElements = $$('.js-hidden');\n\n if (hiddenElements) {\n Array.prototype.forEach.call(hiddenElements, (elem) => {\n toggleEl(elem);\n });\n }\n}\n\nexport { globalSetup };"],"names":["funcp","$","selector","document","querySelector","$$","querySelectorAll","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","attach","href","embedButton","expandButton","panel","$delete","$notification","removeChild","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","Math","random","hiddenElements","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 1582d2a..4321ac7 100644
--- a/public/assets/bundle/user_profile.js
+++ b/public/assets/bundle/user_profile.js
@@ -488,6 +488,7 @@ const globalSetup = () => {
main.id = '';
}
+ // CAPTCHA refresh
const captchaContainer = $('.captcha_container');
if (captchaContainer) {
@@ -496,14 +497,27 @@ const globalSetup = () => {
if (refreshElement && imageElement) {
refreshElement.addEventListener('click', () => {
- imageElement.src = imageElement.src.split('?')[0] + '?rand=' + Math.random();
+ let src = imageElement.src;
+
+ if (src.indexOf('&refresh') !== -1) {
+ // yeah, it's kinda cancerous. fuck off.
+ src = src.split('&rand=')[0];
+ } else {
+ src += '&refresh';
+ }
+
+ imageElement.src = src + '&rand=' + Math.random();
});
}
}
- Array.prototype.forEach.call($('.js-hidden'), (elem) => {
- toggleEl(elem);
- });
+ const hiddenElements = $$('.js-hidden');
+
+ if (hiddenElements) {
+ Array.prototype.forEach.call(hiddenElements, (elem) => {
+ toggleEl(elem);
+ });
+ }
};
const getUserInfo = () => {
diff --git a/public/assets/bundle/user_profile.min.js b/public/assets/bundle/user_profile.min.js
index 02dc0a5..04bad95 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,"'")},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 | '):"",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);
+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,"'")},f=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){u(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(d(''))),s&&(this.element.appendChild(d('"))),this.element.appendChild(d('…')));for(var c=i;c<=r;c++){var h=c===a?"paginator__button--selected":"";this.element.appendChild(d('")))}o&&(this.element.appendChild(d('…')),this.element.appendChild(d('"))));var p=a===n?"disabled":"";this.element.appendChild(d('')))}}}]),t}(),g=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 f(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");u(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(p(t.name),"\n ")})).join("")},y=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=d(''),this.inputNode=d(''),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'+p(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}(),b=function(){var t;Array.prototype.forEach.call(c(".js-tag-input"),(function(t){new y(t).attach()})),(t=l('[data-target~="#signin"],[data-target~="#signup"]'))&&(t.href="javascript:void(0)",t.addEventListener("click",(function(){l(".modal").classList.add("is-active")})),l(".modal-button-close").addEventListener("click",(function(){l(".modal").classList.remove("is-active")})));var e=l(".panel-tools .embed-tool");e&&e.addEventListener("click",(function(t){t.target&&t.target.closest(".panel-tools")&&h(t.target.closest(".panel-tools").querySelector(".panel-embed"))}));var a=l(".expand-tool");a&&a.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 n=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);n.length>0&&n.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 i=l(".preloader"),r=l("main");i&&r&&(i.remove(),r.id="");var s=l(".captcha_container");if(s){var o=s.querySelector("a"),d=s.querySelector("img");o&&d&&o.addEventListener("click",(function(){var t=d.src;-1!==t.indexOf("&refresh")?t=t.split("&rand=")[0]:t+="&refresh",d.src=t+"&rand="+Math.random()}))}var u=c(".js-hidden");u&&Array.prototype.forEach.call(u,(function(t){h(t)}))},k=function(t){return t.dataset.pasteInfo?JSON.parse(t.dataset.pasteInfo):null};o=function(){b();var t=new URLSearchParams(window.location.search).get("q"),e=document.getElementById("archive");new g(e,{ajaxCallback:function(t){t({data:Array.prototype.map.call(e.querySelectorAll("tbody > tr"),k)})},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 | '):"",r=new Date(t.created_at).toLocaleString(),s=n?''.concat(t.visibility," | "):"";return'\n ').concat(p(t.title),' | \n ').concat(r," | \n ").concat(s,'\n ').concat(t.views||0," | \n ").concat(m(t.tags)," | \n ").concat(i,"\n
")},filterCallback:v,preFilter:t}).attach();var a=document.getElementById("favs");a&&new g(a,{ajaxCallback:function(t){t({data:Array.prototype.map.call(a.querySelectorAll("tbody > tr"),k)})},rowCallback:function(t){var e=t.recently_updated?"":"",a=new Date(t.favourited_at).toLocaleString();return'\n ').concat(p(t.title),' | \n ').concat(a,' | \n ').concat(e," | \n ").concat(m(t.tags)," | \n
")},filterCallback:v}).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 207ceb9..e01978b 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.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 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
+{"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 // CAPTCHA refresh\n const captchaContainer = $('.captcha_container');\n\n if (captchaContainer) {\n const refreshElement = captchaContainer.querySelector('a');\n const imageElement = captchaContainer.querySelector('img');\n\n if (refreshElement && imageElement) {\n refreshElement.addEventListener('click', () => {\n let src = imageElement.src;\n\n if (src.indexOf('&refresh') !== -1) {\n // yeah, it's kinda cancerous. fuck off.\n src = src.split('&rand=')[0];\n } else {\n src += '&refresh';\n }\n\n imageElement.src = src + '&rand=' + Math.random();\n });\n }\n }\n\n const hiddenElements = $$('.js-hidden');\n\n if (hiddenElements) {\n Array.prototype.forEach.call(hiddenElements, (elem) => {\n toggleEl(elem);\n });\n }\n}\n\nexport { globalSetup };","import { escape, whenReady } from './dom';\nimport { DataTable, dumbFilterCallback } from './data_tables';\nimport { tagsToHtml } from \"./utils\";\nimport { globalSetup } from './main';\n\nconst getUserInfo = () => {\n const elem = document.getElementById('js-data-holder');\n\n if (!elem) {\n return { userId: null, csrfToken: null };\n }\n\n return { userId: elem.dataset.userId, csrfToken: elem.dataset.csrfToken };\n};\n\nconst parsePasteInfo = (elem) => {\n if (!elem.dataset.pasteInfo) {\n return null;\n }\n\n return JSON.parse(elem.dataset.pasteInfo);\n};\n\nwhenReady(() => {\n globalSetup();\n\n const urlParams = new URLSearchParams(window.location.search);\n const myParam = urlParams.get('q');\n const myPastesElem = document.getElementById('archive');\n const 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 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","$$","querySelectorAll","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","clearEl","el","removeChild","toggleEl","classList","contains","remove","add","escape","unsafe","replace","SimplePaginator","element","pageCallback","addEventListener","evt","target","dataset","page","totalRecords","perPage","currentPage","this","lastPage","Math","floor","firstPageShow","lastPageShow","showFirstPage","abs","showLastPage","prevButtonDisabled","appendChild","i","selected","nextButtonDisabled","DataTable","options","container","parentElement","ajaxCallback","data","unfilteredData","paginator","filterCallback","sortField","sortDir","filterField","_this","_updateFilter","value","preFilter","perPageField","Number","_updatePage","header","elem","_updateSort","attach","bind","_loadEntries","Promise","then","_this2","length","bodyElement","firstIndex","lastIndex","rowElem","rowCallback","update","n","_updateEntries","query","datum","push","field","direction","newEntries","_toConsumableArray","sort","a","b","sorter","dumbFilterCallback","title","indexOf","tags","name","toLowerCase","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","href","embedButton","expandButton","panel","$delete","$notification","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","random","hiddenElements","parsePasteInfo","pasteInfo","JSON","parse","myParam","URLSearchParams","window","location","search","get","myPastesElem","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 47f3f99..aa9134e 100644
--- a/public/captcha.php
+++ b/public/captcha.php
@@ -8,6 +8,10 @@ if (empty($_GET['t'])) {
die('Invalid token provided.');
}
+if (isset($_GET['refresh'])) {
+ setupCaptcha();
+}
+
$captcha_token = 'captcha/' . md5($_GET['t']);
$captcha_code = $redis->get($captcha_token);
diff --git a/public/index.php b/public/index.php
index e9ec79d..aae4fe1 100644
--- a/public/index.php
+++ b/public/index.php
@@ -31,7 +31,7 @@ function verifyCaptcha() : string|bool {
* Anything unhandled means to expire never.
* @return string|null Expiry time, or NULL if expires never.
*/
-function calculatePasteExpiry(string $expiry) {
+function calculatePasteExpiry(string $expiry) : ?string {
// used to use mktime
if ($expiry === 'self') {
return 'SELF';
diff --git a/public/login.php b/public/login.php
index 86f366c..5278ed5 100644
--- a/public/login.php
+++ b/public/login.php
@@ -2,6 +2,7 @@
/** @noinspection PhpDefineCanBeReplacedWithConstInspection */
define('IN_PONEPASTE', 1);
require_once(__DIR__ . '/../includes/common.php');
+require_once(__DIR__ . '/../includes/captcha.php');
use PonePaste\Helpers\SessionHelper;
use PonePaste\Models\User;
@@ -100,7 +101,7 @@ if (isset($_POST['forgot'])) {
$username = trim($_POST['username']);
$password = pp_password_hash($_POST['password']);
- if ($captcha_config['enabled'] && !checkCaptcha($_POST['captcha_token'], trim($_POST['captcha_answer']))) {
+ if ($captcha_enabled && !checkCaptcha($_POST['captcha_token'], trim($_POST['captcha_answer']))) {
$error = 'Incorrect CAPTCHA.';
} elseif (empty($_POST['password']) || empty($_POST['username'])) {
$error = 'All fields must be filled out.';
@@ -118,7 +119,6 @@ if (isset($_POST['forgot'])) {
'username' => $username,
'password' => $password,
'recovery_code_hash' => pp_password_hash($recovery_code),
- 'date' => $date,
'ip' => $ip
]);
$user->save();
diff --git a/public/paste.php b/public/paste.php
index 88cf9a5..e7f0b78 100644
--- a/public/paste.php
+++ b/public/paste.php
@@ -11,7 +11,7 @@ function isRequesterLikelyBot() : bool {
return str_contains(strtolower($_SERVER['HTTP_USER_AGENT']), 'bot');
}
-function rawView($content, $p_code) {
+function rawView($content, $p_code) : void {
if ($p_code) {
header('Content-Type: text/plain');
echo $content;
@@ -192,6 +192,7 @@ if ($paste_code === "pastedown") {
$p_content = $parsedown->text($p_content);
} else {
Highlighter::registerLanguage('green', __DIR__ . '/../config/green.lang.json');
+ Highlighter::registerLanguage('plaintext', __DIR__ . '/../vendor/scrivo/highlight.php/Highlight/languages/plaintext.json');
$hl = new Highlighter(false);
$highlighted = $hl->highlight($paste_code == 'text' ? 'plaintext' : $paste_code, $p_content)->value;
$lines = HighlightUtilities\splitCodeIntoArray($highlighted);
diff --git a/theme/bulma/common.php b/theme/bulma/common.php
index 5dc1eb2..f595062 100644
--- a/theme/bulma/common.php
+++ b/theme/bulma/common.php
@@ -211,13 +211,14 @@ $flashes = getFlashes();
-
 ?>)
+
-
+
+
and press "Enter"
diff --git a/theme/bulma/login.php b/theme/bulma/login.php
index 7e7c538..2abc75d 100644
--- a/theme/bulma/login.php
+++ b/theme/bulma/login.php
@@ -100,11 +100,17 @@
-

-
-
and
- press"Enter"
+
+
 ?>)
+
+
+
+
+
+
+
+
and press "Enter"
+
diff --git a/theme/bulma/main.php b/theme/bulma/main.php
index 3ce785c..7164b32 100644
--- a/theme/bulma/main.php
+++ b/theme/bulma/main.php
@@ -296,13 +296,14 @@
-
 ?>)
+
-
+
+
and press "Enter"
diff --git a/theme/bulma/user_profile.php b/theme/bulma/user_profile.php
index 6dde7d4..4b24ea9 100644
--- a/theme/bulma/user_profile.php
+++ b/theme/bulma/user_profile.php
@@ -22,12 +22,10 @@
1000 => '[HorseWriter] Have more than 1000 total views'
];
-
-
- function outputBadges(array $badgeCandidates, int $actualValue, string $imagePrefix) {
+ function outputBadges(array $badgeCandidates, int $actualValue, string $imagePrefix) : void {
foreach ($badgeCandidates as $threshold => $badgeTitle) {
if ($actualValue >= $threshold) {
- echo "

";
+ echo "

";
break;
}
}
diff --git a/theme/bulma/view.php b/theme/bulma/view.php
index 95856a9..582929e 100644
--- a/theme/bulma/view.php
+++ b/theme/bulma/view.php
@@ -208,14 +208,7 @@ $selectedloader = "$bg[$i]"; // set variable equal to which random filename was
id !== $paste_owner_id)) { ?>
-
-
+