diff --git a/extensions/flags/extend.php b/extensions/flags/extend.php
index 3bc6db108..e85281629 100644
--- a/extensions/flags/extend.php
+++ b/extensions/flags/extend.php
@@ -7,25 +7,17 @@
* LICENSE file that was distributed with this source code.
*/
-use Flarum\Api\Controller\AbstractSerializeController;
-use Flarum\Api\Controller\ListPostsController;
-use Flarum\Api\Controller\ShowDiscussionController;
-use Flarum\Api\Controller\ShowPostController;
-use Flarum\Api\Serializer\CurrentUserSerializer;
-use Flarum\Api\Serializer\ForumSerializer;
-use Flarum\Api\Serializer\PostSerializer;
+use Flarum\Api\Endpoint;
+use Flarum\Api\Resource;
use Flarum\Extend;
use Flarum\Flags\Access\ScopeFlagVisibility;
-use Flarum\Flags\AddCanFlagAttribute;
-use Flarum\Flags\AddFlagsApiAttributes;
-use Flarum\Flags\AddNewFlagCountAttribute;
-use Flarum\Flags\Api\Controller\CreateFlagController;
use Flarum\Flags\Api\Controller\DeleteFlagsController;
-use Flarum\Flags\Api\Controller\ListFlagsController;
-use Flarum\Flags\Api\Serializer\FlagSerializer;
+use Flarum\Flags\Api\ForumResourceFields;
+use Flarum\Flags\Api\PostResourceFields;
+use Flarum\Flags\Api\Resource\FlagResource;
+use Flarum\Flags\Api\UserResourceFields;
use Flarum\Flags\Flag;
use Flarum\Flags\Listener;
-use Flarum\Flags\PrepareFlagsApiData;
use Flarum\Forum\Content\AssertRegistered;
use Flarum\Post\Event\Deleted;
use Flarum\Post\Post;
@@ -41,8 +33,6 @@ return [
->js(__DIR__.'/js/dist/admin.js'),
(new Extend\Routes('api'))
- ->get('/flags', 'flags.index', ListFlagsController::class)
- ->post('/flags', 'flags.create', CreateFlagController::class)
->delete('/posts/{id}/flags', 'flags.delete', DeleteFlagsController::class),
(new Extend\Model(User::class))
@@ -51,27 +41,26 @@ return [
(new Extend\Model(Post::class))
->hasMany('flags', Flag::class, 'post_id'),
- (new Extend\ApiSerializer(PostSerializer::class))
- ->hasMany('flags', FlagSerializer::class)
- ->attribute('canFlag', AddCanFlagAttribute::class),
+ (new Extend\ApiResource(FlagResource::class)),
- (new Extend\ApiSerializer(CurrentUserSerializer::class))
- ->attribute('newFlagCount', AddNewFlagCountAttribute::class),
+ (new Extend\ApiResource(Resource\PostResource::class))
+ ->fields(PostResourceFields::class),
- (new Extend\ApiSerializer(ForumSerializer::class))
- ->attributes(AddFlagsApiAttributes::class),
+ (new Extend\ApiResource(Resource\UserResource::class))
+ ->fields(UserResourceFields::class),
- (new Extend\ApiController(ShowDiscussionController::class))
- ->addInclude(['posts.flags', 'posts.flags.user']),
+ (new Extend\ApiResource(Resource\ForumResource::class))
+ ->fields(ForumResourceFields::class),
- (new Extend\ApiController(ListPostsController::class))
- ->addInclude(['flags', 'flags.user']),
+ (new Extend\ApiResource(Resource\DiscussionResource::class))
+ ->endpoint(Endpoint\Show::class, function (Endpoint\Show $endpoint) {
+ return $endpoint->addDefaultInclude(['posts.flags', 'posts.flags.user']);
+ }),
- (new Extend\ApiController(ShowPostController::class))
- ->addInclude(['flags', 'flags.user']),
-
- (new Extend\ApiController(AbstractSerializeController::class))
- ->prepareDataForSerialization(PrepareFlagsApiData::class),
+ (new Extend\ApiResource(Resource\PostResource::class))
+ ->endpoint([Endpoint\Index::class, Endpoint\Show::class], function (Endpoint\Index|Endpoint\Show $endpoint) {
+ return $endpoint->addDefaultInclude(['flags', 'flags.user']);
+ }),
(new Extend\Settings())
->serializeToForum('guidelinesUrl', 'flarum-flags.guidelines_url'),
diff --git a/extensions/flags/js/dist/forum.js b/extensions/flags/js/dist/forum.js
index f93273b12..6d70775d1 100644
--- a/extensions/flags/js/dist/forum.js
+++ b/extensions/flags/js/dist/forum.js
@@ -1,2 +1,2 @@
-(()=>{var t={n:a=>{var e=a&&a.__esModule?()=>a.default:()=>a;return t.d(e,{a:e}),e},d:(a,e)=>{for(var s in e)t.o(e,s)&&!t.o(a,s)&&Object.defineProperty(a,s,{enumerable:!0,get:e[s]})},o:(t,a)=>Object.prototype.hasOwnProperty.call(t,a),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},a={};(()=>{"use strict";t.r(a),t.d(a,{extend:()=>st});const e=flarum.reg.get("core","forum/app");var s=t.n(e);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}const o=flarum.reg.get("core","common/states/PaginatedListState");var n=t.n(o);class l extends(n()){constructor(t){var a,e,s;super({},1,null),a=this,s=void 0,(e=function(t){var a=function(t,a){if("object"!==r(t)||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var s=e.call(t,a);if("object"!==r(s))return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t,"string");return"symbol"===r(a)?a:String(a)}(e="app"))in a?Object.defineProperty(a,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):a[e]=s,this.app=t}get type(){return"flags"}load(){var t;return null!=(t=this.app.session.user)&&t.attribute("newFlagCount")&&(this.pages=[],this.location={page:1}),this.pages.length>0?Promise.resolve():super.loadNext()}}flarum.reg.add("flarum-flags","forum/states/FlagListState",l);const i=flarum.reg.get("core","common/extend"),u=flarum.reg.get("core","forum/utils/PostControls");var c=t.n(u);const f=flarum.reg.get("core","common/components/Button");var g=t.n(f);const d=flarum.reg.get("core","common/components/FormModal");var p=t.n(d);const h=flarum.reg.get("core","common/components/Form");var v=t.n(h);const b=flarum.reg.get("core","common/utils/Stream");var _=t.n(b);const y=flarum.reg.get("core","common/utils/withAttr");var N=t.n(y);const x=flarum.reg.get("core","common/utils/ItemList");var F=t.n(x);class P extends(p()){oninit(t){super.oninit(t),this.success=!1,this.reason=_()(""),this.reasonDetail=_()("")}className(){return"FlagPostModal Modal--medium"}title(){return s().translator.trans("flarum-flags.forum.flag_post.title")}content(){return this.success?m("div",{className:"Modal-body"},m(v(),{className:"Form--centered"},m("p",{className:"helpText"},s().translator.trans("flarum-flags.forum.flag_post.confirmation_message")),m("div",{className:"Form-group Form-controls"},m(g(),{className:"Button Button--primary Button--block",onclick:this.hide.bind(this)},s().translator.trans("flarum-flags.forum.flag_post.dismiss_button"))))):m("div",{className:"Modal-body"},m(v(),{className:"Form--centered"},m("div",{className:"Form-group"},m("div",null,this.flagReasons().toArray())),m("div",{className:"Form-group Form-controls"},m(g(),{className:"Button Button--primary Button--block",type:"submit",loading:this.loading,disabled:!this.reason()},s().translator.trans("flarum-flags.forum.flag_post.submit_button")))))}flagReasons(){const t=new(F()),a=s().forum.attribute("guidelinesUrl");return t.add("off-topic",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"off_topic"===this.reason(),value:"off_topic",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_off_topic_label")),s().translator.trans("flarum-flags.forum.flag_post.reason_off_topic_text"),"off_topic"===this.reason()&&m("textarea",{className:"FormControl",placeholder:s().translator.trans("flarum-flags.forum.flag_post.reason_details_placeholder"),value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),70),t.add("inappropriate",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"inappropriate"===this.reason(),value:"inappropriate",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_inappropriate_label")),s().translator.trans("flarum-flags.forum.flag_post.reason_inappropriate_text",{a:a?m("a",{href:a,target:"_blank"}):void 0}),"inappropriate"===this.reason()&&m("textarea",{className:"FormControl",placeholder:s().translator.trans("flarum-flags.forum.flag_post.reason_details_placeholder"),value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),60),t.add("spam",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"spam"===this.reason(),value:"spam",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_spam_label")),s().translator.trans("flarum-flags.forum.flag_post.reason_spam_text"),"spam"===this.reason()&&m("textarea",{className:"FormControl",placeholder:s().translator.trans("flarum-flags.forum.flag_post.reason_details_placeholder"),value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),50),t.add("other",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"other"===this.reason(),value:"other",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_other_label")),"other"===this.reason()&&m("textarea",{className:"FormControl",value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),10),t}onsubmit(t){t.preventDefault(),this.loading=!0,s().store.createRecord("flags").save({reason:"other"===this.reason()?null:this.reason(),reasonDetail:this.reasonDetail(),relationships:{user:s().session.user,post:this.attrs.post}},{errorHandler:this.onerror.bind(this)}).then((()=>this.success=!0)).catch((()=>{})).then(this.loaded.bind(this))}}flarum.reg.add("flarum-flags","forum/components/FlagPostModal",P);const w=flarum.reg.get("core","forum/components/HeaderSecondary");var k=t.n(w);const D=flarum.reg.get("core","forum/components/HeaderDropdown");var S=t.n(D);const C=flarum.reg.get("core","common/utils/classList");var A=t.n(C);const L=flarum.reg.get("core","common/Component");var M=t.n(L);const B=flarum.reg.get("core","common/components/Avatar");var O=t.n(B);const j=flarum.reg.get("core","common/helpers/username");var T=t.n(j);const H=flarum.reg.get("core","forum/components/HeaderList");var I=t.n(H);const R=flarum.reg.get("core","forum/components/HeaderListItem");var E=t.n(R);class U extends(M()){oninit(t){super.oninit(t)}view(){const t=this.attrs.state;return m(I(),{className:"FlagList",title:s().translator.trans("flarum-flags.forum.flagged_posts.title"),hasItems:t.hasItems(),loading:t.isLoading(),emptyText:s().translator.trans("flarum-flags.forum.flagged_posts.empty_text"),loadMore:()=>t.hasNext()&&!t.isLoadingNext()&&t.loadNext()},m("ul",{className:"HeaderListGroup-content"},this.content(t)))}content(t){return!t.isLoading()&&t.hasItems()?t.getPages().map((t=>t.items.map((t=>{const a=t.post();return m("li",null,m(E(),{className:"Flag",avatar:m(O(),{user:a.user()||null}),icon:"fas fa-flag",content:s().translator.trans("flarum-flags.forum.flagged_posts.item_text",{username:T()(a.user()),em:m("em",null),discussion:a.discussion().title()}),excerpt:a.contentPlain(),datetime:t.createdAt(),href:s().route.post(a),onclick:t=>{t.redraw=!1}}))})))):null}}flarum.reg.add("flarum-flags","forum/components/FlagList",U);class G extends(S()){static initAttrs(t){t.className=A()("FlagsDropdown",t.className),t.label=t.label||s().translator.trans("flarum-flags.forum.flagged_posts.tooltip"),t.icon=t.icon||"fas fa-flag",super.initAttrs(t)}getContent(){return m(U,{state:this.attrs.state})}goToRoute(){m.route.set(s().route("flags"))}getUnreadCount(){return s().forum.attribute("flagCount")}getNewCount(){return s().session.user.attribute("newFlagCount")}}flarum.reg.add("flarum-flags","forum/components/FlagsDropdown",G);const q=flarum.reg.get("core","forum/components/Post");var z=t.n(q);const V=flarum.reg.get("core","common/utils/humanTime");var J=t.n(V);const K=flarum.reg.get("core","common/extenders");var Q=t.n(K);const W=flarum.reg.get("core","common/models/Post");var X=t.n(W);const Y=flarum.reg.get("core","common/components/Page");var Z=t.n(Y);class $ extends(Z()){oninit(t){super.oninit(t),s().history.push("flags"),s().flags.load(),this.bodyClass="App--flags"}view(){return m("div",{className:"FlagsPage"},m(U,{state:s().flags}))}}flarum.reg.add("flarum-flags","forum/components/FlagsPage",$);const tt=flarum.reg.get("core","common/Model");var at=t.n(tt);class et extends(at()){type(){return at().attribute("type").call(this)}reason(){return at().attribute("reason").call(this)}reasonDetail(){return at().attribute("reasonDetail").call(this)}createdAt(){return at().attribute("createdAt",at().transformDate).call(this)}post(){return at().hasOne("post").call(this)}user(){return at().hasOne("user").call(this)}}flarum.reg.add("flarum-flags","forum/models/Flag",et);const st=[(new(Q().Routes)).add("flags","/flags",$),(new(Q().Store)).add("flags",et),new(Q().Model)(X()).hasMany("flags").attribute("canFlag")];s().initializers.add("flarum-flags",(()=>{s().flags=new l(s()),(0,i.extend)(c(),"userControls",(function(t,a){!a.isHidden()&&"comment"===a.contentType()&&a.canFlag()&&t.add("flag",m(g(),{icon:"fas fa-flag",onclick:()=>s().modal.show(P,{post:a})},s().translator.trans("flarum-flags.forum.post_controls.flag_button")))})),(0,i.extend)(k().prototype,"items",(function(t){s().forum.attribute("canViewFlags")&&t.add("flags",m(G,{state:s().flags}),15)})),(0,i.extend)(z().prototype,"elementAttrs",(function(t){this.attrs.post.flags().length&&(t.className+=" Post--flagged")})),z().prototype.dismissFlag=function(t){const a=this.attrs.post;return delete a.data.relationships.flags,this.subtree.invalidate(),s().flags.cache&&s().flags.cache.some(((t,e)=>{if(t.post()===a){if(s().flags.cache.splice(e,1),s().flags.index===a){let t=s().flags.cache[e];if(t||(t=s().flags.cache[0]),t){const a=t.post();s().flags.index=a,m.route.set(s().route.post(a))}}return!0}})),s().request({url:s().forum.attribute("apiUrl")+a.apiEndpoint()+"/flags",method:"DELETE",body:t})},z().prototype.flagActionItems=function(){const t=new(F()),a=c().destructiveControls(this.attrs.post);return Object.keys(a.toObject()).forEach((t=>{const e=a.get(t).attrs;e.className="Button",(0,i.extend)(e,"onclick",(()=>this.dismissFlag()))})),t.add("controls",m("div",{className:"ButtonGroup"},a.toArray())),t.add("dismiss",m(g(),{className:"Button",icon:"far fa-eye-slash",onclick:this.dismissFlag.bind(this)},s().translator.trans("flarum-flags.forum.post.dismiss_flag_button")),-100),t},(0,i.override)(z().prototype,"header",(function(t){const a=this.attrs.post,e=a.flags();if(e.length)return a.isHidden()&&(this.revealContent=!0),m("div",{className:"Post-flagged"},m("div",{className:"Post-flagged-flags"},e.map((t=>m("div",{className:"Post-flagged-flag"},this.flagReason(t))))),m("div",{className:"Post-flagged-actions"},this.flagActionItems().toArray()))})),z().prototype.flagReason=function(t){if("user"===t.type()){const a=t.user(),e=t.reason()?s().translator.trans("flarum-flags.forum.flag_post.reason_".concat(t.reason(),"_label")):null,r=t.reasonDetail(),o=J()(t.createdAt());return[s().translator.trans(e?"flarum-flags.forum.post.flagged_by_with_reason_text":"flarum-flags.forum.post.flagged_by_text",{time:o,user:a,reason:e}),!!r&&m("span",{className:"Post-flagged-detail"},r)]}}}))})(),module.exports=a})();
+(()=>{var t={n:a=>{var e=a&&a.__esModule?()=>a.default:()=>a;return t.d(e,{a:e}),e},d:(a,e)=>{for(var s in e)t.o(e,s)&&!t.o(a,s)&&Object.defineProperty(a,s,{enumerable:!0,get:e[s]})},o:(t,a)=>Object.prototype.hasOwnProperty.call(t,a),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},a={};(()=>{"use strict";t.r(a),t.d(a,{extend:()=>st});const e=flarum.reg.get("core","forum/app");var s=t.n(e);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}const o=flarum.reg.get("core","common/states/PaginatedListState");var n=t.n(o);class l extends(n()){constructor(t){var a,e,s;super({},1,null),a=this,s=void 0,(e=function(t){var a=function(t,a){if("object"!==r(t)||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var s=e.call(t,a);if("object"!==r(s))return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t,"string");return"symbol"===r(a)?a:String(a)}(e="app"))in a?Object.defineProperty(a,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):a[e]=s,this.app=t}get type(){return"flags"}load(){var t;return null!=(t=this.app.session.user)&&t.attribute("newFlagCount")&&(this.pages=[],this.location={page:1}),this.pages.length>0?Promise.resolve():super.loadNext()}}flarum.reg.add("flarum-flags","forum/states/FlagListState",l);const i=flarum.reg.get("core","common/extend"),u=flarum.reg.get("core","forum/utils/PostControls");var c=t.n(u);const f=flarum.reg.get("core","common/components/Button");var g=t.n(f);const d=flarum.reg.get("core","common/components/FormModal");var p=t.n(d);const h=flarum.reg.get("core","common/components/Form");var v=t.n(h);const b=flarum.reg.get("core","common/utils/Stream");var _=t.n(b);const y=flarum.reg.get("core","common/utils/withAttr");var N=t.n(y);const x=flarum.reg.get("core","common/utils/ItemList");var F=t.n(x);class P extends(p()){oninit(t){super.oninit(t),this.success=!1,this.reason=_()(""),this.reasonDetail=_()("")}className(){return"FlagPostModal Modal--medium"}title(){return s().translator.trans("flarum-flags.forum.flag_post.title")}content(){return this.success?m("div",{className:"Modal-body"},m(v(),{className:"Form--centered"},m("p",{className:"helpText"},s().translator.trans("flarum-flags.forum.flag_post.confirmation_message")),m("div",{className:"Form-group Form-controls"},m(g(),{className:"Button Button--primary Button--block",onclick:this.hide.bind(this)},s().translator.trans("flarum-flags.forum.flag_post.dismiss_button"))))):m("div",{className:"Modal-body"},m(v(),{className:"Form--centered"},m("div",{className:"Form-group"},m("div",null,this.flagReasons().toArray())),m("div",{className:"Form-group Form-controls"},m(g(),{className:"Button Button--primary Button--block",type:"submit",loading:this.loading,disabled:!this.reason()},s().translator.trans("flarum-flags.forum.flag_post.submit_button")))))}flagReasons(){const t=new(F()),a=s().forum.attribute("guidelinesUrl");return t.add("off-topic",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"off_topic"===this.reason(),value:"off_topic",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_off_topic_label")),s().translator.trans("flarum-flags.forum.flag_post.reason_off_topic_text"),"off_topic"===this.reason()&&m("textarea",{className:"FormControl",placeholder:s().translator.trans("flarum-flags.forum.flag_post.reason_details_placeholder"),value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),70),t.add("inappropriate",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"inappropriate"===this.reason(),value:"inappropriate",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_inappropriate_label")),s().translator.trans("flarum-flags.forum.flag_post.reason_inappropriate_text",{a:a?m("a",{href:a,target:"_blank"}):void 0}),"inappropriate"===this.reason()&&m("textarea",{className:"FormControl",placeholder:s().translator.trans("flarum-flags.forum.flag_post.reason_details_placeholder"),value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),60),t.add("spam",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"spam"===this.reason(),value:"spam",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_spam_label")),s().translator.trans("flarum-flags.forum.flag_post.reason_spam_text"),"spam"===this.reason()&&m("textarea",{className:"FormControl",placeholder:s().translator.trans("flarum-flags.forum.flag_post.reason_details_placeholder"),value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),50),t.add("other",m("label",{className:"checkbox"},m("input",{type:"radio",name:"reason",checked:"other"===this.reason(),value:"other",onclick:N()("value",this.reason)}),m("strong",null,s().translator.trans("flarum-flags.forum.flag_post.reason_other_label")),"other"===this.reason()&&m("textarea",{className:"FormControl",value:this.reasonDetail(),oninput:N()("value",this.reasonDetail)})),10),t}onsubmit(t){t.preventDefault(),this.loading=!0,s().store.createRecord("flags").save({reason:"other"===this.reason()?null:this.reason(),reasonDetail:this.reasonDetail(),relationships:{post:this.attrs.post}},{errorHandler:this.onerror.bind(this)}).then((()=>this.success=!0)).catch((()=>{})).then(this.loaded.bind(this))}}flarum.reg.add("flarum-flags","forum/components/FlagPostModal",P);const w=flarum.reg.get("core","forum/components/HeaderSecondary");var k=t.n(w);const D=flarum.reg.get("core","forum/components/HeaderDropdown");var S=t.n(D);const C=flarum.reg.get("core","common/utils/classList");var A=t.n(C);const L=flarum.reg.get("core","common/Component");var M=t.n(L);const B=flarum.reg.get("core","common/components/Avatar");var O=t.n(B);const j=flarum.reg.get("core","common/helpers/username");var T=t.n(j);const H=flarum.reg.get("core","forum/components/HeaderList");var I=t.n(H);const R=flarum.reg.get("core","forum/components/HeaderListItem");var E=t.n(R);class U extends(M()){oninit(t){super.oninit(t)}view(){const t=this.attrs.state;return m(I(),{className:"FlagList",title:s().translator.trans("flarum-flags.forum.flagged_posts.title"),hasItems:t.hasItems(),loading:t.isLoading(),emptyText:s().translator.trans("flarum-flags.forum.flagged_posts.empty_text"),loadMore:()=>t.hasNext()&&!t.isLoadingNext()&&t.loadNext()},m("ul",{className:"HeaderListGroup-content"},this.content(t)))}content(t){return!t.isLoading()&&t.hasItems()?t.getPages().map((t=>t.items.map((t=>{const a=t.post();return m("li",null,m(E(),{className:"Flag",avatar:m(O(),{user:a.user()||null}),icon:"fas fa-flag",content:s().translator.trans("flarum-flags.forum.flagged_posts.item_text",{username:T()(a.user()),em:m("em",null),discussion:a.discussion().title()}),excerpt:a.contentPlain(),datetime:t.createdAt(),href:s().route.post(a),onclick:t=>{t.redraw=!1}}))})))):null}}flarum.reg.add("flarum-flags","forum/components/FlagList",U);class G extends(S()){static initAttrs(t){t.className=A()("FlagsDropdown",t.className),t.label=t.label||s().translator.trans("flarum-flags.forum.flagged_posts.tooltip"),t.icon=t.icon||"fas fa-flag",super.initAttrs(t)}getContent(){return m(U,{state:this.attrs.state})}goToRoute(){m.route.set(s().route("flags"))}getUnreadCount(){return s().forum.attribute("flagCount")}getNewCount(){return s().session.user.attribute("newFlagCount")}}flarum.reg.add("flarum-flags","forum/components/FlagsDropdown",G);const q=flarum.reg.get("core","forum/components/Post");var z=t.n(q);const V=flarum.reg.get("core","common/utils/humanTime");var J=t.n(V);const K=flarum.reg.get("core","common/extenders");var Q=t.n(K);const W=flarum.reg.get("core","common/models/Post");var X=t.n(W);const Y=flarum.reg.get("core","common/components/Page");var Z=t.n(Y);class $ extends(Z()){oninit(t){super.oninit(t),s().history.push("flags"),s().flags.load(),this.bodyClass="App--flags"}view(){return m("div",{className:"FlagsPage"},m(U,{state:s().flags}))}}flarum.reg.add("flarum-flags","forum/components/FlagsPage",$);const tt=flarum.reg.get("core","common/Model");var at=t.n(tt);class et extends(at()){type(){return at().attribute("type").call(this)}reason(){return at().attribute("reason").call(this)}reasonDetail(){return at().attribute("reasonDetail").call(this)}createdAt(){return at().attribute("createdAt",at().transformDate).call(this)}post(){return at().hasOne("post").call(this)}user(){return at().hasOne("user").call(this)}}flarum.reg.add("flarum-flags","forum/models/Flag",et);const st=[(new(Q().Routes)).add("flags","/flags",$),(new(Q().Store)).add("flags",et),new(Q().Model)(X()).hasMany("flags").attribute("canFlag")];s().initializers.add("flarum-flags",(()=>{s().flags=new l(s()),(0,i.extend)(c(),"userControls",(function(t,a){!a.isHidden()&&"comment"===a.contentType()&&a.canFlag()&&t.add("flag",m(g(),{icon:"fas fa-flag",onclick:()=>s().modal.show(P,{post:a})},s().translator.trans("flarum-flags.forum.post_controls.flag_button")))})),(0,i.extend)(k().prototype,"items",(function(t){s().forum.attribute("canViewFlags")&&t.add("flags",m(G,{state:s().flags}),15)})),(0,i.extend)(z().prototype,"elementAttrs",(function(t){this.attrs.post.flags().length&&(t.className+=" Post--flagged")})),z().prototype.dismissFlag=function(t){const a=this.attrs.post;return delete a.data.relationships.flags,this.subtree.invalidate(),s().flags.cache&&s().flags.cache.some(((t,e)=>{if(t.post()===a){if(s().flags.cache.splice(e,1),s().flags.index===a){let t=s().flags.cache[e];if(t||(t=s().flags.cache[0]),t){const a=t.post();s().flags.index=a,m.route.set(s().route.post(a))}}return!0}})),s().request({url:s().forum.attribute("apiUrl")+a.apiEndpoint()+"/flags",method:"DELETE",body:t})},z().prototype.flagActionItems=function(){const t=new(F()),a=c().destructiveControls(this.attrs.post);return Object.keys(a.toObject()).forEach((t=>{const e=a.get(t).attrs;e.className="Button",(0,i.extend)(e,"onclick",(()=>this.dismissFlag()))})),t.add("controls",m("div",{className:"ButtonGroup"},a.toArray())),t.add("dismiss",m(g(),{className:"Button",icon:"far fa-eye-slash",onclick:this.dismissFlag.bind(this)},s().translator.trans("flarum-flags.forum.post.dismiss_flag_button")),-100),t},(0,i.override)(z().prototype,"header",(function(t){const a=this.attrs.post,e=a.flags();if(e.length)return a.isHidden()&&(this.revealContent=!0),m("div",{className:"Post-flagged"},m("div",{className:"Post-flagged-flags"},e.map((t=>m("div",{className:"Post-flagged-flag"},this.flagReason(t))))),m("div",{className:"Post-flagged-actions"},this.flagActionItems().toArray()))})),z().prototype.flagReason=function(t){if("user"===t.type()){const a=t.user(),e=t.reason()?s().translator.trans("flarum-flags.forum.flag_post.reason_".concat(t.reason(),"_label")):null,r=t.reasonDetail(),o=J()(t.createdAt());return[s().translator.trans(e?"flarum-flags.forum.post.flagged_by_with_reason_text":"flarum-flags.forum.post.flagged_by_text",{time:o,user:a,reason:e}),!!r&&m("span",{className:"Post-flagged-detail"},r)]}}}))})(),module.exports=a})();
//# sourceMappingURL=forum.js.map
\ No newline at end of file
diff --git a/extensions/flags/js/dist/forum.js.map b/extensions/flags/js/dist/forum.js.map
index b12fc74d7..0138391fc 100644
--- a/extensions/flags/js/dist/forum.js.map
+++ b/extensions/flags/js/dist/forum.js.map
@@ -1 +1 @@
-{"version":3,"file":"forum.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,sDCL9D,MAAM,EAA+BC,OAAOC,IAAIV,IAAI,OAAQ,a,aCA7C,SAASW,EAAQV,GAG9B,OAAOU,EAAU,mBAAqBL,QAAU,iBAAmBA,OAAOM,SAAW,SAAUX,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBK,QAAUL,EAAIY,cAAgBP,QAAUL,IAAQK,OAAOH,UAAY,gBAAkBF,CAC1H,EAAGU,EAAQV,EACb,CCRA,MAAM,EAA+BQ,OAAOC,IAAIV,IAAI,OAAQ,oC,aCE7C,MAAMc,UAAsB,KACzCD,YAAYE,GCFC,IAAyBd,EAAKN,EAAKa,EDG9CQ,MAAM,CAAC,EAAG,EAAG,MCHuBf,EDIpBgB,KCJ8BT,ODIjB,GCH/Bb,ECAa,SAAwBuB,GACrC,IAAIvB,ECFS,SAAsBwB,EAAOC,GAC1C,GAAuB,WAAnBT,EAAQQ,IAAiC,OAAVA,EAAgB,OAAOA,EAC1D,IAAIE,EAAOF,EAAMb,OAAOgB,aACxB,QAAaC,IAATF,EAAoB,CACtB,IAAIG,EAAMH,EAAKhB,KAAKc,EAAOC,GAC3B,GAAqB,WAAjBT,EAAQa,GAAmB,OAAOA,EACtC,MAAM,IAAIC,UAAU,+CACtB,CACA,OAA4BC,OAAiBP,EAC/C,CDPYG,CAAYJ,EAAK,UAC3B,MAAwB,WAAjBP,EAAQhB,GAAoBA,EAAM+B,OAAO/B,EAClD,CDHQgC,CADqChC,EDInB,UCFbM,EACTJ,OAAOC,eAAeG,EAAKN,EAAK,CAC9Ba,MAAOA,EACPT,YAAY,EACZ6B,cAAc,EACdC,UAAU,IAGZ5B,EAAIN,GAAOa,EDLXS,KAAKF,IAAMA,CACb,CACIe,WACF,MAAO,OACT,CAMAC,OACE,IAAIC,EAOJ,OANuD,OAAlDA,EAAwBf,KAAKF,IAAIkB,QAAQC,OAAiBF,EAAsBG,UAAU,kBAC7FlB,KAAKmB,MAAQ,GACbnB,KAAKoB,SAAW,CACdC,KAAM,IAGNrB,KAAKmB,MAAMG,OAAS,EACfC,QAAQC,UAEVzB,MAAM0B,UACf,EAEFjC,OAAOC,IAAIiC,IAAI,eAAgB,6BAA8B7B,GI9B7D,MAAM,EAA+BL,OAAOC,IAAIV,IAAI,OAAQ,iBCAtD,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,4B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,4B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,+B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,uB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,yB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,yB,aCO7C,MAAM4C,UAAsB,KACzCC,OAAOC,GACL9B,MAAM6B,OAAOC,GACb7B,KAAK8B,SAAU,EACf9B,KAAK+B,OAAS,IAAO,IACrB/B,KAAKgC,aAAe,IAAO,GAC7B,CACAC,YACE,MAAO,6BACT,CACAC,QACE,OAAO,qBAAqB,qCAC9B,CACAC,UACE,OAAInC,KAAK8B,QACAM,EAAE,MAAO,CACdH,UAAW,cACVG,EAAE,IAAM,CACTH,UAAW,kBACVG,EAAE,IAAK,CACRH,UAAW,YACV,qBAAqB,sDAAuDG,EAAE,MAAO,CACtFH,UAAW,4BACVG,EAAE,IAAQ,CACXH,UAAW,uCACXI,QAASrC,KAAKsC,KAAKC,KAAKvC,OACvB,qBAAqB,mDAEnBoC,EAAE,MAAO,CACdH,UAAW,cACVG,EAAE,IAAM,CACTH,UAAW,kBACVG,EAAE,MAAO,CACVH,UAAW,cACVG,EAAE,MAAO,KAAMpC,KAAKwC,cAAcC,YAAaL,EAAE,MAAO,CACzDH,UAAW,4BACVG,EAAE,IAAQ,CACXH,UAAW,uCACXpB,KAAM,SACN6B,QAAS1C,KAAK0C,QACdC,UAAW3C,KAAK+B,UACf,qBAAqB,iDAC1B,CACAS,cACE,MAAMI,EAAQ,IAAI,KACZC,EAAgB,oBAAoB,iBA6D1C,OA5DAD,EAAMlB,IAAI,YAAaU,EAAE,QAAS,CAChCH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,cAAlB/C,KAAK+B,SACdxC,MAAO,YACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,wDAAyD,qBAAqB,sDAAyE,cAAlBpC,KAAK+B,UAA4BK,EAAE,WAAY,CAC7NH,UAAW,cACXe,YAAa,qBAAqB,2DAClCzD,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACLY,EAAMlB,IAAI,gBAAiBU,EAAE,QAAS,CACpCH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,kBAAlB/C,KAAK+B,SACdxC,MAAO,gBACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,4DAA6D,qBAAqB,yDAA0D,CACrL7D,EAAGsE,EAAgBT,EAAE,IAAK,CACxBc,KAAML,EACNM,OAAQ,gBACL7C,IACe,kBAAlBN,KAAK+B,UAAgCK,EAAE,WAAY,CACrDH,UAAW,cACXe,YAAa,qBAAqB,2DAClCzD,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACLY,EAAMlB,IAAI,OAAQU,EAAE,QAAS,CAC3BH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,SAAlB/C,KAAK+B,SACdxC,MAAO,OACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,mDAAoD,qBAAqB,iDAAoE,SAAlBpC,KAAK+B,UAAuBK,EAAE,WAAY,CAC9MH,UAAW,cACXe,YAAa,qBAAqB,2DAClCzD,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACLY,EAAMlB,IAAI,QAASU,EAAE,QAAS,CAC5BH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,UAAlB/C,KAAK+B,SACdxC,MAAO,QACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,oDAAuE,UAAlBpC,KAAK+B,UAAwBK,EAAE,WAAY,CACzIH,UAAW,cACX1C,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACEY,CACT,CACAQ,SAASC,GACPA,EAAEC,iBACFtD,KAAK0C,SAAU,EACf,uBAAuB,SAASa,KAAK,CACnCxB,OAA0B,UAAlB/B,KAAK+B,SAAuB,KAAO/B,KAAK+B,SAChDC,aAAchC,KAAKgC,eACnBwB,cAAe,CACbvC,KAAM,iBACNwC,KAAMzD,KAAK0D,MAAMD,OAElB,CACDE,aAAc3D,KAAK4D,QAAQrB,KAAKvC,QAC/B6D,MAAK,IAAM7D,KAAK8B,SAAU,IAAMgC,OAAM,SAAUD,KAAK7D,KAAK+D,OAAOxB,KAAKvC,MAC3E,EAEFR,OAAOC,IAAIiC,IAAI,eAAgB,iCAAkCC,GClIjE,MAAM,EAA+BnC,OAAOC,IAAIV,IAAI,OAAQ,oC,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,mC,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,oB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,4B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,2B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,+B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,mC,aCM7C,MAAMiF,UAAiB,KACpCpC,OAAOC,GACL9B,MAAM6B,OAAOC,EACf,CACAoC,OACE,MAAMC,EAAQlE,KAAK0D,MAAMQ,MACzB,OAAO9B,EAAE,IAAY,CACnBH,UAAW,WACXC,MAAO,qBAAqB,0CAC5BiC,SAAUD,EAAMC,WAChBzB,QAASwB,EAAME,YACfC,UAAW,qBAAqB,+CAChCC,SAAU,IAAMJ,EAAMK,YAAcL,EAAMM,iBAAmBN,EAAMzC,YAClEW,EAAE,KAAM,CACTH,UAAW,2BACVjC,KAAKmC,QAAQ+B,IAClB,CACA/B,QAAQ+B,GACN,OAAKA,EAAME,aAAeF,EAAMC,WACvBD,EAAMO,WAAWC,KAAIrD,GACnBA,EAAKuB,MAAM8B,KAAIC,IACpB,MAAMlB,EAAOkB,EAAKlB,OAClB,OAAOrB,EAAE,KAAM,KAAMA,EAAE,IAAgB,CACrCH,UAAW,OACX2C,OAAQxC,EAAE,IAAQ,CAChBnB,KAAMwC,EAAKxC,QAAU,OAEvB4D,KAAM,cACN1C,QAAS,qBAAqB,6CAA8C,CAC1E2C,SAAU,IAASrB,EAAKxC,QACxB8D,GAAI3C,EAAE,KAAM,MACZ4C,WAAYvB,EAAKuB,aAAa9C,UAEhC+C,QAASxB,EAAKyB,eACdC,SAAUR,EAAKS,YACflC,KAAM,eAAeO,GACrBpB,QAASgB,IACPA,EAAEgC,QAAS,CAAK,IAEjB,MAIF,IACT,EAEF7F,OAAOC,IAAIiC,IAAI,eAAgB,4BAA6BsC,GChD7C,MAAMsB,UAAsB,KACzCC,iBAAiB7B,GACfA,EAAMzB,UAAY,IAAU,gBAAiByB,EAAMzB,WACnDyB,EAAM8B,MAAQ9B,EAAM8B,OAAS,qBAAqB,4CAClD9B,EAAMmB,KAAOnB,EAAMmB,MAAQ,cAC3B9E,MAAM0F,UAAU/B,EAClB,CACAgC,aACE,OAAOtD,EAAE4B,EAAU,CACjBE,MAAOlE,KAAK0D,MAAMQ,OAEtB,CACAyB,YACEvD,EAAEwD,MAAMC,IAAI,UAAU,SACxB,CACAC,iBACE,OAAO,oBAAoB,YAC7B,CACAC,cACE,OAAO,2BAA2B,eACpC,EAEFvG,OAAOC,IAAIiC,IAAI,eAAgB,iCAAkC4D,GC1BjE,MAAM,EAA+B9F,OAAOC,IAAIV,IAAI,OAAQ,yB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,oB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,sB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCQ7C,MAAMiH,UAAkB,KACrCpE,OAAOC,GACL9B,MAAM6B,OAAOC,GACb,iBAAiB,SACjB,iBACA7B,KAAKiG,UAAY,YACnB,CACAhC,OACE,OAAO7B,EAAE,MAAO,CACdH,UAAW,aACVG,EAAE4B,EAAU,CACbE,MAAO,YAEX,EAEF1E,OAAOC,IAAIiC,IAAI,eAAgB,6BAA8BsE,GCvB7D,MAAM,GAA+BxG,OAAOC,IAAIV,IAAI,OAAQ,gB,eCC7C,MAAMmH,WAAa,MAChCrF,OACE,OAAO,eAAgB,QAAQzB,KAAKY,KACtC,CACA+B,SACE,OAAO,eAAgB,UAAU3C,KAAKY,KACxC,CACAgC,eACE,OAAO,eAAgB,gBAAgB5C,KAAKY,KAC9C,CACAoF,YACE,OAAO,eAAgB,YAAa,oBAAqBhG,KAAKY,KAChE,CACAyD,OACE,OAAO,YAAa,QAAQrE,KAAKY,KACnC,CACAiB,OACE,OAAO,YAAa,QAAQ7B,KAAKY,KACnC,EAEFR,OAAOC,IAAIiC,IAAI,eAAgB,oBAAqBwE,ICjBpD,WAAgB,IAAI,aACnBxE,IAAI,QAAS,SAAUsE,IAAY,IAAI,YACvCtE,IAAI,QAASwE,IAAO,IAAI,WAAa,KACrCC,QAAQ,SAASjF,UAAU,YCD5B,qBAAqB,gBAAgB,KACnC,UAAY,IAAIrB,EAAc,MCD9B,IAAAuG,QAAO,IAAc,gBAAgB,SAAUxD,EAAOa,IAChDA,EAAK4C,YAAqC,YAAvB5C,EAAK6C,eAAgC7C,EAAK8C,WACjE3D,EAAMlB,IAAI,OAAQU,EAAE,IAAQ,CAC1ByC,KAAM,cACNxC,QAAS,IAAM,eAAeV,EAAe,CAC3C8B,UAED,qBAAqB,iDAC1B,KCTA,IAAA2C,QAAO,cAA2B,SAAS,SAAUxD,GAC/C,oBAAoB,iBACtBA,EAAMlB,IAAI,QAASU,EAAEkD,EAAe,CAClCpB,MAAO,YACL,GAER,KCHA,IAAAkC,QAAO,cAAgB,gBAAgB,SAAU1C,GAC3C1D,KAAK0D,MAAMD,KAAK+C,QAAQlF,SAC1BoC,EAAMzB,WAAa,iBAEvB,IACA,0BAA6B,SAAUwE,GACrC,MAAMhD,EAAOzD,KAAK0D,MAAMD,KAoBxB,cAnBOA,EAAKiD,KAAKlD,cAAcgD,MAC/BxG,KAAK2G,QAAQC,aACT,iBACF,sBAAqB,CAACjC,EAAMkC,KAC1B,GAAIlC,EAAKlB,SAAWA,EAAM,CAExB,GADA,uBAAuBoD,EAAG,GACtB,kBAAoBpD,EAAM,CAC5B,IAAIqD,EAAO,gBAAgBD,GAE3B,GADKC,IAAMA,EAAO,oBACdA,EAAM,CACR,MAAMC,EAAWD,EAAKrD,OACtB,gBAAkBsD,EAClB3E,EAAEwD,MAAMC,IAAI,eAAekB,GAC7B,CACF,CACA,OAAO,CACT,KAGG,YAAY,CACjBC,IAAK,oBAAoB,UAAYvD,EAAKwD,cAAgB,SAC1DC,OAAQ,SACRT,QAEJ,EACA,8BAAiC,WAC/B,MAAM7D,EAAQ,IAAI,KACZuE,EAAW,wBAAiCnH,KAAK0D,MAAMD,MAc7D,OAbA7E,OAAOwI,KAAKD,EAASE,YAAYC,SAAQC,IACvC,MAAM7D,EAAQyD,EAASpI,IAAIwI,GAAG7D,MAC9BA,EAAMzB,UAAY,UAClB,IAAAmE,QAAO1C,EAAO,WAAW,IAAM1D,KAAKwH,eAAc,IAEpD5E,EAAMlB,IAAI,WAAYU,EAAE,MAAO,CAC7BH,UAAW,eACVkF,EAAS1E,YACZG,EAAMlB,IAAI,UAAWU,EAAE,IAAQ,CAC7BH,UAAW,SACX4C,KAAM,mBACNxC,QAASrC,KAAKwH,YAAYjF,KAAKvC,OAC9B,qBAAqB,iDAAkD,KACnE4C,CACT,GACA,IAAA6E,UAAS,cAAgB,UAAU,SAAUC,GAC3C,MAAMjE,EAAOzD,KAAK0D,MAAMD,KAClB+C,EAAQ/C,EAAK+C,QACnB,GAAKA,EAAMlF,OAEX,OADImC,EAAK4C,aAAYrG,KAAK2H,eAAgB,GACnCvF,EAAE,MAAO,CACdH,UAAW,gBACVG,EAAE,MAAO,CACVH,UAAW,sBACVuE,EAAM9B,KAAIC,GAAQvC,EAAE,MAAO,CAC5BH,UAAW,qBACVjC,KAAK4H,WAAWjD,OAAUvC,EAAE,MAAO,CACpCH,UAAW,wBACVjC,KAAK6H,kBAAkBpF,WAC5B,IACA,yBAA4B,SAAUkC,GACpC,GAAoB,SAAhBA,EAAK9D,OAAmB,CAC1B,MAAMI,EAAO0D,EAAK1D,OACZc,EAAS4C,EAAK5C,SAAW,qBAAqB,uCAAuC+F,OAAOnD,EAAK5C,SAAU,WAAa,KACxHgG,EAASpD,EAAK3C,eACdgG,EAAO,IAAUrD,EAAKS,aAC5B,MAAO,CAAC,qBAAqBrD,EAAS,sDAAwD,0CAA2C,CACvIiG,OACA/G,OACAc,aACIgG,GAAU3F,EAAE,OAAQ,CACxBH,UAAW,uBACV8F,GACL,CACF,CH7EiB,G","sources":["webpack://@flarum/flags/webpack/bootstrap","webpack://@flarum/flags/webpack/runtime/compat get default export","webpack://@flarum/flags/webpack/runtime/define property getters","webpack://@flarum/flags/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/flags/webpack/runtime/make namespace object","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/app')\"","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/states/PaginatedListState')\"","webpack://@flarum/flags/./src/forum/states/FlagListState.tsx","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/extend')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/utils/PostControls')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Button')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/FormModal')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Form')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/Stream')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/withAttr')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/ItemList')\"","webpack://@flarum/flags/./src/forum/components/FlagPostModal.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderSecondary')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderDropdown')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/classList')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/Component')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Avatar')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/helpers/username')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderList')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderListItem')\"","webpack://@flarum/flags/./src/forum/components/FlagList.tsx","webpack://@flarum/flags/./src/forum/components/FlagsDropdown.tsx","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/Post')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/humanTime')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/extenders')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/models/Post')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Page')\"","webpack://@flarum/flags/./src/forum/components/FlagsPage.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/Model')\"","webpack://@flarum/flags/./src/forum/models/Flag.ts","webpack://@flarum/flags/./src/forum/extend.ts","webpack://@flarum/flags/./src/forum/index.ts","webpack://@flarum/flags/./src/forum/addFlagControl.js","webpack://@flarum/flags/./src/forum/addFlagsDropdown.js","webpack://@flarum/flags/./src/forum/addFlagsToPosts.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/app');","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/states/PaginatedListState');","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport PaginatedListState from 'flarum/common/states/PaginatedListState';\nexport default class FlagListState extends PaginatedListState {\n constructor(app) {\n super({}, 1, null);\n _defineProperty(this, \"app\", void 0);\n this.app = app;\n }\n get type() {\n return 'flags';\n }\n\n /**\n * Load flags into the application's cache if they haven't already\n * been loaded.\n */\n load() {\n var _this$app$session$use;\n if ((_this$app$session$use = this.app.session.user) != null && _this$app$session$use.attribute('newFlagCount')) {\n this.pages = [];\n this.location = {\n page: 1\n };\n }\n if (this.pages.length > 0) {\n return Promise.resolve();\n }\n return super.loadNext();\n }\n}\nflarum.reg.add('flarum-flags', 'forum/states/FlagListState', FlagListState);","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extend');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/utils/PostControls');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Button');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/FormModal');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Form');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/Stream');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/withAttr');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/ItemList');","import app from 'flarum/forum/app';\nimport FormModal from 'flarum/common/components/FormModal';\nimport Form from 'flarum/common/components/Form';\nimport Button from 'flarum/common/components/Button';\nimport Stream from 'flarum/common/utils/Stream';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport ItemList from 'flarum/common/utils/ItemList';\nexport default class FlagPostModal extends FormModal {\n oninit(vnode) {\n super.oninit(vnode);\n this.success = false;\n this.reason = Stream('');\n this.reasonDetail = Stream('');\n }\n className() {\n return 'FlagPostModal Modal--medium';\n }\n title() {\n return app.translator.trans('flarum-flags.forum.flag_post.title');\n }\n content() {\n if (this.success) {\n return m(\"div\", {\n className: \"Modal-body\"\n }, m(Form, {\n className: \"Form--centered\"\n }, m(\"p\", {\n className: \"helpText\"\n }, app.translator.trans('flarum-flags.forum.flag_post.confirmation_message')), m(\"div\", {\n className: \"Form-group Form-controls\"\n }, m(Button, {\n className: \"Button Button--primary Button--block\",\n onclick: this.hide.bind(this)\n }, app.translator.trans('flarum-flags.forum.flag_post.dismiss_button')))));\n }\n return m(\"div\", {\n className: \"Modal-body\"\n }, m(Form, {\n className: \"Form--centered\"\n }, m(\"div\", {\n className: \"Form-group\"\n }, m(\"div\", null, this.flagReasons().toArray())), m(\"div\", {\n className: \"Form-group Form-controls\"\n }, m(Button, {\n className: \"Button Button--primary Button--block\",\n type: \"submit\",\n loading: this.loading,\n disabled: !this.reason()\n }, app.translator.trans('flarum-flags.forum.flag_post.submit_button')))));\n }\n flagReasons() {\n const items = new ItemList();\n const guidelinesUrl = app.forum.attribute('guidelinesUrl');\n items.add('off-topic', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'off_topic',\n value: \"off_topic\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_label')), app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_text'), this.reason() === 'off_topic' && m(\"textarea\", {\n className: \"FormControl\",\n placeholder: app.translator.trans('flarum-flags.forum.flag_post.reason_details_placeholder'),\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 70);\n items.add('inappropriate', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'inappropriate',\n value: \"inappropriate\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_label')), app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_text', {\n a: guidelinesUrl ? m(\"a\", {\n href: guidelinesUrl,\n target: \"_blank\"\n }) : undefined\n }), this.reason() === 'inappropriate' && m(\"textarea\", {\n className: \"FormControl\",\n placeholder: app.translator.trans('flarum-flags.forum.flag_post.reason_details_placeholder'),\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 60);\n items.add('spam', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'spam',\n value: \"spam\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_spam_label')), app.translator.trans('flarum-flags.forum.flag_post.reason_spam_text'), this.reason() === 'spam' && m(\"textarea\", {\n className: \"FormControl\",\n placeholder: app.translator.trans('flarum-flags.forum.flag_post.reason_details_placeholder'),\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 50);\n items.add('other', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'other',\n value: \"other\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_other_label')), this.reason() === 'other' && m(\"textarea\", {\n className: \"FormControl\",\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 10);\n return items;\n }\n onsubmit(e) {\n e.preventDefault();\n this.loading = true;\n app.store.createRecord('flags').save({\n reason: this.reason() === 'other' ? null : this.reason(),\n reasonDetail: this.reasonDetail(),\n relationships: {\n user: app.session.user,\n post: this.attrs.post\n }\n }, {\n errorHandler: this.onerror.bind(this)\n }).then(() => this.success = true).catch(() => {}).then(this.loaded.bind(this));\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagPostModal', FlagPostModal);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderSecondary');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderDropdown');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/classList');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Component');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Avatar');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/helpers/username');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderList');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderListItem');","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Avatar from 'flarum/common/components/Avatar';\nimport username from 'flarum/common/helpers/username';\nimport HeaderList from 'flarum/forum/components/HeaderList';\nimport HeaderListItem from 'flarum/forum/components/HeaderListItem';\nexport default class FlagList extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n }\n view() {\n const state = this.attrs.state;\n return m(HeaderList, {\n className: \"FlagList\",\n title: app.translator.trans('flarum-flags.forum.flagged_posts.title'),\n hasItems: state.hasItems(),\n loading: state.isLoading(),\n emptyText: app.translator.trans('flarum-flags.forum.flagged_posts.empty_text'),\n loadMore: () => state.hasNext() && !state.isLoadingNext() && state.loadNext()\n }, m(\"ul\", {\n className: \"HeaderListGroup-content\"\n }, this.content(state)));\n }\n content(state) {\n if (!state.isLoading() && state.hasItems()) {\n return state.getPages().map(page => {\n return page.items.map(flag => {\n const post = flag.post();\n return m(\"li\", null, m(HeaderListItem, {\n className: \"Flag\",\n avatar: m(Avatar, {\n user: post.user() || null\n }),\n icon: \"fas fa-flag\",\n content: app.translator.trans('flarum-flags.forum.flagged_posts.item_text', {\n username: username(post.user()),\n em: m(\"em\", null),\n discussion: post.discussion().title()\n }),\n excerpt: post.contentPlain(),\n datetime: flag.createdAt(),\n href: app.route.post(post),\n onclick: e => {\n e.redraw = false;\n }\n }));\n });\n });\n }\n return null;\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagList', FlagList);","import app from 'flarum/forum/app';\nimport HeaderDropdown from 'flarum/forum/components/HeaderDropdown';\nimport classList from 'flarum/common/utils/classList';\nimport FlagList from './FlagList';\nexport default class FlagsDropdown extends HeaderDropdown {\n static initAttrs(attrs) {\n attrs.className = classList('FlagsDropdown', attrs.className);\n attrs.label = attrs.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip');\n attrs.icon = attrs.icon || 'fas fa-flag';\n super.initAttrs(attrs);\n }\n getContent() {\n return m(FlagList, {\n state: this.attrs.state\n });\n }\n goToRoute() {\n m.route.set(app.route('flags'));\n }\n getUnreadCount() {\n return app.forum.attribute('flagCount');\n }\n getNewCount() {\n return app.session.user.attribute('newFlagCount');\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagsDropdown', FlagsDropdown);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/Post');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/humanTime');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extenders');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/Post');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Page');","import app from 'flarum/forum/app';\nimport Page from 'flarum/common/components/Page';\nimport FlagList from './FlagList';\n\n/**\n * The `FlagsPage` component shows the flags list. It is only\n * used on mobile devices where the flags dropdown is within the drawer.\n */\nexport default class FlagsPage extends Page {\n oninit(vnode) {\n super.oninit(vnode);\n app.history.push('flags');\n app.flags.load();\n this.bodyClass = 'App--flags';\n }\n view() {\n return m(\"div\", {\n className: \"FlagsPage\"\n }, m(FlagList, {\n state: app.flags\n }));\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagsPage', FlagsPage);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Model');","import Model from 'flarum/common/Model';\nexport default class Flag extends Model {\n type() {\n return Model.attribute('type').call(this);\n }\n reason() {\n return Model.attribute('reason').call(this);\n }\n reasonDetail() {\n return Model.attribute('reasonDetail').call(this);\n }\n createdAt() {\n return Model.attribute('createdAt', Model.transformDate).call(this);\n }\n post() {\n return Model.hasOne('post').call(this);\n }\n user() {\n return Model.hasOne('user').call(this);\n }\n}\nflarum.reg.add('flarum-flags', 'forum/models/Flag', Flag);","import Extend from 'flarum/common/extenders';\nimport Post from 'flarum/common/models/Post';\nimport FlagsPage from './components/FlagsPage';\nimport Flag from './models/Flag';\nexport default [new Extend.Routes() //\n.add('flags', '/flags', FlagsPage), new Extend.Store() //\n.add('flags', Flag), new Extend.Model(Post) //\n.hasMany('flags').attribute('canFlag')];","import app from 'flarum/forum/app';\nimport FlagListState from './states/FlagListState';\nimport addFlagControl from './addFlagControl';\nimport addFlagsDropdown from './addFlagsDropdown';\nimport addFlagsToPosts from './addFlagsToPosts';\nexport { default as extend } from './extend';\napp.initializers.add('flarum-flags', () => {\n app.flags = new FlagListState(app);\n addFlagControl();\n addFlagsDropdown();\n addFlagsToPosts();\n});\nimport './forum';","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport PostControls from 'flarum/forum/utils/PostControls';\nimport Button from 'flarum/common/components/Button';\nimport FlagPostModal from './components/FlagPostModal';\nexport default function () {\n extend(PostControls, 'userControls', function (items, post) {\n if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag()) return;\n items.add('flag', m(Button, {\n icon: \"fas fa-flag\",\n onclick: () => app.modal.show(FlagPostModal, {\n post\n })\n }, app.translator.trans('flarum-flags.forum.post_controls.flag_button')));\n });\n}","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport HeaderSecondary from 'flarum/forum/components/HeaderSecondary';\nimport FlagsDropdown from './components/FlagsDropdown';\nexport default function () {\n extend(HeaderSecondary.prototype, 'items', function (items) {\n if (app.forum.attribute('canViewFlags')) {\n items.add('flags', m(FlagsDropdown, {\n state: app.flags\n }), 15);\n }\n });\n}","import { extend, override } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Post from 'flarum/forum/components/Post';\nimport Button from 'flarum/common/components/Button';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport PostControls from 'flarum/forum/utils/PostControls';\nimport humanTime from 'flarum/common/utils/humanTime';\nexport default function () {\n extend(Post.prototype, 'elementAttrs', function (attrs) {\n if (this.attrs.post.flags().length) {\n attrs.className += ' Post--flagged';\n }\n });\n Post.prototype.dismissFlag = function (body) {\n const post = this.attrs.post;\n delete post.data.relationships.flags;\n this.subtree.invalidate();\n if (app.flags.cache) {\n app.flags.cache.some((flag, i) => {\n if (flag.post() === post) {\n app.flags.cache.splice(i, 1);\n if (app.flags.index === post) {\n let next = app.flags.cache[i];\n if (!next) next = app.flags.cache[0];\n if (next) {\n const nextPost = next.post();\n app.flags.index = nextPost;\n m.route.set(app.route.post(nextPost));\n }\n }\n return true;\n }\n });\n }\n return app.request({\n url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags',\n method: 'DELETE',\n body\n });\n };\n Post.prototype.flagActionItems = function () {\n const items = new ItemList();\n const controls = PostControls.destructiveControls(this.attrs.post);\n Object.keys(controls.toObject()).forEach(k => {\n const attrs = controls.get(k).attrs;\n attrs.className = 'Button';\n extend(attrs, 'onclick', () => this.dismissFlag());\n });\n items.add('controls', m(\"div\", {\n className: \"ButtonGroup\"\n }, controls.toArray()));\n items.add('dismiss', m(Button, {\n className: \"Button\",\n icon: \"far fa-eye-slash\",\n onclick: this.dismissFlag.bind(this)\n }, app.translator.trans('flarum-flags.forum.post.dismiss_flag_button')), -100);\n return items;\n };\n override(Post.prototype, 'header', function (vdom) {\n const post = this.attrs.post;\n const flags = post.flags();\n if (!flags.length) return;\n if (post.isHidden()) this.revealContent = true;\n return m(\"div\", {\n className: \"Post-flagged\"\n }, m(\"div\", {\n className: \"Post-flagged-flags\"\n }, flags.map(flag => m(\"div\", {\n className: \"Post-flagged-flag\"\n }, this.flagReason(flag)))), m(\"div\", {\n className: \"Post-flagged-actions\"\n }, this.flagActionItems().toArray()));\n });\n Post.prototype.flagReason = function (flag) {\n if (flag.type() === 'user') {\n const user = flag.user();\n const reason = flag.reason() ? app.translator.trans(\"flarum-flags.forum.flag_post.reason_\".concat(flag.reason(), \"_label\")) : null;\n const detail = flag.reasonDetail();\n const time = humanTime(flag.createdAt());\n return [app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', {\n time,\n user,\n reason\n }), !!detail && m(\"span\", {\n className: \"Post-flagged-detail\"\n }, detail)];\n }\n };\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","reg","_typeof","iterator","constructor","FlagListState","app","super","this","arg","input","hint","prim","toPrimitive","undefined","res","TypeError","String","toPropertyKey","configurable","writable","type","load","_this$app$session$use","session","user","attribute","pages","location","page","length","Promise","resolve","loadNext","add","FlagPostModal","oninit","vnode","success","reason","reasonDetail","className","title","content","m","onclick","hide","bind","flagReasons","toArray","loading","disabled","items","guidelinesUrl","name","checked","placeholder","oninput","href","target","onsubmit","e","preventDefault","save","relationships","post","attrs","errorHandler","onerror","then","catch","loaded","FlagList","view","state","hasItems","isLoading","emptyText","loadMore","hasNext","isLoadingNext","getPages","map","flag","avatar","icon","username","em","discussion","excerpt","contentPlain","datetime","createdAt","redraw","FlagsDropdown","static","label","initAttrs","getContent","goToRoute","route","set","getUnreadCount","getNewCount","FlagsPage","bodyClass","Flag","hasMany","extend","isHidden","contentType","canFlag","flags","body","data","subtree","invalidate","i","next","nextPost","url","apiEndpoint","method","controls","keys","toObject","forEach","k","dismissFlag","override","vdom","revealContent","flagReason","flagActionItems","concat","detail","time"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"forum.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,sDCL9D,MAAM,EAA+BC,OAAOC,IAAIV,IAAI,OAAQ,a,aCA7C,SAASW,EAAQV,GAG9B,OAAOU,EAAU,mBAAqBL,QAAU,iBAAmBA,OAAOM,SAAW,SAAUX,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBK,QAAUL,EAAIY,cAAgBP,QAAUL,IAAQK,OAAOH,UAAY,gBAAkBF,CAC1H,EAAGU,EAAQV,EACb,CCRA,MAAM,EAA+BQ,OAAOC,IAAIV,IAAI,OAAQ,oC,aCE7C,MAAMc,UAAsB,KACzCD,YAAYE,GCFC,IAAyBd,EAAKN,EAAKa,EDG9CQ,MAAM,CAAC,EAAG,EAAG,MCHuBf,EDIpBgB,KCJ8BT,ODIjB,GCH/Bb,ECAa,SAAwBuB,GACrC,IAAIvB,ECFS,SAAsBwB,EAAOC,GAC1C,GAAuB,WAAnBT,EAAQQ,IAAiC,OAAVA,EAAgB,OAAOA,EAC1D,IAAIE,EAAOF,EAAMb,OAAOgB,aACxB,QAAaC,IAATF,EAAoB,CACtB,IAAIG,EAAMH,EAAKhB,KAAKc,EAAOC,GAC3B,GAAqB,WAAjBT,EAAQa,GAAmB,OAAOA,EACtC,MAAM,IAAIC,UAAU,+CACtB,CACA,OAA4BC,OAAiBP,EAC/C,CDPYG,CAAYJ,EAAK,UAC3B,MAAwB,WAAjBP,EAAQhB,GAAoBA,EAAM+B,OAAO/B,EAClD,CDHQgC,CADqChC,EDInB,UCFbM,EACTJ,OAAOC,eAAeG,EAAKN,EAAK,CAC9Ba,MAAOA,EACPT,YAAY,EACZ6B,cAAc,EACdC,UAAU,IAGZ5B,EAAIN,GAAOa,EDLXS,KAAKF,IAAMA,CACb,CACIe,WACF,MAAO,OACT,CAMAC,OACE,IAAIC,EAOJ,OANuD,OAAlDA,EAAwBf,KAAKF,IAAIkB,QAAQC,OAAiBF,EAAsBG,UAAU,kBAC7FlB,KAAKmB,MAAQ,GACbnB,KAAKoB,SAAW,CACdC,KAAM,IAGNrB,KAAKmB,MAAMG,OAAS,EACfC,QAAQC,UAEVzB,MAAM0B,UACf,EAEFjC,OAAOC,IAAIiC,IAAI,eAAgB,6BAA8B7B,GI9B7D,MAAM,EAA+BL,OAAOC,IAAIV,IAAI,OAAQ,iBCAtD,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,4B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,4B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,+B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,uB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,yB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,yB,aCO7C,MAAM4C,UAAsB,KACzCC,OAAOC,GACL9B,MAAM6B,OAAOC,GACb7B,KAAK8B,SAAU,EACf9B,KAAK+B,OAAS,IAAO,IACrB/B,KAAKgC,aAAe,IAAO,GAC7B,CACAC,YACE,MAAO,6BACT,CACAC,QACE,OAAO,qBAAqB,qCAC9B,CACAC,UACE,OAAInC,KAAK8B,QACAM,EAAE,MAAO,CACdH,UAAW,cACVG,EAAE,IAAM,CACTH,UAAW,kBACVG,EAAE,IAAK,CACRH,UAAW,YACV,qBAAqB,sDAAuDG,EAAE,MAAO,CACtFH,UAAW,4BACVG,EAAE,IAAQ,CACXH,UAAW,uCACXI,QAASrC,KAAKsC,KAAKC,KAAKvC,OACvB,qBAAqB,mDAEnBoC,EAAE,MAAO,CACdH,UAAW,cACVG,EAAE,IAAM,CACTH,UAAW,kBACVG,EAAE,MAAO,CACVH,UAAW,cACVG,EAAE,MAAO,KAAMpC,KAAKwC,cAAcC,YAAaL,EAAE,MAAO,CACzDH,UAAW,4BACVG,EAAE,IAAQ,CACXH,UAAW,uCACXpB,KAAM,SACN6B,QAAS1C,KAAK0C,QACdC,UAAW3C,KAAK+B,UACf,qBAAqB,iDAC1B,CACAS,cACE,MAAMI,EAAQ,IAAI,KACZC,EAAgB,oBAAoB,iBA6D1C,OA5DAD,EAAMlB,IAAI,YAAaU,EAAE,QAAS,CAChCH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,cAAlB/C,KAAK+B,SACdxC,MAAO,YACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,wDAAyD,qBAAqB,sDAAyE,cAAlBpC,KAAK+B,UAA4BK,EAAE,WAAY,CAC7NH,UAAW,cACXe,YAAa,qBAAqB,2DAClCzD,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACLY,EAAMlB,IAAI,gBAAiBU,EAAE,QAAS,CACpCH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,kBAAlB/C,KAAK+B,SACdxC,MAAO,gBACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,4DAA6D,qBAAqB,yDAA0D,CACrL7D,EAAGsE,EAAgBT,EAAE,IAAK,CACxBc,KAAML,EACNM,OAAQ,gBACL7C,IACe,kBAAlBN,KAAK+B,UAAgCK,EAAE,WAAY,CACrDH,UAAW,cACXe,YAAa,qBAAqB,2DAClCzD,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACLY,EAAMlB,IAAI,OAAQU,EAAE,QAAS,CAC3BH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,SAAlB/C,KAAK+B,SACdxC,MAAO,OACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,mDAAoD,qBAAqB,iDAAoE,SAAlBpC,KAAK+B,UAAuBK,EAAE,WAAY,CAC9MH,UAAW,cACXe,YAAa,qBAAqB,2DAClCzD,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACLY,EAAMlB,IAAI,QAASU,EAAE,QAAS,CAC5BH,UAAW,YACVG,EAAE,QAAS,CACZvB,KAAM,QACNiC,KAAM,SACNC,QAA2B,UAAlB/C,KAAK+B,SACdxC,MAAO,QACP8C,QAAS,IAAS,QAASrC,KAAK+B,UAC9BK,EAAE,SAAU,KAAM,qBAAqB,oDAAuE,UAAlBpC,KAAK+B,UAAwBK,EAAE,WAAY,CACzIH,UAAW,cACX1C,MAAOS,KAAKgC,eACZiB,QAAS,IAAS,QAASjD,KAAKgC,iBAC7B,IACEY,CACT,CACAQ,SAASC,GACPA,EAAEC,iBACFtD,KAAK0C,SAAU,EACf,uBAAuB,SAASa,KAAK,CACnCxB,OAA0B,UAAlB/B,KAAK+B,SAAuB,KAAO/B,KAAK+B,SAChDC,aAAchC,KAAKgC,eACnBwB,cAAe,CACbC,KAAMzD,KAAK0D,MAAMD,OAElB,CACDE,aAAc3D,KAAK4D,QAAQrB,KAAKvC,QAC/B6D,MAAK,IAAM7D,KAAK8B,SAAU,IAAMgC,OAAM,SAAUD,KAAK7D,KAAK+D,OAAOxB,KAAKvC,MAC3E,EAEFR,OAAOC,IAAIiC,IAAI,eAAgB,iCAAkCC,GCjIjE,MAAM,EAA+BnC,OAAOC,IAAIV,IAAI,OAAQ,oC,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,mC,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,oB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,4B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,2B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,+B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,mC,aCM7C,MAAMiF,UAAiB,KACpCpC,OAAOC,GACL9B,MAAM6B,OAAOC,EACf,CACAoC,OACE,MAAMC,EAAQlE,KAAK0D,MAAMQ,MACzB,OAAO9B,EAAE,IAAY,CACnBH,UAAW,WACXC,MAAO,qBAAqB,0CAC5BiC,SAAUD,EAAMC,WAChBzB,QAASwB,EAAME,YACfC,UAAW,qBAAqB,+CAChCC,SAAU,IAAMJ,EAAMK,YAAcL,EAAMM,iBAAmBN,EAAMzC,YAClEW,EAAE,KAAM,CACTH,UAAW,2BACVjC,KAAKmC,QAAQ+B,IAClB,CACA/B,QAAQ+B,GACN,OAAKA,EAAME,aAAeF,EAAMC,WACvBD,EAAMO,WAAWC,KAAIrD,GACnBA,EAAKuB,MAAM8B,KAAIC,IACpB,MAAMlB,EAAOkB,EAAKlB,OAClB,OAAOrB,EAAE,KAAM,KAAMA,EAAE,IAAgB,CACrCH,UAAW,OACX2C,OAAQxC,EAAE,IAAQ,CAChBnB,KAAMwC,EAAKxC,QAAU,OAEvB4D,KAAM,cACN1C,QAAS,qBAAqB,6CAA8C,CAC1E2C,SAAU,IAASrB,EAAKxC,QACxB8D,GAAI3C,EAAE,KAAM,MACZ4C,WAAYvB,EAAKuB,aAAa9C,UAEhC+C,QAASxB,EAAKyB,eACdC,SAAUR,EAAKS,YACflC,KAAM,eAAeO,GACrBpB,QAASgB,IACPA,EAAEgC,QAAS,CAAK,IAEjB,MAIF,IACT,EAEF7F,OAAOC,IAAIiC,IAAI,eAAgB,4BAA6BsC,GChD7C,MAAMsB,UAAsB,KACzCC,iBAAiB7B,GACfA,EAAMzB,UAAY,IAAU,gBAAiByB,EAAMzB,WACnDyB,EAAM8B,MAAQ9B,EAAM8B,OAAS,qBAAqB,4CAClD9B,EAAMmB,KAAOnB,EAAMmB,MAAQ,cAC3B9E,MAAM0F,UAAU/B,EAClB,CACAgC,aACE,OAAOtD,EAAE4B,EAAU,CACjBE,MAAOlE,KAAK0D,MAAMQ,OAEtB,CACAyB,YACEvD,EAAEwD,MAAMC,IAAI,UAAU,SACxB,CACAC,iBACE,OAAO,oBAAoB,YAC7B,CACAC,cACE,OAAO,2BAA2B,eACpC,EAEFvG,OAAOC,IAAIiC,IAAI,eAAgB,iCAAkC4D,GC1BjE,MAAM,EAA+B9F,OAAOC,IAAIV,IAAI,OAAQ,yB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,oB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,sB,aCA5D,MAAM,EAA+BS,OAAOC,IAAIV,IAAI,OAAQ,0B,aCQ7C,MAAMiH,UAAkB,KACrCpE,OAAOC,GACL9B,MAAM6B,OAAOC,GACb,iBAAiB,SACjB,iBACA7B,KAAKiG,UAAY,YACnB,CACAhC,OACE,OAAO7B,EAAE,MAAO,CACdH,UAAW,aACVG,EAAE4B,EAAU,CACbE,MAAO,YAEX,EAEF1E,OAAOC,IAAIiC,IAAI,eAAgB,6BAA8BsE,GCvB7D,MAAM,GAA+BxG,OAAOC,IAAIV,IAAI,OAAQ,gB,eCC7C,MAAMmH,WAAa,MAChCrF,OACE,OAAO,eAAgB,QAAQzB,KAAKY,KACtC,CACA+B,SACE,OAAO,eAAgB,UAAU3C,KAAKY,KACxC,CACAgC,eACE,OAAO,eAAgB,gBAAgB5C,KAAKY,KAC9C,CACAoF,YACE,OAAO,eAAgB,YAAa,oBAAqBhG,KAAKY,KAChE,CACAyD,OACE,OAAO,YAAa,QAAQrE,KAAKY,KACnC,CACAiB,OACE,OAAO,YAAa,QAAQ7B,KAAKY,KACnC,EAEFR,OAAOC,IAAIiC,IAAI,eAAgB,oBAAqBwE,ICjBpD,WAAgB,IAAI,aACnBxE,IAAI,QAAS,SAAUsE,IAAY,IAAI,YACvCtE,IAAI,QAASwE,IAAO,IAAI,WAAa,KACrCC,QAAQ,SAASjF,UAAU,YCD5B,qBAAqB,gBAAgB,KACnC,UAAY,IAAIrB,EAAc,MCD9B,IAAAuG,QAAO,IAAc,gBAAgB,SAAUxD,EAAOa,IAChDA,EAAK4C,YAAqC,YAAvB5C,EAAK6C,eAAgC7C,EAAK8C,WACjE3D,EAAMlB,IAAI,OAAQU,EAAE,IAAQ,CAC1ByC,KAAM,cACNxC,QAAS,IAAM,eAAeV,EAAe,CAC3C8B,UAED,qBAAqB,iDAC1B,KCTA,IAAA2C,QAAO,cAA2B,SAAS,SAAUxD,GAC/C,oBAAoB,iBACtBA,EAAMlB,IAAI,QAASU,EAAEkD,EAAe,CAClCpB,MAAO,YACL,GAER,KCHA,IAAAkC,QAAO,cAAgB,gBAAgB,SAAU1C,GAC3C1D,KAAK0D,MAAMD,KAAK+C,QAAQlF,SAC1BoC,EAAMzB,WAAa,iBAEvB,IACA,0BAA6B,SAAUwE,GACrC,MAAMhD,EAAOzD,KAAK0D,MAAMD,KAoBxB,cAnBOA,EAAKiD,KAAKlD,cAAcgD,MAC/BxG,KAAK2G,QAAQC,aACT,iBACF,sBAAqB,CAACjC,EAAMkC,KAC1B,GAAIlC,EAAKlB,SAAWA,EAAM,CAExB,GADA,uBAAuBoD,EAAG,GACtB,kBAAoBpD,EAAM,CAC5B,IAAIqD,EAAO,gBAAgBD,GAE3B,GADKC,IAAMA,EAAO,oBACdA,EAAM,CACR,MAAMC,EAAWD,EAAKrD,OACtB,gBAAkBsD,EAClB3E,EAAEwD,MAAMC,IAAI,eAAekB,GAC7B,CACF,CACA,OAAO,CACT,KAGG,YAAY,CACjBC,IAAK,oBAAoB,UAAYvD,EAAKwD,cAAgB,SAC1DC,OAAQ,SACRT,QAEJ,EACA,8BAAiC,WAC/B,MAAM7D,EAAQ,IAAI,KACZuE,EAAW,wBAAiCnH,KAAK0D,MAAMD,MAc7D,OAbA7E,OAAOwI,KAAKD,EAASE,YAAYC,SAAQC,IACvC,MAAM7D,EAAQyD,EAASpI,IAAIwI,GAAG7D,MAC9BA,EAAMzB,UAAY,UAClB,IAAAmE,QAAO1C,EAAO,WAAW,IAAM1D,KAAKwH,eAAc,IAEpD5E,EAAMlB,IAAI,WAAYU,EAAE,MAAO,CAC7BH,UAAW,eACVkF,EAAS1E,YACZG,EAAMlB,IAAI,UAAWU,EAAE,IAAQ,CAC7BH,UAAW,SACX4C,KAAM,mBACNxC,QAASrC,KAAKwH,YAAYjF,KAAKvC,OAC9B,qBAAqB,iDAAkD,KACnE4C,CACT,GACA,IAAA6E,UAAS,cAAgB,UAAU,SAAUC,GAC3C,MAAMjE,EAAOzD,KAAK0D,MAAMD,KAClB+C,EAAQ/C,EAAK+C,QACnB,GAAKA,EAAMlF,OAEX,OADImC,EAAK4C,aAAYrG,KAAK2H,eAAgB,GACnCvF,EAAE,MAAO,CACdH,UAAW,gBACVG,EAAE,MAAO,CACVH,UAAW,sBACVuE,EAAM9B,KAAIC,GAAQvC,EAAE,MAAO,CAC5BH,UAAW,qBACVjC,KAAK4H,WAAWjD,OAAUvC,EAAE,MAAO,CACpCH,UAAW,wBACVjC,KAAK6H,kBAAkBpF,WAC5B,IACA,yBAA4B,SAAUkC,GACpC,GAAoB,SAAhBA,EAAK9D,OAAmB,CAC1B,MAAMI,EAAO0D,EAAK1D,OACZc,EAAS4C,EAAK5C,SAAW,qBAAqB,uCAAuC+F,OAAOnD,EAAK5C,SAAU,WAAa,KACxHgG,EAASpD,EAAK3C,eACdgG,EAAO,IAAUrD,EAAKS,aAC5B,MAAO,CAAC,qBAAqBrD,EAAS,sDAAwD,0CAA2C,CACvIiG,OACA/G,OACAc,aACIgG,GAAU3F,EAAE,OAAQ,CACxBH,UAAW,uBACV8F,GACL,CACF,CH7EiB,G","sources":["webpack://@flarum/flags/webpack/bootstrap","webpack://@flarum/flags/webpack/runtime/compat get default export","webpack://@flarum/flags/webpack/runtime/define property getters","webpack://@flarum/flags/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/flags/webpack/runtime/make namespace object","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/app')\"","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/states/PaginatedListState')\"","webpack://@flarum/flags/./src/forum/states/FlagListState.tsx","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@flarum/flags/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/extend')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/utils/PostControls')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Button')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/FormModal')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Form')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/Stream')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/withAttr')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/ItemList')\"","webpack://@flarum/flags/./src/forum/components/FlagPostModal.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderSecondary')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderDropdown')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/classList')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/Component')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Avatar')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/helpers/username')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderList')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/HeaderListItem')\"","webpack://@flarum/flags/./src/forum/components/FlagList.tsx","webpack://@flarum/flags/./src/forum/components/FlagsDropdown.tsx","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'forum/components/Post')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/utils/humanTime')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/extenders')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/models/Post')\"","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/components/Page')\"","webpack://@flarum/flags/./src/forum/components/FlagsPage.js","webpack://@flarum/flags/external root \"flarum.reg.get('core', 'common/Model')\"","webpack://@flarum/flags/./src/forum/models/Flag.ts","webpack://@flarum/flags/./src/forum/extend.ts","webpack://@flarum/flags/./src/forum/index.ts","webpack://@flarum/flags/./src/forum/addFlagControl.js","webpack://@flarum/flags/./src/forum/addFlagsDropdown.js","webpack://@flarum/flags/./src/forum/addFlagsToPosts.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/app');","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/states/PaginatedListState');","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport PaginatedListState from 'flarum/common/states/PaginatedListState';\nexport default class FlagListState extends PaginatedListState {\n constructor(app) {\n super({}, 1, null);\n _defineProperty(this, \"app\", void 0);\n this.app = app;\n }\n get type() {\n return 'flags';\n }\n\n /**\n * Load flags into the application's cache if they haven't already\n * been loaded.\n */\n load() {\n var _this$app$session$use;\n if ((_this$app$session$use = this.app.session.user) != null && _this$app$session$use.attribute('newFlagCount')) {\n this.pages = [];\n this.location = {\n page: 1\n };\n }\n if (this.pages.length > 0) {\n return Promise.resolve();\n }\n return super.loadNext();\n }\n}\nflarum.reg.add('flarum-flags', 'forum/states/FlagListState', FlagListState);","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extend');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/utils/PostControls');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Button');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/FormModal');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Form');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/Stream');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/withAttr');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/ItemList');","import app from 'flarum/forum/app';\nimport FormModal from 'flarum/common/components/FormModal';\nimport Form from 'flarum/common/components/Form';\nimport Button from 'flarum/common/components/Button';\nimport Stream from 'flarum/common/utils/Stream';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport ItemList from 'flarum/common/utils/ItemList';\nexport default class FlagPostModal extends FormModal {\n oninit(vnode) {\n super.oninit(vnode);\n this.success = false;\n this.reason = Stream('');\n this.reasonDetail = Stream('');\n }\n className() {\n return 'FlagPostModal Modal--medium';\n }\n title() {\n return app.translator.trans('flarum-flags.forum.flag_post.title');\n }\n content() {\n if (this.success) {\n return m(\"div\", {\n className: \"Modal-body\"\n }, m(Form, {\n className: \"Form--centered\"\n }, m(\"p\", {\n className: \"helpText\"\n }, app.translator.trans('flarum-flags.forum.flag_post.confirmation_message')), m(\"div\", {\n className: \"Form-group Form-controls\"\n }, m(Button, {\n className: \"Button Button--primary Button--block\",\n onclick: this.hide.bind(this)\n }, app.translator.trans('flarum-flags.forum.flag_post.dismiss_button')))));\n }\n return m(\"div\", {\n className: \"Modal-body\"\n }, m(Form, {\n className: \"Form--centered\"\n }, m(\"div\", {\n className: \"Form-group\"\n }, m(\"div\", null, this.flagReasons().toArray())), m(\"div\", {\n className: \"Form-group Form-controls\"\n }, m(Button, {\n className: \"Button Button--primary Button--block\",\n type: \"submit\",\n loading: this.loading,\n disabled: !this.reason()\n }, app.translator.trans('flarum-flags.forum.flag_post.submit_button')))));\n }\n flagReasons() {\n const items = new ItemList();\n const guidelinesUrl = app.forum.attribute('guidelinesUrl');\n items.add('off-topic', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'off_topic',\n value: \"off_topic\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_label')), app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_text'), this.reason() === 'off_topic' && m(\"textarea\", {\n className: \"FormControl\",\n placeholder: app.translator.trans('flarum-flags.forum.flag_post.reason_details_placeholder'),\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 70);\n items.add('inappropriate', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'inappropriate',\n value: \"inappropriate\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_label')), app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_text', {\n a: guidelinesUrl ? m(\"a\", {\n href: guidelinesUrl,\n target: \"_blank\"\n }) : undefined\n }), this.reason() === 'inappropriate' && m(\"textarea\", {\n className: \"FormControl\",\n placeholder: app.translator.trans('flarum-flags.forum.flag_post.reason_details_placeholder'),\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 60);\n items.add('spam', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'spam',\n value: \"spam\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_spam_label')), app.translator.trans('flarum-flags.forum.flag_post.reason_spam_text'), this.reason() === 'spam' && m(\"textarea\", {\n className: \"FormControl\",\n placeholder: app.translator.trans('flarum-flags.forum.flag_post.reason_details_placeholder'),\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 50);\n items.add('other', m(\"label\", {\n className: \"checkbox\"\n }, m(\"input\", {\n type: \"radio\",\n name: \"reason\",\n checked: this.reason() === 'other',\n value: \"other\",\n onclick: withAttr('value', this.reason)\n }), m(\"strong\", null, app.translator.trans('flarum-flags.forum.flag_post.reason_other_label')), this.reason() === 'other' && m(\"textarea\", {\n className: \"FormControl\",\n value: this.reasonDetail(),\n oninput: withAttr('value', this.reasonDetail)\n })), 10);\n return items;\n }\n onsubmit(e) {\n e.preventDefault();\n this.loading = true;\n app.store.createRecord('flags').save({\n reason: this.reason() === 'other' ? null : this.reason(),\n reasonDetail: this.reasonDetail(),\n relationships: {\n post: this.attrs.post\n }\n }, {\n errorHandler: this.onerror.bind(this)\n }).then(() => this.success = true).catch(() => {}).then(this.loaded.bind(this));\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagPostModal', FlagPostModal);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderSecondary');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderDropdown');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/classList');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Component');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Avatar');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/helpers/username');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderList');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/HeaderListItem');","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Avatar from 'flarum/common/components/Avatar';\nimport username from 'flarum/common/helpers/username';\nimport HeaderList from 'flarum/forum/components/HeaderList';\nimport HeaderListItem from 'flarum/forum/components/HeaderListItem';\nexport default class FlagList extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n }\n view() {\n const state = this.attrs.state;\n return m(HeaderList, {\n className: \"FlagList\",\n title: app.translator.trans('flarum-flags.forum.flagged_posts.title'),\n hasItems: state.hasItems(),\n loading: state.isLoading(),\n emptyText: app.translator.trans('flarum-flags.forum.flagged_posts.empty_text'),\n loadMore: () => state.hasNext() && !state.isLoadingNext() && state.loadNext()\n }, m(\"ul\", {\n className: \"HeaderListGroup-content\"\n }, this.content(state)));\n }\n content(state) {\n if (!state.isLoading() && state.hasItems()) {\n return state.getPages().map(page => {\n return page.items.map(flag => {\n const post = flag.post();\n return m(\"li\", null, m(HeaderListItem, {\n className: \"Flag\",\n avatar: m(Avatar, {\n user: post.user() || null\n }),\n icon: \"fas fa-flag\",\n content: app.translator.trans('flarum-flags.forum.flagged_posts.item_text', {\n username: username(post.user()),\n em: m(\"em\", null),\n discussion: post.discussion().title()\n }),\n excerpt: post.contentPlain(),\n datetime: flag.createdAt(),\n href: app.route.post(post),\n onclick: e => {\n e.redraw = false;\n }\n }));\n });\n });\n }\n return null;\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagList', FlagList);","import app from 'flarum/forum/app';\nimport HeaderDropdown from 'flarum/forum/components/HeaderDropdown';\nimport classList from 'flarum/common/utils/classList';\nimport FlagList from './FlagList';\nexport default class FlagsDropdown extends HeaderDropdown {\n static initAttrs(attrs) {\n attrs.className = classList('FlagsDropdown', attrs.className);\n attrs.label = attrs.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip');\n attrs.icon = attrs.icon || 'fas fa-flag';\n super.initAttrs(attrs);\n }\n getContent() {\n return m(FlagList, {\n state: this.attrs.state\n });\n }\n goToRoute() {\n m.route.set(app.route('flags'));\n }\n getUnreadCount() {\n return app.forum.attribute('flagCount');\n }\n getNewCount() {\n return app.session.user.attribute('newFlagCount');\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagsDropdown', FlagsDropdown);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/Post');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/humanTime');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extenders');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/Post');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Page');","import app from 'flarum/forum/app';\nimport Page from 'flarum/common/components/Page';\nimport FlagList from './FlagList';\n\n/**\n * The `FlagsPage` component shows the flags list. It is only\n * used on mobile devices where the flags dropdown is within the drawer.\n */\nexport default class FlagsPage extends Page {\n oninit(vnode) {\n super.oninit(vnode);\n app.history.push('flags');\n app.flags.load();\n this.bodyClass = 'App--flags';\n }\n view() {\n return m(\"div\", {\n className: \"FlagsPage\"\n }, m(FlagList, {\n state: app.flags\n }));\n }\n}\nflarum.reg.add('flarum-flags', 'forum/components/FlagsPage', FlagsPage);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Model');","import Model from 'flarum/common/Model';\nexport default class Flag extends Model {\n type() {\n return Model.attribute('type').call(this);\n }\n reason() {\n return Model.attribute('reason').call(this);\n }\n reasonDetail() {\n return Model.attribute('reasonDetail').call(this);\n }\n createdAt() {\n return Model.attribute('createdAt', Model.transformDate).call(this);\n }\n post() {\n return Model.hasOne('post').call(this);\n }\n user() {\n return Model.hasOne('user').call(this);\n }\n}\nflarum.reg.add('flarum-flags', 'forum/models/Flag', Flag);","import Extend from 'flarum/common/extenders';\nimport Post from 'flarum/common/models/Post';\nimport FlagsPage from './components/FlagsPage';\nimport Flag from './models/Flag';\nexport default [new Extend.Routes() //\n.add('flags', '/flags', FlagsPage), new Extend.Store() //\n.add('flags', Flag), new Extend.Model(Post) //\n.hasMany('flags').attribute('canFlag')];","import app from 'flarum/forum/app';\nimport FlagListState from './states/FlagListState';\nimport addFlagControl from './addFlagControl';\nimport addFlagsDropdown from './addFlagsDropdown';\nimport addFlagsToPosts from './addFlagsToPosts';\nexport { default as extend } from './extend';\napp.initializers.add('flarum-flags', () => {\n app.flags = new FlagListState(app);\n addFlagControl();\n addFlagsDropdown();\n addFlagsToPosts();\n});\nimport './forum';","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport PostControls from 'flarum/forum/utils/PostControls';\nimport Button from 'flarum/common/components/Button';\nimport FlagPostModal from './components/FlagPostModal';\nexport default function () {\n extend(PostControls, 'userControls', function (items, post) {\n if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag()) return;\n items.add('flag', m(Button, {\n icon: \"fas fa-flag\",\n onclick: () => app.modal.show(FlagPostModal, {\n post\n })\n }, app.translator.trans('flarum-flags.forum.post_controls.flag_button')));\n });\n}","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport HeaderSecondary from 'flarum/forum/components/HeaderSecondary';\nimport FlagsDropdown from './components/FlagsDropdown';\nexport default function () {\n extend(HeaderSecondary.prototype, 'items', function (items) {\n if (app.forum.attribute('canViewFlags')) {\n items.add('flags', m(FlagsDropdown, {\n state: app.flags\n }), 15);\n }\n });\n}","import { extend, override } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Post from 'flarum/forum/components/Post';\nimport Button from 'flarum/common/components/Button';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport PostControls from 'flarum/forum/utils/PostControls';\nimport humanTime from 'flarum/common/utils/humanTime';\nexport default function () {\n extend(Post.prototype, 'elementAttrs', function (attrs) {\n if (this.attrs.post.flags().length) {\n attrs.className += ' Post--flagged';\n }\n });\n Post.prototype.dismissFlag = function (body) {\n const post = this.attrs.post;\n delete post.data.relationships.flags;\n this.subtree.invalidate();\n if (app.flags.cache) {\n app.flags.cache.some((flag, i) => {\n if (flag.post() === post) {\n app.flags.cache.splice(i, 1);\n if (app.flags.index === post) {\n let next = app.flags.cache[i];\n if (!next) next = app.flags.cache[0];\n if (next) {\n const nextPost = next.post();\n app.flags.index = nextPost;\n m.route.set(app.route.post(nextPost));\n }\n }\n return true;\n }\n });\n }\n return app.request({\n url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags',\n method: 'DELETE',\n body\n });\n };\n Post.prototype.flagActionItems = function () {\n const items = new ItemList();\n const controls = PostControls.destructiveControls(this.attrs.post);\n Object.keys(controls.toObject()).forEach(k => {\n const attrs = controls.get(k).attrs;\n attrs.className = 'Button';\n extend(attrs, 'onclick', () => this.dismissFlag());\n });\n items.add('controls', m(\"div\", {\n className: \"ButtonGroup\"\n }, controls.toArray()));\n items.add('dismiss', m(Button, {\n className: \"Button\",\n icon: \"far fa-eye-slash\",\n onclick: this.dismissFlag.bind(this)\n }, app.translator.trans('flarum-flags.forum.post.dismiss_flag_button')), -100);\n return items;\n };\n override(Post.prototype, 'header', function (vdom) {\n const post = this.attrs.post;\n const flags = post.flags();\n if (!flags.length) return;\n if (post.isHidden()) this.revealContent = true;\n return m(\"div\", {\n className: \"Post-flagged\"\n }, m(\"div\", {\n className: \"Post-flagged-flags\"\n }, flags.map(flag => m(\"div\", {\n className: \"Post-flagged-flag\"\n }, this.flagReason(flag)))), m(\"div\", {\n className: \"Post-flagged-actions\"\n }, this.flagActionItems().toArray()));\n });\n Post.prototype.flagReason = function (flag) {\n if (flag.type() === 'user') {\n const user = flag.user();\n const reason = flag.reason() ? app.translator.trans(\"flarum-flags.forum.flag_post.reason_\".concat(flag.reason(), \"_label\")) : null;\n const detail = flag.reasonDetail();\n const time = humanTime(flag.createdAt());\n return [app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', {\n time,\n user,\n reason\n }), !!detail && m(\"span\", {\n className: \"Post-flagged-detail\"\n }, detail)];\n }\n };\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","reg","_typeof","iterator","constructor","FlagListState","app","super","this","arg","input","hint","prim","toPrimitive","undefined","res","TypeError","String","toPropertyKey","configurable","writable","type","load","_this$app$session$use","session","user","attribute","pages","location","page","length","Promise","resolve","loadNext","add","FlagPostModal","oninit","vnode","success","reason","reasonDetail","className","title","content","m","onclick","hide","bind","flagReasons","toArray","loading","disabled","items","guidelinesUrl","name","checked","placeholder","oninput","href","target","onsubmit","e","preventDefault","save","relationships","post","attrs","errorHandler","onerror","then","catch","loaded","FlagList","view","state","hasItems","isLoading","emptyText","loadMore","hasNext","isLoadingNext","getPages","map","flag","avatar","icon","username","em","discussion","excerpt","contentPlain","datetime","createdAt","redraw","FlagsDropdown","static","label","initAttrs","getContent","goToRoute","route","set","getUnreadCount","getNewCount","FlagsPage","bodyClass","Flag","hasMany","extend","isHidden","contentType","canFlag","flags","body","data","subtree","invalidate","i","next","nextPost","url","apiEndpoint","method","controls","keys","toObject","forEach","k","dismissFlag","override","vdom","revealContent","flagReason","flagActionItems","concat","detail","time"],"sourceRoot":""}
\ No newline at end of file
diff --git a/extensions/flags/js/src/forum/components/FlagPostModal.js b/extensions/flags/js/src/forum/components/FlagPostModal.js
index 560b99ec2..9c2e58954 100644
--- a/extensions/flags/js/src/forum/components/FlagPostModal.js
+++ b/extensions/flags/js/src/forum/components/FlagPostModal.js
@@ -151,7 +151,6 @@ export default class FlagPostModal extends FormModal {
reason: this.reason() === 'other' ? null : this.reason(),
reasonDetail: this.reasonDetail(),
relationships: {
- user: app.session.user,
post: this.attrs.post,
},
},
diff --git a/extensions/flags/src/Access/ScopeFlagVisibility.php b/extensions/flags/src/Access/ScopeFlagVisibility.php
index 8add2307f..25f038f1f 100644
--- a/extensions/flags/src/Access/ScopeFlagVisibility.php
+++ b/extensions/flags/src/Access/ScopeFlagVisibility.php
@@ -23,31 +23,26 @@ class ScopeFlagVisibility
public function __invoke(User $actor, Builder $query): void
{
- if ($this->extensions->isEnabled('flarum-tags')) {
- $query
- ->select('flags.*')
- ->leftJoin('posts', 'posts.id', '=', 'flags.post_id')
- ->leftJoin('discussions', 'discussions.id', '=', 'posts.discussion_id')
- ->whereNotExists(function ($query) use ($actor) {
- return $query->selectRaw('1')
- ->from('discussion_tag')
- ->whereNotIn('tag_id', function ($query) use ($actor) {
- Tag::query()->setQuery($query->from('tags'))->whereHasPermission($actor, 'discussion.viewFlags')->select('tags.id');
- })
- ->whereColumn('discussions.id', 'discussion_id');
- });
+ $query
+ ->whereHas('post', function (Builder $query) use ($actor) {
+ $query->whereVisibleTo($actor);
+ })
+ ->where(function (Builder $query) use ($actor) {
+ if ($this->extensions->isEnabled('flarum-tags')) {
+ $query
+ ->select('flags.*')
+ ->whereHas('post.discussion.tags', function ($query) use ($actor) {
+ $query->whereHasPermission($actor, 'discussion.viewFlags');
+ });
- if (! $actor->hasPermission('discussion.viewFlags')) {
- $query->whereExists(function ($query) {
- return $query->selectRaw('1')
- ->from('discussion_tag')
- ->whereColumn('discussions.id', 'discussion_id');
- });
- }
- }
+ if ($actor->hasPermission('discussion.viewFlags')) {
+ $query->orWhereDoesntHave('post.discussion.tags');
+ }
+ }
- if (! $actor->hasPermission('discussion.viewFlags')) {
- $query->orWhere('flags.user_id', $actor->id);
- }
+ if (! $actor->hasPermission('discussion.viewFlags')) {
+ $query->orWhere('flags.user_id', $actor->id);
+ }
+ });
}
}
diff --git a/extensions/flags/src/AddCanFlagAttribute.php b/extensions/flags/src/AddCanFlagAttribute.php
deleted file mode 100644
index 1e1e6793c..000000000
--- a/extensions/flags/src/AddCanFlagAttribute.php
+++ /dev/null
@@ -1,39 +0,0 @@
-getActor()->can('flag', $post) && $this->checkFlagOwnPostSetting($serializer->getActor(), $post);
- }
-
- protected function checkFlagOwnPostSetting(User $actor, Post $post): bool
- {
- if ($actor->id === $post->user_id) {
- // If $actor is the post author, check to see if the setting is enabled
- return (bool) $this->settings->get('flarum-flags.can_flag_own');
- }
-
- // $actor is not the post author
- return true;
- }
-}
diff --git a/extensions/flags/src/AddFlagsApiAttributes.php b/extensions/flags/src/AddFlagsApiAttributes.php
deleted file mode 100755
index f8a2f1292..000000000
--- a/extensions/flags/src/AddFlagsApiAttributes.php
+++ /dev/null
@@ -1,40 +0,0 @@
- $serializer->getActor()->hasPermissionLike('discussion.viewFlags')
- ];
-
- if ($attributes['canViewFlags']) {
- $attributes['flagCount'] = (int) $this->getFlagCount($serializer->getActor());
- }
-
- return $attributes;
- }
-
- protected function getFlagCount(User $actor): int
- {
- return Flag::whereVisibleTo($actor)->distinct()->count('flags.post_id');
- }
-}
diff --git a/extensions/flags/src/AddNewFlagCountAttribute.php b/extensions/flags/src/AddNewFlagCountAttribute.php
deleted file mode 100644
index 45a1fd829..000000000
--- a/extensions/flags/src/AddNewFlagCountAttribute.php
+++ /dev/null
@@ -1,32 +0,0 @@
-getNewFlagCount($user);
- }
-
- protected function getNewFlagCount(User $actor): int
- {
- $query = Flag::whereVisibleTo($actor);
-
- if ($time = $actor->read_flags_at) {
- $query->where('flags.created_at', '>', $time);
- }
-
- return $query->distinct()->count('flags.post_id');
- }
-}
diff --git a/extensions/flags/src/Api/Controller/CreateFlagController.php b/extensions/flags/src/Api/Controller/CreateFlagController.php
deleted file mode 100644
index 7d5b5c376..000000000
--- a/extensions/flags/src/Api/Controller/CreateFlagController.php
+++ /dev/null
@@ -1,43 +0,0 @@
-bus->dispatch(
- new CreateFlag(RequestUtil::getActor($request), Arr::get($request->getParsedBody(), 'data', []))
- );
- }
-}
diff --git a/extensions/flags/src/Api/Controller/ListFlagsController.php b/extensions/flags/src/Api/Controller/ListFlagsController.php
deleted file mode 100644
index 534d3abe5..000000000
--- a/extensions/flags/src/Api/Controller/ListFlagsController.php
+++ /dev/null
@@ -1,81 +0,0 @@
-assertRegistered();
-
- $actor->read_flags_at = Carbon::now();
- $actor->save();
-
- $limit = $this->extractLimit($request);
- $offset = $this->extractOffset($request);
- $include = $this->extractInclude($request);
-
- if (in_array('post.user', $include)) {
- $include[] = 'post.user.groups';
- }
-
- $flags = Flag::whereVisibleTo($actor)
- ->latest('flags.created_at')
- ->groupBy('post_id')
- ->limit($limit + 1)
- ->offset($offset)
- ->get();
-
- $this->loadRelations($flags, $include, $request);
-
- $flags = $flags->all();
-
- $areMoreResults = false;
-
- if (count($flags) > $limit) {
- array_pop($flags);
- $areMoreResults = true;
- }
-
- $this->addPaginationData(
- $document,
- $request,
- $this->url->to('api')->route('flags.index'),
- $areMoreResults ? null : 0
- );
-
- return $flags;
- }
-}
diff --git a/extensions/flags/src/Api/ForumResourceFields.php b/extensions/flags/src/Api/ForumResourceFields.php
new file mode 100644
index 000000000..7289f04bd
--- /dev/null
+++ b/extensions/flags/src/Api/ForumResourceFields.php
@@ -0,0 +1,31 @@
+get(function (object $model, Context $context) {
+ return $context->getActor()->hasPermissionLike('discussion.viewFlags');
+ }),
+ Schema\Integer::make('flagCount')
+ ->visible(fn (object $model, Context $context) => $context->getActor()->hasPermissionLike('discussion.viewFlags'))
+ ->get(function (object $model, Context $context) {
+ return Flag::whereVisibleTo($context->getActor())->distinct()->count('flags.post_id');
+ }),
+ ];
+ }
+}
diff --git a/extensions/flags/src/Api/PostResourceFields.php b/extensions/flags/src/Api/PostResourceFields.php
new file mode 100644
index 000000000..ab9b9036c
--- /dev/null
+++ b/extensions/flags/src/Api/PostResourceFields.php
@@ -0,0 +1,35 @@
+get(function (Post $post, Context $context) {
+ $actor = $context->getActor();
+
+ return $actor->can('flag', $post) && (
+ // $actor is not the post author
+ $actor->id !== $post->user_id
+ // If $actor is the post author, check to see if the setting is enabled
+ || ((bool) $this->settings->get('flarum-flags.can_flag_own'))
+ );
+ }),
+ Schema\Relationship\ToMany::make('flags')
+ ->includable(),
+ ];
+ }
+}
diff --git a/extensions/flags/src/Api/Resource/FlagResource.php b/extensions/flags/src/Api/Resource/FlagResource.php
new file mode 100644
index 000000000..c575664ba
--- /dev/null
+++ b/extensions/flags/src/Api/Resource/FlagResource.php
@@ -0,0 +1,155 @@
+collection instanceof self && $context->endpoint instanceof Endpoint\Index) {
+ $query = Flag::query()->groupBy('post_id');
+
+ $this->scope($query, $context);
+
+ return $query;
+ }
+
+ return parent::query($context);
+ }
+
+ public function scope(Builder $query, Context $context): void
+ {
+ $query->whereVisibleTo($context->getActor());
+ }
+
+ public function newModel(Context $context): object
+ {
+ if ($context->collection instanceof self && $context->endpoint instanceof Endpoint\Create) {
+ Flag::unguard();
+
+ return Flag::query()->firstOrNew([
+ 'post_id' => (int) Arr::get($context->body(), 'data.relationships.post.data.id'),
+ 'user_id' => $context->getActor()->id
+ ], [
+ 'type' => 'user',
+ ]);
+ }
+
+ return parent::newModel($context);
+ }
+
+ public function endpoints(): array
+ {
+ return [
+ Endpoint\Create::make()
+ ->authenticated()
+ ->defaultInclude(['post', 'post.flags', 'user']),
+ Endpoint\Index::make()
+ ->authenticated()
+ ->defaultInclude(['user', 'post', 'post.user', 'post.discussion'])
+ ->defaultSort('-createdAt')
+ ->paginate()
+ ->after(function (FlarumContext $context, $data) {
+ $actor = $context->getActor();
+
+ $actor->read_flags_at = Carbon::now();
+ $actor->save();
+
+ return $data;
+ }),
+ ];
+ }
+
+ public function fields(): array
+ {
+ return [
+ Schema\Str::make('type'),
+ Schema\Str::make('reason')
+ ->writableOnCreate()
+ ->nullable()
+ ->requiredOnCreateWithout(['reasonDetail'])
+ ->validationMessages([
+ 'reason.required_without' => $this->translator->trans('flarum-flags.forum.flag_post.reason_missing_message'),
+ ]),
+ Schema\Str::make('reasonDetail')
+ ->writableOnCreate()
+ ->nullable()
+ ->requiredOnCreateWithout(['reason'])
+ ->validationMessages([
+ 'reasonDetail.required_without' => $this->translator->trans('flarum-flags.forum.flag_post.reason_missing_message'),
+ ]),
+ Schema\DateTime::make('createdAt'),
+
+ Schema\Relationship\ToOne::make('post')
+ ->includable()
+ ->writable(fn (Flag $flag, FlarumContext $context) => $context->endpoint instanceof Endpoint\Create)
+ ->set(function (Flag $flag, Post $post, FlarumContext $context) {
+ if (! ($post instanceof CommentPost)) {
+ throw new InvalidParameterException;
+ }
+
+ $actor = $context->getActor();
+
+ $actor->assertCan('flag', $post);
+
+ if ($actor->id === $post->user_id && ! $this->settings->get('flarum-flags.can_flag_own')) {
+ throw new PermissionDeniedException;
+ }
+
+ $flag->post_id = $post->id;
+ }),
+ Schema\Relationship\ToOne::make('user')
+ ->includable(),
+ ];
+ }
+
+ public function sorts(): array
+ {
+ return [
+ SortColumn::make('createdAt'),
+ ];
+ }
+
+ public function created(object $model, Context $context): ?object
+ {
+ $this->events->dispatch(new Created($model, $context->getActor(), $context->body()));
+
+ return parent::created($model, $context);
+ }
+}
diff --git a/extensions/flags/src/Api/Serializer/FlagSerializer.php b/extensions/flags/src/Api/Serializer/FlagSerializer.php
deleted file mode 100644
index 83e8e7d3c..000000000
--- a/extensions/flags/src/Api/Serializer/FlagSerializer.php
+++ /dev/null
@@ -1,48 +0,0 @@
- $model->type,
- 'reason' => $model->reason,
- 'reasonDetail' => $model->reason_detail,
- 'createdAt' => $this->formatDate($model->created_at),
- ];
- }
-
- protected function post(Flag $flag): ?Relationship
- {
- return $this->hasOne($flag, PostSerializer::class);
- }
-
- protected function user(Flag $flag): ?Relationship
- {
- return $this->hasOne($flag, BasicUserSerializer::class);
- }
-}
diff --git a/extensions/flags/src/Api/UserResourceFields.php b/extensions/flags/src/Api/UserResourceFields.php
new file mode 100644
index 000000000..8ca701d3d
--- /dev/null
+++ b/extensions/flags/src/Api/UserResourceFields.php
@@ -0,0 +1,29 @@
+visible(fn (User $user, Context $context) => $context->getActor()->id === $user->id)
+ ->get(function (User $user, Context $context) {
+ $actor = $context->getActor();
+ $query = Flag::whereVisibleTo($actor);
+
+ if ($time = $actor->read_flags_at) {
+ $query->where('flags.created_at', '>', $time);
+ }
+
+ return $query->distinct()->count('flags.post_id');
+ }),
+ ];
+ }
+}
diff --git a/extensions/flags/src/Command/CreateFlagHandler.php b/extensions/flags/src/Command/CreateFlagHandler.php
deleted file mode 100644
index 3fbb79aac..000000000
--- a/extensions/flags/src/Command/CreateFlagHandler.php
+++ /dev/null
@@ -1,79 +0,0 @@
-actor;
- $data = $command->data;
-
- $postId = Arr::get($data, 'relationships.post.data.id');
- $post = $this->posts->findOrFail($postId, $actor);
-
- if (! ($post instanceof CommentPost)) {
- throw new InvalidParameterException;
- }
-
- $actor->assertCan('flag', $post);
-
- if ($actor->id === $post->user_id && ! $this->settings->get('flarum-flags.can_flag_own')) {
- throw new PermissionDeniedException();
- }
-
- if (Arr::get($data, 'attributes.reason') === null && Arr::get($data, 'attributes.reasonDetail') === '') {
- throw new ValidationException([
- 'message' => $this->translator->trans('flarum-flags.forum.flag_post.reason_missing_message')
- ]);
- }
-
- Flag::unguard();
-
- $flag = Flag::firstOrNew([
- 'post_id' => $post->id,
- 'user_id' => $actor->id
- ]);
-
- $flag->post_id = $post->id;
- $flag->user_id = $actor->id;
- $flag->type = 'user';
- $flag->reason = Arr::get($data, 'attributes.reason');
- $flag->reason_detail = Arr::get($data, 'attributes.reasonDetail');
- $flag->created_at = Carbon::now();
-
- $flag->save();
-
- $this->events->dispatch(new Created($flag, $actor, $data));
-
- return $flag;
- }
-}
diff --git a/extensions/flags/src/Flag.php b/extensions/flags/src/Flag.php
index 1fd01dad7..0ca306274 100644
--- a/extensions/flags/src/Flag.php
+++ b/extensions/flags/src/Flag.php
@@ -31,6 +31,10 @@ class Flag extends AbstractModel
{
use ScopeVisibilityTrait;
+ public $timestamps = true;
+
+ public const UPDATED_AT = null;
+
protected $casts = ['created_at' => 'datetime'];
public function post(): BelongsTo
diff --git a/extensions/flags/src/PrepareFlagsApiData.php b/extensions/flags/src/PrepareFlagsApiData.php
deleted file mode 100755
index 4442255d2..000000000
--- a/extensions/flags/src/PrepareFlagsApiData.php
+++ /dev/null
@@ -1,64 +0,0 @@
-relationLoaded('posts')) {
- $posts = $data->getRelation('posts');
- }
- }
-
- if ($controller instanceof Controller\ListPostsController) {
- $posts = $data->all();
- }
-
- if ($controller instanceof Controller\ShowPostController) {
- $posts = [$data];
- }
-
- if ($controller instanceof CreateFlagController) {
- $posts = [$data->post];
- }
-
- if (isset($posts)) {
- $actor = RequestUtil::getActor($request);
- $postsWithPermission = [];
-
- foreach ($posts as $post) {
- if (is_object($post)) {
- $post->setRelation('flags', null);
-
- if ($actor->can('viewFlags', $post->discussion)) {
- $postsWithPermission[] = $post;
- }
- }
- }
-
- if (count($postsWithPermission)) {
- (new Collection($postsWithPermission))
- ->load('flags', 'flags.user');
- }
- }
- }
-}
diff --git a/extensions/flags/tests/integration/api/flags/ListTest.php b/extensions/flags/tests/integration/api/flags/ListTest.php
index 7ab74e466..690bc4124 100644
--- a/extensions/flags/tests/integration/api/flags/ListTest.php
+++ b/extensions/flags/tests/integration/api/flags/ListTest.php
@@ -51,6 +51,7 @@ class ListTest extends TestCase
['id' => 1, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
['id' => 2, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
['id' => 3, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
+ ['id' => 4, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => '', 'is_private' => true],
],
'flags' => [
['id' => 1, 'post_id' => 1, 'user_id' => 1],
@@ -58,6 +59,7 @@ class ListTest extends TestCase
['id' => 3, 'post_id' => 1, 'user_id' => 3],
['id' => 4, 'post_id' => 2, 'user_id' => 2],
['id' => 5, 'post_id' => 3, 'user_id' => 1],
+ ['id' => 6, 'post_id' => 4, 'user_id' => 1],
]
]);
}
@@ -65,7 +67,7 @@ class ListTest extends TestCase
/**
* @test
*/
- public function admin_can_see_one_flag_per_post()
+ public function admin_can_see_one_flag_per_visible_post()
{
$response = $this->send(
$this->request('GET', '/api/flags', [
@@ -73,9 +75,9 @@ class ListTest extends TestCase
])
);
- $this->assertEquals(200, $response->getStatusCode());
+ $this->assertEquals(200, $response->getStatusCode(), $body = $response->getBody()->getContents());
- $data = json_decode($response->getBody()->getContents(), true)['data'];
+ $data = json_decode($body, true)['data'];
$ids = Arr::pluck($data, 'id');
$this->assertEqualsCanonicalizing(['1', '4', '5'], $ids);
@@ -84,7 +86,7 @@ class ListTest extends TestCase
/**
* @test
*/
- public function regular_user_sees_own_flags()
+ public function regular_user_sees_own_flags_of_visible_posts()
{
$response = $this->send(
$this->request('GET', '/api/flags', [
@@ -103,7 +105,7 @@ class ListTest extends TestCase
/**
* @test
*/
- public function mod_can_see_one_flag_per_post()
+ public function mod_can_see_one_flag_per_visible_post()
{
$response = $this->send(
$this->request('GET', '/api/flags', [
diff --git a/extensions/flags/tests/integration/api/flags/ListWithTagsTest.php b/extensions/flags/tests/integration/api/flags/ListWithTagsTest.php
index 6a86e0f0e..ebb80a53a 100644
--- a/extensions/flags/tests/integration/api/flags/ListWithTagsTest.php
+++ b/extensions/flags/tests/integration/api/flags/ListWithTagsTest.php
@@ -50,9 +50,9 @@ class ListWithTagsTest extends TestCase
],
'group_permission' => [
['group_id' => Group::MODERATOR_ID, 'permission' => 'discussion.viewFlags'],
- ['group_id' => Group::MODERATOR_ID, 'permission' => 'tag2.viewDiscussions'],
+ ['group_id' => Group::MODERATOR_ID, 'permission' => 'tag2.viewForum'],
['group_id' => Group::MODERATOR_ID, 'permission' => 'tag3.discussion.viewFlags'],
- ['group_id' => Group::MODERATOR_ID, 'permission' => 'tag4.viewDiscussions'],
+ ['group_id' => Group::MODERATOR_ID, 'permission' => 'tag4.viewForum'],
['group_id' => Group::MODERATOR_ID, 'permission' => 'tag4.discussion.viewFlags'],
],
'discussions' => [
@@ -149,9 +149,7 @@ class ListWithTagsTest extends TestCase
$data = json_decode($response->getBody()->getContents(), true)['data'];
$ids = Arr::pluck($data, 'id');
- // 7 is included, even though mods can't view discussions.
- // This is because the UI doesnt allow discussions.viewFlags without viewDiscussions.
- $this->assertEqualsCanonicalizing(['1', '4', '5', '7', '8', '9'], $ids);
+ $this->assertEqualsCanonicalizing(['1', '4', '5', '8', '9'], $ids);
}
/**
diff --git a/extensions/flags/tests/integration/api/posts/IncludeFlagsVisibilityTest.php b/extensions/flags/tests/integration/api/posts/IncludeFlagsVisibilityTest.php
new file mode 100644
index 000000000..cc448b17f
--- /dev/null
+++ b/extensions/flags/tests/integration/api/posts/IncludeFlagsVisibilityTest.php
@@ -0,0 +1,143 @@
+extension('flarum-tags', 'flarum-flags');
+
+ $this->prepareDatabase([
+ 'users' => [
+ $this->normalUser(),
+ [
+ 'id' => 3,
+ 'username' => 'mod',
+ 'password' => '$2y$10$LO59tiT7uggl6Oe23o/O6.utnF6ipngYjvMvaxo1TciKqBttDNKim', // BCrypt hash for "too-obscure"
+ 'email' => 'normal2@machine.local',
+ 'is_email_confirmed' => 1,
+ ],
+ [
+ 'id' => 4,
+ 'username' => 'tod',
+ 'password' => '$2y$10$LO59tiT7uggl6Oe23o/O6.utnF6ipngYjvMvaxo1TciKqBttDNKim', // BCrypt hash for "too-obscure"
+ 'email' => 'tod@machine.local',
+ 'is_email_confirmed' => 1,
+ ],
+ [
+ 'id' => 5,
+ 'username' => 'ted',
+ 'password' => '$2y$10$LO59tiT7uggl6Oe23o/O6.utnF6ipngYjvMvaxo1TciKqBttDNKim', // BCrypt hash for "too-obscure"
+ 'email' => 'ted@machine.local',
+ 'is_email_confirmed' => 1,
+ ],
+ ],
+ 'group_user' => [
+ ['group_id' => 5, 'user_id' => 2],
+ ['group_id' => 6, 'user_id' => 3],
+ ],
+ 'groups' => [
+ ['id' => 5, 'name_singular' => 'group5', 'name_plural' => 'group5', 'color' => null, 'icon' => 'fas fa-crown', 'is_hidden' => false],
+ ['id' => 6, 'name_singular' => 'group1', 'name_plural' => 'group1', 'color' => null, 'icon' => 'fas fa-cog', 'is_hidden' => false],
+ ],
+ 'group_permission' => [
+ ['group_id' => Group::MEMBER_ID, 'permission' => 'tag1.viewForum'],
+ ['group_id' => 5, 'permission' => 'tag1.viewForum'],
+ ['group_id' => 5, 'permission' => 'discussion.viewFlags'],
+ ['group_id' => 6, 'permission' => 'tag1.discussion.viewFlags'],
+ ['group_id' => 6, 'permission' => 'tag1.viewForum'],
+ ],
+ 'tags' => [
+ ['id' => 1, 'name' => 'Tag 1', 'slug' => 'tag-1', 'is_primary' => false, 'position' => null, 'parent_id' => null, 'is_restricted' => true],
+ ['id' => 2, 'name' => 'Tag 2', 'slug' => 'tag-2', 'is_primary' => true, 'position' => 2, 'parent_id' => null, 'is_restricted' => false],
+ ],
+ 'discussions' => [
+ ['id' => 1, 'title' => 'Test1', 'user_id' => 1, 'comment_count' => 1],
+ ['id' => 2, 'title' => 'Test2', 'user_id' => 1, 'comment_count' => 1],
+ ],
+ 'discussion_tag' => [
+ ['discussion_id' => 1, 'tag_id' => 1],
+ ['discussion_id' => 2, 'tag_id' => 2],
+ ],
+ 'posts' => [
+ ['id' => 1, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
+ ['id' => 2, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
+ ['id' => 3, 'discussion_id' => 1, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
+
+ ['id' => 4, 'discussion_id' => 2, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
+ ['id' => 5, 'discussion_id' => 2, 'user_id' => 1, 'type' => 'comment', 'content' => ''],
+ ],
+ 'flags' => [
+ ['id' => 1, 'post_id' => 1, 'user_id' => 1],
+ ['id' => 2, 'post_id' => 1, 'user_id' => 5],
+ ['id' => 3, 'post_id' => 1, 'user_id' => 3],
+ ['id' => 4, 'post_id' => 2, 'user_id' => 5],
+ ['id' => 5, 'post_id' => 3, 'user_id' => 1],
+
+ ['id' => 6, 'post_id' => 4, 'user_id' => 1],
+ ['id' => 7, 'post_id' => 5, 'user_id' => 5],
+ ['id' => 8, 'post_id' => 5, 'user_id' => 5],
+ ],
+ ]);
+ }
+
+ /**
+ * @dataProvider listFlagsIncludesDataProvider
+ * @test
+ */
+ public function user_sees_where_allowed_with_included_tags(int $actorId, array $expectedIncludes)
+ {
+ $response = $this->send(
+ $this->request('GET', '/api/posts', [
+ 'authenticatedAs' => $actorId,
+ ])->withQueryParams([
+ 'include' => 'flags'
+ ])
+ );
+
+ $this->assertEquals(200, $response->getStatusCode());
+
+ $responseBody = json_decode($response->getBody()->getContents(), true);
+
+ $data = $responseBody['data'];
+
+ $this->assertEquals(['1', '2', '3', '4', '5'], Arr::pluck($data, 'id'));
+ $this->assertEqualsCanonicalizing($expectedIncludes, collect($responseBody['included'] ?? [])
+ ->filter(fn($include) => $include['type'] === 'flags')
+ ->pluck('id')
+ ->map(strval(...))
+ ->all()
+ );
+ }
+
+ public function listFlagsIncludesDataProvider(): array
+ {
+ return [
+ 'admin_sees_all' => [1, [1, 2, 3, 4, 5, 6, 7, 8]],
+ 'user_with_general_permission_sees_where_unrestricted_tag' => [2, [6, 7, 8]],
+ 'user_with_tag1_permission_sees_tag1_flags' => [3, [1, 2, 3, 4, 5]],
+ 'normal_user_sees_none' => [4, []],
+ 'normal_user_sees_own' => [5, [2, 7, 4, 8]],
+ ];
+ }
+}
diff --git a/extensions/tags/extend.php b/extensions/tags/extend.php
index 560767639..363a66f1d 100644
--- a/extensions/tags/extend.php
+++ b/extensions/tags/extend.php
@@ -12,10 +12,9 @@ use Flarum\Api\Endpoint;
use Flarum\Api\Resource;
use Flarum\Api\Schema;
use Flarum\Discussion\Discussion;
-use Flarum\Discussion\Event\Saving;
use Flarum\Discussion\Search\DiscussionSearcher;
use Flarum\Extend;
-use Flarum\Flags\Api\Controller\ListFlagsController;
+use Flarum\Flags\Api\Resource\FlagResource;
use Flarum\Http\RequestUtil;
use Flarum\Post\Filter\PostSearcher;
use Flarum\Post\Post;
@@ -104,8 +103,13 @@ return [
return $endpoint->eagerLoad('discussion.tags');
}),
-// (new Extend\ApiController(ListFlagsController::class))
-// ->load('post.discussion.tags'),
+ (new Extend\Conditional())
+ ->whenExtensionEnabled('flarum-flags', fn () => [
+ (new Extend\ApiResource(FlagResource::class))
+ ->endpoint(Endpoint\Index::class, function (Endpoint\Index $endpoint) {
+ return $endpoint->eagerLoad(['post.discussion.tags']);
+ }),
+ ]),
(new Extend\ApiResource(Resource\DiscussionResource::class))
->endpoint(
diff --git a/framework/core/src/Foundation/ErrorServiceProvider.php b/framework/core/src/Foundation/ErrorServiceProvider.php
index 2fd8e6f47..7bc1a8bf3 100644
--- a/framework/core/src/Foundation/ErrorServiceProvider.php
+++ b/framework/core/src/Foundation/ErrorServiceProvider.php
@@ -11,9 +11,9 @@ namespace Flarum\Foundation;
use Flarum\Extension\Exception as ExtensionException;
use Flarum\Foundation\ErrorHandling as Handling;
+use Flarum\Http\Exception\InvalidParameterException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Validation\ValidationException as IlluminateValidationException;
-use Tobscure\JsonApi\Exception\InvalidParameterException;
use Tobyz\JsonApiServer\Exception as TobyzJsonApiServerException;
class ErrorServiceProvider extends AbstractServiceProvider
diff --git a/extensions/flags/src/Command/CreateFlag.php b/framework/core/src/Http/Exception/InvalidParameterException.php
similarity index 51%
rename from extensions/flags/src/Command/CreateFlag.php
rename to framework/core/src/Http/Exception/InvalidParameterException.php
index 2c7f23480..7c915c929 100644
--- a/extensions/flags/src/Command/CreateFlag.php
+++ b/framework/core/src/Http/Exception/InvalidParameterException.php
@@ -7,15 +7,11 @@
* LICENSE file that was distributed with this source code.
*/
-namespace Flarum\Flags\Command;
+namespace Flarum\Http\Exception;
-use Flarum\User\User;
+use Exception;
-class CreateFlag
+class InvalidParameterException extends Exception
{
- public function __construct(
- public User $actor,
- public array $data
- ) {
- }
+ //
}