diff --git a/config/bootstrap.php b/config/bootstrap.php index 06da29f..4536857 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -163,7 +163,7 @@ function create_tables(): void { )"); // mood table - $db->exec("CREATE TABLE IF NOT EXISTS mood ( + $db->exec("CREATE TABLE IF NOT EXISTS emoji( id INTEGER PRIMARY KEY, emoji TEXT UNIQUE NOT NULL, description TEXT NOT NULL @@ -185,7 +185,7 @@ function validate_tables(): void { $appTables[] = "settings"; $appTables[] = "user"; $appTables[] = "css"; - $appTables[] = "mood"; + $appTables[] = "emoji"; $db = get_db(); diff --git a/public/css/tkr.css b/public/css/tkr.css index 94253dc..bb1cbe4 100644 --- a/public/css/tkr.css +++ b/public/css/tkr.css @@ -77,6 +77,10 @@ fieldset.emoji-group { gap: 0.3em; } +h1.site-description { + font-size: 1.3em; +} + .delete-emoji-fieldset .fieldset-items { display: block; grid-template-columns: none; @@ -293,7 +297,7 @@ label.description { font-size: 1.0em; } -.pagination a { +.tick-pagination a { margin: 0 5px; text-decoration: none; } diff --git a/src/Controller/EmojiController/EmojiController.php b/src/Controller/EmojiController/EmojiController.php new file mode 100644 index 0000000..ad03ee7 --- /dev/null +++ b/src/Controller/EmojiController/EmojiController.php @@ -0,0 +1,73 @@ + $config, + 'emojiList' => $emojiList, + ]; + + $this->render("emoji.php", $vars); + } + + public function handlePost(): void { + global $config; + + switch ($_POST['action']) { + case 'add': + $emoji = trim($_POST['emoji']); + $description = trim($_POST['emoji-description']); + $this->handleAdd($emoji, $description); + break; + case 'delete': + if (!empty($_POST['delete_emoji_ids'])){ + $this->handleDelete(); + } + break; + } + + header('Location: ' . $config->basePath . 'admin/emoji'); + exit; + } + + public function handleAdd(string $emoji, ?string $description=null): void { + // Validate 1 visible character in the emoji + if (extension_loaded('mbstring')) { + // TODO - log a warning if mbstring isn't loaded + $charCount = mb_strlen($emoji, 'UTF-8'); + if ($charCount !== 1) { + // TODO - handle error + return; + } + } + + // Validate the emoji is actually an emoji + $emojiPattern = '/^[\x{1F000}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F1E0}-\x{1F1FF}\x{1F900}-\x{1F9FF}\x{1FA70}-\x{1FAFF}]$/u'; + + if (!preg_match($emojiPattern, $emoji)) { + // TODO - handle error + return; + } + + // emojis should have more bytes than characters + $byteCount = strlen($emoji); + if ($byteCount <= 1) { + // TODO - handle error + return; + } + + // It looks like an emoji. Let's add it. + EmojiModel::add($emoji, $description); + } + + public function handleDelete(): void { + $ids = $_POST['delete_emoji_ids']; + + if (!empty($ids)) { + EmojiModel::delete($ids); + } + } + } \ No newline at end of file diff --git a/src/Controller/MoodController/MoodController.php b/src/Controller/MoodController/MoodController.php index 6e77d0d..08f9fd4 100644 --- a/src/Controller/MoodController/MoodController.php +++ b/src/Controller/MoodController/MoodController.php @@ -15,80 +15,8 @@ $this->render("mood.php", $vars); } - // Shows the custom emoji management page - public function showCustomEmoji(){ - global $config; - $emojiList = MoodModel::loadAll(); - - $vars = [ - 'config' => $config, - 'emojiList' => $emojiList, - ]; - - $this->render("emoji.php", $vars); - } - - public function handlePost(): void { - global $config; - - switch ($_POST['action']) { - case 'add': - $emoji = trim($_POST['emoji']); - $description = trim($_POST['emoji-description']); - $this->handleAdd($emoji, $description); - break; - case 'delete': - if (!empty($_POST['delete_emoji_ids'])){ - $this->handleDelete(); - } - break; - } - - header('Location: ' . $config->basePath . 'admin/emoji'); - exit; - } - - public function handleAdd(string $emoji, ?string $description=null): void { - // Validate 1 visible character in the emoji - if (extension_loaded('mbstring')) { - // TODO - log a warning if mbstring isn't loaded - $charCount = mb_strlen($emoji, 'UTF-8'); - if ($charCount !== 1) { - // TODO - handle error - return; - } - } - - // Validate the emoji is actually an emoji - $emojiPattern = '/^[\x{1F000}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F1E0}-\x{1F1FF}\x{1F900}-\x{1F9FF}\x{1FA70}-\x{1FAFF}]$/u'; - - if (!preg_match($emojiPattern, $emoji)) { - // TODO - handle error - return; - } - - // emojis should have more bytes than characters - $byteCount = strlen($emoji); - if ($byteCount <= 1) { - // TODO - handle error - return; - } - - // It looks like an emoji. Let's add it. - MoodModel::add($emoji, $description); - } - - public function handleDelete(): void { - $ids = $_POST['delete_emoji_ids']; - - if (!empty($ids)) { - $moodModel = new MoodModel(); - $moodModel->delete($ids); - } - } - - public function handleSetMood(){ - if ($_SERVER['REQUEST_METHOD'] === 'POST' and isset($_POST['mood'])) { + public function handlePost(){ + if ($_SERVER['REQUEST_METHOD'] === 'POST') { // ensure that the session is valid before proceeding if (!Session::validateCsrfToken($_POST['csrf_token'])) { die('Invalid CSRF token'); @@ -97,9 +25,17 @@ // Get the data we need global $config; global $user; - $mood = $_POST['mood']; - // set the mood + switch ($_POST['action']){ + case 'set': + $mood = $_POST['mood']; + break; + case 'clear': + $mood = ''; + break; + } + + // set or clear the mood $user->mood = $mood; $user = $user->save(); @@ -110,7 +46,7 @@ } private static function getEmojisWithLabels(): array { - $customEmoji = MoodModel::loadAll(); + $customEmoji = EmojiModel::loadAll(); if (!empty($customEmoji)){ $custom = []; diff --git a/src/Framework/Router/Router.php b/src/Framework/Router/Router.php index 10dea0f..b7a6f1a 100644 --- a/src/Framework/Router/Router.php +++ b/src/Framework/Router/Router.php @@ -10,15 +10,15 @@ class Router { ['admin', 'AdminController@handleSave', ['POST']], ['admin/css', 'CssController'], ['admin/css', 'CssController@handlePost', ['POST']], - ['admin/emoji', 'MoodController@showCustomEmoji'], - ['admin/emoji', 'MoodController@handlePost', ['POST']], + ['admin/emoji', 'EmojiController'], + ['admin/emoji', 'EmojiController@handlePost', ['POST']], ['feed/rss', 'FeedController@rss'], ['feed/atom', 'FeedController@atom'], ['login', 'AuthController@showLogin'], ['login', 'AuthController@handleLogin', ['POST']], ['logout', 'AuthController@handleLogout', ['GET', 'POST']], ['mood', 'MoodController'], - ['mood', 'MoodController@handleSetMood', ['POST']], + ['mood', 'MoodController@handlePost', ['POST']], ['setup', 'AdminController@showSetup'], ['setup', 'AdminController@handleSetup', ['POST']], ['tick/{y}/{m}/{d}/{h}/{i}/{s}', 'TickController'], diff --git a/src/Model/MoodModel/MoodModel.php b/src/Model/EmojiModel/EmojiModel.php similarity index 72% rename from src/Model/MoodModel/MoodModel.php rename to src/Model/EmojiModel/EmojiModel.php index 40eb0f0..99b2530 100644 --- a/src/Model/MoodModel/MoodModel.php +++ b/src/Model/EmojiModel/EmojiModel.php @@ -1,12 +1,12 @@ query("SELECT id, emoji, description FROM mood"); + $stmt = $db->query("SELECT id, emoji, description FROM emoji"); return $stmt->fetchAll(PDO::FETCH_ASSOC); } @@ -15,7 +15,7 @@ class MoodModel{ public static function add(string $emoji, ?string $description): void{ global $db; - $stmt = $db->prepare("INSERT INTO mood (emoji, description) VALUES (?, ?)"); + $stmt = $db->prepare("INSERT INTO emoji (emoji, description) VALUES (?, ?)"); $stmt->execute([$emoji, $description]); } @@ -23,7 +23,7 @@ class MoodModel{ global $db; $placeholders = rtrim(str_repeat('?,', count($idsToDelete)), ','); - $stmt = $db->prepare("DELETE FROM mood WHERE id IN ($placeholders)"); + $stmt = $db->prepare("DELETE FROM emoji WHERE id IN ($placeholders)"); $stmt->execute($idsToDelete); } } \ No newline at end of file diff --git a/src/View/HomeView/HomeView.php b/src/View/HomeView/HomeView.php index 9c4d526..ba29a11 100644 --- a/src/View/HomeView/HomeView.php +++ b/src/View/HomeView/HomeView.php @@ -4,8 +4,8 @@ class HomeView { ob_start(); ?> -
-
+
+
@@ -13,7 +13,7 @@ class HomeView {
-
+
1): ?> « Newer @@ -21,7 +21,7 @@ class HomeView { Older »
-
+ render_emoji_groups($emojiGroups, $currentMood) ?> - +
+ + +
' . "\n"; - + href="feed/atom"> + diff --git a/templates/feed/rss.php b/templates/feed/rss.php index f902d53..534744e 100644 --- a/templates/feed/rss.php +++ b/templates/feed/rss.php @@ -9,15 +9,15 @@ echo '' . "\n"; ?> - My tkr + <?php echo htmlspecialchars($config->siteTitle) ?> RSS Feed + href="baseUrl . $config->basePath)?>feed/rss/"> - My tkr + href="baseUrl . $config->basePath) ?>"> + siteDescription) ?> en-us siteTitle) ?> RSS Feed" - href="baseUrl . $config->basePath)?>feed/rss/" /> + href="baseUrl . $config->basePath)?>feed/rss/"> + href="baseUrl . $config->basePath)?>feed/atom/"> diff --git a/templates/partials/home.php b/templates/partials/home.php index 2601c3c..4c10bd8 100644 --- a/templates/partials/home.php +++ b/templates/partials/home.php @@ -5,10 +5,15 @@