diff --git a/framework/core/js/src/admin/AdminApplication.tsx b/framework/core/js/src/admin/AdminApplication.tsx index 5e81303cdd..b6f8c888a3 100644 --- a/framework/core/js/src/admin/AdminApplication.tsx +++ b/framework/core/js/src/admin/AdminApplication.tsx @@ -59,6 +59,7 @@ export interface AdminApplicationData extends ApplicationData { settings: Record; modelStatistics: Record; displayNameDrivers: string[]; + avatarDrivers: string[]; slugDrivers: Record; searchDrivers: Record; permissions: Record; diff --git a/framework/core/js/src/admin/components/BasicsPage.tsx b/framework/core/js/src/admin/components/BasicsPage.tsx index 42cd5907b1..29977d7fda 100644 --- a/framework/core/js/src/admin/components/BasicsPage.tsx +++ b/framework/core/js/src/admin/components/BasicsPage.tsx @@ -10,6 +10,7 @@ import extractText from '../../common/utils/extractText'; export type HomePageItem = { path: string; label: Mithril.Children }; export type DriverLocale = { display_name: Record; + avatar: Record; slug: Record>; }; @@ -58,6 +59,9 @@ export default class BasicsPage ext display_name: { username: extractText(app.translator.trans('core.admin.basics.display_name_driver_options.username')), }, + avatar: { + default: extractText(app.translator.trans('core.admin.basics.avatar_driver_options.default')), + }, slug: { 'Flarum\\Discussion\\Discussion': { default: extractText(app.translator.trans('core.admin.basics.slug_driver_options.discussions.default')), @@ -82,6 +86,7 @@ export default class BasicsPage ext const localeOptions: Record = {}; const displayNameOptions: Record = {}; + const avatarDriverOptions: Record = {}; const slugDriverOptions: Record> = {}; const driverLocale = BasicsPage.driverLocale(); @@ -94,6 +99,10 @@ export default class BasicsPage ext displayNameOptions[identifier] = driverLocale.display_name[identifier] || identifier; }); + app.data.avatarDrivers.forEach((identifier) => { + avatarDriverOptions[identifier] = driverLocale.avatar[identifier] || identifier; + }); + Object.keys(app.data.slugDrivers).forEach((model) => { slugDriverOptions[model] = {}; @@ -169,6 +178,16 @@ export default class BasicsPage ext }); } + if (Object.keys(avatarDriverOptions).length > 1) { + app.registry.registerSetting({ + type: 'select', + setting: 'avatar_driver', + options: avatarDriverOptions, + label: app.translator.trans('core.admin.basics.avatar_driver_heading'), + help: app.translator.trans('core.admin.basics.avatar_driver_text'), + }); + } + Object.keys(slugDriverOptions).forEach((model) => { const options = slugDriverOptions[model]; const modelLocale = AdminPage.modelLocale()[model] || model; diff --git a/framework/core/js/src/common/models/User.tsx b/framework/core/js/src/common/models/User.tsx index d0d03fea68..eee5f59bab 100644 --- a/framework/core/js/src/common/models/User.tsx +++ b/framework/core/js/src/common/models/User.tsx @@ -30,6 +30,10 @@ export default class User extends Model { return Model.attribute('password').call(this); } + hasUploadedAvatar() { + return Model.attribute('hasUploadedAvatar').call(this); + } + avatarUrl() { return Model.attribute('avatarUrl').call(this); } diff --git a/framework/core/js/src/forum/components/AvatarEditor.js b/framework/core/js/src/forum/components/AvatarEditor.js index 9ed5fd3039..790bce4b1e 100644 --- a/framework/core/js/src/forum/components/AvatarEditor.js +++ b/framework/core/js/src/forum/components/AvatarEditor.js @@ -44,7 +44,7 @@ export default class AvatarEditor extends Component {