Alpha 7 #22
@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
/** The current Feed Reader Central version */
|
||||
const FRC_VERSION = '1.0.0-alpha6';
|
||||
const FRC_VERSION = '1.0.0-alpha7';
|
||||
|
||||
spl_autoload_register(function ($class) {
|
||||
$file = implode(DIRECTORY_SEPARATOR, [__DIR__, 'lib', "$class.php"]);
|
||||
@ -18,3 +18,17 @@ Data::ensureDb();
|
||||
|
||||
/** @var string The date the world wide web was created */
|
||||
const WWW_EPOCH = '1993-04-30T00:00:00+00:00';
|
||||
|
||||
/**
|
||||
* Capitalize the first letter of the given string
|
||||
*
|
||||
* @param string $value The string to be capitalized
|
||||
* @return string The given string with the first letter capitalized
|
||||
*/
|
||||
function init_cap(string $value): string {
|
||||
return match (strlen($value)) {
|
||||
0 => "",
|
||||
1 => strtoupper($value),
|
||||
default => strtoupper(substr($value, 0, 1)) . substr($value, 1),
|
||||
};
|
||||
}
|
||||
|
@ -28,17 +28,3 @@ function cli_title(string $title): void {
|
||||
printfn(' | %s | %s |', $title, $appTitle);
|
||||
printfn($dashes . PHP_EOL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Capitalize the first letter of the given string
|
||||
*
|
||||
* @param string $value The string to be capitalized
|
||||
* @return string The given string with the first letter capitalized
|
||||
*/
|
||||
function init_cap(string $value): string {
|
||||
return match (strlen($value)) {
|
||||
0 => "",
|
||||
1 => strtoupper($value),
|
||||
default => strtoupper(substr($value, 0, 1)) . substr($value, 1),
|
||||
};
|
||||
}
|
||||
|
BIN
src/public/assets/bookmark-add.png
Normal file
BIN
src/public/assets/bookmark-add.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
src/public/assets/bookmark-added.png
Normal file
BIN
src/public/assets/bookmark-added.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
@ -79,10 +79,6 @@ main {
|
||||
margin-top: .25rem;
|
||||
}
|
||||
|
||||
.item_heading {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.item_published {
|
||||
margin-bottom: 1rem;
|
||||
line-height: 1.2;
|
||||
@ -153,3 +149,31 @@ code {
|
||||
p.back-link {
|
||||
margin-top: -1rem;
|
||||
}
|
||||
.item_heading {
|
||||
margin-bottom: 0;
|
||||
|
||||
.bookmark {
|
||||
padding: 0;
|
||||
border: solid 1px black;
|
||||
border-radius: .5rem;
|
||||
|
||||
&.add {
|
||||
background-color: lightgray;
|
||||
:hover {
|
||||
background: linear-gradient(lightgreen, gray);
|
||||
}
|
||||
}
|
||||
&.remove {
|
||||
background: linear-gradient(lightgreen, green);
|
||||
:hover {
|
||||
background: linear-gradient(gray, lightgreen);
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 1.5rem;
|
||||
max-height: 1.5rem;
|
||||
padding: .5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
49
src/public/bookmark.php
Normal file
49
src/public/bookmark.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Bookmark Partial Handler
|
||||
*
|
||||
* This will display a button which will either add or remove a bookmark for a given item.
|
||||
*/
|
||||
|
||||
include '../start.php';
|
||||
|
||||
$db = Data::getConnection();
|
||||
Security::verifyUser($db);
|
||||
|
||||
$id = $_GET['id'];
|
||||
|
||||
$existsQuery = $db->prepare(
|
||||
'SELECT item.id FROM item INNER JOIN feed ON feed.id = item.feed_id WHERE item.id = :id AND feed.user_id = :user');
|
||||
$existsQuery->bindValue(':id', $id);
|
||||
$existsQuery->bindValue(':user', $_SESSION[Key::USER_ID]);
|
||||
$existsResult = $existsQuery->execute();
|
||||
$exists = $existsResult ? $existsResult->fetchArray(SQLITE3_ASSOC) : false;
|
||||
|
||||
if (!$exists) not_found();
|
||||
|
||||
if (key_exists('action', $_GET)) {
|
||||
if ($_GET['action'] == 'add') {
|
||||
$flag = 1;
|
||||
} elseif ($_GET['action'] == 'remove') {
|
||||
$flag = 0;
|
||||
}
|
||||
if (isset($flag)) {
|
||||
$update = $db->prepare('UPDATE item SET is_bookmarked = :flag WHERE id = :id');
|
||||
$update->bindValue(':id', $id);
|
||||
$update->bindValue(':flag', $flag);
|
||||
if (!$update->execute()) die(Data::error($db)['error']);
|
||||
}
|
||||
}
|
||||
|
||||
$bookQuery = $db->prepare('SELECT id, is_bookmarked FROM item WHERE id = :id');
|
||||
$bookQuery->bindValue(':id', $id);
|
||||
$bookResult = $bookQuery->execute();
|
||||
$bookmark = $bookResult ? $bookResult->fetchArray(SQLITE3_ASSOC) : ['id' => $id, 'is_bookmarked' => 0];
|
||||
|
||||
$action = $bookmark['is_bookmarked'] ? 'remove' : 'add';
|
||||
$icon = $bookmark['is_bookmarked'] ? 'added' : 'add'; ?>
|
||||
<button class="bookmark <?=$action?>" type=button role=button hx-patch="/bookmark?id=<?=$id?>&action=<?=$action?>"
|
||||
hx-target=this hx-swap=outerHTML hx-push-url=false title="<?=init_cap($action)?> Bookmark">
|
||||
<img src=/assets/bookmark-<?=$icon?>.png alt="<?=$action?> bookmark">
|
||||
</button><?php
|
@ -67,6 +67,7 @@ if ($type == TYPE_ALL) { ?>
|
||||
while ($item) { ?>
|
||||
<p><?=hx_get("/item?id={$item['id']}&from=$thisURL", strip_tags($item['title']))?><br>
|
||||
<small><?=$item['is_read'] == 0 ? '<strong>New</strong> ' : ''?>
|
||||
<?=$item['is_bookmarked'] ? '<strong>Bookmarked</strong> ' : ''?>
|
||||
<em><?=date_time($item['as_of'])?></em></small><?php
|
||||
$item = $itemResult->fetchArray(SQLITE3_ASSOC);
|
||||
}
|
||||
|
@ -75,6 +75,8 @@ $updated = isset($item['updated_on']) ? date_time($item['updated_on']) : null;
|
||||
|
||||
page_head(htmlentities("{$item['item_title']} | {$item['feed_title']}")); ?>
|
||||
<h1 class=item_heading>
|
||||
<span class=bookmark hx-get="/bookmark?id=<?=$_GET['id']?>" hx-trigger=load hx-target=this hx-swap=outerHTML
|
||||
hx-push-url=false></span>
|
||||
<a href="<?=$item['item_link']?>" target=_blank rel=noopener><?=strip_tags($item['item_title'])?></a><br>
|
||||
</h1>
|
||||
<div class=item_published>
|
||||
|
Loading…
Reference in New Issue
Block a user