mirror of
https://github.com/codeninjasllc/discourse.git
synced 2025-03-24 13:49:54 -04:00
Link to edit "About Me" links directly to the field.
This commit is contained in:
parent
b0ca3a34ca
commit
43ceacabab
30 changed files with 263 additions and 191 deletions
|
@ -0,0 +1,66 @@
|
||||||
|
/**
|
||||||
|
The route for editing a user's "About Me" bio.
|
||||||
|
|
||||||
|
@class PreferencesAboutRoute
|
||||||
|
@extends Discourse.RestrictedUserRoute
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.PreferencesAboutRoute = Discourse.RestrictedUserRoute.extend({
|
||||||
|
model: function() {
|
||||||
|
return this.modelFor('user');
|
||||||
|
},
|
||||||
|
|
||||||
|
renderTemplate: function() {
|
||||||
|
this.render({ into: 'user', outlet: 'userOutlet' });
|
||||||
|
},
|
||||||
|
|
||||||
|
setupController: function(controller, model) {
|
||||||
|
controller.setProperties({ model: model, newBio: model.get('bio_raw') });
|
||||||
|
},
|
||||||
|
|
||||||
|
// A bit odd, but if we leave to /preferences we need to re-render that outlet
|
||||||
|
exit: function() {
|
||||||
|
this._super();
|
||||||
|
this.render('preferences', { into: 'user', outlet: 'userOutlet', controller: 'preferences' });
|
||||||
|
},
|
||||||
|
|
||||||
|
events: {
|
||||||
|
changeAbout: function() {
|
||||||
|
var route = this;
|
||||||
|
var controller = route.controllerFor('preferencesAbout');
|
||||||
|
|
||||||
|
controller.setProperties({ saving: true });
|
||||||
|
return controller.get('model').save().then(function() {
|
||||||
|
controller.set('saving', false);
|
||||||
|
route.transitionTo('user.index');
|
||||||
|
}, function() {
|
||||||
|
// model failed to save
|
||||||
|
controller.set('saving', false);
|
||||||
|
alert(I18n.t('generic_error'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
This controller supports actions related to updating your "About Me" bio
|
||||||
|
|
||||||
|
@class PreferencesAboutController
|
||||||
|
@extends Discourse.ObjectController
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.PreferencesAboutController = Discourse.ObjectController.extend({
|
||||||
|
saving: false,
|
||||||
|
|
||||||
|
saveButtonText: function() {
|
||||||
|
if (this.get('saving')) return I18n.t("saving");
|
||||||
|
return I18n.t("user.change");
|
||||||
|
}.property('saving'),
|
||||||
|
|
||||||
|
|
||||||
|
});
|
|
@ -1,3 +1,21 @@
|
||||||
|
/**
|
||||||
|
The common route stuff for a user's preference
|
||||||
|
|
||||||
|
@class PreferencesRoute
|
||||||
|
@extends Discourse.RestrictedUserRoute
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.PreferencesRoute = Discourse.RestrictedUserRoute.extend({
|
||||||
|
model: function() {
|
||||||
|
return this.modelFor('user');
|
||||||
|
},
|
||||||
|
|
||||||
|
renderTemplate: function() {
|
||||||
|
this.render('preferences', { into: 'user', outlet: 'userOutlet', controller: 'preferences' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This controller supports actions related to updating one's preferences
|
This controller supports actions related to updating one's preferences
|
||||||
|
|
||||||
|
@ -10,47 +28,32 @@ Discourse.PreferencesController = Discourse.ObjectController.extend({
|
||||||
// By default we haven't saved anything
|
// By default we haven't saved anything
|
||||||
saved: false,
|
saved: false,
|
||||||
|
|
||||||
saveDisabled: (function() {
|
saveDisabled: function() {
|
||||||
if (this.get('saving')) return true;
|
if (this.get('saving')) return true;
|
||||||
if (this.blank('content.name')) return true;
|
if (this.blank('name')) return true;
|
||||||
if (this.blank('content.email')) return true;
|
if (this.blank('email')) return true;
|
||||||
return false;
|
return false;
|
||||||
}).property('saving', 'content.name', 'content.email'),
|
}.property('saving', 'name', 'email'),
|
||||||
|
|
||||||
digestFrequencies: (function() {
|
digestFrequencies: [{ name: I18n.t('user.email_digests.daily'), value: 1 },
|
||||||
var freqs;
|
{ name: I18n.t('user.email_digests.weekly'), value: 7 },
|
||||||
freqs = Em.A();
|
{ name: I18n.t('user.email_digests.bi_weekly'), value: 14 }],
|
||||||
freqs.addObject({ name: I18n.t('user.email_digests.daily'), value: 1 });
|
|
||||||
freqs.addObject({ name: I18n.t('user.email_digests.weekly'), value: 7 });
|
|
||||||
freqs.addObject({ name: I18n.t('user.email_digests.bi_weekly'), value: 14 });
|
|
||||||
return freqs;
|
|
||||||
}).property(),
|
|
||||||
|
|
||||||
autoTrackDurations: (function() {
|
autoTrackDurations: [{ name: I18n.t('user.auto_track_options.never'), value: -1 },
|
||||||
var freqs;
|
{ name: I18n.t('user.auto_track_options.always'), value: 0 },
|
||||||
freqs = Em.A();
|
{ name: I18n.t('user.auto_track_options.after_n_seconds', { count: 30 }), value: 30000 },
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.never'), value: -1 });
|
{ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 1 }), value: 60000 },
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.always'), value: 0 });
|
{ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 2 }), value: 120000 },
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_seconds', { count: 30 }), value: 30000 });
|
{ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 3 }), value: 180000 },
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 1 }), value: 60000 });
|
{ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 4 }), value: 240000 },
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 2 }), value: 120000 });
|
{ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 5 }), value: 300000 },
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 3 }), value: 180000 });
|
{ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 10 }), value: 600000 }],
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 4 }), value: 240000 });
|
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 5 }), value: 300000 });
|
|
||||||
freqs.addObject({ name: I18n.t('user.auto_track_options.after_n_minutes', { count: 10 }), value: 600000 });
|
|
||||||
return freqs;
|
|
||||||
}).property(),
|
|
||||||
|
|
||||||
considerNewTopicOptions: (function() {
|
considerNewTopicOptions: [{ name: I18n.t('user.new_topic_duration.not_viewed'), value: -1 },
|
||||||
var opts;
|
{ name: I18n.t('user.new_topic_duration.after_n_days', { count: 1 }), value: 60 * 24 },
|
||||||
opts = Em.A();
|
{ name: I18n.t('user.new_topic_duration.after_n_days', { count: 2 }), value: 60 * 48 },
|
||||||
opts.addObject({ name: I18n.t('user.new_topic_duration.not_viewed'), value: -1 });
|
{ name: I18n.t('user.new_topic_duration.after_n_weeks', { count: 1 }), value: 7 * 60 * 24 },
|
||||||
opts.addObject({ name: I18n.t('user.new_topic_duration.after_n_days', { count: 1 }), value: 60 * 24 });
|
{ name: I18n.t('user.new_topic_duration.last_here'), value: -2 }],
|
||||||
opts.addObject({ name: I18n.t('user.new_topic_duration.after_n_days', { count: 2 }), value: 60 * 48 });
|
|
||||||
opts.addObject({ name: I18n.t('user.new_topic_duration.after_n_weeks', { count: 1 }), value: 7 * 60 * 24 });
|
|
||||||
opts.addObject({ name: I18n.t('user.new_topic_duration.last_here'), value: -2 });
|
|
||||||
return opts;
|
|
||||||
}).property(),
|
|
||||||
|
|
||||||
save: function() {
|
save: function() {
|
||||||
var preferencesController = this;
|
var preferencesController = this;
|
||||||
|
@ -58,7 +61,7 @@ Discourse.PreferencesController = Discourse.ObjectController.extend({
|
||||||
this.set('saved', false);
|
this.set('saved', false);
|
||||||
|
|
||||||
// Cook the bio for preview
|
// Cook the bio for preview
|
||||||
var model = this.get('content');
|
var model = this.get('model');
|
||||||
return model.save().then(function() {
|
return model.save().then(function() {
|
||||||
// model was saved
|
// model was saved
|
||||||
preferencesController.set('saving', false);
|
preferencesController.set('saving', false);
|
||||||
|
@ -66,8 +69,8 @@ Discourse.PreferencesController = Discourse.ObjectController.extend({
|
||||||
Discourse.User.current().set('name', model.get('name'));
|
Discourse.User.current().set('name', model.get('name'));
|
||||||
}
|
}
|
||||||
|
|
||||||
preferencesController.set('content.bio_cooked',
|
preferencesController.set('bio_cooked',
|
||||||
Discourse.Markdown.cook(preferencesController.get('content.bio_raw')));
|
Discourse.Markdown.cook(preferencesController.get('bio_raw')));
|
||||||
preferencesController.set('saved', true);
|
preferencesController.set('saved', true);
|
||||||
}, function() {
|
}, function() {
|
||||||
// model failed to save
|
// model failed to save
|
||||||
|
@ -76,16 +79,15 @@ Discourse.PreferencesController = Discourse.ObjectController.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
saveButtonText: (function() {
|
saveButtonText: function() {
|
||||||
if (this.get('saving')) return I18n.t('saving');
|
return this.get('saving') ? I18n.t('saving') : I18n.t('save');
|
||||||
return I18n.t('save');
|
}.property('saving'),
|
||||||
}).property('saving'),
|
|
||||||
|
|
||||||
changePassword: function() {
|
changePassword: function() {
|
||||||
var preferencesController = this;
|
var preferencesController = this;
|
||||||
if (!this.get('passwordProgress')) {
|
if (!this.get('passwordProgress')) {
|
||||||
this.set('passwordProgress', I18n.t("user.change_password.in_progress"));
|
this.set('passwordProgress', I18n.t("user.change_password.in_progress"));
|
||||||
return this.get('content').changePassword().then(function() {
|
return this.get('model').changePassword().then(function() {
|
||||||
// password changed
|
// password changed
|
||||||
preferencesController.setProperties({
|
preferencesController.setProperties({
|
||||||
changePasswordProgress: false,
|
changePasswordProgress: false,
|
||||||
|
|
|
@ -1,3 +1,32 @@
|
||||||
|
/**
|
||||||
|
The route for editing a user's email
|
||||||
|
|
||||||
|
@class PreferencesEmailRoute
|
||||||
|
@extends Discourse.RestrictedUserRoute
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.PreferencesEmailRoute = Discourse.RestrictedUserRoute.extend({
|
||||||
|
model: function() {
|
||||||
|
return this.modelFor('user');
|
||||||
|
},
|
||||||
|
|
||||||
|
renderTemplate: function() {
|
||||||
|
this.render({ into: 'user', outlet: 'userOutlet' });
|
||||||
|
},
|
||||||
|
|
||||||
|
setupController: function(controller, model) {
|
||||||
|
controller.setProperties({ model: model, newEmail: model.get('email') });
|
||||||
|
},
|
||||||
|
|
||||||
|
// A bit odd, but if we leave to /preferences we need to re-render that outlet
|
||||||
|
exit: function() {
|
||||||
|
this._super();
|
||||||
|
this.render('preferences', { into: 'user', outlet: 'userOutlet', controller: 'preferences' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This controller supports actions related to updating one's email address
|
This controller supports actions related to updating one's email address
|
||||||
|
|
||||||
|
@ -13,25 +42,14 @@ Discourse.PreferencesEmailController = Discourse.ObjectController.extend({
|
||||||
success: false,
|
success: false,
|
||||||
newEmail: null,
|
newEmail: null,
|
||||||
|
|
||||||
saveDisabled: (function() {
|
newEmailEmpty: Em.computed.empty('newEmail'),
|
||||||
if (this.get('saving')) return true;
|
saveDisabled: Em.computed.or('saving', 'newEmailEmpty', 'taken', 'unchanged'),
|
||||||
if (this.blank('newEmail')) return true;
|
unchanged: Discourse.computed.propertyEqual('newEmail', 'email'),
|
||||||
if (this.get('taken')) return true;
|
|
||||||
if (this.get('unchanged')) return true;
|
|
||||||
}).property('newEmail', 'taken', 'unchanged', 'saving'),
|
|
||||||
|
|
||||||
unchanged: (function() {
|
saveButtonText: function() {
|
||||||
return this.get('newEmail') === this.get('content.email');
|
|
||||||
}).property('newEmail', 'content.email'),
|
|
||||||
|
|
||||||
initializeEmail: (function() {
|
|
||||||
this.set('newEmail', this.get('content.email'));
|
|
||||||
}).observes('content.email'),
|
|
||||||
|
|
||||||
saveButtonText: (function() {
|
|
||||||
if (this.get('saving')) return I18n.t("saving");
|
if (this.get('saving')) return I18n.t("saving");
|
||||||
return I18n.t("user.change_email.action");
|
return I18n.t("user.change");
|
||||||
}).property('saving'),
|
}.property('saving'),
|
||||||
|
|
||||||
changeEmail: function() {
|
changeEmail: function() {
|
||||||
var preferencesEmailController = this;
|
var preferencesEmailController = this;
|
||||||
|
@ -39,9 +57,10 @@ Discourse.PreferencesEmailController = Discourse.ObjectController.extend({
|
||||||
return this.get('content').changeEmail(this.get('newEmail')).then(function() {
|
return this.get('content').changeEmail(this.get('newEmail')).then(function() {
|
||||||
preferencesEmailController.set('success', true);
|
preferencesEmailController.set('success', true);
|
||||||
}, function() {
|
}, function() {
|
||||||
// Error
|
preferencesEmailController.setProperties({
|
||||||
preferencesEmailController.set('error', true);
|
error: true,
|
||||||
preferencesEmailController.set('saving', false);
|
saving: false
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,32 @@
|
||||||
|
/**
|
||||||
|
The route for updating a user's username
|
||||||
|
|
||||||
|
@class PreferencesUsernameRoute
|
||||||
|
@extends Discourse.RestrictedUserRoute
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.PreferencesUsernameRoute = Discourse.RestrictedUserRoute.extend({
|
||||||
|
model: function() {
|
||||||
|
return this.modelFor('user');
|
||||||
|
},
|
||||||
|
|
||||||
|
renderTemplate: function() {
|
||||||
|
return this.render({ into: 'user', outlet: 'userOutlet' });
|
||||||
|
},
|
||||||
|
|
||||||
|
// A bit odd, but if we leave to /preferences we need to re-render that outlet
|
||||||
|
exit: function() {
|
||||||
|
this._super();
|
||||||
|
this.render('preferences', { into: 'user', outlet: 'userOutlet', controller: 'preferences' });
|
||||||
|
},
|
||||||
|
|
||||||
|
setupController: function(controller, user) {
|
||||||
|
controller.setProperties({ model: user, newUsername: user.get('username') });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This controller supports actions related to updating one's username
|
This controller supports actions related to updating one's username
|
||||||
|
|
||||||
|
@ -13,18 +42,9 @@ Discourse.PreferencesUsernameController = Discourse.ObjectController.extend({
|
||||||
errorMessage: null,
|
errorMessage: null,
|
||||||
newUsername: null,
|
newUsername: null,
|
||||||
|
|
||||||
saveDisabled: function() {
|
newUsernameEmpty: Em.computed.empty('newUsername'),
|
||||||
if (this.get('saving')) return true;
|
saveDisabled: Em.computed.or('saving', 'newUsernameEmpty', 'taken', 'unchanged', 'errorMessage'),
|
||||||
if (this.blank('newUsername')) return true;
|
unchanged: Discourse.computed.propertyEqual('newUsername', 'username'),
|
||||||
if (this.get('taken')) return true;
|
|
||||||
if (this.get('unchanged')) return true;
|
|
||||||
if (this.get('errorMessage')) return true;
|
|
||||||
return false;
|
|
||||||
}.property('newUsername', 'taken', 'errorMessage', 'unchanged', 'saving'),
|
|
||||||
|
|
||||||
unchanged: function() {
|
|
||||||
return this.get('newUsername') === this.get('content.username');
|
|
||||||
}.property('newUsername', 'content.username'),
|
|
||||||
|
|
||||||
checkTaken: function() {
|
checkTaken: function() {
|
||||||
if( this.get('newUsername') && this.get('newUsername').length < 3 ) {
|
if( this.get('newUsername') && this.get('newUsername').length < 3 ) {
|
||||||
|
@ -47,7 +67,7 @@ Discourse.PreferencesUsernameController = Discourse.ObjectController.extend({
|
||||||
|
|
||||||
saveButtonText: function() {
|
saveButtonText: function() {
|
||||||
if (this.get('saving')) return I18n.t("saving");
|
if (this.get('saving')) return I18n.t("saving");
|
||||||
return I18n.t("user.change_username.action");
|
return I18n.t("user.change");
|
||||||
}.property('saving'),
|
}.property('saving'),
|
||||||
|
|
||||||
changeUsername: function() {
|
changeUsername: function() {
|
||||||
|
|
|
@ -56,6 +56,7 @@ Discourse.Route.buildRoutes(function() {
|
||||||
this.resource('preferences', { path: '/preferences' }, function() {
|
this.resource('preferences', { path: '/preferences' }, function() {
|
||||||
this.route('username', { path: '/username' });
|
this.route('username', { path: '/username' });
|
||||||
this.route('email', { path: '/email' });
|
this.route('email', { path: '/email' });
|
||||||
|
this.route('about', { path: '/about-me' });
|
||||||
});
|
});
|
||||||
|
|
||||||
this.route('invited', { path: 'invited' });
|
this.route('invited', { path: 'invited' });
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
/**
|
|
||||||
The route for editing a user's email
|
|
||||||
|
|
||||||
@class PreferencesEmailRoute
|
|
||||||
@extends Discourse.RestrictedUserRoute
|
|
||||||
@namespace Discourse
|
|
||||||
@module Discourse
|
|
||||||
**/
|
|
||||||
Discourse.PreferencesEmailRoute = Discourse.RestrictedUserRoute.extend({
|
|
||||||
|
|
||||||
model: function() {
|
|
||||||
return this.modelFor('user');
|
|
||||||
},
|
|
||||||
|
|
||||||
renderTemplate: function() {
|
|
||||||
this.render({ into: 'user', outlet: 'userOutlet' });
|
|
||||||
},
|
|
||||||
|
|
||||||
// A bit odd, but if we leave to /preferences we need to re-render that outlet
|
|
||||||
exit: function() {
|
|
||||||
this._super();
|
|
||||||
this.render('preferences', {
|
|
||||||
into: 'user',
|
|
||||||
outlet: 'userOutlet',
|
|
||||||
controller: 'preferences'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
/**
|
|
||||||
The common route stuff for a user's preference
|
|
||||||
|
|
||||||
@class PreferencesRoute
|
|
||||||
@extends Discourse.RestrictedUserRoute
|
|
||||||
@namespace Discourse
|
|
||||||
@module Discourse
|
|
||||||
**/
|
|
||||||
Discourse.PreferencesRoute = Discourse.RestrictedUserRoute.extend({
|
|
||||||
|
|
||||||
model: function() {
|
|
||||||
return this.modelFor('user');
|
|
||||||
},
|
|
||||||
|
|
||||||
renderTemplate: function() {
|
|
||||||
this.render('preferences', {
|
|
||||||
into: 'user',
|
|
||||||
outlet: 'userOutlet',
|
|
||||||
controller: 'preferences'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
|
@ -1,36 +0,0 @@
|
||||||
/**
|
|
||||||
The route for updating a user's username
|
|
||||||
|
|
||||||
@class PreferencesUsernameRoute
|
|
||||||
@extends Discourse.RestrictedUserRoute
|
|
||||||
@namespace Discourse
|
|
||||||
@module Discourse
|
|
||||||
**/
|
|
||||||
Discourse.PreferencesUsernameRoute = Discourse.RestrictedUserRoute.extend({
|
|
||||||
|
|
||||||
model: function() {
|
|
||||||
return this.modelFor('user');
|
|
||||||
},
|
|
||||||
|
|
||||||
renderTemplate: function() {
|
|
||||||
return this.render({ into: 'user', outlet: 'userOutlet' });
|
|
||||||
},
|
|
||||||
|
|
||||||
// A bit odd, but if we leave to /preferences we need to re-render that outlet
|
|
||||||
exit: function() {
|
|
||||||
this._super();
|
|
||||||
this.render('preferences', {
|
|
||||||
into: 'user',
|
|
||||||
outlet: 'userOutlet',
|
|
||||||
controller: 'preferences'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
setupController: function(controller, user) {
|
|
||||||
controller.set('model', user);
|
|
||||||
controller.set('newUsername', user.get('username'));
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
|
@ -20,13 +20,16 @@ Discourse.UserRoute = Discourse.Route.extend({
|
||||||
return Discourse.User.create({username: params.username});
|
return Discourse.User.create({username: params.username});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
afterModel: function() {
|
||||||
|
return this.modelFor('user').findDetails();
|
||||||
|
},
|
||||||
|
|
||||||
serialize: function(params) {
|
serialize: function(params) {
|
||||||
if (!params) return {};
|
if (!params) return {};
|
||||||
return { username: Em.get(params, 'username').toLowerCase() };
|
return { username: Em.get(params, 'username').toLowerCase() };
|
||||||
},
|
},
|
||||||
|
|
||||||
setupController: function(controller, user) {
|
setupController: function(controller, user) {
|
||||||
user.findDetails();
|
|
||||||
controller.set('model', user);
|
controller.set('model', user);
|
||||||
|
|
||||||
// Add a search context
|
// Add a search context
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<form class="form-horizontal">
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="controls">
|
||||||
|
<h3>{{i18n user.change_about.title}}</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{#if error}}
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="instructions">
|
||||||
|
<div class='alert error'>{{i18n user.change_about.error}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label">{{i18n user.bio}}</label>
|
||||||
|
<div class="controls">
|
||||||
|
{{pagedown value=bio_raw}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<div class="controls">
|
||||||
|
<button {{action changeAbout}} {{bindAttr disabled="saveDisabled"}} class="btn btn-primary">{{saveButtonText}}</button>
|
||||||
|
{{#if saved}}{{i18n saved}}{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
|
@ -4,7 +4,7 @@
|
||||||
<label class="control-label">{{i18n user.username.title}}</label>
|
<label class="control-label">{{i18n user.username.title}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<span class='static'>{{username}}</span>
|
<span class='static'>{{username}}</span>
|
||||||
{{#linkTo "preferences.username" class="btn pad-left"}}{{i18n user.change_username.action}}{{/linkTo}}
|
{{#linkTo "preferences.username" class="btn pad-left"}}{{i18n user.change}}{{/linkTo}}
|
||||||
</div>
|
</div>
|
||||||
<div class='instructions'>
|
<div class='instructions'>
|
||||||
{{{i18n user.username.short_instructions username="username"}}}
|
{{{i18n user.username.short_instructions username="username"}}}
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
<label class="control-label">{{i18n user.email.title}}</label>
|
<label class="control-label">{{i18n user.email.title}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<span class='static'>{{email}}</span>
|
<span class='static'>{{email}}</span>
|
||||||
{{#linkTo "preferences.email" class="btn pad-left"}}{{i18n user.change_email.action}}{{/linkTo}}
|
{{#linkTo "preferences.email" class="btn pad-left"}}{{i18n user.change}}{{/linkTo}}
|
||||||
</div>
|
</div>
|
||||||
<div class='instructions'>
|
<div class='instructions'>
|
||||||
{{i18n user.email.instructions}}
|
{{i18n user.email.instructions}}
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label">{{i18n user.password.title}}</label>
|
<label class="control-label">{{i18n user.password.title}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<a href="#" {{action changePassword}} class='btn'>{{i18n user.change_password.action}}</a> {{passwordProgress}}
|
<a href="#" {{action changePassword}} class='btn'>{{i18n user.change}}</a> {{passwordProgress}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
/**
|
||||||
|
This view handles rendering of a user's bio editor
|
||||||
|
|
||||||
|
@class PreferencesAboutView
|
||||||
|
@extends Discourse.View
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.PreferencesAboutView = Discourse.View.extend({
|
||||||
|
templateName: 'user/about',
|
||||||
|
classNames: ['user-preferences'],
|
||||||
|
|
||||||
|
didInsertElement: function() {
|
||||||
|
this.$('textarea').focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
|
@ -184,25 +184,26 @@ en:
|
||||||
dynamic_favicon: "Show incoming message notifications on favicon"
|
dynamic_favicon: "Show incoming message notifications on favicon"
|
||||||
external_links_in_new_tab: "Open all external links in a new tab"
|
external_links_in_new_tab: "Open all external links in a new tab"
|
||||||
enable_quoting: "Enable quote reply for highlighted text"
|
enable_quoting: "Enable quote reply for highlighted text"
|
||||||
|
change: "change"
|
||||||
moderator: "{{user}} is a moderator"
|
moderator: "{{user}} is a moderator"
|
||||||
admin: "{{user}} is an admin"
|
admin: "{{user}} is an admin"
|
||||||
|
|
||||||
change_password:
|
change_password:
|
||||||
action: "change"
|
|
||||||
success: "(email sent)"
|
success: "(email sent)"
|
||||||
in_progress: "(sending email)"
|
in_progress: "(sending email)"
|
||||||
error: "(error)"
|
error: "(error)"
|
||||||
|
|
||||||
|
change_about:
|
||||||
|
title: "Change About Me"
|
||||||
|
|
||||||
change_username:
|
change_username:
|
||||||
action: "change"
|
|
||||||
title: "Change Username"
|
title: "Change Username"
|
||||||
confirm: "There could be consequences to changing your username. Are you absolutely sure you want to?"
|
confirm: "There could be consequences to changing your username. Are you absolutely sure you want to?"
|
||||||
taken: "Sorry, that username is taken."
|
taken: "Sorry, that username is taken."
|
||||||
error: "There was an error changing your username."
|
error: "There was an error changing your username."
|
||||||
invalid: "That username is invalid. It must only include numbers and letters"
|
invalid: "That username is invalid. It must only include numbers and letters"
|
||||||
|
|
||||||
change_email:
|
change_email:
|
||||||
action: 'change'
|
|
||||||
title: "Change Email"
|
title: "Change Email"
|
||||||
taken: "Sorry, that email is not available."
|
taken: "Sorry, that email is not available."
|
||||||
error: "There was an error changing your email. Perhaps that address is already in use?"
|
error: "There was an error changing your email. Perhaps that address is already in use?"
|
||||||
|
|
|
@ -123,7 +123,7 @@ cs:
|
||||||
cant_send_pm: "Bohužel, tomuto uživateli nemůžete poslat soukromou zprávu."
|
cant_send_pm: "Bohužel, tomuto uživateli nemůžete poslat soukromou zprávu."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>Pole 'o mně' je v tuto chvíli prázdné, <a href='/users/%{username_lower}/preferences'>nechcete si ho vyplnit?</a></div>"
|
no_info_me: "<div class='missing-profile'>Pole 'o mně' je v tuto chvíli prázdné, <a href='/users/%{username_lower}/preferences/about-me'>nechcete si ho vyplnit?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} o sobě zatím žádné informace nevyplnil</div>"
|
no_info_other: "<div class='missing-profile'>%{name} o sobě zatím žádné informace nevyplnil</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -76,7 +76,7 @@ da:
|
||||||
cant_send_pm: "Beklager, du kan ikke sende en privat besked til den bruger."
|
cant_send_pm: "Beklager, du kan ikke sende en privat besked til den bruger."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>“Om mig” feltet på din profil er pt. tomt, <a href='/users/%{username_lower}/preferences'>ønsker du at udfylde det</a>?</div>"
|
no_info_me: "<div class='missing-profile'>“Om mig” feltet på din profil er pt. tomt, <a href='/users/%{username_lower}/preferences/about-me'>ønsker du at udfylde det</a>?</div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} har ikke skrevet noget i “Om mig”-feltet endnu</div>"
|
no_info_other: "<div class='missing-profile'>%{name} har ikke skrevet noget i “Om mig”-feltet endnu</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -111,7 +111,7 @@ de:
|
||||||
cant_send_pm: "Entschuldige, du kannst keine private Nachricht an diesen Nutzer schicken."
|
cant_send_pm: "Entschuldige, du kannst keine private Nachricht an diesen Nutzer schicken."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>Das 'Über mich'-Feld deines Profils ist aktuell leer, <a href='/users/%{username_lower}/preferences'>möchtest Du es ausfüllen?</a></div>"
|
no_info_me: "<div class='missing-profile'>Das 'Über mich'-Feld deines Profils ist aktuell leer, <a href='/users/%{username_lower}/preferences/about-me'>möchtest Du es ausfüllen?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} hat noch nichts in das 'Über mich'-Feld des Nutzerprofils eingetragen</div>"
|
no_info_other: "<div class='missing-profile'>%{name} hat noch nichts in das 'Über mich'-Feld des Nutzerprofils eingetragen</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -122,7 +122,7 @@ en:
|
||||||
cant_send_pm: "Sorry, you cannot send a private message to that user."
|
cant_send_pm: "Sorry, you cannot send a private message to that user."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>the About Me field of your profile is currently blank, <a href='/users/%{username_lower}/preferences'>would you like to fill it out?</a></div>"
|
no_info_me: "<div class='missing-profile'>the About Me field of your profile is currently blank, <a href='/users/%{username_lower}/preferences/about-me'>would you like to fill it out?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} hasn't entered anything in the About Me field of their profile yet</div>"
|
no_info_other: "<div class='missing-profile'>%{name} hasn't entered anything in the About Me field of their profile yet</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -76,7 +76,7 @@ es:
|
||||||
cant_send_pm: "Lo sentimos, no puedes enviar un mensaje privado a este usuario."
|
cant_send_pm: "Lo sentimos, no puedes enviar un mensaje privado a este usuario."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>El campo 'Sobre mí' de tu perfil está actualmente en blanco, <a href='/users/%{username_lower}/preferences'>¿Te gustaría rellenarlo?</a></div>"
|
no_info_me: "<div class='missing-profile'>El campo 'Sobre mí' de tu perfil está actualmente en blanco, <a href='/users/%{username_lower}/preferences/about-me'>¿Te gustaría rellenarlo?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} no ha introducido nada aún en el campo 'Sobre mí' de su perfil</div>"
|
no_info_other: "<div class='missing-profile'>%{name} no ha introducido nada aún en el campo 'Sobre mí' de su perfil</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -122,7 +122,7 @@ fr:
|
||||||
cant_send_pm: "Désolé, vous ne pouvez pas envoyer de message privé à cet utilisateur."
|
cant_send_pm: "Désolé, vous ne pouvez pas envoyer de message privé à cet utilisateur."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>le champ À propos de moi de votre profil est actuellement vide, <a href='/users/%{username_lower}/preferences'>souhaitez-vous le remplir ?</a></div>"
|
no_info_me: "<div class='missing-profile'>le champ À propos de moi de votre profil est actuellement vide, <a href='/users/%{username_lower}/preferences/about-me'>souhaitez-vous le remplir ?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} n'a rien renseigné dans le champ À propos de moi de son profil</div>"
|
no_info_other: "<div class='missing-profile'>%{name} n'a rien renseigné dans le champ À propos de moi de son profil</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -72,7 +72,7 @@ id:
|
||||||
cant_send_pm: "Sorry, you cannot send a private message to that user."
|
cant_send_pm: "Sorry, you cannot send a private message to that user."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>the About Me field of your profile is currently blank, <a href='/users/%{username_lower}/preferences'>would you like to fill it out?</a></div>"
|
no_info_me: "<div class='missing-profile'>the About Me field of your profile is currently blank, <a href='/users/%{username_lower}/preferences/about-me'>would you like to fill it out?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} hasn't entered anything in the About Me field of their profile yet</div>"
|
no_info_other: "<div class='missing-profile'>%{name} hasn't entered anything in the About Me field of their profile yet</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -107,7 +107,7 @@ it:
|
||||||
cant_send_pm: "Spriacenti, non puoi mandare un messaggio privato a quell'utente."
|
cant_send_pm: "Spriacenti, non puoi mandare un messaggio privato a quell'utente."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>il campo About Me del tuo profilo è vuoto, <a href='/users/%{username_lower}/preferences'>vuoi compilarlo?</a></div>"
|
no_info_me: "<div class='missing-profile'>il campo About Me del tuo profilo è vuoto, <a href='/users/%{username_lower}/preferences/about-me'>vuoi compilarlo?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} non ha ancora compilato il campo About Me del suo profilo.</div>"
|
no_info_other: "<div class='missing-profile'>%{name} non ha ancora compilato il campo About Me del suo profilo.</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -101,7 +101,7 @@ ko:
|
||||||
cant_send_pm: "Sorry, you cannot send a private message to that user."
|
cant_send_pm: "Sorry, you cannot send a private message to that user."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>the About Me field of your profile is currently blank, <a href='/users/%{username_lower}/preferences'>would you like to fill it out?</a></div>"
|
no_info_me: "<div class='missing-profile'>the About Me field of your profile is currently blank, <a href='/users/%{username_lower}/preferences/about-me'>would you like to fill it out?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} hasn't entered anything in the About Me field of their profile yet</div>"
|
no_info_other: "<div class='missing-profile'>%{name} hasn't entered anything in the About Me field of their profile yet</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -121,7 +121,7 @@ nl:
|
||||||
cant_send_pm: "Sorry, je kan geen privébericht sturen naar deze persoon."
|
cant_send_pm: "Sorry, je kan geen privébericht sturen naar deze persoon."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>Het Over Mij-profielveld is nog leeg, <a href='/users/%{username_lower}/preferences'>zou je deze willen invullen?</a></div>"
|
no_info_me: "<div class='missing-profile'>Het Over Mij-profielveld is nog leeg, <a href='/users/%{username_lower}/preferences/about-me'>zou je deze willen invullen?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} heeft nog niks in zijn of haar Over Mij-profielveld ingevuld</div>"
|
no_info_other: "<div class='missing-profile'>%{name} heeft nog niks in zijn of haar Over Mij-profielveld ingevuld</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -63,7 +63,7 @@ pt:
|
||||||
cant_send_pm: "Desculpa, não podes enviar uma mensagem privada para esse utilizador."
|
cant_send_pm: "Desculpa, não podes enviar uma mensagem privada para esse utilizador."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>o campo Sobre mim do teu perfil está em branco, <a href='/users/%{username_lower}/preferences'>gostavas de o completar?</a></div>"
|
no_info_me: "<div class='missing-profile'>o campo Sobre mim do teu perfil está em branco, <a href='/users/%{username_lower}/preferences/about-me'>gostavas de o completar?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} ainda não colocou nada no campo Sobre Mim</div>"
|
no_info_other: "<div class='missing-profile'>%{name} ainda não colocou nada no campo Sobre Mim</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -104,7 +104,7 @@ pt_BR:
|
||||||
archetype:
|
archetype:
|
||||||
cant_send_pm: "Desculpe, não podes enviar uma mensagem particular para esse utilizador."
|
cant_send_pm: "Desculpe, não podes enviar uma mensagem particular para esse utilizador."
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>o campo Sobre mim do seu perfil está em branco, <a href='/users/%{username_lower}/preferences'>quer completar?</a></div>"
|
no_info_me: "<div class='missing-profile'>o campo Sobre mim do seu perfil está em branco, <a href='/users/%{username_lower}/preferences/about-me'>quer completar?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} ainda não colocou nada no campo Sobre Mim</div>"
|
no_info_other: "<div class='missing-profile'>%{name} ainda não colocou nada no campo Sobre Mim</div>"
|
||||||
category:
|
category:
|
||||||
topic_prefix: "Definição da categoria %{category}"
|
topic_prefix: "Definição da categoria %{category}"
|
||||||
|
|
|
@ -126,7 +126,7 @@ ru:
|
||||||
cant_send_pm: Извините, вы не можете посылать личные сообщения данному пользователю.
|
cant_send_pm: Извините, вы не можете посылать личные сообщения данному пользователю.
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: |
|
no_info_me: |
|
||||||
<div class='missing-profile'>Вы оставили пустым поле «Обо мне" <a href='/users/%{username_lower}/preferences'> хотите заполнить его сейчас? </a></div>
|
<div class='missing-profile'>Вы оставили пустым поле «Обо мне" <a href='/users/%{username_lower}/preferences/about-me'> хотите заполнить его сейчас? </a></div>
|
||||||
no_info_other: "<div class='missing-profile'>%{name} еще не заполнил поле «Обо мне» в своём профайле. </div>"
|
no_info_other: "<div class='missing-profile'>%{name} еще не заполнил поле «Обо мне» в своём профайле. </div>"
|
||||||
category:
|
category:
|
||||||
topic_prefix: 'Описание категории %{category}'
|
topic_prefix: 'Описание категории %{category}'
|
||||||
|
|
|
@ -90,7 +90,7 @@ sv:
|
||||||
cant_send_pm: "Tyvärr, du kan inte skicka ett privat meddelande till den användaren."
|
cant_send_pm: "Tyvärr, du kan inte skicka ett privat meddelande till den användaren."
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>Din profils Om Mig-fält är för närvarande tomt, <a href='/users/%{username_lower}/preferences'>skulle du vilja fylla i det?</a></div>"
|
no_info_me: "<div class='missing-profile'>Din profils Om Mig-fält är för närvarande tomt, <a href='/users/%{username_lower}/preferences/about-me'>skulle du vilja fylla i det?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} har inte skrivit någonting i dess profils Om Mig-fält ännu</div>"
|
no_info_other: "<div class='missing-profile'>%{name} har inte skrivit någonting i dess profils Om Mig-fält ännu</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -111,7 +111,7 @@ zh_CN:
|
||||||
cant_send_pm: "抱歉,你不能向该用户发送私信。"
|
cant_send_pm: "抱歉,你不能向该用户发送私信。"
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>你的介绍信息中,“关于我”部分目前还是空白,<a href='/users/%{username_lower}/preferences'>介绍一下你自己,好不好?</a></div>"
|
no_info_me: "<div class='missing-profile'>你的介绍信息中,“关于我”部分目前还是空白,<a href='/users/%{username_lower}/preferences/about-me'>介绍一下你自己,好不好?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} 尚未在他/她的介绍中的“关于我”部分填写任何信息</div>"
|
no_info_other: "<div class='missing-profile'>%{name} 尚未在他/她的介绍中的“关于我”部分填写任何信息</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -107,7 +107,7 @@ zh_TW:
|
||||||
cant_send_pm: "抱歉,你不能向該用戶發送私信。"
|
cant_send_pm: "抱歉,你不能向該用戶發送私信。"
|
||||||
|
|
||||||
user_profile:
|
user_profile:
|
||||||
no_info_me: "<div class='missing-profile'>你的介紹信息中,“關于我”部分目前還是空白,<a href='/users/%{username_lower}/preferences'>介紹一下你自己,好不好?</a></div>"
|
no_info_me: "<div class='missing-profile'>你的介紹信息中,“關于我”部分目前還是空白,<a href='/users/%{username_lower}/preferences/about-me'>介紹一下你自己,好不好?</a></div>"
|
||||||
no_info_other: "<div class='missing-profile'>%{name} 尚未在他/她的介紹中的“關于我”部分填寫任何信息</div>"
|
no_info_other: "<div class='missing-profile'>%{name} 尚未在他/她的介紹中的“關于我”部分填寫任何信息</div>"
|
||||||
|
|
||||||
category:
|
category:
|
||||||
|
|
|
@ -125,6 +125,7 @@ Discourse::Application.routes.draw do
|
||||||
get 'users/:username/preferences' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}, as: :email_preferences
|
get 'users/:username/preferences' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}, as: :email_preferences
|
||||||
get 'users/:username/preferences/email' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}
|
get 'users/:username/preferences/email' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}
|
||||||
put 'users/:username/preferences/email' => 'users#change_email', constraints: {username: USERNAME_ROUTE_FORMAT}
|
put 'users/:username/preferences/email' => 'users#change_email', constraints: {username: USERNAME_ROUTE_FORMAT}
|
||||||
|
get 'users/:username/preferences/about-me' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}
|
||||||
get 'users/:username/preferences/username' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}
|
get 'users/:username/preferences/username' => 'users#preferences', constraints: {username: USERNAME_ROUTE_FORMAT}
|
||||||
put 'users/:username/preferences/username' => 'users#username', constraints: {username: USERNAME_ROUTE_FORMAT}
|
put 'users/:username/preferences/username' => 'users#username', constraints: {username: USERNAME_ROUTE_FORMAT}
|
||||||
get 'users/:username/avatar(/:size)' => 'users#avatar', constraints: {username: USERNAME_ROUTE_FORMAT}
|
get 'users/:username/avatar(/:size)' => 'users#avatar', constraints: {username: USERNAME_ROUTE_FORMAT}
|
||||||
|
|
Loading…
Add table
Reference in a new issue