mirror of
https://github.com/moodle/moodle.git
synced 2025-03-14 04:30:15 +01:00
MDL-65033 mod_forum: Feedback updates
This commit is contained in:
parent
309e869827
commit
8885cd573a
2
mod/forum/amd/build/discussion_list.min.js
vendored
2
mod/forum/amd/build/discussion_list.min.js
vendored
@ -1 +1 @@
|
||||
define(["jquery","mod_forum/subscription_toggle","mod_forum/selectors","mod_forum/repository"],function(a,b,c,d){var e=function(b){b.on("click",c.favourite.toggle,function(){var b=a(this),c=b.data("forumid"),e=b.data("discussionid"),f=b.data("targetstate");d.toggleFavouriteDiscussionState(c,e,f).then(function(){location.reload()})["catch"](Notification.exception)}),b.on("click",c.pin.toggle,function(){var b=a(this),c=b.data("forumid"),e=b.data("discussionid"),f=b.data("targetstate");d.togglePin(c,e,f).then(function(){location.reload()})["catch"](Notification.exception)})};return{init:function(a){b.init(a),e(a)}}});
|
||||
define(["jquery","mod_forum/subscription_toggle","mod_forum/selectors","mod_forum/repository"],function(a,b,c,d){var e=function(b){b.on("click",c.favourite.toggle,function(){var b=a(this),c=b.data("forumid"),e=b.data("discussionid"),f=b.data("targetstate");d.setFavouriteDiscussionState(c,e,f).then(function(){location.reload()})["catch"](Notification.exception)}),b.on("click",c.pin.toggle,function(b){b.preventDefault();var c=a(this),e=c.data("forumid"),f=c.data("discussionid"),g=c.data("targetstate");d.setPinDiscussionState(e,f,g).then(function(){location.reload()})["catch"](Notification.exception)})};return{init:function(a){b.init(a),e(a)}}});
|
2
mod/forum/amd/build/favourite_toggle.min.js
vendored
2
mod/forum/amd/build/favourite_toggle.min.js
vendored
@ -1 +1 @@
|
||||
define(["jquery","core/templates","core/notification","mod_forum/repository","mod_forum/selectors"],function(a,b,c,d,e){var f=function(f){f.on("click",e.favourite.toggle,function(e){var f=a(this),g=f.data("forumid"),h=f.data("discussionid"),i=f.data("targetstate");d.toggleFavouriteDiscussionState(g,h,i).then(function(a){return b.render("mod_forum/discussion_favourite_toggle",a)}).then(function(a,c){return b.replaceNode(f,a,c)})["catch"](c.exception),e.preventDefault()})};return{init:function(a){f(a)}}});
|
||||
define(["jquery","core/templates","core/notification","mod_forum/repository","mod_forum/selectors"],function(a,b,c,d,e){var f=function(f){f.on("click",e.favourite.toggle,function(e){var f=a(this),g=f.data("forumid"),h=f.data("discussionid"),i=f.data("targetstate");d.setFavouriteDiscussionState(g,h,i).then(function(a){return b.render("mod_forum/discussion_favourite_toggle",a)}).then(function(a,c){return b.replaceNode(f,a,c)})["catch"](c.exception),e.preventDefault()})};return{init:function(a){f(a)}}});
|
2
mod/forum/amd/build/pin_toggle.min.js
vendored
2
mod/forum/amd/build/pin_toggle.min.js
vendored
@ -1 +1 @@
|
||||
define(["jquery","core/ajax","core/str","core/templates","core/notification","mod_forum/repository","mod_forum/selectors"],function(a,b,c,d,e,f,g){var h=function(b){b.on("click",g.pin.toggle,function(b){var c=a(this),g=c.data("forumid"),h=c.data("discussionid"),i=c.data("targetstate"),j=c.data("includetext");f.togglePin(g,h,i,j).then(function(a){return d.render("mod_forum/discussion_pin_toggle",a)}).then(function(a,b){return d.replaceNode(c,a,b)}).then(function(){return e.fetchNotifications()}).fail(e.exception),b.preventDefault()})};return{init:function(a){h(a)}}});
|
||||
define(["jquery","core/ajax","core/str","core/templates","core/notification","mod_forum/repository","mod_forum/selectors"],function(a,b,c,d,e,f,g){var h=function(b){b.on("click",g.pin.toggle,function(b){var c=a(this),g=c.data("forumid"),h=c.data("discussionid"),i=c.data("targetstate");f.setPinDiscussionState(g,h,i).then(function(a){return d.render("mod_forum/discussion_pin_toggle",a)}).then(function(a,b){return d.replaceNode(c,a,b)}).fail(e.exception),b.preventDefault()})};return{init:function(a){h(a)}}});
|
2
mod/forum/amd/build/repository.min.js
vendored
2
mod/forum/amd/build/repository.min.js
vendored
@ -1 +1 @@
|
||||
define(["core/ajax"],function(a){var b=function(b,c,d){var e={methodname:"mod_forum_set_subscription_state",args:{forumid:b,discussionid:c,targetstate:d}};return a.call([e])[0]},c=function(b,c,d){var e={methodname:"mod_forum_add_discussion_post",args:{postid:b,message:d,subject:c}};return a.call([e])[0]},d=function(b,c,d){var e={methodname:"mod_forum_toggle_favourite_state",args:{forumid:b,discussionid:c,targetstate:d}};return a.call([e])[0]},e=function(b,c,d){var e={methodname:"mod_forum_set_lock_state",args:{forumid:b,discussionid:c,targetstate:d}};return a.call([e])[0]},f=function(b,c,d,e){var f={methodname:"mod_forum_set_pin_state",args:{forumid:b,discussionid:c,targetstate:d,includetext:e}};return a.call([f])[0]};return{setDiscussionSubscriptionState:b,addDiscussionPost:c,setDiscussionLockState:e,toggleFavouriteDiscussionState:d,togglePin:f}});
|
||||
define(["core/ajax"],function(a){var b=function(b,c,d){var e={methodname:"mod_forum_set_subscription_state",args:{forumid:b,discussionid:c,targetstate:d}};return a.call([e])[0]},c=function(b,c,d){var e={methodname:"mod_forum_add_discussion_post",args:{postid:b,message:d,subject:c}};return a.call([e])[0]},d=function(b,c,d){var e={methodname:"mod_forum_toggle_favourite_state",args:{discussionid:c,targetstate:d}};return a.call([e])[0]},e=function(b,c,d){var e={methodname:"mod_forum_set_lock_state",args:{forumid:b,discussionid:c,targetstate:d}};return a.call([e])[0]},f=function(b,c,d){var e={methodname:"mod_forum_set_pin_state",args:{discussionid:c,targetstate:d}};return a.call([e])[0]};return{setDiscussionSubscriptionState:b,addDiscussionPost:c,setDiscussionLockState:e,setFavouriteDiscussionState:d,setPinDiscussionState:f}});
|
@ -38,19 +38,20 @@ define([
|
||||
var forumId = toggleElement.data('forumid');
|
||||
var discussionId = toggleElement.data('discussionid');
|
||||
var subscriptionState = toggleElement.data('targetstate');
|
||||
Repository.toggleFavouriteDiscussionState(forumId, discussionId, subscriptionState)
|
||||
Repository.setFavouriteDiscussionState(forumId, discussionId, subscriptionState)
|
||||
.then(function() {
|
||||
location.reload();
|
||||
})
|
||||
.catch(Notification.exception);
|
||||
});
|
||||
|
||||
root.on('click', Selectors.pin.toggle, function() {
|
||||
root.on('click', Selectors.pin.toggle, function(e) {
|
||||
e.preventDefault();
|
||||
var toggleElement = $(this);
|
||||
var forumId = toggleElement.data('forumid');
|
||||
var discussionId = toggleElement.data('discussionid');
|
||||
var state = toggleElement.data('targetstate');
|
||||
Repository.togglePin(forumId, discussionId, state)
|
||||
Repository.setPinDiscussionState(forumId, discussionId, state)
|
||||
.then(function() {
|
||||
location.reload();
|
||||
})
|
||||
|
@ -48,7 +48,7 @@ define([
|
||||
var discussionId = toggleElement.data('discussionid');
|
||||
var subscriptionState = toggleElement.data('targetstate');
|
||||
|
||||
Repository.toggleFavouriteDiscussionState(forumId, discussionId, subscriptionState)
|
||||
Repository.setFavouriteDiscussionState(forumId, discussionId, subscriptionState)
|
||||
.then(function(context) {
|
||||
return Templates.render('mod_forum/discussion_favourite_toggle', context);
|
||||
})
|
||||
|
@ -54,18 +54,13 @@ define([
|
||||
var forumid = toggleElement.data('forumid');
|
||||
var discussionid = toggleElement.data('discussionid');
|
||||
var pinstate = toggleElement.data('targetstate');
|
||||
var includetext = toggleElement.data('includetext');
|
||||
|
||||
Repository.togglePin(forumid, discussionid, pinstate, includetext)
|
||||
Repository.setPinDiscussionState(forumid, discussionid, pinstate)
|
||||
.then(function(context) {
|
||||
return Templates.render('mod_forum/discussion_pin_toggle', context);
|
||||
})
|
||||
.then(function(html, js) {
|
||||
return Templates.replaceNode(toggleElement, html, js);
|
||||
})
|
||||
.then(function() {
|
||||
return Notification.fetchNotifications();
|
||||
})
|
||||
.fail(Notification.exception);
|
||||
|
||||
e.preventDefault();
|
||||
|
@ -60,14 +60,13 @@ define(['core/ajax'], function(Ajax) {
|
||||
*
|
||||
* @param {number} forumId ID of the forum the discussion belongs to
|
||||
* @param {number} discussionId ID of the discussion with the subscription state
|
||||
* @param {boolean} targetState Set the favourite state. True == favourited; false == unfavourited.
|
||||
* @param {null|date} targetState Set the favourite state. True == favourited; false == unfavourited.
|
||||
* @return {object} jQuery promise
|
||||
*/
|
||||
var toggleFavouriteDiscussionState = function(forumId, discussionId, targetState) {
|
||||
var setFavouriteDiscussionState = function(forumId, discussionId, targetState) {
|
||||
var request = {
|
||||
methodname: 'mod_forum_toggle_favourite_state',
|
||||
args: {
|
||||
forumid: forumId,
|
||||
discussionid: discussionId,
|
||||
targetstate: targetState
|
||||
}
|
||||
@ -86,14 +85,21 @@ define(['core/ajax'], function(Ajax) {
|
||||
return Ajax.call([request])[0];
|
||||
};
|
||||
|
||||
var togglePin = function(forumid, discussionid, targetstate, includetext) {
|
||||
/**
|
||||
* Set the pinned state for the discussion provided.
|
||||
*
|
||||
* @param {number} forumid
|
||||
* @param {number} discussionid
|
||||
* @param {boolean} targetstate
|
||||
* @param includetext
|
||||
* @return {*|Promise}
|
||||
*/
|
||||
var setPinDiscussionState = function(forumid, discussionid, targetstate) {
|
||||
var request = {
|
||||
methodname: 'mod_forum_set_pin_state',
|
||||
args: {
|
||||
forumid: forumid,
|
||||
discussionid: discussionid,
|
||||
targetstate: targetstate,
|
||||
includetext: includetext,
|
||||
targetstate: targetstate
|
||||
}
|
||||
};
|
||||
return Ajax.call([request])[0];
|
||||
@ -103,7 +109,7 @@ define(['core/ajax'], function(Ajax) {
|
||||
setDiscussionSubscriptionState: setDiscussionSubscriptionState,
|
||||
addDiscussionPost: addDiscussionPost,
|
||||
setDiscussionLockState: setDiscussionLockState,
|
||||
toggleFavouriteDiscussionState: toggleFavouriteDiscussionState,
|
||||
togglePin: togglePin
|
||||
setFavouriteDiscussionState: setFavouriteDiscussionState,
|
||||
setPinDiscussionState: setPinDiscussionState
|
||||
};
|
||||
});
|
||||
|
@ -306,12 +306,10 @@ class discussion {
|
||||
* @param int $targetstate The state to change the pin to
|
||||
* @return bool
|
||||
*/
|
||||
public function set_pinned(int $targetstate): bool {
|
||||
public function set_pinned(int $targetstate): void {
|
||||
if ($targetstate != $this->pinned) {
|
||||
$this->pinned = $targetstate;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -202,7 +202,7 @@ class discussion extends exporter {
|
||||
],
|
||||
'userstate' => [
|
||||
'subscribed' => \mod_forum\subscriptions::is_subscribed($user->id, $forumrecord, $discussion->get_id()),
|
||||
'favourited' => discussion_entity::is_favourited($discussion, $forum->get_context(), $user),
|
||||
'favourited' => $this->is_favourited($discussion, $forum->get_context(), $user),
|
||||
],
|
||||
'capabilities' => [
|
||||
'subscribe' => $capabilitymanager->can_subscribe_to_discussion($user, $discussion),
|
||||
@ -243,6 +243,21 @@ class discussion extends exporter {
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the provided discussion has been favourited by the user.
|
||||
*
|
||||
* @param discussion $discussion The discussion record
|
||||
* @param context $forumcontext Forum context
|
||||
* @param \stdClass $user The user to check the favourite against
|
||||
*
|
||||
* @return bool Whether or not the user has favourited the discussion
|
||||
*/
|
||||
private function is_favourited(discussion_entity $discussion, \context_module $forumcontext, \stdClass $user) {
|
||||
$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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the legacy forum record from the forum entity.
|
||||
*
|
||||
|
@ -197,10 +197,6 @@ class discussion {
|
||||
$exporteddiscussion['html']['movediscussion'] = $this->get_move_discussion_html();
|
||||
}
|
||||
|
||||
if ($capabilities['pin']) {
|
||||
$exporteddiscussion['html']['pindiscussion'] = $this->get_pin_discussion_html();
|
||||
}
|
||||
|
||||
return $this->renderer->render_from_template('mod_forum/forum_discussion', $exporteddiscussion);
|
||||
}
|
||||
|
||||
@ -325,32 +321,6 @@ class discussion {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the HTML to render the pin discussion button.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function get_pin_discussion_html() : string {
|
||||
$discussion = $this->discussion;
|
||||
|
||||
if ($discussion->is_pinned()) {
|
||||
$pinlink = FORUM_DISCUSSION_UNPINNED;
|
||||
$pintext = get_string('unpindiscussion', 'forum');
|
||||
} else {
|
||||
$pinlink = FORUM_DISCUSSION_PINNED;
|
||||
$pintext = get_string('pindiscussion', 'forum');
|
||||
}
|
||||
|
||||
$params = [
|
||||
'pin' => $pinlink,
|
||||
'd' => $discussion->get_id(),
|
||||
'sesskey' => sesskey(),
|
||||
];
|
||||
$url = new moodle_url('discuss.php', $params);
|
||||
$link = new \action_link($url, $pintext, null, ['class' => 'btn btn-link']);
|
||||
return $this->renderer->render($link);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the HTML to render the export discussion button.
|
||||
*
|
||||
|
@ -314,7 +314,8 @@ class discussion_list {
|
||||
$user->id,
|
||||
$sortorder,
|
||||
$this->get_page_size($pagesize),
|
||||
$this->get_page_number($pageno) * $this->get_page_size($pagesize));
|
||||
$this->get_page_number($pageno) * $this->get_page_size($pagesize),
|
||||
$user);
|
||||
} else {
|
||||
return $discussions = $discussionvault->get_from_forum_id_and_group_id(
|
||||
$forum->get_id(),
|
||||
@ -323,7 +324,8 @@ class discussion_list {
|
||||
$user->id,
|
||||
$sortorder,
|
||||
$this->get_page_size($pagesize),
|
||||
$this->get_page_number($pageno) * $this->get_page_size($pagesize));
|
||||
$this->get_page_number($pageno) * $this->get_page_size($pagesize),
|
||||
$user);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,9 +55,10 @@ class author extends db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param \stdClass|null $user The user object
|
||||
* @return string
|
||||
*/
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null) : string {
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string {
|
||||
$selectsql = 'SELECT * FROM {' . self::TABLE . '} ' . $this->get_table_alias();
|
||||
$selectsql .= $wheresql ? ' WHERE ' . $wheresql : '';
|
||||
$selectsql .= $sortsql ? ' ORDER BY ' . $sortsql : '';
|
||||
|
@ -72,9 +72,10 @@ abstract class db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param object|null $user The user object
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function generate_get_records_sql(string $wheresql = null, string $sortsql = 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
|
||||
|
@ -58,9 +58,10 @@ class discussion extends db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param \stdClass|null $user The user object
|
||||
* @return string
|
||||
*/
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null) : string {
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string {
|
||||
$selectsql = 'SELECT * FROM {' . self::TABLE . '} ' . $this->get_table_alias();
|
||||
$selectsql .= $wheresql ? ' WHERE ' . $wheresql : '';
|
||||
$selectsql .= $sortsql ? ' ORDER BY ' . $sortsql : '';
|
||||
|
@ -88,14 +88,20 @@ class discussion_list extends db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param string|null $joinsql Additional join conditions for the sql
|
||||
* @param string|null $joinsql Additional join conditions for the sql
|
||||
* @param stdClass|null $user User we are performing this query for
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function generate_get_records_sql(string $wheresql = null, ?string $sortsql = null, ?string $joinsql = null) : string {
|
||||
protected function generate_get_records_sql(string $wheresql = null, ?string $sortsql = null, stdClass $user = null) : string {
|
||||
$alias = $this->get_table_alias();
|
||||
$db = $this->get_db();
|
||||
|
||||
list($favsql, $favparams) = $this->get_favourite_sql($user);
|
||||
foreach ($favparams as $key => $param) {
|
||||
$favsql = str_replace(":$key", "'$param'", $favsql);
|
||||
}
|
||||
|
||||
// Fetch:
|
||||
// - Discussion
|
||||
// - First post
|
||||
@ -117,7 +123,7 @@ class discussion_list extends db_table_vault {
|
||||
$tables .= ' JOIN {user} fa ON fa.id = ' . $alias . '.userid';
|
||||
$tables .= ' JOIN {user} la ON la.id = ' . $alias . '.usermodified';
|
||||
$tables .= ' JOIN ' . $posttable->get_from_sql() . ' ON fp.id = ' . $alias . '.firstpost';
|
||||
$tables .= $joinsql ? $joinsql : '';
|
||||
$tables .= $favsql ? $favsql : '';
|
||||
|
||||
$selectsql = 'SELECT ' . $fields . ' FROM ' . $tables;
|
||||
$selectsql .= $wheresql ? ' WHERE ' . $wheresql : '';
|
||||
@ -260,7 +266,8 @@ class discussion_list extends db_table_vault {
|
||||
?int $includepostsforuser,
|
||||
?int $sortorder,
|
||||
int $limit,
|
||||
int $offset
|
||||
int $offset,
|
||||
stdClass $user
|
||||
) {
|
||||
$alias = $this->get_table_alias();
|
||||
$wheresql = "{$alias}.forum = :forumid";
|
||||
@ -274,10 +281,7 @@ class discussion_list extends db_table_vault {
|
||||
'forumid' => $forumid,
|
||||
]);
|
||||
|
||||
list($favsql, $favparams) = $this->get_favourite_sql();
|
||||
$params += $favparams;
|
||||
|
||||
$sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder), $favsql);
|
||||
$sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder), $user);
|
||||
$records = $this->get_db()->get_records_sql($sql, $params, $offset, $limit);
|
||||
|
||||
return $this->transform_db_records_to_entities($records);
|
||||
@ -303,7 +307,8 @@ class discussion_list extends db_table_vault {
|
||||
?int $includepostsforuser,
|
||||
?int $sortorder,
|
||||
int $limit,
|
||||
int $offset
|
||||
int $offset,
|
||||
stdClass $user
|
||||
) {
|
||||
$alias = $this->get_table_alias();
|
||||
|
||||
@ -327,10 +332,7 @@ class discussion_list extends db_table_vault {
|
||||
'allgroupsid' => -1,
|
||||
]);
|
||||
|
||||
list($favsql, $favparams) = $this->get_favourite_sql();
|
||||
$params += $favparams;
|
||||
|
||||
$sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder), $favsql);
|
||||
$sql = $this->generate_get_records_sql($wheresql, $this->get_sort_order($sortorder), $user);
|
||||
$records = $this->get_db()->get_records_sql($sql, $params, $offset, $limit);
|
||||
|
||||
return $this->transform_db_records_to_entities($records);
|
||||
@ -411,9 +413,8 @@ class discussion_list extends db_table_vault {
|
||||
/**
|
||||
* Get the standard favouriting sql.
|
||||
*/
|
||||
private function get_favourite_sql(): array {
|
||||
global $USER;
|
||||
$usercontext = \context_user::instance($USER->id);
|
||||
private function get_favourite_sql($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',
|
||||
|
@ -61,9 +61,10 @@ class forum extends db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param \stdClass|null $user The user object
|
||||
* @return string
|
||||
*/
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null) : string {
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string {
|
||||
$db = $this->get_db();
|
||||
$alias = $this->get_table_alias();
|
||||
|
||||
|
@ -63,9 +63,10 @@ class post extends db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param \stdClass|null $user The user object
|
||||
* @return string
|
||||
*/
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null) : string {
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, stdClass $user = null) : string {
|
||||
$table = self::TABLE;
|
||||
$alias = $this->get_table_alias();
|
||||
$fields = $alias . '.*';
|
||||
|
@ -57,9 +57,10 @@ class post_read_receipt_collection extends db_table_vault {
|
||||
*
|
||||
* @param string|null $wheresql Where conditions for the SQL
|
||||
* @param string|null $sortsql Order by conditions for the SQL
|
||||
* @param \stdClass|null $user The user object
|
||||
* @return string
|
||||
*/
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null) : string {
|
||||
protected function generate_get_records_sql(string $wheresql = null, string $sortsql = null, \stdClass $user = null) : string {
|
||||
$selectsql = 'SELECT * FROM {' . self::TABLE . '} ' . $this->get_table_alias();
|
||||
$selectsql .= $wheresql ? ' WHERE ' . $wheresql : '';
|
||||
$selectsql .= $sortsql ? ' ORDER BY ' . $sortsql : '';
|
||||
|
@ -407,7 +407,7 @@ $capabilities = array(
|
||||
),
|
||||
'mod/forum:cantogglefavourite' => array(
|
||||
'captype' => 'write',
|
||||
'contextlevel' => CONTEXT_SYSTEM,
|
||||
'contextlevel' => CONTEXT_MODULE,
|
||||
'archetypes' => array(
|
||||
'user' => CAP_ALLOW
|
||||
)
|
||||
|
@ -1100,23 +1100,25 @@ class mod_forum_external extends external_api {
|
||||
/**
|
||||
* Toggle the favouriting value for the discussion provided
|
||||
*
|
||||
* @param int $forumid The forum id
|
||||
* @param int $discussionid The discussion we need to favourite
|
||||
* @param bool $targetstate The state of the favourite value
|
||||
* @return array The exported discussion
|
||||
*/
|
||||
public static function toggle_favourite_state($forumid, $discussionid, $targetstate) {
|
||||
public static function toggle_favourite_state($discussionid, $targetstate) {
|
||||
global $DB, $PAGE, $USER;
|
||||
|
||||
$params = self::validate_parameters(self::toggle_favourite_state_parameters(), [
|
||||
'forumid' => $forumid,
|
||||
'discussionid' => $discussionid,
|
||||
'targetstate' => $targetstate
|
||||
]);
|
||||
|
||||
$vaultfactory = mod_forum\local\container::get_vault_factory();
|
||||
// Get the discussion vault and the corresponding discussion entity.
|
||||
$discussionvault = $vaultfactory->get_discussion_vault();
|
||||
$discussion = $discussionvault->get_from_id($params['discussionid']);
|
||||
|
||||
$forumvault = $vaultfactory->get_forum_vault();
|
||||
$forum = $forumvault->get_from_id($params['forumid']);
|
||||
$forum = $forumvault->get_from_id($discussion->get_forum_id());
|
||||
$forumcontext = $forum->get_context();
|
||||
$usercontext = context_user::instance($USER->id);
|
||||
|
||||
@ -1125,9 +1127,7 @@ class mod_forum_external extends external_api {
|
||||
$managerfactory = mod_forum\local\container::get_manager_factory();
|
||||
$capabilitymanager = $managerfactory->get_capability_manager($forum);
|
||||
|
||||
// Get the discussion vault and the corresponding discussion entity.
|
||||
$discussionvault = $vaultfactory->get_discussion_vault();
|
||||
$discussion = $discussionvault->get_from_id($params['discussionid']);
|
||||
|
||||
|
||||
// Does the user have the ability to favourite the discussion?
|
||||
if (!$capabilitymanager->can_favourite_discussion($USER, $discussion)) {
|
||||
@ -1165,7 +1165,6 @@ class mod_forum_external extends external_api {
|
||||
public static function toggle_favourite_state_parameters() {
|
||||
return new external_function_parameters(
|
||||
[
|
||||
'forumid' => new external_value(PARAM_INT, 'Forum that the discussion is in'),
|
||||
'discussionid' => new external_value(PARAM_INT, 'The discussion to subscribe or unsubscribe'),
|
||||
'targetstate' => new external_value(PARAM_BOOL, 'The target state')
|
||||
]
|
||||
@ -1588,7 +1587,7 @@ class mod_forum_external extends external_api {
|
||||
* @return external_description
|
||||
*/
|
||||
public static function set_subscription_state_returns() {
|
||||
return \mod_forum\local\exporters\discussion::get_read_structure();
|
||||
return discussion_exporter::get_read_structure();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1638,15 +1637,13 @@ class mod_forum_external extends external_api {
|
||||
/**
|
||||
* Set the pin state.
|
||||
*
|
||||
* @param int $forumid
|
||||
* @param int $discussionid
|
||||
* @param bool $targetstate
|
||||
* @return \stdClass
|
||||
*/
|
||||
public static function set_pin_state($forumid, $discussionid, $targetstate) {
|
||||
public static function set_pin_state($discussionid, $targetstate) {
|
||||
global $PAGE, $USER;
|
||||
$params = self::validate_parameters(self::set_pin_state_parameters(), [
|
||||
'forumid' => $forumid,
|
||||
'discussionid' => $discussionid,
|
||||
'targetstate' => $targetstate,
|
||||
]);
|
||||
@ -1654,19 +1651,18 @@ class mod_forum_external extends external_api {
|
||||
$managerfactory = mod_forum\local\container::get_manager_factory();
|
||||
$forumvault = $vaultfactory->get_forum_vault();
|
||||
$discussionvault = $vaultfactory->get_discussion_vault();
|
||||
$forum = $forumvault->get_from_id($params['forumid']);
|
||||
$discussion = $discussionvault->get_from_id($params['discussionid']);
|
||||
$forum = $forumvault->get_from_id($discussion->get_forum_id());
|
||||
$capabilitymanager = $managerfactory->get_capability_manager($forum);
|
||||
|
||||
self::validate_context($forum->get_context());
|
||||
|
||||
$legacydatamapperfactory = mod_forum\local\container::get_legacy_data_mapper_factory();
|
||||
$forumrecord = $legacydatamapperfactory->get_forum_data_mapper()->to_legacy_object($forum);
|
||||
if (!$capabilitymanager->can_pin_discussions($USER)) {
|
||||
// Nothing to do. We won't actually output any content here though.
|
||||
throw new \moodle_exception('cannotpindiscussions', 'mod_forum');
|
||||
}
|
||||
|
||||
$discussion = $discussionvault->get_from_id($params['discussionid']);
|
||||
$discussion->set_pinned($targetstate);
|
||||
$discussionrecord = $legacydatamapperfactory->get_discussion_data_mapper()->to_legacy_object($discussion);
|
||||
$discussionvault->update_discussion($discussionrecord);
|
||||
@ -1699,8 +1695,6 @@ class mod_forum_external extends external_api {
|
||||
public static function set_pin_state_parameters() {
|
||||
return new external_function_parameters(
|
||||
[
|
||||
'forumid' => new external_value(PARAM_INT, 'Forum that the discussion is in', VALUE_REQUIRED,
|
||||
null, NULL_NOT_ALLOWED),
|
||||
'discussionid' => new external_value(PARAM_INT, 'The discussion to pin or unpin', VALUE_REQUIRED,
|
||||
null, NULL_NOT_ALLOWED),
|
||||
'targetstate' => new external_value(PARAM_INT, 'The target state', VALUE_REQUIRED,
|
||||
@ -1730,6 +1724,6 @@ class mod_forum_external extends external_api {
|
||||
* @return external_single_structure
|
||||
*/
|
||||
public static function set_pin_state_returns() {
|
||||
return \mod_forum\local\exporters\discussion::get_read_structure();
|
||||
return discussion_exporter::get_read_structure();
|
||||
}
|
||||
}
|
||||
|
@ -6437,7 +6437,8 @@ function mod_forum_get_fontawesome_icon_map() {
|
||||
'mod_forum:t/selected' => 'fa-check',
|
||||
'mod_forum:t/subscribed' => 'fa-envelope-o',
|
||||
'mod_forum:t/unsubscribed' => 'fa-envelope-open-o',
|
||||
'mod_forum:t/unstar' => 'fa-star-o',
|
||||
'mod_forum:t/emptystar' => 'fa-star-o',
|
||||
'mod_forum:t/star' => 'fa-star',
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -39,12 +39,14 @@
|
||||
data-action="toggle"
|
||||
data-discussionid="{{id}}"
|
||||
data-forumid="{{forumid}}"
|
||||
href="#"
|
||||
tabindex="-1"
|
||||
{{#userstate.favourited}}
|
||||
data-targetstate="0"
|
||||
title="{{#str}}removefromfavourites, mod_forum{{/str}}"
|
||||
{{/userstate.favourited}}
|
||||
{{^userstate.favourited}}
|
||||
data-targetstate="1"
|
||||
title="{{#str}}addtofavourites, mod_forum{{/str}}"
|
||||
{{/userstate.favourited}}
|
||||
>
|
||||
{{$favouritecontent}}
|
||||
|
@ -42,9 +42,11 @@
|
||||
href="{{urls.pin}}"
|
||||
{{#pinned}}
|
||||
data-targetstate="0"
|
||||
title="{{#str}}unpindiscussion, mod_forum{{/str}}"
|
||||
{{/pinned}}
|
||||
{{^pinned}}
|
||||
data-targetstate="1"
|
||||
title="{{#str}}pindiscussion, mod_forum{{/str}}"
|
||||
{{/pinned}}
|
||||
>
|
||||
{{#pinned}}
|
||||
|
@ -32,13 +32,13 @@
|
||||
|
||||
<div id="discussion-container-{{uniqid}}" data-content="forum-discussion">
|
||||
{{#html}}
|
||||
<div class="d-flex flex-wrap flex-row-reverse m-b-1" data-container="discussion-tools" style="text-align: right;">
|
||||
<div class="d-flex flex-wrap flex-row-reverse m-b-1 text-right" data-container="discussion-tools">
|
||||
{{#capabilities.manage}}
|
||||
{{^istimelocked}}
|
||||
<div class="pl-1 discussionlock">
|
||||
{{> forum/discussion_lock_toggle }}
|
||||
</div>
|
||||
{{/istimelocked}}
|
||||
{{^istimelocked}}
|
||||
<div class="pl-1 discussionlock">
|
||||
{{> forum/discussion_lock_toggle }}
|
||||
</div>
|
||||
{{/istimelocked}}
|
||||
{{/capabilities.manage}}
|
||||
<div class="pl-1">
|
||||
<div class="discussion-settings-menu">
|
||||
|
@ -32,10 +32,10 @@
|
||||
{{< mod_forum/discussion_favourite_toggle }}
|
||||
{{$favouritecontent}}
|
||||
{{#userstate.favourited}}
|
||||
{{#pix}}t/star, mod_forum{{/pix}}
|
||||
{{#pix}}t/star, mod_forum, {{#str}}removefromfavourites, mod_forum{{/str}}{{/pix}}
|
||||
{{/userstate.favourited}}
|
||||
{{^userstate.favourited}}
|
||||
{{#pix}}t/unstar, mod_forum{{/pix}}
|
||||
{{#pix}}t/emptystar, mod_forum, {{#str}}addtofavourites, mod_forum{{/str}}{{/pix}}
|
||||
{{/userstate.favourited}}
|
||||
{{/favouritecontent}}
|
||||
{{/ mod_forum/discussion_favourite_toggle }}
|
||||
|
@ -158,54 +158,6 @@ class mod_forum_entities_discussion_testcase extends advanced_testcase {
|
||||
$this->assertEquals($isvisible, $discussion->is_timed_discussion_visible(), $testdescription);
|
||||
}
|
||||
|
||||
public function test_is_favourited() {
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$time = time() + 10;
|
||||
// Create a user.
|
||||
$user = self::getDataGenerator()->create_user(array('trackforums' => 1));
|
||||
|
||||
// Set to the user.
|
||||
self::setUser($user);
|
||||
|
||||
// Create courses to add the modules.
|
||||
$course1 = self::getDataGenerator()->create_course();
|
||||
$this->getDataGenerator()->enrol_user($user->id, $course1->id);
|
||||
|
||||
$record = new stdClass();
|
||||
$record->introformat = FORMAT_HTML;
|
||||
$record->course = $course1->id;
|
||||
$record->trackingtype = FORUM_TRACKING_OFF;
|
||||
$forum1 = self::getDataGenerator()->create_module('forum', $record);
|
||||
|
||||
$discussion = new discussion_entity(
|
||||
1,
|
||||
$course1->id,
|
||||
$forum1->id,
|
||||
'test discussion',
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
false,
|
||||
$time,
|
||||
$time,
|
||||
0,
|
||||
0,
|
||||
false
|
||||
);
|
||||
$coursemodule = get_coursemodule_from_instance('forum', $forum1->id);
|
||||
$contextmodule = context_module::instance($coursemodule->id);
|
||||
|
||||
$this->assertFalse(\mod_forum\local\entities\discussion::is_favourited($discussion, $contextmodule, $user));
|
||||
|
||||
// Toggle the favourite for discussion.
|
||||
$usercontext = \context_user::instance($user->id);
|
||||
$ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
|
||||
$ufservice->create_favourite('mod_forum', 'discussions', $discussion->get_id(), $contextmodule);
|
||||
|
||||
$this->assertTrue(\mod_forum\local\entities\discussion::is_favourited($discussion, $contextmodule, $user));
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_display_period_settings().
|
||||
*
|
||||
|
@ -113,4 +113,52 @@ class mod_forum_exporters_discussion_testcase extends advanced_testcase {
|
||||
$this->assertEquals(0, $exporteddiscussion->times['end']);
|
||||
$this->assertEquals($group->name, $exporteddiscussion->group['name']);
|
||||
}
|
||||
|
||||
public function test_is_favourited() {
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$time = time() + 10;
|
||||
// Create a user.
|
||||
$user = self::getDataGenerator()->create_user(array('trackforums' => 1));
|
||||
|
||||
// Set to the user.
|
||||
self::setUser($user);
|
||||
|
||||
// Create courses to add the modules.
|
||||
$course1 = self::getDataGenerator()->create_course();
|
||||
$this->getDataGenerator()->enrol_user($user->id, $course1->id);
|
||||
|
||||
$record = new stdClass();
|
||||
$record->introformat = FORMAT_HTML;
|
||||
$record->course = $course1->id;
|
||||
$record->trackingtype = FORUM_TRACKING_OFF;
|
||||
$forum1 = self::getDataGenerator()->create_module('forum', $record);
|
||||
|
||||
$discussion = new discussion_entity(
|
||||
1,
|
||||
$course1->id,
|
||||
$forum1->id,
|
||||
'test discussion',
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
false,
|
||||
$time,
|
||||
$time,
|
||||
0,
|
||||
0,
|
||||
false
|
||||
);
|
||||
$coursemodule = get_coursemodule_from_instance('forum', $forum1->id);
|
||||
$contextmodule = context_module::instance($coursemodule->id);
|
||||
|
||||
$this->assertFalse(\mod_forum\local\entities\discussion::is_favourited($discussion, $contextmodule, $user));
|
||||
|
||||
// Toggle the favourite for discussion.
|
||||
$usercontext = \context_user::instance($user->id);
|
||||
$ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
|
||||
$ufservice->create_favourite('mod_forum', 'discussions', $discussion->get_id(), $contextmodule);
|
||||
|
||||
$this->assertTrue(\mod_forum\local\entities\discussion::is_favourited($discussion, $contextmodule, $user));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user