Add button_with_spinner class.
This commit is contained in:
		
							parent
							
								
									83b7143753
								
							
						
					
					
						commit
						f842c2e49b
					
				
					 1 changed files with 71 additions and 3 deletions
				
			
		|  | @ -154,11 +154,12 @@ function init_button_with_confirm() | ||||||
| 
 | 
 | ||||||
|         data-cancel: Text inside the cancel button. Default is "Cancel". |         data-cancel: Text inside the cancel button. Default is "Cancel". | ||||||
|         data-cancel-class |         data-cancel-class | ||||||
|  | 
 | ||||||
|  |         data-holder-class: CSS class for the new span that holds the menu. | ||||||
|     */ |     */ | ||||||
|     var buttons = Array.from(document.getElementsByClassName("button_with_confirm")); |     var buttons = Array.from(document.getElementsByClassName("button_with_confirm")); | ||||||
|     for (var index = 0; index < buttons.length; index += 1) |     buttons.forEach(function(button) | ||||||
|     { |     { | ||||||
|         var button = buttons[index]; |  | ||||||
|         button.classList.remove("button_with_confirm"); |         button.classList.remove("button_with_confirm"); | ||||||
| 
 | 
 | ||||||
|         var holder = document.createElement("span"); |         var holder = document.createElement("span"); | ||||||
|  | @ -245,7 +246,73 @@ function init_button_with_confirm() | ||||||
|             holder.getElementsByClassName("confirm_holder_stage2")[0].classList.add("hidden"); |             holder.getElementsByClassName("confirm_holder_stage2")[0].classList.add("hidden"); | ||||||
|         } |         } | ||||||
|         delete button.dataset.onclick; |         delete button.dataset.onclick; | ||||||
|     } |     }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var spinner_button_count = 0; | ||||||
|  | common.init_button_with_spinner = | ||||||
|  | function init_button_with_spinner() | ||||||
|  | { | ||||||
|  |     /* | ||||||
|  |     To create a button that has a spinner, and cannot be clicked again while | ||||||
|  |     the action is running, assign it the class "button_with_spinner". | ||||||
|  | 
 | ||||||
|  |     Required: | ||||||
|  |         data-onclick: The string that would normally be the button's onclick. | ||||||
|  | 
 | ||||||
|  |     Optional: | ||||||
|  |         data-spinner-id: If you want to use your own element as the spinner, | ||||||
|  |             give its ID here. Otherwise a new one will be created. | ||||||
|  | 
 | ||||||
|  |         data-holder-class: CSS class for the new span that holds the menu. | ||||||
|  |     */ | ||||||
|  |     var buttons = Array.from(document.getElementsByClassName("button_with_spinner")); | ||||||
|  |     buttons.forEach(function(button) | ||||||
|  |     { | ||||||
|  |         button.classList.remove("button_with_spinner"); | ||||||
|  |         button.innerHTML = button.innerHTML.trim(); | ||||||
|  | 
 | ||||||
|  |         var holder = document.createElement("span"); | ||||||
|  |         holder.classList.add("spinner_holder"); | ||||||
|  |         holder.classList.add(button.dataset.holderClass || "spinner_holder"); | ||||||
|  |         button.parentElement.insertBefore(holder, button); | ||||||
|  |         button.parentElement.removeChild(button); | ||||||
|  |         holder.appendChild(button); | ||||||
|  | 
 | ||||||
|  |         var spinner_element; | ||||||
|  |         if (button.dataset.spinnerId) | ||||||
|  |         { | ||||||
|  |             spinner_element = document.getElementById(button.dataset.spinnerId); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             spinner_element = document.createElement("span"); | ||||||
|  |             spinner_element.innerText = "Working..."; | ||||||
|  |             spinner_element.classList.add("hidden"); | ||||||
|  |             holder.appendChild(spinner_element); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         var spin = new spinner.Spinner(spinner_element); | ||||||
|  |         var spin_delay = parseFloat(button.dataset.spinnerDelay) || 0; | ||||||
|  | 
 | ||||||
|  |         var wrapped_onclick = Function(button.dataset.onclick); | ||||||
|  |         button.onclick = function() | ||||||
|  |         { | ||||||
|  |             spin.show(spin_delay); | ||||||
|  |             button.disabled = true; | ||||||
|  |             wrapped_onclick(); | ||||||
|  |         } | ||||||
|  |         delete button.dataset.onclick; | ||||||
|  | 
 | ||||||
|  |         var closer_id = "spinner_closer_" + spinner_button_count; | ||||||
|  |         spinner_button_count += 1; | ||||||
|  |         window[closer_id] = function spinner_closer() | ||||||
|  |         { | ||||||
|  |             spin.hide(); | ||||||
|  |             button.disabled = false; | ||||||
|  |         } | ||||||
|  |         button.dataset.spinnerCloser = closer_id; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| common.normalize_tagname = | common.normalize_tagname = | ||||||
|  | @ -271,5 +338,6 @@ common.on_pageload = | ||||||
| function on_pageload() | function on_pageload() | ||||||
| { | { | ||||||
|     common.init_button_with_confirm(); |     common.init_button_with_confirm(); | ||||||
|  |     common.init_button_with_spinner(); | ||||||
| } | } | ||||||
| document.addEventListener("DOMContentLoaded", common.on_pageload); | document.addEventListener("DOMContentLoaded", common.on_pageload); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue