FIX: Admin user fields weren't showing errors

Also updated it to remove deprecations and item controller
This commit is contained in:
Robin Ward 2015-07-10 12:28:56 -04:00
parent 84549929ba
commit ac2f5cbdab
6 changed files with 134 additions and 138 deletions

View File

@ -0,0 +1,68 @@
import { bufferedProperty } from 'discourse/mixins/buffered-content';
import UserField from 'admin/models/user-field';
import { popupAjaxError } from 'discourse/lib/ajax-error';
export default Ember.Component.extend(bufferedProperty('userField'), {
editing: Ember.computed.empty('userField.id'),
classNameBindings: [':user-field'],
_focusOnEdit: function() {
if (this.get('editing')) {
Ember.run.scheduleOnce('afterRender', this, '_focusName');
}
}.observes('editing').on('didInsertElement'),
_focusName: function() {
$('.user-field-name').select();
},
fieldName: function() {
return UserField.fieldTypeById(this.get('userField.field_type')).get('name');
}.property('userField.field_type'),
flags: function() {
const ret = [];
if (this.get('userField.editable')) {
ret.push(I18n.t('admin.user_fields.editable.enabled'));
}
if (this.get('userField.required')) {
ret.push(I18n.t('admin.user_fields.required.enabled'));
}
if (this.get('userField.show_on_profile')) {
ret.push(I18n.t('admin.user_fields.show_on_profile.enabled'));
}
return ret.join(', ');
}.property('userField.editable', 'userField.required', 'userField.show_on_profile'),
actions: {
save: function() {
const self = this;
const attrs = this.get('buffered').getProperties('name', 'description', 'field_type', 'editable', 'required', 'show_on_profile');
this.get('userField').save(attrs).then(function(res) {
self.set('userField.id', res.user_field.id);
self.set('editing', false);
self.commitBuffer();
}).catch(popupAjaxError);
},
edit: function() {
this.set('editing', true);
},
destroy: function() {
this.sendAction('destroyAction', this.get('userField'));
},
cancel: function() {
const id = this.get('userField.id');
if (Ember.isEmpty(id)) {
this.sendAction('destroyAction', this.get('userField'));
} else {
this.rollbackBuffer();
this.set('editing', false);
}
}
}
});

View File

@ -1,64 +0,0 @@
import UserField from 'admin/models/user-field';
import BufferedContent from 'discourse/mixins/buffered-content';
export default Ember.ObjectController.extend(BufferedContent, {
needs: ['admin-user-fields'],
editing: Ember.computed.empty('id'),
fieldName: function() {
return UserField.fieldTypeById(this.get('field_type')).get('name');
}.property('field_type'),
flags: function() {
var ret = [];
if (this.get('editable')) {
ret.push(I18n.t('admin.user_fields.editable.enabled'));
}
if (this.get('required')) {
ret.push(I18n.t('admin.user_fields.required.enabled'));
}
if (this.get('show_on_profile')) {
ret.push(I18n.t('admin.user_fields.show_on_profile.enabled'));
}
return ret.join(', ');
}.property('editable', 'required', 'show_on_profile'),
actions: {
save: function() {
var self = this;
var attrs = this.get('buffered').getProperties('name', 'description', 'field_type', 'editable', 'required', 'show_on_profile');
this.get('model').save(attrs).then(function(res) {
self.set('model.id', res.user_field.id);
self.set('editing', false);
self.commitBuffer();
}).catch(function(e) {
var msg = I18n.t("generic_error");
if (e.responseJSON && e.responseJSON.errors) {
msg = I18n.t("generic_error_with_reason", {error: e.responseJSON.errors.join('. ')});
}
bootbox.alert(msg);
});
},
edit: function() {
this.set('editing', true);
},
destroy: function() {
this.get('controllers.admin-user-fields').send('destroy', this.get('model'));
},
cancel: function() {
var id = this.get('id');
if (Ember.isEmpty(id)) {
this.get('controllers.admin-user-fields').send('destroy', this.get('model'));
} else {
this.rollbackBuffer();
this.set('editing', false);
}
}
}
});

View File

@ -0,0 +1,47 @@
{{#if editing}}
<div class='row'>
<div class='form-element'>
{{input value=buffered.name class="user-field-name" placeholder=userFieldsName}}
</div>
<div class='form-element'>
{{input value=buffered.description class="user-field-desc" placeholder=userFieldsDescription}}
</div>
<div class='form-element'>
{{combo-box content=fieldTypes valueAttribute="id" value=buffered.field_type}}
</div>
<div class='form-element controls'>
{{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"}}
</div>
</div>
<div class="row">
<div class='form-element'>
<label>
{{input type="checkbox" checked=buffered.editable}} {{i18n 'admin.user_fields.editable.title'}}
</label>
</div>
<div class='form-element'>
<label>
{{input type="checkbox" checked=buffered.required}} {{i18n 'admin.user_fields.required.title'}}
</label>
</div>
<div class='form-element'>
<label>
{{input type="checkbox" checked=buffered.show_on_profile}} {{i18n 'admin.user_fields.show_on_profile.title'}}
</label>
</div>
</div>
{{else}}
<div class="row">
<div class='form-display'><strong>{{userField.name}}</strong></div>
<div class='form-display'>{{{userField.description}}}</div>
<div class='form-display'>{{fieldName}}</div>
<div class='form-display'></div>
<div class='form-element controls'>
{{d-button action="edit" class="btn-default" icon="pencil" label="admin.user_fields.edit"}}
{{d-button action="destroy" class="btn-danger" icon="trash-o" label="admin.user_fields.delete"}}
</div>
</div>
<div class="row">{{flags}}</div>
{{/if}}
<div class='clearfix'></div>

View File

@ -4,54 +4,8 @@
<p class="desc">{{i18n 'admin.user_fields.help'}}</p>
{{#if model}}
{{#each f in model itemController="admin-user-field-item" itemView="admin-user-field-item"}}
{{#if f.editing}}
<div class='row'>
<div class='form-element'>
{{input value=f.buffered.name class="user-field-name" placeholder=userFieldsName}}
</div>
<div class='form-element'>
{{input value=f.buffered.description class="user-field-desc" placeholder=userFieldsDescription}}
</div>
<div class='form-element'>
{{combo-box content=fieldTypes valueAttribute="id" value=f.buffered.field_type}}
</div>
<div class='form-element controls'>
<button {{action "save"}}class='btn btn-primary'>{{fa-icon 'check'}} {{i18n 'admin.user_fields.save'}}</button>
<button {{action "cancel"}} class='btn btn-danger'>{{fa-icon 'times'}} {{i18n 'admin.user_fields.cancel'}}</button>
</div>
</div>
<div class="row">
<div class='form-element'>
<label>
{{input type="checkbox" checked=f.buffered.editable}} {{i18n 'admin.user_fields.editable.title'}}
</label>
</div>
<div class='form-element'>
<label>
{{input type="checkbox" checked=f.buffered.required}} {{i18n 'admin.user_fields.required.title'}}
</label>
</div>
<div class='form-element'>
<label>
{{input type="checkbox" checked=f.buffered.show_on_profile}} {{i18n 'admin.user_fields.show_on_profile.title'}}
</label>
</div>
</div>
{{else}}
<div class="row">
<div class='form-display'><strong>{{f.name}}</strong></div>
<div class='form-display'>{{{f.description}}}</div>
<div class='form-display'>{{f.fieldName}}</div>
<div class='form-display'></div>
<div class='form-element controls'>
<button {{action "edit"}}class='btn btn-default'>{{fa-icon 'pencil'}} {{i18n 'admin.user_fields.edit'}}</button>
<button {{action "destroy"}}class='btn btn-danger'>{{fa-icon 'trash-o'}} {{i18n 'admin.user_fields.delete'}}</button>
</div>
</div>
<div class="row">{{f.flags}}</div>
{{/if}}
<div class='clearfix'></div>
{{#each model as |uf|}}
{{admin-user-field-item userField=uf fieldTypes=fieldTypes destroyAction="destroy"}}
{{/each}}
{{/if}}

View File

@ -1,13 +0,0 @@
export default Ember.View.extend({
classNameBindings: [':user-field'],
_focusOnEdit: function() {
if (this.get('controller.editing')) {
Ember.run.scheduleOnce('afterRender', this, '_focusName');
}
}.observes('controller.editing').on('didInsertElement'),
_focusName: function() {
$('.user-field-name').select();
}
});

View File

@ -1,16 +1,20 @@
/* global BufferedProxy: true */
export default Ember.Mixin.create({
buffered: function() {
return Em.ObjectProxy.extend(BufferedProxy).create({
content: this.get('content')
});
}.property('content'),
export function bufferedProperty(property) {
return Ember.Mixin.create({
buffered: function() {
return Em.ObjectProxy.extend(BufferedProxy).create({
content: this.get(property)
});
}.property(property),
rollbackBuffer: function() {
this.get('buffered').discardBufferedChanges();
},
rollbackBuffer: function() {
this.get('buffered').discardBufferedChanges();
},
commitBuffer: function() {
this.get('buffered').applyBufferedChanges();
}
});
commitBuffer: function() {
this.get('buffered').applyBufferedChanges();
}
});
}
export default bufferedProperty('content');