LinkGenerator.vue 7.2 KB

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