MDL-65033 mod_forum: Hook up the pin toggle via AJAX

This commit is contained in:
Peter 2019-03-21 06:54:56 +08:00 committed by Peter
parent 25a97f99a9
commit 24962ee1d7
11 changed files with 40 additions and 17 deletions

View File

@ -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)})};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.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)}}});

1
mod/forum/amd/build/pin_toggle.min.js vendored Normal file
View File

@ -0,0 +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)}}});

View File

@ -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]};return{setDiscussionSubscriptionState:b,addDiscussionPost:c,setDiscussionLockState:e,toggleFavouriteDiscussionState:d}});
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}});

View File

@ -1 +1 @@
define([],function(){return{subscription:{toggle:"[data-type='subscription-toggle'][data-action='toggle']"},pin:{toggle:".pindiscussion [data-action='toggle']"},post:{post:'[data-region="post"]',action:'[data-region="post-action"]',actionsContainer:'[data-region="post-actions-container"]',forumCoreContent:"[data-region-content='forum-post-core']",forumContent:"[data-content='forum-post']",forumSubject:"[data-region-content='forum-post-core-subject']",inpageReplyLink:"[data-action='collapsible-link']",inpageReplyContent:"[data-content='inpage-reply-content']",inpageReplyForm:"form[data-content='inpage-reply-form']",inpageSubmitBtn:"[data-action='forum-inpage-submit']",repliesContainer:"[data-region='replies-container']",modeSelect:"select[name='mode']"},lock:{toggle:"[data-action='toggle'][data-type='lock-toggle']"},favourite:{toggle:"[data-type='favorite-toggle'][data-action='toggle']"}}});
define([],function(){return{subscription:{toggle:"[data-type='subscription-toggle'][data-action='toggle']"},post:{post:'[data-region="post"]',action:'[data-region="post-action"]',actionsContainer:'[data-region="post-actions-container"]',forumCoreContent:"[data-region-content='forum-post-core']",forumContent:"[data-content='forum-post']",forumSubject:"[data-region-content='forum-post-core-subject']",inpageReplyLink:"[data-action='collapsible-link']",inpageReplyContent:"[data-content='inpage-reply-content']",inpageReplyForm:"form[data-content='inpage-reply-form']",inpageSubmitBtn:"[data-action='forum-inpage-submit']",repliesContainer:"[data-region='replies-container']",modeSelect:"select[name='mode']"},lock:{toggle:"[data-action='toggle'][data-type='lock-toggle']"},favourite:{toggle:"[data-type='favorite-toggle'][data-action='toggle']"},pin:{toggle:"[data-type='pin-toggle'][data-action='toggle']"}}});

View File

@ -44,6 +44,18 @@ define([
})
.catch(Notification.exception);
});
root.on('click', Selectors.pin.toggle, function() {
var toggleElement = $(this);
var forumId = toggleElement.data('forumid');
var discussionId = toggleElement.data('discussionid');
var state = toggleElement.data('targetstate');
Repository.togglePin(forumId, discussionId, state)
.then(function() {
location.reload();
})
.catch(Notification.exception);
});
};
return {

View File

@ -26,9 +26,6 @@ define([], function() {
subscription: {
toggle: "[data-type='subscription-toggle'][data-action='toggle']",
},
pin: {
toggle: ".pindiscussion [data-action='toggle']",
},
post: {
post: '[data-region="post"]',
action: '[data-region="post-action"]',
@ -48,6 +45,9 @@ define([], function() {
},
favourite: {
toggle: "[data-type='favorite-toggle'][data-action='toggle']",
}
},
pin: {
toggle: "[data-type='pin-toggle'][data-action='toggle']",
},
};
});

View File

@ -300,6 +300,15 @@ class discussion {
return $this->get_group_id() > 0;
}
public function set_pinned(int $targetstate): bool {
if ($targetstate != $this->pinned) {
$this->pinned = $targetstate;
}
return true;
}
/**
* Check if the discussion is timed.
*

View File

@ -330,7 +330,7 @@ class capability {
*/
public function can_favourite_discussion(stdClass $user, discussion_entity $discussion) : bool {
$context = $this->get_context();
return has_capability('mod/forum::cantogglefavourite', $context, $user);
return has_capability('mod/forum:cantogglefavourite', $context, $user);
}
/**

View File

@ -405,13 +405,12 @@ $capabilities = array(
),
'clonepermissionsfrom' => 'mod/forum:canoverridediscussionlock'
),
'mod/forum::cantogglefavourite' => array(
'mod/forum:cantogglefavourite' => array(
'captype' => 'write',
'contextlevel' => CONTEXT_SYSTEM,
'archetypes' => array(
'user' => CAP_ALLOW
),
'clonepermissionsfrom' => 'moodle/user:manageownfiles'
)
)
);

View File

@ -1643,17 +1643,18 @@ class mod_forum_external extends external_api {
$forum = $forumvault->get_from_id($params['forumid']);
self::validate_context($forum->get_context());
if (!$forum->can_subscribe()) {
$legacydatamapperfactory = mod_forum\local\container::get_legacy_data_mapper_factory();
$forumrecord = $legacydatamapperfactory->get_forum_data_mapper()->to_legacy_object($forum);
if (!\mod_forum\subscriptions::is_subscribable($forumrecord)) {
// Nothing to do. We won't actually output any content here though.
throw new \moodle_exception('cannotsubscribe', 'mod_forum');
}
$discussion = $discussionvault->get_from_id($params['discussionid']);
$discussion->set_pinned($targetstate);
$legacydatamapperfactory = mod_forum\local\container::get_legacy_data_mapper_factory();
$discussionrecord = $legacydatamapperfactory->get_discussion_data_mapper()->to_legacy_object($discussion);
$discussionvault->update_discussion($discussion);
$discussionvault->update_discussion($discussionrecord);
$exporterfactory = mod_forum\local\container::get_exporter_factory();
$exporter = $exporterfactory->get_discussion_exporter($USER, $forum, $discussion);

View File

@ -65,13 +65,14 @@
{{#html.neighbourlinks}}{{{.}}}{{/html.neighbourlinks}}
</div>
{{#js}}
require(['jquery', 'mod_forum/discussion', 'mod_forum/posts_list', 'mod_forum/lock_toggle', 'mod_forum/favourite_toggle'],
function($, Discussion, PostsList, LockToggle, FavouriteToggle) {
require(['jquery', 'mod_forum/discussion', 'mod_forum/posts_list', 'mod_forum/lock_toggle', 'mod_forum/favourite_toggle', 'mod_forum/pin_toggle'],
function($, Discussion, PostsList, LockToggle, FavouriteToggle, Pin) {
var root = $("[data-content='forum-discussion']");
Discussion.init(root);
PostsList.init(root);
var root = $('[data-container="discussion-tools"]');
LockToggle.init(root);
FavouriteToggle.init(root);
Pin.init(root);
});
{{/js}}