1
0
mirror of https://github.com/flarum/core.git synced 2025-08-07 00:47:00 +02:00

Update to sub in "display names" from database when rendering

This also improves the behaviour of mentions in the JS preview (no more
broken links, mention is only picked up if corresponding user/post is
found).

See flarum/core#1246

Closes flarum/core#315
This commit is contained in:
Toby Zerner
2017-09-19 20:16:30 +09:30
parent acd3195491
commit 408d882598
7 changed files with 164 additions and 62 deletions

View File

@@ -179,14 +179,12 @@ System.register('flarum/mentions/addComposerAutocomplete', ['flarum/extend', 'fl
if (this.selectionEnd - cursor > 0) return;
// Search backwards from the cursor for an '@' symbol, without any
// intervening whitespace. If we find one, we will want to show the
// autocomplete dropdown!
// Search backwards from the cursor for an '@' symbol. If we find one,
// we will want to show the autocomplete dropdown!
var value = this.value;
mentionStart = 0;
for (var i = cursor - 1; i >= 0; i--) {
for (var i = cursor - 1; i >= cursor - 30; i--) {
var character = value.substr(i, 1);
if (/\s/.test(character)) break;
if (character === '@') {
mentionStart = i + 1;
break;
@@ -228,6 +226,14 @@ System.register('flarum/mentions/addComposerAutocomplete', ['flarum/extend', 'fl
);
};
var userMatches = function userMatches(user) {
var names = [user.username(), user.displayName()];
return names.some(function (value) {
return value.toLowerCase().substr(0, typed.length) === typed;
});
};
var buildSuggestions = function buildSuggestions() {
var suggestions = [];
@@ -235,7 +241,7 @@ System.register('flarum/mentions/addComposerAutocomplete', ['flarum/extend', 'fl
// matching that username.
if (typed) {
app.store.all('users').forEach(function (user) {
if (user.username().toLowerCase().substr(0, typed.length) !== typed) return;
if (!userMatches(user)) return;
suggestions.push(makeSuggestion(user, '@' + user.username(), '', 'MentionsDropdown-user'));
});
@@ -254,7 +260,7 @@ System.register('flarum/mentions/addComposerAutocomplete', ['flarum/extend', 'fl
return b.time() - a.time();
}).filter(function (post) {
var user = post.user();
return user && user.username().toLowerCase().substr(0, typed.length) === typed;
return user && userMatches(user);
}).splice(0, 5).forEach(function (post) {
var user = post.user();
suggestions.push(makeSuggestion(user, '@' + user.username() + '#' + post.id(), [app.translator.trans('flarum-mentions.forum.composer.reply_to_post_text', { number: post.number() }), ' — ', truncate(post.contentPlain(), 200)], 'MentionsDropdown-post'));
@@ -279,14 +285,18 @@ System.register('flarum/mentions/addComposerAutocomplete', ['flarum/extend', 'fl
left = parent.width() - width;
}
dropdown.show(left, top);
} else {
dropdown.active = false;
dropdown.hide();
}
};
dropdown.active = true;
buildSuggestions();
dropdown.setIndex(0);
dropdown.$().scrollTop(0);
dropdown.active = true;
clearTimeout(searchTimeout);
if (typed) {
@@ -1166,6 +1176,7 @@ System.register('flarum/mentions/main', ['flarum/extend', 'flarum/app', 'flarum/
}), 80);
});
// Remove post mentions when rendering post previews.
getPlainContent.removeSelectors.push('a.PostMention');
});
}
@@ -1258,4 +1269,46 @@ System.register('flarum/mentions/utils/selectedText', [], function (_export, _co
setters: [],
execute: function () {}
};
});;
'use strict';
System.register('flarum/mentions/utils/textFormatter', ['flarum/helpers/username', 'flarum/utils/extractText'], function (_export, _context) {
"use strict";
var username, extractText;
function filterUserMentions(tag) {
var user = app.store.getBy('users', 'username', tag.getAttribute('username'));
if (user) {
tag.setAttribute('id', user.id());
tag.setAttribute('displayname', extractText(username(user)));
return true;
}
}
_export('filterUserMentions', filterUserMentions);
function filterPostMentions(tag) {
var post = app.store.getById('posts', tag.getAttribute('id'));
if (post) {
tag.setAttribute('discussionid', post.discussion().id());
tag.setAttribute('number', post.number());
tag.setAttribute('displayname', extractText(username(post.user())));
return true;
}
}
_export('filterPostMentions', filterPostMentions);
return {
setters: [function (_flarumHelpersUsername) {
username = _flarumHelpersUsername.default;
}, function (_flarumUtilsExtractText) {
extractText = _flarumUtilsExtractText.default;
}],
execute: function () {}
};
});

View File

@@ -54,14 +54,12 @@ export default function addComposerAutocomplete() {
if (this.selectionEnd - cursor > 0) return;
// Search backwards from the cursor for an '@' symbol, without any
// intervening whitespace. If we find one, we will want to show the
// autocomplete dropdown!
// Search backwards from the cursor for an '@' symbol. If we find one,
// we will want to show the autocomplete dropdown!
const value = this.value;
mentionStart = 0;
for (let i = cursor - 1; i >= 0; i--) {
for (let i = cursor - 1; i >= cursor - 30; i--) {
const character = value.substr(i, 1);
if (/\s/.test(character)) break;
if (character === '@') {
mentionStart = i + 1;
break;
@@ -95,6 +93,15 @@ export default function addComposerAutocomplete() {
);
};
const userMatches = function(user) {
const names = [
user.username(),
user.displayName()
];
return names.some(value => value.toLowerCase().substr(0, typed.length) === typed);
};
const buildSuggestions = () => {
const suggestions = [];
@@ -102,7 +109,7 @@ export default function addComposerAutocomplete() {
// matching that username.
if (typed) {
app.store.all('users').forEach(user => {
if (user.username().toLowerCase().substr(0, typed.length) !== typed) return;
if (!userMatches(user)) return;
suggestions.push(
makeSuggestion(user, '@' + user.username(), '', 'MentionsDropdown-user')
@@ -122,7 +129,7 @@ export default function addComposerAutocomplete() {
.sort((a, b) => b.time() - a.time())
.filter(post => {
const user = post.user();
return user && user.username().toLowerCase().substr(0, typed.length) === typed;
return user && userMatches(user);
})
.splice(0, 5)
.forEach(post => {

View File

@@ -67,5 +67,6 @@ app.initializers.add('flarum-mentions', function() {
);
});
// Remove post mentions when rendering post previews.
getPlainContent.removeSelectors.push('a.PostMention');
});

View File

@@ -0,0 +1,25 @@
import username from 'flarum/helpers/username';
import extractText from 'flarum/utils/extractText';
export function filterUserMentions(tag) {
const user = app.store.getBy('users', 'username', tag.getAttribute('username'));
if (user) {
tag.setAttribute('id', user.id());
tag.setAttribute('displayname', extractText(username(user)));
return true;
}
}
export function filterPostMentions(tag) {
const post = app.store.getById('posts', tag.getAttribute('id'));
if (post) {
tag.setAttribute('discussionid', post.discussion().id());
tag.setAttribute('number', post.number());
tag.setAttribute('displayname', extractText(username(post.user())));
return true;
}
}