feat(tool): added Date Converter
This commit is contained in:
		
							parent
							
								
									ecbc5bad28
								
							
						
					
					
						commit
						e907b05c32
					
				
							
								
								
									
										135
									
								
								pages/tools/converter/date-converter.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								pages/tools/converter/date-converter.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,135 @@ | ||||
| <template> | ||||
|   <ToolWrapper :config="config()"> | ||||
|     <v-row> | ||||
|       <v-col md="3" sm="12" class="pt-0 pb-0"> | ||||
|         <div class="text-center"> | ||||
|           <v-switch v-model="useCurrentDate" label="Use current date"/> | ||||
|         </div> | ||||
|       </v-col> | ||||
| 
 | ||||
|       <v-col md="3" sm="12" class="pt-0 pb-0"> | ||||
|         <v-select | ||||
|           v-model="inputFormatterTitle" | ||||
|           :items="formats.filter(f => !f.title.toLowerCase().includes('locale')).map(v => v.title)" | ||||
|           outlined | ||||
|           label="Your date format" | ||||
|           placeholder="Input format" | ||||
|           :disabled="useCurrentDate" | ||||
|           @input="userInputChanged()" | ||||
|         /> | ||||
|       </v-col> | ||||
|       <v-col md="6" sm="12" class="pt-0 pb-0"> | ||||
|         <v-text-field | ||||
|           v-model="inputString" | ||||
|           outlined | ||||
|           label="Your date string" | ||||
|           :error="invalidInput" | ||||
|           :disabled="useCurrentDate" | ||||
|           @input="userInputChanged()" | ||||
|         /> | ||||
|       </v-col> | ||||
|     </v-row> | ||||
| 
 | ||||
|     <br> | ||||
|     <v-divider/> | ||||
|     <br> | ||||
|     <br> | ||||
| 
 | ||||
|     <v-text-field | ||||
|       v-for="format of formats" | ||||
|       :key="format.title" | ||||
|       dense | ||||
|       readonly | ||||
|       outlined | ||||
|       :label="format.title" | ||||
|       :value="format.getDate(displayedDate)" | ||||
|       append-icon="mdi-content-copy" | ||||
|       @click:append="copy(format.getDate(displayedDate))" | ||||
|     /> | ||||
|   </ToolWrapper> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| 
 | ||||
| import {Component} from 'nuxt-property-decorator' | ||||
| import {CopyableMixin} from '@/mixins/copyable.mixin' | ||||
| import Tool from '@/components/Tool.vue' | ||||
| import {ToolConfig} from '@/types/ToolConfig' | ||||
| 
 | ||||
| @Component({ | ||||
|   mixins: [CopyableMixin] | ||||
| }) | ||||
| export default class DateConverter extends Tool { | ||||
|   config(): ToolConfig { | ||||
|     return { | ||||
|       title: 'Date/Time converter', | ||||
|       description: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus distinctio dolor dolorum eaque eligendi, facilis impedit laboriosam odit placeat.', | ||||
|       icon: 'mdi-calendar-range', | ||||
|       keywords: ['date', 'time', 'converter', 'iso'] | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   inputString = '' | ||||
|   inputFormatterTitle: string | null = null | ||||
|   useCurrentDate = true | ||||
|   displayedDate = new Date() | ||||
|   invalidInput = false | ||||
|   formats = [ | ||||
|     { | ||||
|       title: 'Locale datetime', | ||||
|       getDate: (displayedDate: Date) => displayedDate.toLocaleString(), | ||||
|       dateFromFormat: (dateString: string) => dateString | ||||
|     }, | ||||
|     { | ||||
|       title: 'ISO 8601', | ||||
|       getDate: (displayedDate: Date) => displayedDate.toISOString(), | ||||
|       dateFromFormat: (dateString: string) => new Date(dateString) | ||||
|     }, | ||||
|     { | ||||
|       title: 'UTC format', | ||||
|       getDate: (displayedDate: Date) => displayedDate.toUTCString(), | ||||
|       dateFromFormat: (dateString: string) => new Date(dateString) | ||||
|     }, | ||||
|     { | ||||
|       title: 'UNIX Timestamp (ms)', | ||||
|       getDate: (displayedDate: Date) => displayedDate.getTime(), | ||||
|       dateFromFormat: (dateString: string) => new Date(parseInt(dateString)) | ||||
|     }, | ||||
|     { | ||||
|       title: 'Complete', | ||||
|       getDate: (displayedDate: Date) => displayedDate.toString(), | ||||
|       dateFromFormat: (dateString: string) => new Date(dateString) | ||||
|     } | ||||
|   ] | ||||
| 
 | ||||
|   refreshCurrentDate() { | ||||
|     if (this.useCurrentDate) { | ||||
|       this.displayedDate = new Date() | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   userInputChanged() { | ||||
|     try { | ||||
|       this.invalidInput = false | ||||
|       const newDate = this.formats.find(f => f.title === this.inputFormatterTitle)?.dateFromFormat(this.inputString) | ||||
|       if (newDate && !isNaN((newDate as Date).getTime())) { | ||||
|         this.useCurrentDate = false | ||||
|         this.displayedDate = newDate as Date | ||||
|       } else if (this.inputString.length > 0) { | ||||
|         this.invalidInput = true | ||||
|       } | ||||
|     } catch (ignored) { | ||||
|       // | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   created() { | ||||
|     setInterval(this.refreshCurrentDate.bind(this), 1000) | ||||
|     this.inputFormatterTitle = this.formats[1].title | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="less"> | ||||
| </style> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user