diff options
-rw-r--r-- | app/class/controllertimeline.php | 28 | ||||
-rw-r--r-- | app/class/event.php | 20 | ||||
-rw-r--r-- | app/class/modeltimeline.php | 113 | ||||
-rw-r--r-- | app/class/routes.php | 1 | ||||
-rw-r--r-- | app/view/templates/timeline.php | 61 | ||||
-rw-r--r-- | assets/css/home.css | 49 |
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; +} + + + + + |