aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/class/controllertimeline.php28
-rw-r--r--app/class/event.php20
-rw-r--r--app/class/modeltimeline.php113
-rw-r--r--app/class/routes.php1
-rw-r--r--app/view/templates/timeline.php61
-rw-r--r--assets/css/home.css49
6 files changed, 233 insertions, 39 deletions
diff --git a/app/class/controllertimeline.php b/app/class/controllertimeline.php
index b4081a4..7e617e1 100644
--- a/app/class/controllertimeline.php
+++ b/app/class/controllertimeline.php
@@ -14,20 +14,36 @@ class Controllertimeline extends Controller
public function desktop()
{
- $eventlist = $this->eventmanager->getlister();
+ $eventlist = $this->eventmanager->showlast(['message'], 100, 0);
- $this->showtemplate('timeline', ['eventlist' => $eventlist]);
+ $groupedeventlist = $this->eventmanager->group($eventlist);
+
+ $this->showtemplate('timeline', ['eventlist' => $eventlist, 'groupedeventlist' => $groupedeventlist]);
}
public function add()
{
- $event = new Event($_POST);
- $event->stamp();
- $event->setid($this->eventmanager->getlastfreeid());
- $this->eventmanager->add($event);
+ if($this->user->level() >= Modeluser::EDITOR && !empty($_POST['message'])) {
+
+ $event = new Event($_POST);
+ $event->stamp();
+ $event->setid($this->eventmanager->getlastfreeid());
+ $this->eventmanager->add($event);
+ }
$this->routedirect('timeline');
}
+
+ public function clap()
+ {
+ if(isset($_POST['id']) && isset($_POST['clap'])) {
+ $event = $this->eventmanager->get(intval($_POST['id']));
+ $event->addclap();
+ $this->eventmanager->add($event);
+ }
+ $this->routedirect('timeline');
+
+ }
}
diff --git a/app/class/event.php b/app/class/event.php
index a23fff9..9fc75d2 100644
--- a/app/class/event.php
+++ b/app/class/event.php
@@ -8,6 +8,7 @@ class Event extends Dbitem
protected $user;
protected $target;
protected $message;
+ protected $clap = 0;
const EVENT_TYPES = ['message', 'art_add', 'art_edit', 'art_delete', 'media_add', 'media_delete', 'font_add'];
const EVENT_BASE = ['message'];
@@ -29,9 +30,16 @@ class Event extends Dbitem
$this->user = idclean($this->user);
if (in_array($this->type, self::EVENT_ART)) {
$this->target = idclean($this->target);
+ } elseif ($this->type === 'message') {
+ $this->message = htmlspecialchars($this->message);
}
}
+ public function addclap()
+ {
+ $this->clap ++;
+ }
+
// _____________________ G E T __________________________
public function id()
@@ -78,6 +86,11 @@ class Event extends Dbitem
return $this->message;
}
+ public function clap()
+ {
+ return $this->clap;
+ }
+
// ________________________ S E T ____________________
@@ -126,6 +139,13 @@ class Event extends Dbitem
}
}
+ public function setclap($clap)
+ {
+ if(is_int($clap)) {
+ $this->clap = $clap;
+ }
+ }
+
diff --git a/app/class/modeltimeline.php b/app/class/modeltimeline.php
index b914605..b575dda 100644
--- a/app/class/modeltimeline.php
+++ b/app/class/modeltimeline.php
@@ -2,30 +2,67 @@
class Modeltimeline extends Modeldb
{
+ const EVENT_BASE = ['message'];
+ const EVENT_ART = ['art_add', 'art_edit', 'art_delete'];
+ const EVENT_MEDIA = ['media_add', 'media_delete'];
+ const EVENT_FONT = ['font_add', 'font_delete'];
public function __construct()
{
parent::__construct();
$this->storeinit('timeline');
- }
-
- /**
- * Retrun a list of Event objects
- *
- * @return array array of Event where the key is the Event id.
- */
- public function getlister() : array
+ }
+
+ public function get(int $id)
+ {
+ $eventdata = $this->repo->findById($id);
+ if ($eventdata !== false) {
+ return new Event($eventdata);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Retrun a list of Event objects
+ *
+ * @return array array of Event where the key is the Event id.
+ */
+ public function getlister() : array
{
$eventlist = [];
$datalist = $this->repo->findAll();
foreach ($datalist as $eventdata) {
$event = new Event($eventdata);
- $eventlist[$event->id()] = $event;
+ $id = intval($event->id());
+ $eventlist[$id] = $event;
}
return $eventlist;
}
- public function add(Event $event)
+
+ public function getlisterid(array $idlist = []) : array
+ {
+ $eventdatalist = $this->repo->query()
+ ->where('__id', 'IN', $idlist)
+ ->execute();
+
+ $eventlist = [];
+ foreach ($eventdatalist as $id => $eventdata) {
+ $eventlist[$id] = new Event($eventdata);
+ }
+ return $eventlist;
+ }
+
+
+ /**
+ * Store event
+ *
+ * @param Event The event to be stored in the repositery
+ *
+ * @return bool retrun true if it works, false if it fails
+ */
+ public function add(Event $event) : bool
{
$eventdata = new \JamesMoss\Flywheel\Document($event->dry());
$eventdata->setId($event->id());
@@ -33,20 +70,68 @@ class Modeltimeline extends Modeldb
return $result;
}
- public function getlastfreeid()
+ /**
+ * Return last free id
+ *
+ * @return int id
+ */
+ public function getlastfreeid() : int
{
$idlist = $this->list();
- if(!empty($idlist)) {
+ if (!empty($idlist)) {
$id = max($idlist);
- $id ++;
+ $id++;
} else {
$id = 1;
}
-
return $id;
}
+ public function group(array $events)
+ {
+ $id = 0;
+ $subid = 0;
+ $lastuser = null;
+ foreach ($events as $event) {
+ if($event->user() !== $lastuser) {
+ $subid = 0;
+ $id ++;
+ $groupedevents[$id]['user'] = $event->user();
+ } else {
+ $subid ++;
+ }
+ $groupedevents[$id][$subid] = $event;
+ $lastuser = $event->user();
+ }
+ return $groupedevents;
+ }
+
+ public function showlast(array $types, int $qty = 25, int $offset = 0)
+ {
+ $types = array_intersect($types, $this->types());
+
+ $eventdatalist = $this->repo->query()
+ ->where('type', 'IN', $types)
+ ->orderBy('date DESC')
+ ->limit($qty, $offset)
+ ->execute();
+
+ $eventlist = [];
+ foreach ($eventdatalist as $id => $eventdata) {
+ $eventlist[] = new Event($eventdata);
+ }
+
+ $eventlist = array_reverse($eventlist);
+ return $eventlist;
+ }
+
+
+ public function types()
+ {
+ return array_merge(self::EVENT_ART, self::EVENT_BASE, self::EVENT_MEDIA, self::EVENT_MEDIA);
+ }
+
}
diff --git a/app/class/routes.php b/app/class/routes.php
index 449b8fa..2ccc269 100644
--- a/app/class/routes.php
+++ b/app/class/routes.php
@@ -32,6 +32,7 @@ class Routes
['GET', '/!info', 'Controllerinfo#desktop', 'info'],
['GET', '/!timeline', 'Controllertimeline#desktop', 'timeline'],
['POST', '/!timeline/add', 'Controllertimeline#add', 'timelineadd'],
+ ['POST', '/!timeline/clap', 'Controllertimeline#clap', 'timelineclap'],
['GET', '/[cid:art]/', 'Controllerart#read', 'artread/'],
['GET', '/[cid:art]', 'Controllerart#read', 'artread'],
['GET', '/[cid:art]/add', 'Controllerart#add', 'artadd'],
diff --git a/app/view/templates/timeline.php b/app/view/templates/timeline.php
index 8ddc7f1..fcf8afd 100644
--- a/app/view/templates/timeline.php
+++ b/app/view/templates/timeline.php
@@ -19,25 +19,50 @@
<ul>
<?php
-foreach ($eventlist as $event) {
- if($user->id() === $event->user()) {
- $class = 'class="self event"';
- } else {
- $class = 'class="event"';
- }
- echo '<li '. $class .'>';
- switch ($event->type()) {
- case 'message':
- echo '<h3>'. $event->user() .'</h3>';
- echo '<p>'. $event->message() .'</p>';
- echo '<i>'. $event->date('hrdi') .' ago</i>';
- break;
-
- default:
+foreach ($groupedeventlist as $eventuser) {
+
+ if($user->id() === $eventuser['user']) {
+ $class = 'class="self user"';
+ } else {
+ $class = 'class="user"';
+ }
+ echo '<li '. $class .'>';
+ echo '<h3>'. $eventuser['user'] .'</h3>';
+ echo' <ul>';
+ foreach ($eventuser as $key => $event) {
+ if($key !== 'user') {
+ echo '<li class="event">';
+ switch ($event->type()) {
+ case 'message':
+ echo '<p class="eline">'. $event->message() .'</p>';
+ break;
+ }
+
+ ?>
+
+
+ <?= !empty($event->clap()) ? '<b class="eline">'. $event->clap() .'</b>' : '' ?>
+
+ <span class="details">
+
+ <?php if($user->id() !== $eventuser['user']) {?>
+ <form class="eline" method="post" action="<?= $this->url('timelineclap') ?>">
+ <input type="hidden" name="id" value="<?= $event->id() ?>">
+ <input type="submit" name="clap" value="👌">
+ </form>
+ <?php } ?>
+
+
+ <i class="eline"><?= $event->date('hrdi') ?> ago</i>
- break;
- echo '</li>';
+ </span>
+
+ </li>
+
+ <?php
+ }
}
+ echo '</ul></li>';
}
?>
@@ -50,7 +75,7 @@ foreach ($eventlist as $event) {
<input type="hidden" name="user" value="<?= $user->id() ?>">
<label for="message">message</label>
-<textarea name="message" id="message" cols="30" rows="10"></textarea>
+<textarea name="message" id="message" cols="30" rows="10" autofocus></textarea>
<input type="submit" value="send">
</form>
diff --git a/assets/css/home.css b/assets/css/home.css
index b58ad5b..79f82d1 100644
--- a/assets/css/home.css
+++ b/assets/css/home.css
@@ -261,10 +261,57 @@ main.user table form {
-li.self.event {
+
+
+main.timeline ul {
+ list-style: none;
+ padding-inline-start: 0;
+}
+
+
+li.self.user {
text-align: right;
}
+main.timeline li.event .eline {
+ display: inline-block;
+ margin: 0;
+}
+
+
+
+main.timeline p.eline {
+ background-color: white;
+ border-radius: 10px;
+ padding: 3px 7px;
+ font-family: sans-serif;
+}
+
+
+
+main.timeline textarea#message {
+ width: 100%;
+ max-width: unset;
+}
+
+
+
+li.event:hover span.details {
+ display: inline;
+}
+
+span.details {
+ display: none;
+}
+
+main.timeline li.event {
+ margin: 7px;
+}
+
+
+
+
+