From cf8b3fbd56f125f97432bc2a4161375dab1c82f4 Mon Sep 17 00:00:00 2001 From: Thorben Egberts Date: Fri, 8 Apr 2016 14:35:41 +0200 Subject: [PATCH] FEATURE: add user custom fields to user card The user's custom fields are now displayed on the user card. This has to be enabled for each custom field in the custom field settings. See https://meta.discourse.org/t/custom-user-fields-on-usercard/22662/ --- .../components/admin-user-field-item.js.es6 | 6 +++++- .../components/admin-user-field-item.hbs | 4 ++++ .../discourse/controllers/user-card.js.es6 | 14 +++++++++++++ .../discourse/templates/user-card.hbs | 13 ++++++++++++ .../admin/user_fields_controller.rb | 2 +- app/models/user_field.rb | 21 ++++++++++--------- app/serializers/user_field_serializer.rb | 1 + config/locales/client.de.yml | 4 ++++ config/locales/client.en.yml | 4 ++++ ...59_add_show_on_user_card_to_user_fields.rb | 5 +++++ script/import_scripts/ning.rb | 2 +- 11 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20160408131959_add_show_on_user_card_to_user_fields.rb diff --git a/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 b/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 index d10280daf..907f803ae 100644 --- a/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 +++ b/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 @@ -43,9 +43,12 @@ export default Ember.Component.extend(bufferedProperty('userField'), { if (this.get('userField.show_on_profile')) { ret.push(I18n.t('admin.user_fields.show_on_profile.enabled')); } + if (this.get('userField.show_on_user_card')) { + ret.push(I18n.t('admin.user_fields.show_on_user_card.enabled')); + } return ret.join(', '); - }.property('userField.editable', 'userField.required', 'userField.show_on_profile'), + }.property('userField.editable', 'userField.required', 'userField.show_on_profile', 'userField.show_on_user_card'), actions: { save() { @@ -57,6 +60,7 @@ export default Ember.Component.extend(bufferedProperty('userField'), { 'editable', 'required', 'show_on_profile', + 'show_on_user_card', 'options'); this.get('userField').save(attrs).then(function() { diff --git a/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs b/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs index 36fa8c3b8..c5620d84e 100644 --- a/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs +++ b/app/assets/javascripts/admin/templates/components/admin-user-field-item.hbs @@ -29,6 +29,10 @@ {{input type="checkbox" checked=buffered.show_on_profile}} {{i18n 'admin.user_fields.show_on_profile.title'}} {{/admin-form-row}} + {{#admin-form-row wrapLabel="true"}} + {{input type="checkbox" checked=buffered.show_on_user_card}} {{i18n 'admin.user_fields.show_on_user_card.title'}} + {{/admin-form-row}} + {{#admin-form-row}} {{d-button action="save" class="btn-primary" icon="check" label="admin.user_fields.save"}} {{d-button action="cancel" class="btn-danger" icon="times" label="admin.user_fields.cancel"}} diff --git a/app/assets/javascripts/discourse/controllers/user-card.js.es6 b/app/assets/javascripts/discourse/controllers/user-card.js.es6 index a78407f22..0c8f99549 100644 --- a/app/assets/javascripts/discourse/controllers/user-card.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-card.js.es6 @@ -1,5 +1,6 @@ import DiscourseURL from 'discourse/lib/url'; import { propertyNotEqual, setting } from 'discourse/lib/computed'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ needs: ['topic', 'application'], @@ -26,6 +27,19 @@ export default Ember.Controller.extend({ showMoreBadges: Em.computed.gt('moreBadgesCount', 0), showDelete: Em.computed.and("viewingAdmin", "showName", "user.canBeDeleted"), + @computed('model.user_fields.@each.value') + publicUserFields() { + const siteUserFields = this.site.get('user_fields'); + if (!Ember.isEmpty(siteUserFields)) { + const userFields = this.get('user.user_fields'); + return siteUserFields.filterProperty('show_on_user_card', true).sortBy('position').map(field => { + Ember.set(field, 'dasherized_name', field.get('name').dasherize()); + const value = userFields ? userFields[field.get('id')] : null; + return Ember.isEmpty(value) ? null : Ember.Object.create({ value, field }); + }).compact(); + } + }, + moreBadgesCount: function() { return this.get('user.badge_count') - this.get('user.featured_user_badges.length'); }.property('user.badge_count', 'user.featured_user_badges.@each'), diff --git a/app/assets/javascripts/discourse/templates/user-card.hbs b/app/assets/javascripts/discourse/templates/user-card.hbs index 9b8bf40bb..ecbc84d12 100644 --- a/app/assets/javascripts/discourse/templates/user-card.hbs +++ b/app/assets/javascripts/discourse/templates/user-card.hbs @@ -65,6 +65,19 @@ {{/if}} + {{#if publicUserFields}} +
+ {{#each uf in publicUserFields}} + {{#if uf.value}} +
+ {{uf.field.name}}: + {{uf.value}} +
+ {{/if}} + {{/each}} +
+ {{/if}} + {{#if showBadges}}
{{#each ub in user.featured_user_badges}} diff --git a/app/controllers/admin/user_fields_controller.rb b/app/controllers/admin/user_fields_controller.rb index e6bf7b208..596b53e4e 100644 --- a/app/controllers/admin/user_fields_controller.rb +++ b/app/controllers/admin/user_fields_controller.rb @@ -1,7 +1,7 @@ class Admin::UserFieldsController < Admin::AdminController def self.columns - [:name, :field_type, :editable, :description, :required, :show_on_profile, :position] + [:name, :field_type, :editable, :description, :required, :show_on_profile, :show_on_user_card, :position] end def create diff --git a/app/models/user_field.rb b/app/models/user_field.rb index 7086f1e0e..a63007c9b 100644 --- a/app/models/user_field.rb +++ b/app/models/user_field.rb @@ -12,14 +12,15 @@ end # # Table name: user_fields # -# id :integer not null, primary key -# name :string not null -# field_type :string not null -# created_at :datetime -# updated_at :datetime -# editable :boolean default(FALSE), not null -# description :string not null -# required :boolean default(TRUE), not null -# show_on_profile :boolean default(FALSE), not null -# position :integer default(0) +# id :integer not null, primary key +# name :string not null +# field_type :string not null +# created_at :datetime +# updated_at :datetime +# editable :boolean default(FALSE), not null +# description :string not null +# required :boolean default(TRUE), not null +# show_on_profile :boolean default(FALSE), not null +# show_on_user_card :boolean default(FALSE), not null +# position :integer default(0) # diff --git a/app/serializers/user_field_serializer.rb b/app/serializers/user_field_serializer.rb index 7c0689806..22aef424f 100644 --- a/app/serializers/user_field_serializer.rb +++ b/app/serializers/user_field_serializer.rb @@ -6,6 +6,7 @@ class UserFieldSerializer < ApplicationSerializer :editable, :required, :show_on_profile, + :show_on_user_card, :position, :options diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index c298f43e6..74d859adb 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -2443,6 +2443,10 @@ de: title: "Im öffentlichen Profil anzeigen?" enabled: "wird im Profil angezeigt" disabled: "wird im Profil nicht angezeigt" + show_on_user_card: + title: "Auf Benutzerkarte anzeigen?" + enabled: "wird auf Benutzerkarte angezeigt" + disabled: "wird auf Benutzerkarte nicht angezeigt" field_types: text: 'Textfeld' confirm: 'Bestätigung' diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 194b49a71..b5f27d3b7 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2640,6 +2640,10 @@ en: title: "Show on public profile?" enabled: "shown on profile" disabled: "not shown on profile" + show_on_user_card: + title: "Show on user card?" + enabled: "shown on user card" + disabled: "not shown on user card" field_types: text: 'Text Field' diff --git a/db/migrate/20160408131959_add_show_on_user_card_to_user_fields.rb b/db/migrate/20160408131959_add_show_on_user_card_to_user_fields.rb new file mode 100644 index 000000000..9713abb4d --- /dev/null +++ b/db/migrate/20160408131959_add_show_on_user_card_to_user_fields.rb @@ -0,0 +1,5 @@ +class AddShowOnUserCardToUserFields < ActiveRecord::Migration + def change + add_column :user_fields, :show_on_user_card, :boolean, default: false, null: false + end +end diff --git a/script/import_scripts/ning.rb b/script/import_scripts/ning.rb index d5a81944b..99d81e2d9 100644 --- a/script/import_scripts/ning.rb +++ b/script/import_scripts/ning.rb @@ -26,7 +26,7 @@ class ImportScripts::Ning < ImportScripts::Base # Example of importing a custom profile field: # @interests_field = UserField.find_by_name("My interests") # unless @interests_field - # @interests_field = UserField.create(name: "My interests", description: "Do you like stuff?", field_type: "text", editable: true, required: false, show_on_profile: true) + # @interests_field = UserField.create(name: "My interests", description: "Do you like stuff?", field_type: "text", editable: true, required: false, show_on_profile: true, show_on_user_card: true) # end end