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:
69
extensions/mentions/js/forum/dist/extension.js
vendored
69
extensions/mentions/js/forum/dist/extension.js
vendored
@@ -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 () {}
|
||||
};
|
||||
});
|
@@ -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 => {
|
||||
|
@@ -67,5 +67,6 @@ app.initializers.add('flarum-mentions', function() {
|
||||
);
|
||||
});
|
||||
|
||||
// Remove post mentions when rendering post previews.
|
||||
getPlainContent.removeSelectors.push('a.PostMention');
|
||||
});
|
||||
|
25
extensions/mentions/js/forum/src/utils/textFormatter.js
Normal file
25
extensions/mentions/js/forum/src/utils/textFormatter.js
Normal 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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user