FEATURE: Watched Words: when posts contain words, do one of flag, require approval, censor, or block

This commit is contained in:
Neil Lalonde
2017-06-28 16:56:44 -04:00
parent 9d774a951a
commit 24cb950432
49 changed files with 1096 additions and 37 deletions

View File

@@ -0,0 +1,65 @@
import computed from 'ember-addons/ember-computed-decorators';
import WatchedWord from 'admin/models/watched-word';
export default Ember.Controller.extend({
actionNameKey: null,
adminWatchedWords: Ember.inject.controller(),
showWordsList: Ember.computed.or('adminWatchedWords.filtered', 'adminWatchedWords.showWords'),
findAction(actionName) {
return (this.get('adminWatchedWords.model') || []).findBy('nameKey', actionName);
},
@computed('adminWatchedWords.model', 'actionNameKey')
filteredContent() {
if (!this.get('actionNameKey')) { return []; }
const a = this.findAction(this.get('actionNameKey'));
return a ? a.words : [];
},
@computed('actionNameKey')
actionDescription(actionNameKey) {
return I18n.t('admin.watched_words.action_descriptions.' + actionNameKey);
},
actions: {
recordAdded(arg) {
const a = this.findAction(this.get('actionNameKey'));
if (a) {
a.words.unshiftObject(arg);
a.incrementProperty('count');
Em.run.schedule('afterRender', () => {
// remove from other actions lists
let match = null;
this.get('adminWatchedWords.model').forEach(action => {
if (match) return;
if (action.nameKey !== this.get('actionNameKey')) {
match = action.words.findBy('id', arg.id);
if (match) {
action.words.removeObject(match);
action.decrementProperty('count');
}
}
});
});
}
},
recordRemoved(arg) {
const a = this.findAction(this.get('actionNameKey'));
if (a) {
a.words.removeObject(arg);
a.decrementProperty('count');
}
},
uploadComplete() {
WatchedWord.findAll().then(data => {
this.set('adminWatchedWords.model', data);
});
}
}
});

View File

@@ -0,0 +1,51 @@
import debounce from 'discourse/lib/debounce';
export default Ember.Controller.extend({
filter: null,
filtered: false,
showWords: false,
disableShowWords: Ember.computed.alias('filtered'),
filterContentNow() {
if (!!Ember.isEmpty(this.get('allWatchedWords'))) return;
let filter;
if (this.get('filter')) {
filter = this.get('filter').toLowerCase();
}
if (filter === undefined || filter.length < 1) {
this.set('model', this.get('allWatchedWords'));
return;
}
const matchesByAction = [];
this.get('allWatchedWords').forEach(wordsForAction => {
const wordRecords = wordsForAction.words.filter(wordRecord => {
return (wordRecord.word.indexOf(filter) > -1);
});
matchesByAction.pushObject( Ember.Object.create({
nameKey: wordsForAction.nameKey,
name: wordsForAction.name,
words: wordRecords,
count: wordRecords.length
}) );
});
this.set('model', matchesByAction);
},
filterContent: debounce(function() {
this.filterContentNow();
this.set('filtered', !Ember.isEmpty(this.get('filter')));
}, 250).observes('filter'),
actions: {
clearFilter() {
this.setProperties({ filter: '' });
}
}
});