var subscriptionState = toggleElement.data('targetstate');
Repository.setFavouriteDiscussionState(forumId, discussionId, subscriptionState)
.then(function() {
- location.reload();
+ return location.reload();
})
.catch(Notification.exception);
});
var state = toggleElement.data('targetstate');
Repository.setPinDiscussionState(forumId, discussionId, state)
.then(function() {
- location.reload();
+ return location.reload();
})
.catch(Notification.exception);
});
* @return bool Whether or not the user has favourited the discussion
*/
public function is_favourited(discussion_entity $discussion, \context_module $forumcontext, \stdClass $user) {
+ if (!isloggedin()) {
+ return false;
+ }
+
$usercontext = \context_user::instance($user->id);
$ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
return $ufservice->favourite_exists('mod_forum', 'discussions', $discussion->get_id(), $forumcontext);
* @return int[] A list of favourited itemids
*/
private function get_favourites(stdClass $user) : array {
- $usercontext = \context_user::instance($user->id);
- $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
- $favourites = $ufservice->find_favourites_by_type('mod_forum', 'discussions');
$ids = [];
- foreach ($favourites as $favourite) {
- $ids[] = $favourite->itemid;
+
+ if (isloggedin()) {
+ $usercontext = \context_user::instance($user->id);
+ $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
+ $favourites = $ufservice->find_favourites_by_type('mod_forum', 'discussions');
+ foreach ($favourites as $favourite) {
+ $ids[] = $favourite->itemid;
+ }
}
return $ids;
* @param object|null $user The user object
* @return string
*/
- abstract protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string;
+ abstract protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null,
+ \stdClass $user = null) : string;
/**
* Convert the DB records into entities. The list of records will have been
$alias = $this->get_table_alias();
$db = $this->get_db();
- if ($user) {
- list($favsql, $favparams) = $this->get_favourite_sql($user);
- foreach ($favparams as $key => $param) {
- $favsql = str_replace(":$key", "'$param'", $favsql);
- }
+ list($favsql, $favparams) = $this->get_favourite_sql($user);
+ foreach ($favparams as $key => $param) {
+ $favsql = str_replace(":$key", "'$param'", $favsql);
}
// Fetch:
*
* @param int|null $sortmethod
*/
- public function get_sort_order(?int $sortmethod) : string {
+ public function get_sort_order(?int $sortmethod, $includefavourites = true) : string {
global $CFG;
$alias = $this->get_table_alias();
}
}
- return "{$alias}.pinned DESC, {$this->get_favourite_alias()}.id DESC, {$keyfield} {$direction}";
+ $favouritesort = ($includefavourites ? ", {$this->get_favourite_alias()}.id DESC" : "");
+
+ return "{$alias}.pinned DESC $favouritesort , {$keyfield} {$direction}";
}
/**
'forumid' => $forumid,
]);
- $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder), $user);
+ $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder, isloggedin()), $user);
$records = $this->get_db()->get_records_sql($sql, $params, $offset, $limit);
return $this->transform_db_records_to_entities($records);
'allgroupsid' => -1,
]);
- $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder), $user);
+ $sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder, isloggedin()), $user);
$records = $this->get_db()->get_records_sql($sql, $params, $offset, $limit);
return $this->transform_db_records_to_entities($records);
* @param stdClass $user The user we are getting the sql for
* @return [$sql, $params] An array comprising of the sql and any associated params
*/
- private function get_favourite_sql(stdClass $user): array {
- $usercontext = \context_user::instance($user->id);
- $alias = $this->get_table_alias();
- $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
- list($favsql, $favparams) = $ufservice->get_join_sql_by_type('mod_forum', 'discussions',
- $this->get_favourite_alias(), "$alias.id");
+ private function get_favourite_sql(?stdClass $user): array {
+ $favsql = "";
+ $favparams = [];
+
+ if ($user && isloggedin()) {
+ $usercontext = \context_user::instance($user->id);
+ $alias = $this->get_table_alias();
+ $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
+ list($favsql, $favparams) = $ufservice->get_join_sql_by_type('mod_forum', 'discussions',
+ $this->get_favourite_alias(), "$alias.id");
+ }
return [$favsql, $favparams];
}
$canlock = has_capability('moodle/course:manageactivities', $modcontext, $USER);
$replies = forum_count_discussion_replies($forumid, $sort, -1, $page, $perpage, $canseeprivatereplies);
- $usercontext = context_user::instance($USER->id);
- $ufservice = core_favourites\service_factory::get_service_for_user_context($usercontext);
+ if (isloggedin()) {
+ $usercontext = context_user::instance($USER->id);
+ $ufservice = core_favourites\service_factory::get_service_for_user_context($usercontext);
+ }
$canfavourite = has_capability('mod/forum:cantogglefavourite', $modcontext, $USER);
foreach ($alldiscussions as $discussion) {
$discussion->locked = forum_discussion_is_locked($forum, $discussion);
$discussion->canlock = $canlock;
- $discussion->starred = $ufservice->favourite_exists('mod_forum', 'discussions',
- $discussionrec->id, $modcontext);
+ $discussion->starred = !empty($ufservice) ? $ufservice->favourite_exists('mod_forum', 'discussions',
+ $discussionrec->id, $modcontext) : false;
$discussion->canreply = forum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext);
$discussion->canfavourite = $canfavourite;
$forumvault = $vaultfactory->get_forum_vault();
$forum = $forumvault->get_from_id($discussion->get_forum_id());
$forumcontext = $forum->get_context();
- $usercontext = context_user::instance($USER->id);
-
self::validate_context($forumcontext);
$managerfactory = mod_forum\local\container::get_manager_factory();
if (!$capabilitymanager->can_favourite_discussion($USER, $discussion)) {
throw new moodle_exception('cannotfavourite', 'forum');
}
-
+ $usercontext = context_user::instance($USER->id);
$ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
$isfavourited = $ufservice->favourite_exists('mod_forum', 'discussions', $discussion->get_id(), $forumcontext);
$string['forum:allowforcesubscribe'] = 'Allow force subscribe';
$string['forum:canoverridecutoff'] = 'Post to forums after their cut-off date';
$string['forum:canoverridediscussionlock'] = 'Reply to locked discussions';
+$string['forum:cantogglefavourite'] = 'Can toggle favourites.';
$string['forumauthorhidden'] = 'Author (hidden)';
$string['forumblockingalmosttoomanyposts'] = 'You are approaching the posting threshold. You have posted {$a->numposts} times in the last {$a->blockperiod} and the limit is {$a->blockafter} posts.';
$string['forumbodyhidden'] = 'This post cannot be viewed by you, probably because you have not posted in the discussion, the maximum editing time hasn\'t passed yet, the discussion has not started or the discussion has expired.';
data-action="toggle"
data-discussionid="{{id}}"
data-forumid="{{forumid}}"
- role="menuitem",
tabindex="-1"
{{#userstate.favourited}}
data-targetstate="0"
data-forumid="{{forumid}}"
href="{{urls.pin}}"
tabindex="-1"
- role="menuitem"
{{#pinned}}
data-targetstate="0"
title="{{#str}}unpindiscussion, mod_forum{{/str}}"
data-rel="menu-content"
role="menu"
id="forum-action-menu-{{id}}-menu">
- <div class="dropdown-item">
+ {{#capabilities.favourite}}
+ <div class="dropdown-item" role="menuitem">
{{> mod_forum/discussion_favourite_toggle}}
</div>
- <div class="dropdown-item">
+ {{/capabilities.favourite}}
+ {{#capabilities.pin}}
+ <div class="dropdown-item" role="menuitem">
{{> mod_forum/discussion_pin_toggle}}
</div>
+ {{/capabilities.pin}}
</div>
</div>
\ No newline at end of file
var root = $("[data-content='forum-discussion']");
Discussion.init(root);
PostsList.init(root);
- var root = $('[data-container="discussion-tools"]');
+ root = $('[data-container="discussion-tools"]');
LockToggle.init(root);
FavouriteToggle.init(root);
Pin.init(root);
public function i_click_on_action_menu($discussion) {
$this->execute('behat_general::i_click_on_in_the', [
"[data-container='discussion-tools'] [data-toggle='dropdown']", "css_element",
- "//tr[@class='discussion' and contains(.,'$discussion')]", "xpath_element"
+ "//tr[contains(concat(' ', normalize-space(@class), ' '), ' discussion ') and contains(.,'$discussion')]",
+ "xpath_element"
]);
}
| Message | Discussion contents 1, third message |
And I wait until the page is ready
And I open the action menu in "[data-container='discussion-tools']" "css_element"
- And I click on "Star this discussion" "link"
+ And I click on "[title='Star this discussion']" "css_element"
And I wait "3" seconds
And I open the action menu in "[data-container='discussion-tools']" "css_element"
- Then I should see "Unstar this discussion"
+ And I click on "[title='Unstar this discussion']" "css_element"
Scenario: Student can favourite a discussion from the discussion list
Given I reply "Discussion 1" post from "Test forum name" forum with:
| Message | Discussion contents 1, third message |
And I follow "Test forum name"
And I click on "Discussion 1" action menu
- And I click on "Star this discussion" "link"
+ And I click on "[title='Star this discussion']" "css_element"
And I click on "Discussion 1" action menu
- Then I should see "Unstar this discussion"
\ No newline at end of file
+ And I click on "[title='Unstar this discussion']" "css_element"
\ No newline at end of file
$response = mod_forum_external::toggle_favourite_state($discussion1->id, 0);
$response = external_api::clean_returnvalue(mod_forum_external::toggle_favourite_state_returns(), $response);
$this->assertFalse($response['userstate']['favourited']);
+
+ $this->setUser(0);
+ try {
+ $response = mod_forum_external::toggle_favourite_state($discussion1->id, 0);
+ } catch (moodle_exception $e) {
+ $this->assertEquals('requireloginerror', $e->errorcode);
+ }
}
/**
$this->assertEquals($expectedreturn, $discussions);
- // Test the starring functionality return
+ // Test the starring functionality return.
$t = mod_forum_external::toggle_favourite_state($discussion1->id, 1);
$expectedreturn['discussions'][0]['starred'] = true;
$discussions = mod_forum_external::get_forum_discussions_paginated($forum1->id);