Services.vue (5799B)
1 <template> 2 <div class="services-wrapper"> 3 4 <button @click="showTokens = !showTokens"> 5 {{showTokens ? 'Hide' : 'Show'}} tokens 6 </button> 7 8 <div class="service" v-for="service in services" :key="service.id"> 9 <span>Service ID:</span> 10 <input type="text" :value="service.id"> <br/> 11 12 <span>Token:</span> 13 <input :type="showTokens ? 'text' : 'password'" :value="service.token"/> <br/> 14 15 <span>Name:</span> 16 <input type="text" :value="service.name"/> <br/> 17 18 <span>Description:</span> 19 <input type="text" :value="service.description"/> <br/> 20 21 <span>Max number of events:</span> 22 <input type="number" :value="service.maxevents"/> <br/> 23 24 <span>Expectation period:</span> 25 <time-picker :value="service.period"/> <br/> 26 27 <button @click="deletionID = service.id">Delete</button> 28 <button @click="updateService(service.id)">Update</button> 29 </div> 30 31 <div class="service"> 32 <span>Add service</span> 33 <input :type="showTokens ? 'text' : 'password'" v-model="newService.token" placeholder="Token"> <br/> 34 <input type="text" v-model="newService.name" placeholder="Name"> <br/> 35 <input type="text" v-model="newService.description" placeholder="Description"> <br/> 36 <input type="number" v-model.number="newService.maxevents" placeholder="Max number of events"> <br/> 37 <time-picker v-model="newService.period" placeholder="Expectation Period"/> <br/> 38 39 <button @click="addService">Add service</button> 40 </div> 41 <div v-show="deletionID" style="position: fixed; bottom: 15px; right: 15px;"> 42 <button @click="deletionID = 0">Cancel</button> 43 <button @click="deleteService()">Confirm</button> 44 </div> 45 </div> 46 </template> 47 48 <script> 49 import api from "./requests.js"; 50 import TimePicker from "./TimePicker.vue"; 51 export default { 52 name: "Services", 53 components: {TimePicker}, 54 data() { 55 return { 56 services: [], 57 newService: { 58 token: "", 59 name: "", 60 description: "", 61 period: {"number": 0, "scalar": 0}, 62 maxevents: 0 63 }, 64 showTokens: false, 65 deletionID: 0, 66 } 67 }, 68 methods: { 69 addService() { 70 // Make unix milli time formatted period before sending 71 const formattedService = { 72 ...this.newService, 73 }; 74 formattedService.period = this.newService.period.scalar * this.newService.period.number; 75 console.log(formattedService); 76 api.postService(formattedService, 77 success => { 78 this.services.push(this.newService); 79 this.newService = { 80 token: "", name: "", description: "", 81 period: {"number": 0, "scalar": 0}, maxevents: 0 82 }; 83 }, 84 error => { 85 this.$emit("error"); 86 } 87 ); 88 }, 89 updateService(id) { 90 alert("Not implemented!"); 91 }, 92 deleteService() { 93 api.deleteService(this.deletionID, 94 success => { 95 this.services = this.services.filter( 96 s => s.id !== this.deletionID 97 ); 98 this.deletionID = 0; 99 }, 100 error => { 101 console.error(error); 102 this.$emit("error"); 103 } 104 ); 105 }, 106 getExpectations(unixMilliTime) { 107 const units = [ 108 { "unit": "weeks", "scalar": 604800000 }, 109 { "unit": "days", "scalar": 86400000 }, 110 { "unit": "hours", "scalar": 3600000 }, 111 { "unit": "minutes", "scalar": 60000 }, 112 { "unit": "seconds", "scalar": 1000 }, 113 { "unit": "none", "scalar": 0 } 114 ]; 115 if (unixMilliTime === 0) { 116 return { "number": 0, "scalar": 0 }; 117 } 118 for (let i = 0; i < units.length; i++) { 119 let u = units[i]; 120 if (unixMilliTime % u.scalar === 0) { 121 return { 122 "scalar": u.scalar, 123 "number": unixMilliTime / u.scalar 124 }; 125 } 126 } 127 } 128 }, 129 mounted() { 130 api.getServices( 131 services => { 132 this.services = services.map(s => { 133 s.period = this.getExpectations(s.period); 134 return s; 135 }); 136 }, 137 error => { 138 console.log(error); 139 this.$emit("error"); 140 } 141 ); 142 } 143 } 144 </script> 145 146 <style > 147 span { 148 font-weight: bold; 149 } 150 input { 151 border-width: 0 0 1px; 152 border-color: #bbf; 153 background-color: inherit; 154 outline-width: 0; 155 flex: 1; 156 margin-bottom: 3px; 157 width: 100%; 158 } 159 input:focus { 160 outline-width: 0; 161 } 162 input::placeholder { 163 color: #bbf; 164 } 165 div .service { 166 border: 1px solid blueviolet; 167 border-radius: 3px; 168 margin-bottom: 1em; 169 padding: 1em; 170 } 171 </style>