/ src / views / elements / GroupbarElement.php
<?php
/**
 * SeekQuarry/Yioop --
 * Open Source Pure PHP Search Engine, Crawler, and Indexer
 *
 * Copyright (C) 2009 - 2026  Chris Pollett chris@pollett.org
 *
 * LICENSE:
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * END LICENSE
 *
 * @author Chris Pollett chris@pollett.org
 * @license https://www.gnu.org/licenses/ GPL3
 * @link https://www.seekquarry.com/
 * @copyright 2009 - 2026
 * @filesource
 */
namespace seekquarry\yioop\views\elements;

use seekquarry\yioop as B;
use seekquarry\yioop\configs as C;
use seekquarry\yioop\library as L;
/**
 * Element used to draw the navigation bar on group feed and wiki pages.
 *
 * @author Chris Pollett
 */
class GroupbarElement extends Element
{
    /**
     * Used to draw the navigation bar on the group feed and wiki page portion
     * of the yioop website
     *
     * @param array $data contains antiCSRF token, as well as data on
     *     used to initialize title for group or wiki page
     */
    public function render($data)
    {
        if (isset($data["HEAD"]['page_type']) &&
            $data["HEAD"]['page_type'] == 'presentation' &&
            $data['MODE'] == 'read' ) {
            return;
        }
        $logo_field = "LOGO_MEDIUM";
        $logo = C\p('LOGO_MEDIUM');
        if ($_SERVER["MOBILE"]) {
            $logo_field = "LOGO_SMALL";
            $logo = C\p('LOGO_SMALL');
        }
        $logo = $this->view->helper("logo")->render($data,
            $logo_field, $logo);
        $logged_in = !empty($data["ADMIN"]);
        $is_browse = (!$logged_in || isset($data['SUBSCRIBE_LINK']) ||
            !empty($data["NOT_MEMBER"]));
        $is_wiki = isset($data['ELEMENT']) && $data['ELEMENT'] == 'wiki';
        $token_string = ($logged_in) ? C\p('CSRF_TOKEN') . "=" .
            $data[C\p('CSRF_TOKEN')]
            : "";
        $alt_base_query = B\feedsUrl("",
            "", true, $data['CONTROLLER']) . $token_string;
        $base_query = ($is_wiki) ? htmlentities(B\wikiUrl("", true,
            $data['CONTROLLER'], $data["GROUP"]["GROUP_ID"])) : $alt_base_query;
        $admin_url = htmlentities(B\controllerUrl('admin', true));
        /* controllerUrl leaves a url ready for the first thing in its
           query, the same as wikiUrl does, so the token when there is one
           is that first thing and what follows needs a separator; with
           nobody signed in there is no token and what follows is itself
           the first thing. */
        $admin_query = $admin_url . $token_string;
        if ($token_string !== "") {
            $admin_query .= "&";
        }
        ?><div class="none" >[<a href="#center-container"><?=
        tl('groupbar_element_skip_nav')
        ?>]</a></div><div id='nav-bar' class="nav-bar">
            <div class='inner-bar'><?php
            $this->view->helper("hamburger")->render($logged_in);
            if (!empty($data['ACTIVITY_METHOD']) &&
                $data['ACTIVITY_METHOD'] == 'wiki') {
                $this->renderWikiNavButtons($data);
            }
            ?>
        <div class="title-block">
        <h1><a href="<?=C\SHORT_BASE_URL ?><?php
            if ($logged_in) {
                e("?$token_string");
            }
            ?>"><img src="<?= $logo ?>" alt="<?=
            $this->view->logo_alt_text ?? "" ?>" ></a></h1>
            <div class='nav-span'> - <?php
        if (!empty($data['ACTIVITY_METHOD']) &&
            $data['ACTIVITY_METHOD'] == 'wiki') {
            $group_url = $this->getGroupUrl($data['GROUP']['GROUP_NAME'],
                $token_string, $is_browse);
            $wiki_page_list_url = rtrim(htmlentities(B\wikiUrl(
                "pages", true, $data['CONTROLLER'],
                $data["GROUP"]["GROUP_ID"])) . $token_string, "?");
            $this->view->helper("iconlink")->renderButton(
                $admin_query . "a=manageAccounts", "account_home");
            $page_name = str_replace("_", " ", $data['PAGE_NAME']?? "");
            if ($page_name == "Main") {
                $page_name = tl('groupbar_element_wiki');
            }
            $is_page_list = false;
            if ($data['MODE'] == 'pages') {
                $page_name = tl('groupbar_element_page_list');
                $is_page_list = true;
            }
            ?><a class="bar-item" href="<?=$group_url ?>"><?=
            urldecode($data['GROUP']['GROUP_NAME']) ?></a>:<?php
            $colon = "";
            if (!$is_page_list) {
                $this->view->helper("iconlink")->renderButton(
                    $wiki_page_list_url, "pages");
                $colon = ":";
            }
            if ($data['PAGE_NAME'] != "Main" && in_array(
                $data['MODE'], ['read', 'edit', 'source'])) {
                $colon = ":";
                $wiki_main_url = htmlentities(B\wikiUrl(
                    "Main", true, $data['CONTROLLER'],
                    $data["GROUP"]["GROUP_ID"])) . $token_string;
                $this->view->helper("iconlink")->renderButton(
                    $wiki_main_url, "wiki");
            }
            e($colon);
            if ($data['MODE'] == 'read' &&
                ($_REQUEST['repo_view'] ?? "") == 'issues') {
                $read_url = htmlentities(B\wikiUrl($data['PAGE_NAME'],
                    true, $data['CONTROLLER'],
                    $data["GROUP"]["GROUP_ID"])) . $token_string;
                ?><a class="bar-item" href='<?=$read_url ?>'><?=
                    urldecode($page_name)?></a><?php
            } else if ($data['MODE'] == 'read') {
                ?><div class="bar-item"><?=urldecode($page_name)?></div><?php
            } else if ($data['MODE'] == 'pages') {
                ?><div class="wide-bar-item"><?=
                urldecode($page_name)?></div><?php
            } else {
                $wiki_base_url = htmlentities(B\wikiUrl(
                    $data['PAGE_NAME'], true, $data['CONTROLLER'],
                    $data["GROUP"]["GROUP_ID"])) . $token_string;
                ?><a class="bar-item" href='<?=$wiki_base_url
                    ?>'  target='preview'><?=urldecode($page_name); ?></a><?php
                if ($data['MODE'] == 'history') {
                    ?>:<?=tl('groupbar_element_history');?><?php
                }
            }
        } else if (($data['SUBTITLE'] ?? "") == C\PERSONAL_GROUP_PREFIX) {?>
                <?=
                $this->view->helper("iconlink")->renderButton(
                $admin_query . "a=manageAccounts",
                "account_home");?> <?=
                (($data['ACTIVITY_METHOD'] ?? "") == 'userMail') ?
                tl('groupbar_element_mail') :
                tl('groupbar_element_messages') ?><?php
        } else {
            $this->view->helper("iconlink")->renderButton(
                $admin_query . "a=manageAccounts", "account_home");
            e(" ");
            if (!empty($data['JUST_THREAD']) &&
                !empty($data['WIKI_PAGE_NAME'])) {
                    $group_name = $data['GROUP_NAME'] ??
                        $data['PAGES'][0][L\CrawlConstants::SOURCE_NAME]
                        ?? "";
                    $group_url = $this->getGroupUrl($group_name,
                        $token_string, $is_browse);
                    $group_id = $data["GROUP_ID"] ??
                        $data['PAGES'][0]["GROUP_ID"] ?? "";
                    $wiki_base_url = htmlentities(B\wikiUrl(
                        $data['WIKI_PAGE_NAME'], true, $data['CONTROLLER'],
                        $group_id)) . $token_string;?>
                    <a class="bar-item" href='<?=$group_url ?>' ><?=$group_name
                    ?></a>:<a class="bar-item" href='<?=$wiki_base_url ?>' ><?=
                    $data['WIKI_PAGE_NAME'] ?></a>:<div class="bar-item"><?=
                    tl('groupbar_element_talk');?></div><?php
            } else if (!empty($data['JUST_GROUP_ID'])) {
                $group_url = $this->getGroupUrl($data['SUBTITLE'],
                    $token_string, $is_browse); ?>
                <a class="wide-bar-item" href='<?=$group_url ?>' ><?=
                urldecode($data['SUBTITLE']);
                ?></a>:<div class="bar-item"><?=
                tl('groupbar_element_talk');?></div><?php
            } else if (!empty($data['JUST_USER_ID'])) {
                if (empty($data['PAGES'][0]["USER_NAME"])) {
                    e(tl("groupbar_element_no_path_info"));
                } else {?>
                    <div class="wide-bar-item" ><?=
                        tl("groupbar_element_userfeed",
                        urldecode($data['PAGES'][0]["USER_NAME"]))?></div><?php
                }
            } else if (!empty($data['JUST_THREAD'])) {
                if (!empty($data['GROUP_NAME'])) {
                    $group_url = $this->getGroupUrl($data['GROUP_NAME'],
                        $token_string, $is_browse);
                    ?><a class="bar-item" href='<?=$group_url?>'><?=
                        urldecode($data['GROUP_NAME'])
                    ?></a>:<a class="bar-item" href='<?=htmlentities(
                        B\feedsUrl("group", $data["GROUP_ID"],
                        true, 'group')) . $token_string?>' ><?=
                        tl("groupbar_element_talk")
                        ?></a>:<div class="bar-item"><?=
                        urldecode($data['SUBTITLE'])?></div><?php
                } else {
                    e(urldecode($data['SUBTITLE']));
                }
                if (!empty($data['SHOW_THREAD_FOLLOW'])) {
                    $follow_base = B\feedsUrl("thread",
                        $data['JUST_THREAD'], true, "group") .
                        C\p('CSRF_TOKEN') . "=" . $data[C\p('CSRF_TOKEN')];
                    if (!empty($data['THREAD_FOLLOWED'])) {
                        $follow_url = $follow_base .
                            "&arg=togglethreadmail&follow=0";
                        $follow_type = "thread_followed";
                    } else {
                        $follow_url = $follow_base .
                            "&arg=togglethreadmail&follow=1";
                        $follow_type = "thread_unfollowed";
                    }
                    $this->view->helper("iconlink")->renderButton(
                        $follow_url, $follow_type);
                }
            } else if (!empty($data['VIEW_MODE']) &&
                $data['VIEW_MODE'] == "ungrouped") {
                e(tl('groupbar_element_discussions'));
            } else {
                e(tl('groupbar_element_my_groups'));
            }
        }?></div>
        </div>
        </div>
        </div>
        <?php
    }
    /**
     * Computes the url  to show one group in the
     * already belong to the group ($is_browse == false) and the
     * just looking at group ($is_browse == true) setting.
     *
     * @param string $group_name name of single group to show
     * @param string $token_string CSRF token to show legitimately logged in
     * @param bool $is_browse whether already belong to group (false) or not.
     * @return string url to either My Groups or Join Groups pages for group
     */
    public function getGroupUrl($group_name, $token_string, $is_browse)
    {
        /* controllerUrl leaves the url ready for the first thing in its
           query, so the token when there is one is that first thing and
           needs a separator after it; with nobody signed in there is no
           token and what follows is itself the first thing. */
        $token_query = ($token_string === "") ? "" :
            $token_string . "&";
        if ($is_browse) {
            $group_url = htmlentities(B\controllerUrl('admin', true)) .
                $token_query . "a=manageGroups&context=group" .
                "&group_filter=%3D$group_name&browse=true";
        } else {
            $group_url = htmlentities(B\controllerUrl('group', true)) .
                $token_query . "group_filter=%3D$group_name";
        }
        return $group_url;
    }
    /**
     * Draws navigation controls in the GroupBar when on Wiki pages
     * (floated to opposite side of current reading direction) allowing
     * a user depending on the access to the group to edit or view source of a
     * page and to see the pages discussion thread.
     *
     * @param array $data associative array of data from the controller/
     *   SocialComponent used to draw th enav buttons.
     */
    public function renderWikiNavButtons($data)
    {
        $read_mode = in_array($data['MODE'], ['read', 'ballot-init',
            'count-ballots', 'ballot-concluded']);
        $logged_in = !empty($data["ADMIN"]);
        $token_string = ($logged_in) ? C\p('CSRF_TOKEN') . "=" .
            $data[C\p('CSRF_TOKEN')]
            : "";
        $can_edit = $logged_in && !empty($data["CAN_EDIT"]);
        $public_source = empty($data['NO_HISTORY_SOURCE']);
        $wiki_base_url = htmlentities(B\wikiUrl(
            $data['PAGE_NAME'], true, $data['CONTROLLER'],
            $data["GROUP"]["GROUP_ID"])) . $token_string;
        /* wikiUrl leaves a url ready for the first thing in its query, so
           the token, when there is one, is that first thing and what
           follows it needs a separator of its own. Nobody signed in
           carries no token, and then what follows is itself the first
           thing and needs no separator; writing one anyway is what put a
           stray ampersand straight after the question mark. */
        if ($token_string !== "") {
            $wiki_base_url .= "&";
        }
        $page_type = $data["HEAD"]['page_type'] ??
            ($data['page_type'] ?? "");
        $is_git_repository = ($page_type == 'git_repository');
        $issues_url = $wiki_base_url . "arg=read&repo_view=issues";
        $discuss_url = (!empty($data['DISCUSS_THREAD']) &&
            ($can_edit|| $public_source)) ?
            htmlentities(B\feedsUrl("thread",
            $data['DISCUSS_THREAD'], true, "group")) . $token_string : "";
        e("<div class='float-opposite medium-margin'>");
        if (!$read_mode) {
            $read_url = $wiki_base_url . "arg=read";
            if (!empty($data['SUB_PATH'])) {
                $read_url .= "&sf=".urlencode($data['SUB_PATH']);
            }
            $this->view->helper("iconlink")->renderButton(
                $read_url, "view_read");
        } else if ($can_edit) {
            $edit_url = $wiki_base_url . "arg=edit";
            if (!empty($data['SUB_PATH'])) {
                $edit_url .= "&sf=".urlencode($data['SUB_PATH']);
            }
            $this->view->helper("iconlink")->renderButton(
                $edit_url, "edit");
        } else if ($public_source) {
            $source_url = $wiki_base_url . "arg=source";
            if (!empty($data['SUB_PATH'])) {
                $source_url .= "&sf=".urlencode($data['SUB_PATH']);
            }
            $this->view->helper("iconlink")->renderButton(
                $source_url, "view_source");
        }
        if ($is_git_repository) {
            e("<div id='discuss-button'>");
            $this->view->helper("iconlink")->renderButton(
                $issues_url, "issue_tracker");
            e("</div>");
        } else if (!empty($discuss_url)) {
            e("<div id='discuss-button'>");
            $this->view->helper("iconlink")->renderButton(
                $discuss_url, "discuss_page");
            e("</div>");
        }
        e("</div>");
    }
}
X