admin-dev.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template lang='pug'>
  2. div
  3. v-card(flat, :color='$vuetify.dark ? "grey darken-4" : "grey lighten-5"').pa-3.pt-4
  4. .admin-header-icon: v-icon(size='80', color='grey lighten-2') weekend
  5. .headline.primary--text Developer Tools
  6. .subheading.grey--text ¯\_(ツ)_/¯
  7. v-tabs(
  8. v-model='selectedTab'
  9. :color='$vuetify.dark ? "primary" : "grey lighten-4"'
  10. fixed-tabs
  11. :slider-color='$vuetify.dark ? "white" : "primary"'
  12. show-arrows
  13. @input='tabChanged'
  14. )
  15. v-tab(key='0') Graph API Playground
  16. v-tab(key='1') Graph API Map
  17. v-tabs-items(v-model='selectedTab')
  18. v-tab-item(key='0', :transition='false', :reverse-transition='false')
  19. #graphiql
  20. v-tab-item(key='1', :transition='false', :reverse-transition='false')
  21. #voyager
  22. </template>
  23. <script>
  24. import _ from 'lodash'
  25. import React from 'react'
  26. import ReactDOM from 'react-dom'
  27. import GraphiQL from 'graphiql'
  28. import { Voyager } from 'graphql-voyager'
  29. import 'graphiql/graphiql.css'
  30. import 'graphql-voyager/dist/voyager.css'
  31. const fetcher = (qry, respType) => {
  32. return fetch('/graphql', {
  33. method: 'post',
  34. headers: {
  35. 'Accept': 'application/json',
  36. 'Content-Type': 'application/json'
  37. },
  38. body: JSON.stringify(qry),
  39. credentials: 'include'
  40. }).then(response => {
  41. if (respType === 'json') {
  42. return response.json()
  43. } else {
  44. return response.text()
  45. }
  46. }).then(responseBody => {
  47. try {
  48. return JSON.parse(responseBody)
  49. } catch (error) {
  50. return responseBody
  51. }
  52. })
  53. }
  54. let graphiQLInstance
  55. export default {
  56. data() {
  57. return {
  58. selectedTab: '0'
  59. }
  60. },
  61. mounted() {
  62. this.renderGraphiQL()
  63. },
  64. methods: {
  65. tabChanged (tabId) {
  66. switch (tabId) {
  67. case '1':
  68. this.renderVoyager()
  69. break
  70. }
  71. },
  72. renderGraphiQL() {
  73. ReactDOM.render(
  74. React.createElement(GraphiQL, {
  75. ref(el) { graphiQLInstance = el },
  76. async fetcher(qry) {
  77. let resp = await fetcher(qry, 'text')
  78. _.delay(() => {
  79. graphiQLInstance.resultComponent.viewer.refresh()
  80. }, 500)
  81. return resp
  82. },
  83. query: '',
  84. response: null,
  85. variables: null,
  86. operationName: null,
  87. websocketConnectionParams: null
  88. }),
  89. document.getElementById('graphiql')
  90. )
  91. graphiQLInstance.queryEditorComponent.editor.refresh()
  92. graphiQLInstance.variableEditorComponent.editor.refresh()
  93. graphiQLInstance.state.variableEditorOpen = true
  94. },
  95. renderVoyager() {
  96. ReactDOM.render(
  97. React.createElement(Voyager, {
  98. introspection: qry => fetcher({ query: qry }, 'json'),
  99. workerURI: '/js/voyager.worker.js'
  100. }),
  101. document.getElementById('voyager')
  102. )
  103. }
  104. }
  105. }
  106. </script>
  107. <style lang='scss'>
  108. #graphiql {
  109. height: calc(100vh - 230px);
  110. .topBar {
  111. background-color: mc('grey', '200');
  112. background-image: none;
  113. padding: 1.5rem 0;
  114. > .title {
  115. display: none;
  116. }
  117. }
  118. .toolbar {
  119. background-color: initial;
  120. box-shadow: initial;
  121. }
  122. }
  123. #voyager {
  124. height: calc(100vh - 250px);
  125. .title-area {
  126. display: none;
  127. }
  128. .type-doc {
  129. margin-top: 5px;
  130. }
  131. }
  132. </style>