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 d10280daf7e..907f803aed3 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 36fa8c3b812..c5620d84edf 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 a78407f225f..0c8f9954965 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 9b8bf40bb7a..ecbc84d125a 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 e6bf7b2087d..596b53e4ee1 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 7086f1e0e2b..a63007c9b17 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 7c068980615..22aef424fe0 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 c298f43e612..74d859adbfa 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 194b49a7175..b5f27d3b773 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 00000000000..9713abb4dd4 --- /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 d5a81944bc5..99d81e2d997 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