123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <template lang='pug'>
- v-container(fluid, grid-list-lg)
- v-layout(row, wrap)
- v-flex(xs12)
- .admin-header
- img(src='/svg/icon-console.svg', alt='Developer Tools', style='width: 80px;')
- .admin-header-title
- .headline.primary--text Developer Tools
- .subheading.grey--text ¯\_(ツ)_/¯
- v-spacer
- v-card.radius-7
- v-card-text
- .caption Enables extra dev options and removes many safeguards.
- .caption.red--text Do not enable unless you know what you're doing!
- v-switch.mt-1(
- color='primary'
- hide-details
- label='Dev Mode'
- )
- v-card.mt-3.white.grey--text.text--darken-3
- v-tabs(
- v-model='selectedTab'
- color='grey darken-2'
- fixed-tabs
- slider-color='white'
- show-arrows
- dark
- @change='tabChanged'
- )
- v-tab(key='0') Graph API Playground
- v-tab(key='1') Graph API Map
- v-tabs-items(v-model='selectedTab')
- v-tab-item(key='0', :transition='false', :reverse-transition='false')
- #graphiql
- v-tab-item(key='1', :transition='false', :reverse-transition='false')
- #voyager
- </template>
- <script>
- import _ from 'lodash'
- import React from 'react'
- import ReactDOM from 'react-dom'
- import GraphiQL from 'graphiql'
- import { Voyager } from 'graphql-voyager'
- import 'graphiql/graphiql.css'
- import 'graphql-voyager/dist/voyager.css'
- const fetcher = (qry, respType) => {
- return fetch('/graphql', {
- method: 'post',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(qry),
- credentials: 'include'
- }).then(response => {
- if (respType === 'json') {
- return response.json()
- } else {
- return response.text()
- }
- }).then(responseBody => {
- try {
- return JSON.parse(responseBody)
- } catch (error) {
- return responseBody
- }
- })
- }
- let graphiQLInstance
- export default {
- data() {
- return {
- selectedTab: 0
- }
- },
- mounted() {
- this.renderGraphiQL()
- },
- methods: {
- tabChanged (tabId) {
- switch (tabId) {
- case 1:
- this.renderVoyager()
- break
- }
- },
- renderGraphiQL() {
- ReactDOM.render(
- React.createElement(GraphiQL, {
- ref(el) { graphiQLInstance = el },
- async fetcher(qry) {
- let resp = await fetcher(qry, 'text')
- _.delay(() => {
- graphiQLInstance.resultComponent.viewer.refresh()
- }, 500)
- return resp
- },
- response: null,
- variables: '{}',
- operationName: null,
- websocketConnectionParams: null
- }),
- document.getElementById('graphiql')
- )
- graphiQLInstance.queryEditorComponent.editor.refresh()
- graphiQLInstance.variableEditorComponent.editor.refresh()
- graphiQLInstance.state.variableEditorOpen = true
- graphiQLInstance.state.docExplorerOpen = true
- },
- renderVoyager() {
- ReactDOM.render(
- React.createElement(Voyager, {
- introspection: qry => fetcher({ query: qry }, 'json'),
- workerURI: '/js/voyager.worker.js'
- }),
- document.getElementById('voyager')
- )
- }
- }
- }
- </script>
- <style lang='scss'>
- #graphiql {
- height: calc(100vh - 270px);
- .topBar {
- background-color: mc('grey', '200');
- background-image: none;
- padding: 1.5rem 0;
- > .title {
- display: none;
- }
- }
- .toolbar {
- background-color: initial;
- box-shadow: initial;
- }
- .doc-explorer-title-bar, .history-title-bar {
- height: auto;
- }
- }
- #voyager {
- height: calc(100vh - 270px);
- .title-area {
- display: none;
- }
- .type-doc {
- margin-top: 5px;
- }
- .doc-navigation {
- > span {
- overflow-y: hidden;
- display: block;
- }
- min-height: 40px;
- }
- .contents {
- padding-bottom: 0;
- color: #666;
- }
- .type-info-popover {
- display: none;
- }
- }
- </style>
|