mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Trim whitespace from book/podcast/episode details text inputs #3943
This commit is contained in:
		
							parent
							
								
									e93bb5cb07
								
							
						
					
					
						commit
						0bba709124
					
				| @ -2,10 +2,10 @@ | |||||||
|   <div> |   <div> | ||||||
|     <div class="flex flex-wrap"> |     <div class="flex flex-wrap"> | ||||||
|       <div class="w-1/5 p-1"> |       <div class="w-1/5 p-1"> | ||||||
|         <ui-text-input-with-label v-model="newEpisode.season" :label="$strings.LabelSeason" /> |         <ui-text-input-with-label v-model="newEpisode.season" trim-whitespace :label="$strings.LabelSeason" /> | ||||||
|       </div> |       </div> | ||||||
|       <div class="w-1/5 p-1"> |       <div class="w-1/5 p-1"> | ||||||
|         <ui-text-input-with-label v-model="newEpisode.episode" :label="$strings.LabelEpisode" /> |         <ui-text-input-with-label v-model="newEpisode.episode" trim-whitespace :label="$strings.LabelEpisode" /> | ||||||
|       </div> |       </div> | ||||||
|       <div class="w-1/5 p-1"> |       <div class="w-1/5 p-1"> | ||||||
|         <ui-dropdown v-model="newEpisode.episodeType" :label="$strings.LabelEpisodeType" :items="episodeTypes" small /> |         <ui-dropdown v-model="newEpisode.episodeType" :label="$strings.LabelEpisodeType" :items="episodeTypes" small /> | ||||||
| @ -14,10 +14,10 @@ | |||||||
|         <ui-text-input-with-label v-model="pubDateInput" ref="pubdate" type="datetime-local" :label="$strings.LabelPubDate" @input="updatePubDate" /> |         <ui-text-input-with-label v-model="pubDateInput" ref="pubdate" type="datetime-local" :label="$strings.LabelPubDate" @input="updatePubDate" /> | ||||||
|       </div> |       </div> | ||||||
|       <div class="w-full p-1"> |       <div class="w-full p-1"> | ||||||
|         <ui-text-input-with-label v-model="newEpisode.title" :label="$strings.LabelTitle" /> |         <ui-text-input-with-label v-model="newEpisode.title" :label="$strings.LabelTitle" trim-whitespace /> | ||||||
|       </div> |       </div> | ||||||
|       <div class="w-full p-1"> |       <div class="w-full p-1"> | ||||||
|         <ui-textarea-with-label v-model="newEpisode.subtitle" :label="$strings.LabelSubtitle" :rows="3" /> |         <ui-textarea-with-label v-model="newEpisode.subtitle" :label="$strings.LabelSubtitle" :rows="3" trim-whitespace /> | ||||||
|       </div> |       </div> | ||||||
|       <div class="w-full p-1"> |       <div class="w-full p-1"> | ||||||
|         <ui-rich-text-editor :label="$strings.LabelDescription" v-model="newEpisode.description" /> |         <ui-rich-text-editor :label="$strings.LabelDescription" v-model="newEpisode.description" /> | ||||||
|  | |||||||
| @ -215,6 +215,10 @@ export default { | |||||||
|     inputBlur() { |     inputBlur() { | ||||||
|       if (!this.isFocused) return |       if (!this.isFocused) return | ||||||
| 
 | 
 | ||||||
|  |       if (typeof this.textInput === 'string') { | ||||||
|  |         this.textInput = this.textInput.trim() | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       setTimeout(() => { |       setTimeout(() => { | ||||||
|         if (document.activeElement === this.$refs.input) { |         if (document.activeElement === this.$refs.input) { | ||||||
|           return |           return | ||||||
| @ -231,6 +235,11 @@ export default { | |||||||
|     }, |     }, | ||||||
|     forceBlur() { |     forceBlur() { | ||||||
|       this.isFocused = false |       this.isFocused = false | ||||||
|  | 
 | ||||||
|  |       if (typeof this.textInput === 'string') { | ||||||
|  |         this.textInput = this.textInput.trim() | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       if (this.textInput) this.submitForm() |       if (this.textInput) this.submitForm() | ||||||
|       if (this.$refs.input) this.$refs.input.blur() |       if (this.$refs.input) this.$refs.input.blur() | ||||||
|     }, |     }, | ||||||
| @ -289,11 +298,12 @@ export default { | |||||||
|       this.selectedMenuItemIndex = null |       this.selectedMenuItemIndex = null | ||||||
|     }, |     }, | ||||||
|     submitForm() { |     submitForm() { | ||||||
|       if (!this.textInput) return |       if (!this.textInput || !this.textInput.trim?.()) return | ||||||
|  | 
 | ||||||
|  |       this.textInput = this.textInput.trim() | ||||||
| 
 | 
 | ||||||
|       const cleaned = this.textInput.trim() |  | ||||||
|       const matchesItem = this.items.find((i) => { |       const matchesItem = this.items.find((i) => { | ||||||
|         return i.name === cleaned |         return i.name === this.textInput | ||||||
|       }) |       }) | ||||||
| 
 | 
 | ||||||
|       if (matchesItem) { |       if (matchesItem) { | ||||||
|  | |||||||
| @ -40,7 +40,8 @@ export default { | |||||||
|     showCopy: Boolean, |     showCopy: Boolean, | ||||||
|     step: [String, Number], |     step: [String, Number], | ||||||
|     min: [String, Number], |     min: [String, Number], | ||||||
|     customInputClass: String |     customInputClass: String, | ||||||
|  |     trimWhitespace: Boolean | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
| @ -101,9 +102,13 @@ export default { | |||||||
|       this.$emit('focus') |       this.$emit('focus') | ||||||
|     }, |     }, | ||||||
|     blurred() { |     blurred() { | ||||||
|  |       if (this.trimWhitespace && typeof this.inputValue === 'string') { | ||||||
|  |         this.inputValue = this.inputValue.trim() | ||||||
|  |       } | ||||||
|       this.isFocused = false |       this.isFocused = false | ||||||
|       this.$emit('blur') |       this.$emit('blur') | ||||||
|     }, |     }, | ||||||
|  | 
 | ||||||
|     change(e) { |     change(e) { | ||||||
|       this.$emit('change', e.target.value) |       this.$emit('change', e.target.value) | ||||||
|     }, |     }, | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
|         <em v-if="note" class="font-normal text-xs pl-2">{{ note }}</em> |         <em v-if="note" class="font-normal text-xs pl-2">{{ note }}</em> | ||||||
|       </label> |       </label> | ||||||
|     </slot> |     </slot> | ||||||
|     <ui-text-input :placeholder="placeholder || label" :inputId="identifier" ref="input" v-model="inputValue" :disabled="disabled" :readonly="readonly" :type="type" :show-copy="showCopy" class="w-full" :class="inputClass" @blur="inputBlurred" /> |     <ui-text-input :placeholder="placeholder || label" :inputId="identifier" ref="input" v-model="inputValue" :disabled="disabled" :readonly="readonly" :type="type" :show-copy="showCopy" class="w-full" :class="inputClass" :trim-whitespace="trimWhitespace" @blur="inputBlurred" /> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| @ -24,7 +24,8 @@ export default { | |||||||
|     readonly: Boolean, |     readonly: Boolean, | ||||||
|     disabled: Boolean, |     disabled: Boolean, | ||||||
|     inputClass: String, |     inputClass: String, | ||||||
|     showCopy: Boolean |     showCopy: Boolean, | ||||||
|  |     trimWhitespace: Boolean | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return {} |     return {} | ||||||
|  | |||||||
| @ -3,10 +3,10 @@ | |||||||
|     <form class="w-full h-full px-2 md:px-4 py-6" @submit.prevent="submitForm"> |     <form class="w-full h-full px-2 md:px-4 py-6" @submit.prevent="submitForm"> | ||||||
|       <div class="flex flex-wrap -mx-1"> |       <div class="flex flex-wrap -mx-1"> | ||||||
|         <div class="w-full md:w-1/2 px-1"> |         <div class="w-full md:w-1/2 px-1"> | ||||||
|           <ui-text-input-with-label ref="titleInput" v-model="details.title" :label="$strings.LabelTitle" @input="handleInputChange" /> |           <ui-text-input-with-label ref="titleInput" v-model="details.title" :label="$strings.LabelTitle" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="flex-grow px-1 mt-2 md:mt-0"> |         <div class="flex-grow px-1 mt-2 md:mt-0"> | ||||||
|           <ui-text-input-with-label ref="subtitleInput" v-model="details.subtitle" :label="$strings.LabelSubtitle" @input="handleInputChange" /> |           <ui-text-input-with-label ref="subtitleInput" v-model="details.subtitle" :label="$strings.LabelSubtitle" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
| @ -42,19 +42,19 @@ | |||||||
|           <ui-multi-select ref="narratorsSelect" v-model="details.narrators" :label="$strings.LabelNarrators" :items="narrators" @input="handleInputChange" /> |           <ui-multi-select ref="narratorsSelect" v-model="details.narrators" :label="$strings.LabelNarrators" :items="narrators" @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> |         <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> | ||||||
|           <ui-text-input-with-label ref="isbnInput" v-model="details.isbn" label="ISBN" @input="handleInputChange" /> |           <ui-text-input-with-label ref="isbnInput" v-model="details.isbn" label="ISBN" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> |         <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> | ||||||
|           <ui-text-input-with-label ref="asinInput" v-model="details.asin" label="ASIN" @input="handleInputChange" /> |           <ui-text-input-with-label ref="asinInput" v-model="details.asin" label="ASIN" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
|       <div class="flex flex-wrap mt-2 -mx-1"> |       <div class="flex flex-wrap mt-2 -mx-1"> | ||||||
|         <div class="w-full md:w-1/4 px-1"> |         <div class="w-full md:w-1/4 px-1"> | ||||||
|           <ui-text-input-with-label ref="publisherInput" v-model="details.publisher" :label="$strings.LabelPublisher" @input="handleInputChange" /> |           <ui-text-input-with-label ref="publisherInput" v-model="details.publisher" :label="$strings.LabelPublisher" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> |         <div class="w-1/2 md:w-1/4 px-1 mt-2 md:mt-0"> | ||||||
|           <ui-text-input-with-label ref="languageInput" v-model="details.language" :label="$strings.LabelLanguage" @input="handleInputChange" /> |           <ui-text-input-with-label ref="languageInput" v-model="details.language" :label="$strings.LabelLanguage" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="flex-grow px-1 pt-6 mt-2 md:mt-0"> |         <div class="flex-grow px-1 pt-6 mt-2 md:mt-0"> | ||||||
|           <div class="flex justify-center"> |           <div class="flex justify-center"> | ||||||
|  | |||||||
| @ -3,14 +3,14 @@ | |||||||
|     <form class="w-full h-full px-4 py-6" @submit.prevent="submitForm"> |     <form class="w-full h-full px-4 py-6" @submit.prevent="submitForm"> | ||||||
|       <div class="flex -mx-1"> |       <div class="flex -mx-1"> | ||||||
|         <div class="w-1/2 px-1"> |         <div class="w-1/2 px-1"> | ||||||
|           <ui-text-input-with-label ref="titleInput" v-model="details.title" :label="$strings.LabelTitle" @input="handleInputChange" /> |           <ui-text-input-with-label ref="titleInput" v-model="details.title" :label="$strings.LabelTitle" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="flex-grow px-1"> |         <div class="flex-grow px-1"> | ||||||
|           <ui-text-input-with-label ref="authorInput" v-model="details.author" :label="$strings.LabelAuthor" @input="handleInputChange" /> |           <ui-text-input-with-label ref="authorInput" v-model="details.author" :label="$strings.LabelAuthor" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
|       <ui-text-input-with-label ref="feedUrlInput" v-model="details.feedUrl" :label="$strings.LabelRSSFeedURL" class="mt-2" @input="handleInputChange" /> |       <ui-text-input-with-label ref="feedUrlInput" v-model="details.feedUrl" :label="$strings.LabelRSSFeedURL" trim-whitespace class="mt-2" @input="handleInputChange" /> | ||||||
| 
 | 
 | ||||||
|       <ui-textarea-with-label ref="descriptionInput" v-model="details.description" :rows="3" :label="$strings.LabelDescription" class="mt-2" @input="handleInputChange" /> |       <ui-textarea-with-label ref="descriptionInput" v-model="details.description" :rows="3" :label="$strings.LabelDescription" class="mt-2" @input="handleInputChange" /> | ||||||
| 
 | 
 | ||||||
| @ -25,13 +25,13 @@ | |||||||
| 
 | 
 | ||||||
|       <div class="flex mt-2 -mx-1"> |       <div class="flex mt-2 -mx-1"> | ||||||
|         <div class="w-1/4 px-1"> |         <div class="w-1/4 px-1"> | ||||||
|           <ui-text-input-with-label ref="releaseDateInput" v-model="details.releaseDate" :label="$strings.LabelReleaseDate" @input="handleInputChange" /> |           <ui-text-input-with-label ref="releaseDateInput" v-model="details.releaseDate" :label="$strings.LabelReleaseDate" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="w-1/4 px-1"> |         <div class="w-1/4 px-1"> | ||||||
|           <ui-text-input-with-label ref="itunesIdInput" v-model="details.itunesId" label="iTunes ID" @input="handleInputChange" /> |           <ui-text-input-with-label ref="itunesIdInput" v-model="details.itunesId" label="iTunes ID" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="w-1/4 px-1"> |         <div class="w-1/4 px-1"> | ||||||
|           <ui-text-input-with-label ref="languageInput" v-model="details.language" :label="$strings.LabelLanguage" @input="handleInputChange" /> |           <ui-text-input-with-label ref="languageInput" v-model="details.language" :label="$strings.LabelLanguage" trim-whitespace @input="handleInputChange" /> | ||||||
|         </div> |         </div> | ||||||
|         <div class="flex-grow px-1 pt-6"> |         <div class="flex-grow px-1 pt-6"> | ||||||
|           <div class="flex justify-center"> |           <div class="flex justify-center"> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user