Allow tags to be hidden from All Discussions

This commit is contained in:
Toby Zerner 2015-08-13 12:52:20 +09:30
parent 19ebd19000
commit ee87ada0af
8 changed files with 50 additions and 8 deletions

View File

@ -1,5 +1,6 @@
import Modal from 'flarum/components/Modal'; import Modal from 'flarum/components/Modal';
import Button from 'flarum/components/Button'; import Button from 'flarum/components/Button';
import Switch from 'flarum/components/Switch';
import { slug } from 'flarum/utils/string'; import { slug } from 'flarum/utils/string';
import tagLabel from 'tags/helpers/tagLabel'; import tagLabel from 'tags/helpers/tagLabel';
@ -18,6 +19,7 @@ export default class EditTagModal extends Modal {
this.slug = m.prop(this.tag.slug() || ''); this.slug = m.prop(this.tag.slug() || '');
this.description = m.prop(this.tag.description() || ''); this.description = m.prop(this.tag.description() || '');
this.color = m.prop(this.tag.color() || ''); this.color = m.prop(this.tag.color() || '');
this.isHidden = m.prop(this.tag.isHidden() || '');
} }
className() { className() {
@ -60,11 +62,20 @@ export default class EditTagModal extends Modal {
<input className="FormControl" placeholder="#aaaaaa" value={this.color()} oninput={m.withAttr('value', this.color)}/> <input className="FormControl" placeholder="#aaaaaa" value={this.color()} oninput={m.withAttr('value', this.color)}/>
</div> </div>
<div className="Form-group">
<div>
<label className="checkbox">
<input type="checkbox" value="1" checked={this.isHidden()} onchange={m.withAttr('checked', this.isHidden)}/>
Hide from All Discussions
</label>
</div>
</div>
<div className="Form-group"> <div className="Form-group">
{Button.component({ {Button.component({
type: 'submit', type: 'submit',
className: 'Button Button--primary EditTagModal-save', className: 'Button Button--primary EditTagModal-save',
loading: this._loading, loading: this.loading,
children: 'Save Changes' children: 'Save Changes'
})} })}
{this.tag.exists ? ( {this.tag.exists ? (
@ -81,17 +92,18 @@ export default class EditTagModal extends Modal {
onsubmit(e) { onsubmit(e) {
e.preventDefault(); e.preventDefault();
this._loading = true; this.loading = true;
this.tag.save({ this.tag.save({
name: this.name(), name: this.name(),
slug: this.slug(), slug: this.slug(),
description: this.description(), description: this.description(),
color: this.color() color: this.color(),
isHidden: this.isHidden()
}).then( }).then(
() => this.hide(), () => this.hide(),
() => { () => {
this._loading = false; this.loading = false;
m.redraw(); m.redraw();
} }
); );

View File

@ -10,12 +10,12 @@ export default class Tag extends mixin(Model, {
color: Model.attribute('color'), color: Model.attribute('color'),
backgroundUrl: Model.attribute('backgroundUrl'), backgroundUrl: Model.attribute('backgroundUrl'),
backgroundMode: Model.attribute('backgroundMode'), backgroundMode: Model.attribute('backgroundMode'),
iconUrl: Model.attribute('iconUrl'),
position: Model.attribute('position'), position: Model.attribute('position'),
parent: Model.hasOne('parent'), parent: Model.hasOne('parent'),
defaultSort: Model.attribute('defaultSort'), defaultSort: Model.attribute('defaultSort'),
isChild: Model.attribute('isChild'), isChild: Model.attribute('isChild'),
isHidden: Model.attribute('isHidden'),
discussionsCount: Model.attribute('discussionsCount'), discussionsCount: Model.attribute('discussionsCount'),
lastTime: Model.attribute('lastTime', Model.transformDate), lastTime: Model.attribute('lastTime', Model.transformDate),

View File

@ -21,12 +21,12 @@ class CreateTagsTable extends Migration
$table->string('color', 50)->nullable(); $table->string('color', 50)->nullable();
$table->string('background_path', 100)->nullable(); $table->string('background_path', 100)->nullable();
$table->string('background_mode', 100)->nullable(); $table->string('background_mode', 100)->nullable();
$table->string('icon_path', 100)->nullable();
$table->integer('position')->nullable(); $table->integer('position')->nullable();
$table->integer('parent_id')->unsigned()->nullable(); $table->integer('parent_id')->unsigned()->nullable();
$table->string('default_sort', 50)->nullable(); $table->string('default_sort', 50)->nullable();
$table->boolean('is_restricted')->default(0); $table->boolean('is_restricted')->default(0);
$table->boolean('is_hidden')->default(0);
$table->integer('discussions_count')->unsigned()->default(0); $table->integer('discussions_count')->unsigned()->default(0);
$table->integer('last_time')->unsigned()->nullable(); $table->integer('last_time')->unsigned()->nullable();

View File

@ -20,6 +20,7 @@ class TagSerializer extends Serializer
'position' => $tag->position === null ? null : (int) $tag->position, 'position' => $tag->position === null ? null : (int) $tag->position,
'defaultSort' => $tag->default_sort, 'defaultSort' => $tag->default_sort,
'isChild' => (bool) $tag->parent_id, 'isChild' => (bool) $tag->parent_id,
'isHidden' => (bool) $tag->is_hidden,
'lastTime' => $tag->last_time ? $tag->last_time->toRFC3339String() : null, 'lastTime' => $tag->last_time ? $tag->last_time->toRFC3339String() : null,
'canStartDiscussion' => $tag->can($this->actor, 'startDiscussion') 'canStartDiscussion' => $tag->can($this->actor, 'startDiscussion')
]; ];

View File

@ -34,7 +34,8 @@ class CreateTagHandler
array_get($data, 'attributes.name'), array_get($data, 'attributes.name'),
array_get($data, 'attributes.slug'), array_get($data, 'attributes.slug'),
array_get($data, 'attributes.description'), array_get($data, 'attributes.description'),
array_get($data, 'attributes.color') array_get($data, 'attributes.color'),
array_get($data, 'attributes.isHidden')
); );
$tag->save(); $tag->save();

View File

@ -50,6 +50,10 @@ class EditTagHandler
$tag->color = $attributes['color']; $tag->color = $attributes['color'];
} }
if (isset($attributes['isHidden'])) {
$tag->is_hidden = (bool) $attributes['isHidden'];
}
if (isset($attributes['isRestricted'])) { if (isset($attributes['isRestricted'])) {
$tag->is_restricted = (bool) $attributes['isRestricted']; $tag->is_restricted = (bool) $attributes['isRestricted'];
} }

View File

@ -1,17 +1,39 @@
<?php namespace Flarum\Tags\Listeners; <?php namespace Flarum\Tags\Listeners;
use Flarum\Events\RegisterDiscussionGambits; use Flarum\Events\RegisterDiscussionGambits;
use Flarum\Events\DiscussionSearchWillBePerformed;
use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Events\Dispatcher;
use Flarum\Tags\Gambits\TagGambit;
use Flarum\Tags\Tag;
class AddTagGambit class AddTagGambit
{ {
public function subscribe(Dispatcher $events) public function subscribe(Dispatcher $events)
{ {
$events->listen(RegisterDiscussionGambits::class, [$this, 'registerTagGambit']); $events->listen(RegisterDiscussionGambits::class, [$this, 'registerTagGambit']);
$events->listen(DiscussionSearchWillBePerformed::class, [$this, 'hideTags']);
} }
public function registerTagGambit(RegisterDiscussionGambits $event) public function registerTagGambit(RegisterDiscussionGambits $event)
{ {
$event->gambits->add('Flarum\Tags\Gambits\TagGambit'); $event->gambits->add('Flarum\Tags\Gambits\TagGambit');
} }
public function hideTags(DiscussionSearchWillBePerformed $event)
{
$query = $event->search->getQuery();
foreach ($event->search->getActiveGambits() as $gambit) {
if ($gambit instanceof TagGambit) {
return;
}
}
$query->whereNotExists(function ($query) {
return $query->select(app('flarum.db')->raw(1))
->from('discussions_tags')
->whereIn('tag_id', Tag::where('is_hidden', 1)->lists('id'))
->whereRaw('discussion_id = discussions.id');
});
}
} }

View File

@ -45,9 +45,10 @@ class Tag extends Model
* @param string $slug * @param string $slug
* @param string $description * @param string $description
* @param string $color * @param string $color
* @param bool $isHidden
* @return static * @return static
*/ */
public static function build($name, $slug, $description, $color) public static function build($name, $slug, $description, $color, $isHidden)
{ {
$tag = new static; $tag = new static;
@ -55,6 +56,7 @@ class Tag extends Model
$tag->slug = $slug; $tag->slug = $slug;
$tag->description = $description; $tag->description = $description;
$tag->color = $color; $tag->color = $color;
$tag->is_hidden = $isHidden;
return $tag; return $tag;
} }