LinkGenerator.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <template>
  2. <v-layout justify-center align-center>
  3. <v-flex xs12 sm8>
  4. <v-card>
  5. <v-container fluid fill-height>
  6. <v-layout column align-center>
  7. <v-card-title class="headline d-block text-md-center font-weight-bold">Link generator</v-card-title>
  8. <v-card-text>
  9. <v-form>
  10. <h2>*Host configuration</h2>
  11. <h4>Web application configuration</h4>
  12. <v-text-field
  13. v-model="form.webAppUrl"
  14. label="*Web application link"
  15. />
  16. <h4>Server configuration</h4>
  17. <v-flex xs3>
  18. <v-select
  19. v-model="form.server.ssl"
  20. :items="[false, true]"
  21. label="*SSL"
  22. />
  23. </v-flex>
  24. <v-text-field
  25. v-model="form.server.host"
  26. label="*Host IP address or hostname"
  27. />
  28. <v-text-field
  29. v-model="form.server.port"
  30. label="*Port"
  31. type="number"
  32. />
  33. <h2>User ID and experiment ID</h2>
  34. <v-layout row wrap>
  35. <v-flex xs4>
  36. <v-checkbox
  37. v-model="form.userId.activated"
  38. color="primary"
  39. label="User ID"
  40. />
  41. </v-flex>
  42. <v-spacer />
  43. <v-flex xs8>
  44. <v-text-field
  45. v-model="form.userId.value"
  46. label="User ID"
  47. type="text"
  48. :disabled="!form.userId.activated"
  49. />
  50. </v-flex>
  51. </v-layout>
  52. <v-layout row wrap>
  53. <v-flex xs4>
  54. <v-checkbox
  55. v-model="form.experimentId.activated"
  56. color="primary"
  57. label="Experiment ID"
  58. />
  59. </v-flex>
  60. <v-spacer />
  61. <v-flex xs8>
  62. <v-text-field
  63. v-model="form.experimentId.value"
  64. label="Experiment ID"
  65. type="text"
  66. :disabled="!form.experimentId.activated"
  67. />
  68. </v-flex>
  69. </v-layout>
  70. <h2>Experiment name and scene name</h2>
  71. <v-layout row wrap>
  72. <v-flex xs4>
  73. <v-checkbox
  74. v-model="form.experimentName.activated"
  75. color="primary"
  76. label="Experiment name"
  77. @click="form.sceneName.activated = false"
  78. />
  79. </v-flex>
  80. <v-flex xs8>
  81. <v-select
  82. v-model="form.experimentName.value"
  83. :items="experimentsSelectItems"
  84. item-text="text"
  85. item-value="value"
  86. label="Experiment name"
  87. :disabled="!form.experimentName.activated"
  88. />
  89. </v-flex>
  90. </v-layout>
  91. <v-layout row wrap>
  92. <v-flex xs4>
  93. <v-checkbox
  94. v-model="form.sceneName.activated"
  95. color="primary"
  96. label="Scene name"
  97. :disabled="!form.experimentName.activated || form.experimentName.value === ''"
  98. />
  99. </v-flex>
  100. <v-spacer />
  101. <v-flex xs8>
  102. <v-select
  103. v-model="form.sceneName.value"
  104. :items="scenesSelectItems"
  105. item-text="text"
  106. item-value="value"
  107. label="Scene name"
  108. :disabled="!form.sceneName.activated"
  109. />
  110. </v-flex>
  111. </v-layout>
  112. <v-btn color="primary" @click="generateLink">Generate link</v-btn>
  113. <div v-if="linkOutput && dataOutput">
  114. <h2 class="mt-5">Result</h2>
  115. <v-textarea
  116. :value="linkOutput"
  117. label="Your generated link"
  118. type="text"
  119. readonly
  120. />
  121. Data in the generated link:
  122. <pre>{{ dataOutput }}</pre>
  123. </div>
  124. <v-slide-y-transition mode="out-in">
  125. <v-alert v-if="alertMessage" :value="true" type="info" v-text="alertMessage" />
  126. </v-slide-y-transition>
  127. </v-form>
  128. </v-card-text>
  129. </v-layout>
  130. </v-container>
  131. </v-card>
  132. </v-flex>
  133. </v-layout>
  134. </template>
  135. <script>
  136. import Experiments from '@/router/experiments'
  137. import { getExperimentSceneList } from '@/config.utils'
  138. export default {
  139. name: 'LinkGenerator',
  140. components: {
  141. },
  142. data() {
  143. return {
  144. form: {
  145. webAppUrl: 'https://diran.univ-littoral.fr',
  146. server: {
  147. ssl: true,
  148. host: 'diran.univ-littoral.fr',
  149. port: '80'
  150. },
  151. userId: {
  152. activated: false,
  153. value: ''
  154. },
  155. experimentId: {
  156. activated: false,
  157. value: ''
  158. },
  159. experimentName: {
  160. activated: false,
  161. value: ''
  162. },
  163. sceneName: {
  164. activated: false,
  165. value: ''
  166. }
  167. },
  168. experimentsSelectItems: null,
  169. scenesSelectItems: null,
  170. linkOutput: null,
  171. dataOutput: null,
  172. alertMessage: null
  173. }
  174. },
  175. watch: {
  176. 'form.experimentName.activated'(newValue) {
  177. // Reset available scenes if experiment changed
  178. if (!newValue) this.scenesSelectItems = null
  179. },
  180. 'form.experimentName.value'(newValue) {
  181. // Reset available scenes if experiment changed
  182. if (newValue !== '') this.scenesSelectItems = getExperimentSceneList(this.form.experimentName.value)
  183. },
  184. 'form.sceneName.activated'(newValue) {
  185. // Load available scenes when sceneName is activated
  186. if (newValue) this.scenesSelectItems = getExperimentSceneList(this.form.experimentName.value)
  187. else this.scenesSelectItems = null
  188. }
  189. },
  190. mounted() {
  191. this.experimentsSelectItems = Experiments.map(expe => ({
  192. text: `${expe.name} - ${expe.meta.fullName}`,
  193. value: expe.name
  194. }))
  195. },
  196. methods: {
  197. generateLink() {
  198. this.alertMessage = null
  199. // Check host configuration is set
  200. if (this.form.webAppUrl === '' || this.form.server.host === '' || this.form.server.port === '') {
  201. this.alertMessage = 'The host configuration is required.'
  202. this.linkOutput = null
  203. this.dataOutput = null
  204. return
  205. }
  206. // Generate the link
  207. const obj = {
  208. hostConfig: {
  209. ssl: this.form.server.ssl,
  210. host: this.form.server.host,
  211. port: this.form.server.port
  212. }
  213. }
  214. if (this.form.userId.activated && this.form.userId.value !== '') obj.userId = this.form.userId.value
  215. if (this.form.experimentId.activated && this.form.experimentId.value !== '') obj.experimentId = this.form.experimentId.value
  216. if (this.form.experimentName.activated && this.form.experimentName.value !== '') obj.experimentName = this.form.experimentName.value
  217. if (this.form.sceneName.activated && this.form.sceneName.value !== '') obj.sceneName = this.form.sceneName.value
  218. // eslint-disable-next-line no-div-regex
  219. const q = btoa(JSON.stringify(obj)).replace(/=/g, '')
  220. this.linkOutput = `${this.form.webAppUrl}/#/?q=${q}`
  221. this.dataOutput = JSON.stringify(obj, null, 2)
  222. }
  223. }
  224. }
  225. </script>