Significant updates to editor.js.
This commit is contained in:
		
							parent
							
								
									89195d3449
								
							
						
					
					
						commit
						84a5e2b4e1
					
				
					 4 changed files with 172 additions and 192 deletions
				
			
		|  | @ -3,30 +3,40 @@ const editor = {}; | ||||||
| editor.PARAGRAPH_TYPES = new Set(["P", "PRE"]); | editor.PARAGRAPH_TYPES = new Set(["P", "PRE"]); | ||||||
| 
 | 
 | ||||||
| editor.Editor = | editor.Editor = | ||||||
| function Editor(elements, on_open, on_save, on_cancel) | function Editor(element_argss, on_open, on_save, on_cancel) | ||||||
| { | { | ||||||
|     /* |     /* | ||||||
|     This class wraps around display elements like headers and paragraphs, and |     This class wraps around display elements like spans, headers, and | ||||||
|     creates edit elements like inputs and textareas to edit them with. |     paragraphs, and creates edit elements like inputs and textareas to edit | ||||||
|  |     them with. | ||||||
| 
 | 
 | ||||||
|     You may add the following data- attributes to your display elements to |     element_argss should be a list of dicts. Each dict is required to have "id" | ||||||
|     affect their corresponding edit elements: |     which is unique amongst its peers, and "element" which is the display | ||||||
|     data-editor-empty-text: If the display element contains this text, then |     element. Additionally, you may add the following properties to change the | ||||||
|         the edit element will be set to "" when opened. |     element's behavior: | ||||||
|  | 
 | ||||||
|  |     "autofocus": true | ||||||
|  |         When the user opens the editor, this element will get .focus(). | ||||||
|  |         Only one element should have this. | ||||||
|  | 
 | ||||||
|  |     "empty_text": string | ||||||
|  |         If the display element contains this text, then the edit element will | ||||||
|  |         be set to "" when opened. | ||||||
|         If the edit element contains "", then the display element will |         If the edit element contains "", then the display element will | ||||||
|         contain this text when saved. |         contain this text when saved. | ||||||
|     data-editor-id: The string used as the key into display_element_map and |  | ||||||
|         edit_element_map. |  | ||||||
|     data-editor-placeholder: The placeholder attribute of the edit element. |  | ||||||
| 
 | 
 | ||||||
|     Your on_open, on_save and on_cancel hooks will be called with: |     "hide_when_empty": true | ||||||
|         1. This editor object. |         If the element does not have any text, it will get the "hidden" css | ||||||
|         2. The edit elements as either: |         class after saving / closing. | ||||||
|             If ALL of the display elements have a data-editor-id, | 
 | ||||||
|             then a dictionary of {data-editor-id: edit_element, ...}. |     "placeholder": string | ||||||
|             Otherwise, an array of [edit_element, ...] in the order they were |         The placeholder attribute of the edit element. | ||||||
|             given to the constructor. | 
 | ||||||
|         3. The display elements as either the map or the array, similarly. |     The editor object will contain a dict called elements that maps IDs to the | ||||||
|  |     display element, edit elements, and your other options. | ||||||
|  | 
 | ||||||
|  |     Your on_open, on_save and on_cancel hooks will be called with the editor | ||||||
|  |     object as the only argument. | ||||||
| 
 | 
 | ||||||
|     When your callbacks are used, the default `open`, `save`, `cancel` |     When your callbacks are used, the default `open`, `save`, `cancel` | ||||||
|     methods are not called automatically. You should call them from within |     methods are not called automatically. You should call them from within | ||||||
|  | @ -41,10 +51,13 @@ function Editor(elements, on_open, on_save, on_cancel) | ||||||
| 
 | 
 | ||||||
|     this.close = function() |     this.close = function() | ||||||
|     { |     { | ||||||
|         for (let index = 0; index < this.display_elements.length; index += 1) |         for (const element of Object.values(this.elements)) | ||||||
|         { |         { | ||||||
|             this.display_elements[index].classList.remove("hidden"); |             element.edit.classList.add("hidden"); | ||||||
|             this.edit_elements[index].classList.add("hidden"); |             if (! (element.display.innerText === "" && element.hide_when_empty)) | ||||||
|  |             { | ||||||
|  |                 element.display.classList.remove("hidden"); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         this.hide_spinner(); |         this.hide_spinner(); | ||||||
|         this.hide_error(); |         this.hide_error(); | ||||||
|  | @ -65,22 +78,23 @@ function Editor(elements, on_open, on_save, on_cancel) | ||||||
| 
 | 
 | ||||||
|     this.open = function() |     this.open = function() | ||||||
|     { |     { | ||||||
|         for (let index = 0; index < this.display_elements.length; index += 1) |         for (const element of Object.values(this.elements)) | ||||||
|         { |         { | ||||||
|             const display_element = this.display_elements[index]; |             element.display.classList.add("hidden"); | ||||||
|             const edit_element = this.edit_elements[index]; |             element.edit.classList.remove("hidden"); | ||||||
| 
 | 
 | ||||||
|             display_element.classList.add("hidden"); |             if (element.autofocus) | ||||||
|             edit_element.classList.remove("hidden"); |  | ||||||
| 
 |  | ||||||
|             const empty_text = display_element.dataset.editorEmptyText; |  | ||||||
|             if (empty_text !== undefined && display_element.innerText == empty_text) |  | ||||||
|             { |             { | ||||||
|                 edit_element.value = ""; |                 element.edit.focus(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (element.empty_text !== undefined && element.display.innerText == element.empty_text) | ||||||
|  |             { | ||||||
|  |                 element.edit.value = ""; | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 edit_element.value = display_element.innerText; |                 element.edit.value = element.display.innerText; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         this.open_button.classList.add("hidden"); |         this.open_button.classList.add("hidden"); | ||||||
|  | @ -90,18 +104,15 @@ function Editor(elements, on_open, on_save, on_cancel) | ||||||
| 
 | 
 | ||||||
|     this.save = function() |     this.save = function() | ||||||
|     { |     { | ||||||
|         for (let index = 0; index < this.display_elements.length; index += 1) |         for (const element of Object.values(this.elements)) | ||||||
|         { |         { | ||||||
|             const display_element = this.display_elements[index]; |             if (element.empty_text !== undefined && element.edit.value == "") | ||||||
|             const edit_element = this.edit_elements[index]; |  | ||||||
| 
 |  | ||||||
|             if (display_element.dataset.editorEmptyText !== undefined && edit_element.value == "") |  | ||||||
|             { |             { | ||||||
|                 display_element.innerText = display_element.dataset.editorEmptyText; |                 element.display.innerText = element.empty_text; | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 display_element.innerText = edit_element.value; |                 element.display.innerText = element.edit.value; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -121,64 +132,54 @@ function Editor(elements, on_open, on_save, on_cancel) | ||||||
|         this.spinner.show(delay); |         this.spinner.show(delay); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     this.display_elements = []; |     this.elements = {}; | ||||||
|     this.edit_elements = []; |  | ||||||
| 
 |  | ||||||
|     this.can_use_element_map = true; |  | ||||||
|     this.display_element_map = {}; |  | ||||||
|     this.edit_element_map = {}; |  | ||||||
| 
 | 
 | ||||||
|  |     // End-user can put anything they want in here.
 | ||||||
|     this.misc_data = {}; |     this.misc_data = {}; | ||||||
| 
 | 
 | ||||||
|     for (const display_element of elements) |     // Keep track of last edit element so we can put the toolbox after it.
 | ||||||
|  |     let last_element; | ||||||
|  | 
 | ||||||
|  |     for (const element_args of element_argss) | ||||||
|     { |     { | ||||||
|         let edit_element; |         const element = {}; | ||||||
|         if (editor.PARAGRAPH_TYPES.has(display_element.tagName)) |         element.id = element_args.id; | ||||||
|  |         this.elements[element.id] = element; | ||||||
|  | 
 | ||||||
|  |         element.display = element_args.element; | ||||||
|  |         element.empty_text = element_args.empty_text; | ||||||
|  |         element.hide_when_empty = element_args.hide_when_empty; | ||||||
|  |         element.autofocus = element_args.autofocus; | ||||||
|  | 
 | ||||||
|  |         if (editor.PARAGRAPH_TYPES.has(element.display.tagName)) | ||||||
|         { |         { | ||||||
|             edit_element = document.createElement("textarea"); |             element.edit = document.createElement("textarea"); | ||||||
|             edit_element.rows = 6; |             element.edit.rows = 6; | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             edit_element = document.createElement("input"); |             element.edit = document.createElement("input"); | ||||||
|             edit_element.type = "text"; |             element.edit.type = "text"; | ||||||
|         } |  | ||||||
|         edit_element.classList.add("editor_input"); |  | ||||||
|         edit_element.classList.add("hidden"); |  | ||||||
| 
 |  | ||||||
|         if (display_element.dataset.editorPlaceholder !== undefined) |  | ||||||
|         { |  | ||||||
|             edit_element.placeholder = display_element.dataset.editorPlaceholder; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (this.can_use_element_map) |         element.edit.classList.add("editor_input"); | ||||||
|  |         element.edit.classList.add("hidden"); | ||||||
|  | 
 | ||||||
|  |         if (element_args.placeholder !== undefined) | ||||||
|         { |         { | ||||||
|             if (display_element.dataset.editorId !== undefined) |             element.edit.placeholder = element_args.placeholder; | ||||||
|             { |  | ||||||
|                 this.display_element_map[display_element.dataset.editorId] = display_element; |  | ||||||
|                 this.edit_element_map[display_element.dataset.editorId] = edit_element; |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 this.can_use_element_map = false; |  | ||||||
|                 this.edit_element_map = null; |  | ||||||
|                 this.display_element_map = null; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         display_element.parentElement.insertBefore(edit_element, display_element.nextSibling); |         element.display.parentElement.insertBefore(element.edit, element.display.nextSibling); | ||||||
| 
 |         last_element = element.edit; | ||||||
|         this.display_elements.push(display_element); |  | ||||||
|         this.edit_elements.push(edit_element); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     this.binder = function(func, fallback) |     this.binder = function(func, fallback) | ||||||
|     { |     { | ||||||
|         /* |         /* | ||||||
|         Given a function that takes an Editor as its first argument, and the |         Given a function that takes an Editor as its first argument, | ||||||
|         element arrays/maps as the second and third, return a new function |         return a new function which requires no arguments and calls the | ||||||
|         which requires no arguments and calls the given function with the |         function with this editor. | ||||||
|         correct data. |  | ||||||
| 
 | 
 | ||||||
|         This is done so that the new function can be used in an event handler. |         This is done so that the new function can be used in an event handler. | ||||||
|         */ |         */ | ||||||
|  | @ -187,25 +188,19 @@ function Editor(elements, on_open, on_save, on_cancel) | ||||||
|             return fallback.bind(this); |             return fallback.bind(this); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (this.can_use_element_map) |         const bindable = () => func(this); | ||||||
|         { |  | ||||||
|             const bindable = () => func(this, this.edit_element_map, this.display_element_map); |  | ||||||
|         return bindable.bind(this); |         return bindable.bind(this); | ||||||
|     } |     } | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             const bindable = () => func(this, this.edit_elements, this.display_elements); |  | ||||||
|             return bindable.bind(this); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|  |     // In order to prevent page jumping on load, you can add an element with
 | ||||||
|  |     // class editor_toolbox_placeholder to the page and size it so it matches
 | ||||||
|  |     // the buttons that are going to get placed there.
 | ||||||
|     const placeholders = document.getElementsByClassName("editor_toolbox_placeholder"); |     const placeholders = document.getElementsByClassName("editor_toolbox_placeholder"); | ||||||
|     for (const placeholder of placeholders) |     for (const placeholder of placeholders) | ||||||
|     { |     { | ||||||
|         placeholder.parentElement.removeChild(placeholder); |         placeholder.parentElement.removeChild(placeholder); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const last_element = this.edit_elements[this.edit_elements.length - 1]; |  | ||||||
|     const toolbox = document.createElement("div"); |     const toolbox = document.createElement("div"); | ||||||
|     toolbox.classList.add("editor_toolbox"); |     toolbox.classList.add("editor_toolbox"); | ||||||
|     last_element.parentElement.insertBefore(toolbox, last_element.nextSibling); |     last_element.parentElement.insertBefore(toolbox, last_element.nextSibling); | ||||||
|  | @ -249,15 +244,9 @@ function Editor(elements, on_open, on_save, on_cancel) | ||||||
|     this.spinner = new spinner.Spinner(spinner_element); |     this.spinner = new spinner.Spinner(spinner_element); | ||||||
|     toolbox.appendChild(spinner_element); |     toolbox.appendChild(spinner_element); | ||||||
| 
 | 
 | ||||||
|     for (const edit_element of this.edit_elements) |     for (const element of Object.values(this.elements)) | ||||||
|     { |     { | ||||||
|         if (edit_element.tagName == "TEXTAREA") |         const ctrl_enter = element.edit.tagName == "TEXTAREA"; | ||||||
|         { |         common.bind_box_to_button(element.edit, this.save_button, ctrl_enter); | ||||||
|             common.bind_box_to_button(edit_element, this.save_button, true); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             common.bind_box_to_button(edit_element, this.save_button, false); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -207,19 +207,10 @@ const ALBUM_ID = undefined; | ||||||
|     <div id="left"> |     <div id="left"> | ||||||
|         <div id="hierarchy_self" class="panel"> |         <div id="hierarchy_self" class="panel"> | ||||||
|             <div id="album_metadata"> |             <div id="album_metadata"> | ||||||
|                 <h2><span |                 <h2><span id="title_text">{{-album.display_name-}}</span></h2> | ||||||
|                 id="title_text" |  | ||||||
|                 data-editor-id="title" |  | ||||||
|                 data-editor-empty-text="{{album.id}}" |  | ||||||
|                 data-editor-placeholder="title" |  | ||||||
|                 > |  | ||||||
|                     {{-album.display_name-}} |  | ||||||
|                 </span></h2> |  | ||||||
| 
 | 
 | ||||||
|                 <pre |                 <pre | ||||||
|                 id="description_text" |                 id="description_text" | ||||||
|                 data-editor-id="description" |  | ||||||
|                 data-editor-placeholder="description" |  | ||||||
|                 {% if not album.description %}class="hidden"{% endif %} |                 {% if not album.description %}class="hidden"{% endif %} | ||||||
|                 > |                 > | ||||||
|                     {{-album.description-}} |                     {{-album.description-}} | ||||||
|  | @ -319,13 +310,9 @@ function unpaste_photo_clipboard() | ||||||
|     api.albums.remove_photos(ALBUM_ID, photo_ids, common.refresh_or_alert); |     api.albums.remove_photos(ALBUM_ID, photo_ids, common.refresh_or_alert); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function rename_ed_on_open(ed, edit_element_map, display_element_map) | rename_ed_on_open = undefined; | ||||||
| { |  | ||||||
|     ed.open(); |  | ||||||
|     edit_element_map["title"].focus(); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| function rename_ed_on_save(ed, edit_element_map, display_element_map) | function rename_ed_on_save(ed) | ||||||
| { | { | ||||||
|     function callback(response) |     function callback(response) | ||||||
|     { |     { | ||||||
|  | @ -342,41 +329,41 @@ function rename_ed_on_save(ed, edit_element_map, display_element_map) | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // The data coming back from the server will have been normalized. | ||||||
|  |         ed.elements["title"].edit.value = response.data.title; | ||||||
|  | 
 | ||||||
|         ed.save(); |         ed.save(); | ||||||
| 
 | 
 | ||||||
|         const title_display = display_element_map["title"]; |         document.title = ed.elements["title"].display.innerText + " | Albums"; | ||||||
|         const description_display = display_element_map["description"]; |  | ||||||
| 
 |  | ||||||
|         document.title = title_display.innerText + " | Albums"; |  | ||||||
| 
 |  | ||||||
|         if (description_display.innerText == "") |  | ||||||
|         { |  | ||||||
|             description_display.classList.add("hidden"); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     edit_element_map["title"].value = edit_element_map["title"].value.trim(); |     const title = ed.elements["title"].edit.value; | ||||||
|     const title = edit_element_map["title"].value; |     const description = ed.elements["description"].edit.value; | ||||||
|     const description = edit_element_map["description"].value; |  | ||||||
| 
 | 
 | ||||||
|     ed.show_spinner(); |     ed.show_spinner(); | ||||||
|     api.albums.edit(ALBUM_ID, title, description, callback); |     api.albums.edit(ALBUM_ID, title, description, callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function rename_ed_on_cancel(ed, edit_element_map, display_element_map) | const rename_ed_elements = [ | ||||||
| { |  | ||||||
|     ed.cancel(); |  | ||||||
|     if (display_element_map["description"].innerText == "") |  | ||||||
|     { |     { | ||||||
|         display_element_map["description"].classList.add("hidden"); |         "id": "title", | ||||||
|     } |         "element": document.getElementById("title_text"), | ||||||
| } |         "placeholder": "title", | ||||||
|  |         "empty_text": ALBUM_ID, | ||||||
|  |         "autofocus": true, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "id": "description", | ||||||
|  |         "element": document.getElementById("description_text"), | ||||||
|  |         "placeholder": "description", | ||||||
|  |         "hide_when_empty": true, | ||||||
|  |     }, | ||||||
|  | ]; | ||||||
| 
 | 
 | ||||||
| const rename_ed = new editor.Editor( | const rename_ed = new editor.Editor( | ||||||
|     [document.getElementById("title_text"), document.getElementById("description_text")], |     rename_ed_elements, | ||||||
|     rename_ed_on_open, |     rename_ed_on_open, | ||||||
|     rename_ed_on_save, |     rename_ed_on_save, | ||||||
|     rename_ed_on_cancel |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| function add_album_datalist_on_load(datalist) | function add_album_datalist_on_load(datalist) | ||||||
|  |  | ||||||
|  | @ -63,9 +63,6 @@ | ||||||
|                 <a |                 <a | ||||||
|                 href="{{bookmark.url}}" |                 href="{{bookmark.url}}" | ||||||
|                 class="bookmark_title" |                 class="bookmark_title" | ||||||
|                 data-editor-id="title" |  | ||||||
|                 data-editor-placeholder="title (optional)" |  | ||||||
|                 data-editor-empty-text="{{bookmark.id}}" |  | ||||||
|                 > |                 > | ||||||
|                     {{-bookmark.display_name-}} |                     {{-bookmark.display_name-}} | ||||||
|                 </a> |                 </a> | ||||||
|  | @ -73,8 +70,6 @@ | ||||||
|                 <a |                 <a | ||||||
|                 href="{{bookmark.url}}" |                 href="{{bookmark.url}}" | ||||||
|                 class="bookmark_url" |                 class="bookmark_url" | ||||||
|                 data-editor-id="url" |  | ||||||
|                 data-editor-placeholder="url" |  | ||||||
|                 > |                 > | ||||||
|                     {{-bookmark.url-}} |                     {{-bookmark.url-}} | ||||||
|                 </a> |                 </a> | ||||||
|  | @ -117,51 +112,65 @@ function delete_bookmark_form(event) | ||||||
|     api.bookmarks.delete(id, common.refresh_or_alert); |     api.bookmarks.delete(id, common.refresh_or_alert); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function on_open(ed, edit_element_map) | ed_on_open = undefined; | ||||||
| { |  | ||||||
|     ed.open(); |  | ||||||
|     edit_element_map["title"].focus(); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| function on_save(ed, edit_element_map, display_element_map) | function ed_on_save(ed) | ||||||
| { | { | ||||||
|     function callback(response) |     function callback(response) | ||||||
|     { |     { | ||||||
|  |         ed.hide_spinner(); | ||||||
|  | 
 | ||||||
|         if (response.meta.status != 200) |         if (response.meta.status != 200) | ||||||
|         { |         { | ||||||
|             ed.show_error("Status: " + response.meta.status); |             ed.show_error("Status: " + response.meta.status); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // The data coming back from the server will have been normalized. | ||||||
|  |         ed.elements["title"].edit.value = response.data.title; | ||||||
|  | 
 | ||||||
|         ed.save(); |         ed.save(); | ||||||
|         display_element_map["title"].href = response.data.url; | 
 | ||||||
|         display_element_map["url"].href = response.data.url; |         ed.elements["title"].display.href = response.data.url; | ||||||
|  |         ed.elements["url"].display.href = response.data.url; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     edit_element_map["url"].value = edit_element_map["url"].value.trim(); |     ed.elements["url"].edit.value = ed.elements["url"].edit.value.trim(); | ||||||
|     if (!edit_element_map["url"].value) |     if (! ed.elements["url"].edit.value) | ||||||
|     { |     { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const bookmark_id = ed.misc_data["bookmark_id"]; |     const bookmark_id = ed.misc_data["bookmark_id"]; | ||||||
|     const title = edit_element_map["title"].value; |     const title = ed.elements["title"].edit.value; | ||||||
|     const url = edit_element_map["url"].value; |     const url = ed.elements["url"].edit.value; | ||||||
| 
 | 
 | ||||||
|     ed.show_spinner(); |     ed.show_spinner(); | ||||||
|     api.bookmarks.edit(bookmark_id, title, url, callback); |     api.bookmarks.edit(bookmark_id, title, url, callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| on_cancel = undefined; | ed_on_cancel = undefined; | ||||||
| 
 | 
 | ||||||
| function create_editors() | function create_editors() | ||||||
| { | { | ||||||
|     const cards = document.getElementsByClassName("bookmark_card"); |     const cards = document.getElementsByClassName("bookmark_card"); | ||||||
|     for (const card of cards) |     for (const card of cards) | ||||||
|     { |     { | ||||||
|         const title_div = card.getElementsByClassName("bookmark_title")[0]; |         const ed_elements = [ | ||||||
|         const url_div = card.getElementsByClassName("bookmark_url")[0]; |             { | ||||||
|         ed = new editor.Editor([title_div, url_div], on_open, on_save, on_cancel); |                 "id": "title", | ||||||
|  |                 "element": card.getElementsByClassName("bookmark_title")[0], | ||||||
|  |                 "placeholder": "title (optional)", | ||||||
|  |                 "empty_text": card.dataset.id, | ||||||
|  |                 "autofocus": true, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "id": "url", | ||||||
|  |                 "element": card.getElementsByClassName("bookmark_url")[0], | ||||||
|  |                 "placeholder": "url", | ||||||
|  |             }, | ||||||
|  |         ]; | ||||||
|  |         ed = new editor.Editor(ed_elements, ed_on_open, ed_on_save, ed_on_cancel); | ||||||
|         ed.misc_data["bookmark_id"] = card.dataset.id; |         ed.misc_data["bookmark_id"] = card.dataset.id; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -99,15 +99,11 @@ h2, h3 | ||||||
|                     specific_tag, |                     specific_tag, | ||||||
|                     link="search", |                     link="search", | ||||||
|                     id="name_text", |                     id="name_text", | ||||||
|                     data_editor_id="name", |  | ||||||
|                     data_editor_placeholder="name", |  | ||||||
|                     )}} |                     )}} | ||||||
|                 </h2> |                 </h2> | ||||||
| 
 | 
 | ||||||
|                 <pre |                 <pre | ||||||
|                 id="description_text" |                 id="description_text" | ||||||
|                 data-editor-id="description" |  | ||||||
|                 data-editor-placeholder="description" |  | ||||||
|                 {% if specific_tag.description == "" %}class="hidden"{% endif -%} |                 {% if specific_tag.description == "" %}class="hidden"{% endif -%} | ||||||
|                 > |                 > | ||||||
|                     {{-specific_tag.description-}} |                     {{-specific_tag.description-}} | ||||||
|  | @ -383,65 +379,64 @@ function tag_action_callback(response) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| {% if specific_tag is not none %} | {% if specific_tag is not none %} | ||||||
| function rename_ed_on_open(ed, edit_element_map) | rename_ed_on_open = undefined; | ||||||
| { |  | ||||||
|     ed.open(); |  | ||||||
|     edit_element_map["name"].focus(); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| function rename_ed_on_save(ed, edit_element_map, display_element_map) | function rename_ed_on_save(ed) | ||||||
| { | { | ||||||
|     function callback(response) |     function callback(response) | ||||||
|     { |     { | ||||||
|         ed.hide_spinner(); |         ed.hide_spinner(); | ||||||
|  | 
 | ||||||
|         if (response.meta.status !== 200) |         if (response.meta.status !== 200) | ||||||
|         { |         { | ||||||
|             alert(JSON.stringify(response)); |             alert(JSON.stringify(response)); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // The data that comes back from the server will have been normalized, | ||||||
|  |         // so we update some local state. | ||||||
|         const new_name = response.data.name; |         const new_name = response.data.name; | ||||||
|         const new_description = response.data.description; |         const new_description = response.data.description; | ||||||
|         document.title = new_name + " | Tags"; | 
 | ||||||
|         SPECIFIC_TAG = new_name; |         SPECIFIC_TAG = new_name; | ||||||
|  |         document.title = new_name + " | Tags"; | ||||||
|         window.history.replaceState(null, null, "/tag/" + new_name); |         window.history.replaceState(null, null, "/tag/" + new_name); | ||||||
|         name_editor.value = new_name; | 
 | ||||||
|         name_display.href = "/search?tag_musts=" + new_name; |         ed.elements["name"].display.href = "/search?tag_musts=" + new_name; | ||||||
|         description_editor.value = new_description; |         ed.elements["name"].edit.value = new_name; | ||||||
|  |         ed.elements["description"].edit.value = new_description; | ||||||
|  | 
 | ||||||
|         ed.save(); |         ed.save(); | ||||||
|         if (new_description === "") |  | ||||||
|         { |  | ||||||
|             description_display.classList.add("hidden"); |  | ||||||
|     } |     } | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const name_display = display_element_map["name"]; |  | ||||||
|     const name_editor = edit_element_map["name"]; |  | ||||||
|     const description_display = display_element_map["description"]; |  | ||||||
|     const description_editor = edit_element_map["description"]; |  | ||||||
| 
 |  | ||||||
|     const tag_name = name_display.innerText; |  | ||||||
|     const new_name = name_editor.value; |  | ||||||
|     const new_description = description_editor.value; |  | ||||||
| 
 | 
 | ||||||
|     ed.show_spinner(); |     ed.show_spinner(); | ||||||
|  | 
 | ||||||
|  |     const tag_name = ed.elements["name"].display.innerText; | ||||||
|  |     const new_name = ed.elements["name"].edit.value; | ||||||
|  |     const new_description = ed.elements["description"].edit.value; | ||||||
|  | 
 | ||||||
|     api.tags.edit(tag_name, new_name, new_description, callback); |     api.tags.edit(tag_name, new_name, new_description, callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function rename_ed_on_cancel(ed, edit_element_map, display_element_map) | const rename_ed_elements = [ | ||||||
| { |  | ||||||
|     ed.cancel(); |  | ||||||
|     if (display_element_map["description"].innerText == "") |  | ||||||
|     { |     { | ||||||
|         display_element_map["description"].classList.add("hidden"); |         "id": "name", | ||||||
|     } |         "element": document.getElementById("name_text"), | ||||||
| } |         "placeholder": "name", | ||||||
|  |         "autofocus": true, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "id": "description", | ||||||
|  |         "element": document.getElementById("description_text"), | ||||||
|  |         "placeholder": "description", | ||||||
|  |         "hide_when_empty": true, | ||||||
|  |     }, | ||||||
|  | ]; | ||||||
| 
 | 
 | ||||||
| const rename_ed = new editor.Editor( | const rename_ed = new editor.Editor( | ||||||
|     [document.getElementById("name_text"), document.getElementById("description_text")], |     rename_ed_elements, | ||||||
|     rename_ed_on_open, |     rename_ed_on_open, | ||||||
|     rename_ed_on_save, |     rename_ed_on_save, | ||||||
|     rename_ed_on_cancel, |  | ||||||
| ); | ); | ||||||
| {% endif %} | {% endif %} | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue