Add UI for editing user's display name.
This commit is contained in:
		
							parent
							
								
									84a5e2b4e1
								
							
						
					
					
						commit
						e303b934f7
					
				
					 3 changed files with 85 additions and 1 deletions
				
			
		|  | @ -35,6 +35,23 @@ def get_user_id_redirect(user_id): | ||||||
|     url = request.url.replace(url_from, url_to) |     url = request.url.replace(url_from, url_to) | ||||||
|     return flask.redirect(url) |     return flask.redirect(url) | ||||||
| 
 | 
 | ||||||
|  | @site.route('/user/<username>/edit', methods=['POST']) | ||||||
|  | def post_user_edit(username): | ||||||
|  |     session = session_manager.get(request) | ||||||
|  |     if not session: | ||||||
|  |         return jsonify.make_json_response({}, status=403) | ||||||
|  |     user = common.P_user(username, response_type='json') | ||||||
|  |     if session.user != user: | ||||||
|  |         return jsonify.make_json_response({}, status=403) | ||||||
|  | 
 | ||||||
|  |     display_name = request.form.get('display_name') | ||||||
|  |     if display_name is not None: | ||||||
|  |         user.set_display_name(display_name) | ||||||
|  | 
 | ||||||
|  |     common.P.commit() | ||||||
|  | 
 | ||||||
|  |     return jsonify.make_json_response(user.jsonify()) | ||||||
|  | 
 | ||||||
| # Login and logout ################################################################################# | # Login and logout ################################################################################# | ||||||
| 
 | 
 | ||||||
| @site.route('/login', methods=['GET']) | @site.route('/login', methods=['GET']) | ||||||
|  |  | ||||||
|  | @ -387,6 +387,15 @@ function callback_go_to_tags(response) | ||||||
| /**************************************************************************************************/ | /**************************************************************************************************/ | ||||||
| api.users = {}; | api.users = {}; | ||||||
| 
 | 
 | ||||||
|  | api.users.edit = | ||||||
|  | function edit(username, display_name, callback) | ||||||
|  | { | ||||||
|  |     const url = `/user/${username}/edit`; | ||||||
|  |     const data = new FormData(); | ||||||
|  |     data.append("display_name", display_name); | ||||||
|  |     common.post(url, data, callback); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| api.users.login = | api.users.login = | ||||||
| function login(username, password, callback) | function login(username, password, callback) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -10,6 +10,8 @@ | ||||||
|     {% if theme %}<link rel="stylesheet" href="/static/css/theme_{{theme}}.css">{% endif %} |     {% if theme %}<link rel="stylesheet" href="/static/css/theme_{{theme}}.css">{% endif %} | ||||||
|     <script src="/static/js/common.js"></script> |     <script src="/static/js/common.js"></script> | ||||||
|     <script src="/static/js/api.js"></script> |     <script src="/static/js/api.js"></script> | ||||||
|  |     <script src="/static/js/editor.js"></script> | ||||||
|  |     <script src="/static/js/spinner.js"></script> | ||||||
| 
 | 
 | ||||||
| <style> | <style> | ||||||
| #content_body | #content_body | ||||||
|  | @ -23,13 +25,69 @@ | ||||||
| <body> | <body> | ||||||
|     {{header.make_header(session=session)}} |     {{header.make_header(session=session)}} | ||||||
|     <div id="content_body"> |     <div id="content_body"> | ||||||
|         <h2>{{user.display_name}}</h2> |         <div class="panel"> | ||||||
|  |         <h2 id="display_name">{{user.display_name}}</h2> | ||||||
|         <p>ID: <a href="/userid/{{user.id}}">{{user.id}}</a></p> |         <p>ID: <a href="/userid/{{user.id}}">{{user.id}}</a></p> | ||||||
|         <p>User since <span title="{{user.created|int|timestamp_to_8601}}">{{user.created|timestamp_to_naturaldate}}.</span></p> |         <p>User since <span title="{{user.created|int|timestamp_to_8601}}">{{user.created|timestamp_to_naturaldate}}.</span></p> | ||||||
|         <p><a href="/search?author={{user.username}}">Photos by {{user.display_name}}</a></p> |         <p><a href="/search?author={{user.username}}">Photos by {{user.display_name}}</a></p> | ||||||
|         </div> |         </div> | ||||||
|  |     </div> | ||||||
| </body> | </body> | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
|  | {% if user.id == session.user.id %} | ||||||
|  | const USERNAME = "{{user.username}}"; | ||||||
|  | 
 | ||||||
|  | profile_ed_on_open = undefined; | ||||||
|  | 
 | ||||||
|  | function profile_ed_on_save(ed) | ||||||
|  | { | ||||||
|  |     function callback(response) | ||||||
|  |     { | ||||||
|  |         ed.hide_spinner(); | ||||||
|  | 
 | ||||||
|  |         if (! response.meta.json_ok) | ||||||
|  |         { | ||||||
|  |             alert(JSON.stringify(response)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if ("error_type" in response.data) | ||||||
|  |         { | ||||||
|  |             ed.show_error(response.data.error_message); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // The data that comes back from the server will have been normalized. | ||||||
|  |         const new_display_name = response.data.display_name; | ||||||
|  |         document.title = new_display_name; | ||||||
|  | 
 | ||||||
|  |         ed.elements["display_name"].edit.value = new_display_name; | ||||||
|  | 
 | ||||||
|  |         ed.save(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ed.show_spinner(); | ||||||
|  |     api.users.edit(USERNAME, ed.elements["display_name"].edit.value, callback); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | profile_ed_on_cancel = undefined; | ||||||
|  | 
 | ||||||
|  | const profile_ed_elements = [ | ||||||
|  |     { | ||||||
|  |         "id": "display_name", | ||||||
|  |         "element": document.getElementById("display_name"), | ||||||
|  |         "placeholder": "Display name", | ||||||
|  |         "empty_text": USERNAME, | ||||||
|  |         "autofocus": true, | ||||||
|  |     }, | ||||||
|  | ]; | ||||||
|  | 
 | ||||||
|  | const profile_ed = new editor.Editor( | ||||||
|  |     profile_ed_elements, | ||||||
|  |     profile_ed_on_open, | ||||||
|  |     profile_ed_on_save, | ||||||
|  |     profile_ed_on_cancel, | ||||||
|  | ); | ||||||
|  | {% endif %} | ||||||
| </script> | </script> | ||||||
| </html> | </html> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue