<?php class PoolsTheme extends Themelet { /** * Adds a block to the panel with information on the pool(s) the image is in. * $navIDs = Multidimensional array containing pool id, info & nav IDs. */ public function pool_info(array $navIDs) { global $page; $linksPools = []; foreach ($navIDs as $poolID => $pool) { $linksPools[] = "<a href='" . make_link("pool/view/" . $poolID) . "'>" . html_escape($pool['info']['title']) . "</a>"; if (array_key_exists('nav', $pool)) { $navlinks = ""; if (!empty($pool['nav']['prev'])) { $navlinks .= '<a href="' . make_link('post/view/' . $pool['nav']['prev']) . '" class="pools_prev_img">Prev</a>'; } if (!empty($pool['nav']['next'])) { $navlinks .= '<a href="' . make_link('post/view/' . $pool['nav']['next']) . '" class="pools_next_img">Next</a>'; } if (!empty($navlinks)) { $navlinks .= "<div style='height: 5px'></div>"; $linksPools[] = $navlinks; } } } if (count($linksPools) > 0) { $page->add_block(new Block("Pools", implode("<br>", $linksPools), "left")); } } public function get_adder_html(Image $image, array $pools): string { $h = ""; foreach ($pools as $pool) { $h .= "<option value='" . $pool['id'] . "'>" . html_escape($pool['title']) . "</option>"; } $editor = "\n" . make_form(make_link("pool/add_post")) . " <select name='pool_id'> $h </select> <input type='hidden' name='image_id' value='{$image->id}'> <input type='submit' value='Add Image to Pool'> </form> "; return $editor; } /** * HERE WE SHOWS THE LIST OF POOLS. */ public function list_pools(Page $page, array $pools, int $pageNumber, int $totalPages) { $html = ' <table id="poolsList" class="zebra"> <thead><tr> <th>Name</th> <th>Creator</th> <th>Posts</th> <th>Public</th> </tr></thead><tbody>'; // Build up the list of pools. foreach ($pools as $pool) { $pool_link = '<a href="' . make_link("pool/view/" . $pool['id']) . '">' . html_escape($pool['title']) . "</a>"; $user_link = '<a href="' . make_link("user/" . url_escape($pool['user_name'])) . '">' . html_escape($pool['user_name']) . "</a>"; $public = ($pool['public'] == "Y" ? "Yes" : "No"); $html .= "<tr>" . "<td class='left'>" . $pool_link . "</td>" . "<td>" . $user_link . "</td>" . "<td>" . $pool['posts'] . "</td>" . "<td>" . $public . "</td>" . "</tr>"; } $html .= "</tbody></table>"; $order_html = '<select id="order_pool">'; $order_selected = $page->get_cookie('ui-order-pool'); $order_arr = ['created' => 'Recently created', 'updated' => 'Last updated', 'name' => 'Name', 'count' => 'Post Count']; foreach ($order_arr as $value => $text) { $selected = ($value == $order_selected ? "selected" : ""); $order_html .= "<option value=\"{$value}\" {$selected}>{$text}</option>\n"; } $order_html .= '</select>'; $this->display_top(null, "Pools"); $page->add_block(new Block("Order By", $order_html, "left", 15)); $page->add_block(new Block("Pools", $html, "main", 10)); $this->display_paginator($page, "pool/list", null, $pageNumber, $totalPages); } /* * HERE WE DISPLAY THE NEW POOL COMPOSER */ public function new_pool_composer(Page $page) { $create_html = " " . make_form(make_link("pool/create")) . " <table> <tr><td>Title:</td><td><input type='text' name='title'></td></tr> <tr><td>Public?</td><td><input name='public' type='checkbox' value='Y' checked='checked'/></td></tr> <tr><td>Description:</td><td><textarea name='description'></textarea></td></tr> <tr><td colspan='2'><input type='submit' value='Create' /></td></tr> </table> </form> "; $this->display_top(null, "Create Pool"); $page->add_block(new Block("Create Pool", $create_html, "main", 20)); } private function display_top(?array $pools, string $heading, bool $check_all = false) { global $page, $user; $page->set_title($heading); $page->set_heading($heading); $poolnav_html = ' <a href="' . make_link("pool/list") . '">Pool Index</a> <br><a href="' . make_link("pool/new") . '">Create Pool</a> <br><a href="' . make_link("pool/updated") . '">Pool Changes</a> '; $page->add_block(new NavBlock()); $page->add_block(new Block("Pool Navigation", $poolnav_html, "left", 10)); if (!is_null($pools) && count($pools) == 1) { $pool = $pools[0]; if ($pool['public'] == "Y" || $user->is_admin()) {// IF THE POOL IS PUBLIC OR IS ADMIN SHOW EDIT PANEL if (!$user->is_anonymous()) {// IF THE USER IS REGISTERED AND LOGGED IN SHOW EDIT PANEL $this->sidebar_options($page, $pool, $check_all); } } $tfe = new TextFormattingEvent($pool['description']); send_event($tfe); $page->add_block(new Block(html_escape($pool['title']), $tfe->formatted, "main", 10)); } } /** * HERE WE DISPLAY THE POOL WITH TITLE DESCRIPTION AND IMAGES WITH PAGINATION. */ public function view_pool(array $pools, array $images, int $pageNumber, int $totalPages) { global $page; $this->display_top($pools, "Pool: " . html_escape($pools[0]['title'])); $pool_images = ''; foreach ($images as $image) { $thumb_html = $this->build_thumb_html($image); $pool_images .= "\n" . $thumb_html . "\n"; } $page->add_block(new Block("Viewing Posts", $pool_images, "main", 30)); $this->display_paginator($page, "pool/view/" . $pools[0]['id'], null, $pageNumber, $totalPages); } /** * HERE WE DISPLAY THE POOL OPTIONS ON SIDEBAR BUT WE HIDE REMOVE OPTION IF THE USER IS NOT THE OWNER OR ADMIN. */ public function sidebar_options(Page $page, array $pool, bool $check_all) { global $user; $editor = "\n" . make_form(make_link('pool/import')) . ' <input type="text" name="pool_tag" id="edit_pool_tag" placeholder="Please enter a tag"/> <input type="submit" name="edit" id="edit_pool_import_btn" value="Import"/> <input type="hidden" name="pool_id" value="' . $pool['id'] . '"> </form> ' . make_form(make_link('pool/edit')) . ' <input type="submit" name="edit" id="edit_pool_btn" value="Edit Pool"/> <input type="hidden" name="edit_pool" value="yes"> <input type="hidden" name="pool_id" value="' . $pool['id'] . '"> </form> ' . make_form(make_link('pool/order')) . ' <input type="submit" name="edit" id="edit_pool_order_btn" value="Order Pool"/> <input type="hidden" name="order_view" value="yes"> <input type="hidden" name="pool_id" value="' . $pool['id'] . '"> </form> '; if ($user->id == $pool['user_id'] || $user->is_admin()) { $editor .= " <script type='text/javascript'> <!-- function confirm_action() { return confirm('Are you sure that you want to delete this pool?'); } //--> </script> " . make_form(make_link("pool/nuke")) . " <input type='submit' name='delete' id='delete_pool_btn' value='Delete Pool' onclick='return confirm_action()' /> <input type='hidden' name='pool_id' value='" . $pool['id'] . "'> </form> "; } if ($check_all) { $editor .= " <script type='text/javascript'> <!-- function setAll(value) { $('[name=\"check[]\"]').attr('checked', value); } //--> </script> <br><input type='button' name='CheckAll' value='Check All' onClick='setAll(true)'> <input type='button' name='UnCheckAll' value='Uncheck All' onClick='setAll(false)'> "; } $page->add_block(new Block("Manage Pool", $editor, "left", 15)); } /** * HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT. */ public function pool_result(Page $page, array $images, array $pool) { $this->display_top($pool, "Importing Posts", true); $pool_images = " <script type='text/javascript'> <!-- function confirm_action() { return confirm('Are you sure you want to add selected posts to this pool?'); } //--> </script> "; $pool_images .= "<form action='" . make_link("pool/add_posts") . "' method='POST' name='checks'>"; foreach ($images as $image) { $thumb_html = $this->build_thumb_html($image); $pool_images .= '<span class="thumb">' . $thumb_html . '<br>' . '<input name="check[]" type="checkbox" value="' . $image->id . '" />' . '</span>'; } $pool_images .= "<br>" . "<input type='submit' name='edit' id='edit_pool_add_btn' value='Add Selected' onclick='return confirm_action()'/>" . "<input type='hidden' name='pool_id' value='" . $pool[0]['id'] . "'>" . "</form>"; $page->add_block(new Block("Import", $pool_images, "main", 30)); } /** * HERE WE DISPLAY THE POOL ORDERER. * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH A TEXT INPUT TO SET A NUMBER AND CHANGE THE ORDER */ public function edit_order(Page $page, array $pools, array $images) { $this->display_top($pools, "Sorting Pool"); $pool_images = "\n<form action='" . make_link("pool/order") . "' method='POST' name='checks'>"; $i = 0; foreach ($images as $pair) { $image = $pair[0]; $thumb_html = $this->build_thumb_html($image); $pool_images .= '<span class="thumb">' . "\n" . $thumb_html . "\n" . '<br><input name="imgs[' . $i . '][]" type="number" style="max-width:50px;" value="' . $image->image_order . '" />' . '<input name="imgs[' . $i . '][]" type="hidden" value="' . $image->id . '" />' . '</span>'; $i++; } $pool_images .= "<br>" . "<input type='submit' name='edit' id='edit_pool_order' value='Order'/>" . "<input type='hidden' name='pool_id' value='" . $pools[0]['id'] . "'>" . "</form>"; $page->add_block(new Block("Sorting Posts", $pool_images, "main", 30)); } /** * HERE WE DISPLAY THE POOL EDITOR. * * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH * A CHECKBOX TO SELECT WHICH IMAGE WE WANT TO REMOVE */ public function edit_pool(Page $page, array $pools, array $images) { /* EDIT POOL DESCRIPTION */ $desc_html = " " . make_form(make_link("pool/edit_description")) . " <textarea name='description'>" . $pools[0]['description'] . "</textarea><br /> <input type='hidden' name='pool_id' value='" . $pools[0]['id'] . "'> <input type='submit' value='Change Description' /> </form> "; /* REMOVE POOLS */ $pool_images = "\n<form action='" . make_link("pool/remove_posts") . "' method='POST' name='checks'>"; foreach ($images as $pair) { $image = $pair[0]; $thumb_html = $this->build_thumb_html($image); $pool_images .= '<span class="thumb">' . "\n" . $thumb_html . "\n" . '<br><input name="check[]" type="checkbox" value="' . $image->id . '" />' . '</span>'; } $pool_images .= "<br>" . "<input type='submit' name='edit' id='edit_pool_remove_sel' value='Remove Selected'/>" . "<input type='hidden' name='pool_id' value='" . $pools[0]['id'] . "'>" . "</form>"; $pools[0]['description'] = ""; //This is a rough fix to avoid showing the description twice. $this->display_top($pools, "Editing Pool", true); $page->add_block(new Block("Editing Description", $desc_html, "main", 28)); $page->add_block(new Block("Editing Posts", $pool_images, "main", 30)); } /** * HERE WE DISPLAY THE HISTORY LIST. */ public function show_history(array $histories, int $pageNumber, int $totalPages) { global $page; $html = ' <table id="poolsList" class="zebra"> <thead><tr> <th>Pool</th> <th>Post Count</th> <th>Changes</th> <th>Updater</th> <th>Date</th> <th>Action</th> </tr></thead><tbody>'; foreach ($histories as $history) { $pool_link = "<a href='" . make_link("pool/view/" . $history['pool_id']) . "'>" . html_escape($history['title']) . "</a>"; $user_link = "<a href='" . make_link("user/" . url_escape($history['user_name'])) . "'>" . html_escape($history['user_name']) . "</a>"; $revert_link = "<a href='" . make_link("pool/revert/" . $history['id']) . "'>Revert</a>"; if ($history['action'] == 1) { $prefix = "+"; } elseif ($history['action'] == 0) { $prefix = "-"; } else { throw new Exception("history['action'] not in {0, 1}"); } $images = trim($history['images']); $images = explode(" ", $images); $image_link = ""; foreach ($images as $image) { $image_link .= "<a href='" . make_link("post/view/" . $image) . "'>" . $prefix . $image . " </a>"; } $html .= "<tr>" . "<td class='left'>" . $pool_link . "</td>" . "<td>" . $history['count'] . "</td>" . "<td>" . $image_link . "</td>" . "<td>" . $user_link . "</td>" . "<td>" . $history['date'] . "</td>" . "<td>" . $revert_link . "</td>" . "</tr>"; } $html .= "</tbody></table>"; $this->display_top(null, "Recent Changes"); $page->add_block(new Block("Recent Changes", $html, "main", 10)); $this->display_paginator($page, "pool/updated", null, $pageNumber, $totalPages); } public function get_bulk_pool_selector(array $pools) { $output = "<select name='bulk_pool_select' required='required'><option></option>"; foreach ($pools as $pool) { $output .= "<option value='" . $pool["id"] . "' >" . $pool["title"] . "</option>"; } return $output . "</select>"; } public function get_bulk_pool_input(array $search_terms) { return "<input type='text' name='bulk_pool_new' placeholder='New pool' required='required' value='".(implode(" ",$search_terms))."' />"; } }