From dcb4be7b94b806a373f1cc9fb4e7884065a05250 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Fri, 22 May 2020 20:09:25 +0100 Subject: [PATCH 1/9] handle all possible states for fields --- src/panel/context/Explorer/ast/index.ts | 7 + src/panel/pages/request/Request.tsx | 4 +- src/panel/pages/request/components/Fields.tsx | 204 ++++++++++++++++++ .../pages/request/components/PaneContent.tsx | 84 ++++++++ .../pages/request/components/Response.tsx | 42 +--- .../request/components/Schema.fixture.tsx | 143 ++++++++++++ src/panel/pages/request/components/Schema.tsx | 86 ++++++++ .../pages/request/components/Settings.tsx | 22 +- src/panel/pages/request/components/Stack.tsx | 156 ++++++++++++++ src/panel/pages/request/components/Type.tsx | 58 +++++ src/panel/pages/request/components/index.ts | 2 +- 11 files changed, 763 insertions(+), 45 deletions(-) create mode 100644 src/panel/pages/request/components/Fields.tsx create mode 100644 src/panel/pages/request/components/PaneContent.tsx create mode 100644 src/panel/pages/request/components/Schema.fixture.tsx create mode 100644 src/panel/pages/request/components/Schema.tsx create mode 100644 src/panel/pages/request/components/Stack.tsx create mode 100644 src/panel/pages/request/components/Type.tsx diff --git a/src/panel/context/Explorer/ast/index.ts b/src/panel/context/Explorer/ast/index.ts index 070ca64d..558848ed 100644 --- a/src/panel/context/Explorer/ast/index.ts +++ b/src/panel/context/Explorer/ast/index.ts @@ -126,6 +126,10 @@ const parseNodes = (copyArgs: CopyFromDataArgs): ParsedNodeMap => { return parsedNodemap; } + if (isSchemaField(selectionNode)) { + return parsedNodemap; + } + const name = selectionNode.name.value || "query"; const args = getFieldArguments(selectionNode, variables); const key = getFieldKey(name, args); @@ -219,3 +223,6 @@ const isFragmentSpread = (node: ASTNode): node is FragmentSpreadNode => const isFragmentNode = (node: ASTNode): node is FragmentDefinitionNode => { return node.kind === Kind.FRAGMENT_DEFINITION; }; + +const isSchemaField = (node: FieldNode): boolean => + node.name.value === "__schema"; diff --git a/src/panel/pages/request/Request.tsx b/src/panel/pages/request/Request.tsx index 4e1e21a2..cc3388c0 100644 --- a/src/panel/pages/request/Request.tsx +++ b/src/panel/pages/request/Request.tsx @@ -1,7 +1,7 @@ import React, { ComponentProps, FC } from "react"; import styled from "styled-components"; import { Background } from "../../components/Background"; -import { Query, Response, Settings } from "./components"; +import { Query, PaneContent, Settings } from "./components"; export const Request: FC> = (props) => { return ( @@ -9,7 +9,7 @@ export const Request: FC> = (props) => { - + ); diff --git a/src/panel/pages/request/components/Fields.tsx b/src/panel/pages/request/components/Fields.tsx new file mode 100644 index 00000000..9afecebd --- /dev/null +++ b/src/panel/pages/request/components/Fields.tsx @@ -0,0 +1,204 @@ +import React, { FC } from "react"; +import { + isInterfaceType, + isObjectType, + isInputObjectType, + isUnionType, + isEnumType, + GraphQLField, + GraphQLInputField, + GraphQLNamedType, + GraphQLArgument, +} from "graphql"; +import styled from "styled-components"; +import { Type } from "./Type"; + +interface FieldProps { + node?: GraphQLNamedType; + setType: (type: GraphQLNamedType) => void; +} + +export const Fields: FC = ({ node, setType }) => { + if (!node) { + return null; + } + + const isDeprecated = (field: GraphQLField) => + field.isDeprecated ? ( + {`Deprecated: ${field.deprecationReason}`} + ) : null; + + const getDefaultValue = (field: GraphQLInputField | GraphQLArgument) => { + return field.defaultValue !== undefined || null ? ( + {` = ${field.defaultValue}`} + ) : null; + }; + + if (isObjectType(node) || isInterfaceType(node)) { + const fields = node.getFields(); + const keys = Object.keys(fields); + + return ( + <> + {keys.map((field, i) => { + const args = fields[field].args; + const hasDescriptions = args.some((arg) => arg.description); + + return ( + + {fields[field].description ? ( + {`"${fields[field].description}"`} + ) : null} + + {fields[field].name} + {args.length ? "(" : null} + + {args.length > 0 ? ( + <> + + {args.map((arg, idx) => ( + <> + {arg.description ? ( + {`"${arg.description}"`} + ) : null} + + + {arg.name} + + + {getDefaultValue(arg)} + {idx !== args.length - 1 && ", "} + + + + ))} + + + ) : null} +
+ + {args.length ? ")" : null} + + + + {isDeprecated(fields[field])} +
+
+ ); + })} + + ); + } + + if (isInputObjectType(node)) { + const fields = node.getFields(); + const keys = Object.keys(fields); + + return ( + <> + {keys.map((field, i) => { + return ( + + {fields[field].name} + + + {getDefaultValue(fields[field])} + + ); + })} + + ); + } + + if (isUnionType(node)) { + const types = node.getTypes(); + + return ( + <> + {types.map((type, i) => { + return ( + + | + + + ); + })} + + ); + } + + if (isEnumType(node)) { + const types = node.getValues(); + + return ( + <> + {types.map((type, i) => { + return ( + + {type.value} + + ); + })} + + ); + } + + return null; +}; + +const Description = styled.code` + color: ${(p) => p.theme.green["+3"]}; +`; + +const FieldWrapper = styled.div` + position: relative; + display: flex; + align-items: baseline; + font-size: 13px; + margin-bottom: 12px; + + &[data-multiline="true"] { + flex-direction: column; + + & > ${Description} { + color: ${(p) => p.theme.light["-5"]}; + margin-bottom: 6px; + } + } +`; + +const Colon = styled.span` + &::before { + content: ":"; + display: inline-block; + color: ${(p) => p.theme.light["0"]}; + margin-right: 6px; + } +`; + +const Name = styled.span` + color: ${(p) => p.theme.grey["+9"]}; +`; + +const Deprecated = styled.code` + display: inline-block; + color: ${(p) => p.theme.purple["+5"]}; + margin-left: 6px; +`; + +const Default = styled.code` + display: inline-block; + color: ${(p) => p.theme.green["+5"]}; + margin-left: 6px; +`; + +const ArgWrapper = styled.div` + display: flex; + + &[data-multiline="true"] { + flex-direction: column; + & > code { + padding-left: 8px; + } + } +`; diff --git a/src/panel/pages/request/components/PaneContent.tsx b/src/panel/pages/request/components/PaneContent.tsx new file mode 100644 index 00000000..e68eb542 --- /dev/null +++ b/src/panel/pages/request/components/PaneContent.tsx @@ -0,0 +1,84 @@ +import React, { useState } from "react"; +import styled from "styled-components"; +import { Pane } from "../../../components"; +import { Response } from "./Response"; +import { Schema } from "./Schema"; + +export const PaneContent = () => { + const [activeTab, setActiveTab] = useState(0); + + return ( + + + setActiveTab(0)}> + Response + + setActiveTab(1)}> + Schema + + + + + {activeTab === 0 && } + {activeTab === 1 && } + + + + ); +}; + +const Tabs = styled.menu` + display: flex; + align-items: center; + padding: 0; + margin: 12px; +`; + +const Tab = styled.button` + padding: 3px 5px; + border: 1px solid ${(p) => `${p.theme.grey["-1"]}`}; + border-radius: 2px; + background-color: ${(p) => p.theme.dark["+1"]}; + color: ${(p) => p.theme.grey["+2"]}; + font-size: 11px; + line-height: 1rem; + + &:first-of-type { + margin-right: 5px; + } + + &[data-active="true"] { + color: ${(p) => p.theme.grey["+4"]}; + background-color: ${(p) => p.theme.dark["+5"]}; + } +`; + +const PaneBody = styled(Pane.Body)` + display: flex; + flex-grow: 1; +`; + +const PaneSection = styled.section` + color: #fff; + background: ${(props) => props.theme.dark[0]}; + padding: 20px; + overflow: auto; + flex-grow: 1; + flex-basis: 0; + + h1 { + background-color: ${(p) => p.theme.dark["+3"]}; + position: sticky; + top: -20px; + margin: -20px; + padding: 2px 10px; + font-size: 13px; + font-weight: 400; + border-bottom: solid 1px ${(p) => p.theme.dark["+5"]}; + z-index: 1; + } + + h1 + * { + margin-top: 40px; + } +`; diff --git a/src/panel/pages/request/components/Response.tsx b/src/panel/pages/request/components/Response.tsx index 65a70fe0..7d210b40 100644 --- a/src/panel/pages/request/components/Response.tsx +++ b/src/panel/pages/request/components/Response.tsx @@ -1,7 +1,7 @@ import React, { useContext, useMemo } from "react"; import styled from "styled-components"; import { RequestContext } from "../../../context"; -import { Pane, CodeHighlight } from "../../../components"; +import { CodeHighlight } from "../../../components"; export const Response = () => { const { fetching, response, error } = useContext(RequestContext); @@ -44,7 +44,7 @@ export const Response = () => { }; }, [fetching, response, error]); - const content = useMemo(() => { + return useMemo(() => { if (state === "Idle") { return Run a query to see what the client returns...; } @@ -64,14 +64,6 @@ export const Response = () => { ); }, [code, state]); - - return ( - - - {content} - - - ); }; const Prompt = styled.div` @@ -116,36 +108,6 @@ const Icon = styled.span` } `; -const PaneBody = styled(Pane.Body)` - display: flex; - flex-grow: 1; -`; - -const PaneSection = styled.section` - color: #fff; - background: ${(props) => props.theme.dark[0]}; - padding: 20px; - overflow: auto; - flex-grow: 1; - flex-basis: 0; - - h1 { - background-color: ${(p) => p.theme.dark["+3"]}; - position: sticky; - top: -20px; - margin: -20px; - padding: 2px 10px; - font-size: 13px; - font-weight: 400; - border-bottom: solid 1px ${(p) => p.theme.dark["+5"]}; - z-index: 1; - } - - h1 + * { - margin-top: 40px; - } -`; - const Title = styled.h3` color: ${(p) => p.theme.light["0"]}; font-size: 13px; diff --git a/src/panel/pages/request/components/Schema.fixture.tsx b/src/panel/pages/request/components/Schema.fixture.tsx new file mode 100644 index 00000000..155db81d --- /dev/null +++ b/src/panel/pages/request/components/Schema.fixture.tsx @@ -0,0 +1,143 @@ +import React, { FC, ContextType, useState, useMemo } from "react"; +import { buildSchema } from "graphql"; +import { RequestContext } from "../../../context"; +import { appendPopulateDirective } from "../../../context/schema-transforms"; +import { Schema } from "./Schema"; + +export const schema = buildSchema(` +directive @cacheControl(maxAge: Int, scope: CacheControlScope) on FIELD_DEFINITION | OBJECT | INTERFACE + +directive @populate on FIELD + +enum CacheControlScope { + PUBLIC + PRIVATE +} + +""" +A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the +'date-time' format outlined in section 5.6 of the RFC 3339 profile of the ISO +8601 standard for representation of dates and times using the Gregorian calendar. +""" +scalar DateTime + +type Like { + id: ID! + createdBy: User! + createdAt: DateTime! +} + +type Mutation { + createThread(input: ThreadInput!): Thread! + """ + Reply to a Post + """ + reply( + "Reply to a comment!" + input: ReplyInput! + ): Reply! + likeThread(threadId: ID!): Thread! + likeReply(replyId: ID!): Reply! + signup(username: String!, password: String!): SigninResult! + signin(username: String!, password: String!): SigninResult! +} + +type Query { + threads(sortBy: SortBy!, skip: Int = 0, limit: Int): [Thread!]! + thread(id: ID!): Thread + me: User +} + +type Reply { + id: ID! + text: String! + thread: Thread! + createdBy: User! + createdAt: DateTime! + likesNumber: Int! + likes(skip: Int, limit: Int): [Like!]! + hasUserLiked: Boolean +} + +input ReplyInput { + threadId: ID! + text: String! +} + +type SigninResult { + user: User! + token: String! +} + +enum SortBy { + LATEST + OLDEST +} + +type Subscription { + newThread: Thread! + newReply(threadId: ID!): Reply! + newThreadLike(threadId: ID!): Like! + newReplyLike(replyId: ID!): Like! +} + +type Thread { + id: ID! + title: String! + text: String + createdBy: User! + createdAt: DateTime! + repliesNumber: Int + replies(skip: Int, limit: Int): [Reply!] + likesNumber: Int + likes(skip: Int, limit: Int): [Like!] + hasUserLiked: Boolean +} + +input ThreadInput { + title: String! + text: String +} + +"""The 'Upload' scalar type represents a file upload.""" +scalar Upload + +type User { + id: ID! + username: String! + avatar: String + createdAt: DateTime +} + +`); + +const RequestProviderMock: FC>> = ({ + children, + ...value +}) => { + const [query, setQuery] = useState(""); + + const state = useMemo( + () => ({ + query, + setQuery, + error: undefined, + execute: () => null as any, + fetching: false, + response: undefined, + schema: appendPopulateDirective(schema), + ...value, + }), + [value] + ); + + return ; +}; + +export default { + basic: ( + + + + ), +}; diff --git a/src/panel/pages/request/components/Schema.tsx b/src/panel/pages/request/components/Schema.tsx new file mode 100644 index 00000000..535fe49f --- /dev/null +++ b/src/panel/pages/request/components/Schema.tsx @@ -0,0 +1,86 @@ +import React, { useContext, useState } from "react"; +import { GraphQLNamedType } from "graphql"; +import styled from "styled-components"; +import { RequestContext } from "../../../context"; +import { Stack } from "./Stack"; +import { Fields } from "./Fields"; + +export const Schema = () => { + const [stack, setStack] = useState([]); + const { schema } = useContext(RequestContext); + + if (schema === undefined) { + return ( + + Loading... + + ); + } + + if (schema === null) { + return ( + + + Something went wrong while fetching your schema, make sure + introspection is enabled in your settings + + + ); + } + + const schemaTypes = schema.getTypeMap(); + + const setType = (type: GraphQLNamedType) => { + setStack((stack) => [...stack, type]); + }; + + return ( + + {schemaTypes.Query ? ( + <> + Query + + + + + ) : null} + {schemaTypes.Mutation ? ( + <> + Mutation + + + + + ) : null} + {schemaTypes.Subscription ? ( + <> + Subscription + + + + + ) : null} + + + ); +}; + +const Title = styled.h3` + color: ${(p) => p.theme.light["0"]}; + font-size: 13px; + font-weight: normal; + margin-top: 0; + margin-bottom: 0.5rem; +`; + +const Wrapper = styled.div` + box-sizing: border-box; + position: relative; + width: 100%; + color: ${(p) => p.theme.light["-3"]}; + padding: 30px; +`; + +const FieldsContainer = styled.div` + padding: 8px; +`; diff --git a/src/panel/pages/request/components/Settings.tsx b/src/panel/pages/request/components/Settings.tsx index 8648d676..16972ce3 100644 --- a/src/panel/pages/request/components/Settings.tsx +++ b/src/panel/pages/request/components/Settings.tsx @@ -1,18 +1,35 @@ import React, { FC, useCallback } from "react"; import styled from "styled-components"; -import { faPlay, faTrashAlt } from "@fortawesome/free-solid-svg-icons"; +import prettier from "prettier/standalone"; +import parserGraphql from "prettier/parser-graphql"; +import { + faPlay, + faTrashAlt, + faAlignLeft, +} from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRequest } from "../../../context"; export const Settings: FC = () => { - const { setQuery, execute } = useRequest(); + const { setQuery, execute, query } = useRequest(); const handleTrashClick = useCallback(() => setQuery(""), [setQuery]); + const handleFormatClick = useCallback(() => { + if (query) { + const formatted = prettier.format(query, { + parser: "graphql", + plugins: [parserGraphql], + }); + setQuery(formatted); + } + }, [query, setQuery]); + return ( + ); }; @@ -20,6 +37,7 @@ export const Settings: FC = () => { const Container = styled.div` display: flex; flex-direction: row; + align-items: center; width: 100%; padding: 3px 10px; background: ${(props) => props.theme.dark["+3"]}; diff --git a/src/panel/pages/request/components/Stack.tsx b/src/panel/pages/request/components/Stack.tsx new file mode 100644 index 00000000..2ba1f888 --- /dev/null +++ b/src/panel/pages/request/components/Stack.tsx @@ -0,0 +1,156 @@ +import React, { FC } from "react"; +import { Kind, TypeDefinitionNode, GraphQLNamedType } from "graphql"; +import styled from "styled-components"; +import { Fields } from "./Fields"; + +const getKind = (node: TypeDefinitionNode | null | undefined) => { + if (!node) { + return null; + } + + switch (node.kind) { + case Kind.INPUT_OBJECT_TYPE_DEFINITION: { + return "input"; + } + case Kind.INTERFACE_TYPE_DEFINITION: { + return "interface"; + } + case Kind.UNION_TYPE_DEFINITION: { + return "union"; + } + case Kind.ENUM_TYPE_DEFINITION: { + return "enum"; + } + + default: { + return "type"; + } + } +}; + +interface StackProps { + stack: GraphQLNamedType[] | []; + setStack: (type: GraphQLNamedType[] | []) => void; + setType: (type: GraphQLNamedType) => void; +} + +export const Stack: FC = ({ stack, setStack, setType }) => { + if (!stack.length) { + return null; + } + + const currentType = stack[stack.length - 1]; + const prevType = stack[stack.length - 2]; + + if (!currentType) { + return null; + } + + const kind = getKind(currentType.astNode); + + return ( + + + {stack.length > 1 ? ( + setStack([])}>Root + ) : null} + setStack([...stack].slice(0, -1))}> + {(prevType && prevType.name) || "Root"} + + + + + <TypeKind data-kind={kind}>{kind}</TypeKind> + <span>{currentType.name}</span> + + + {currentType.description ? ( + +

Description

+

{currentType.description}

+
+
+ ) : null} + + + +
+ ); +}; + +const Title = styled.h3` + color: ${(p) => p.theme.light["0"]}; + font-size: 13px; + font-weight: normal; + margin-top: 0; + margin-bottom: 0.5rem; +`; + +const StackWrapper = styled.div` + box-sizing: border-box; + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + padding: 30px; + background-color: ${(p) => p.theme.dark["0"]}; +`; + +const BorderBox = styled.div` + display: flex; + flex-direction: column; + border-bottom: 1px solid ${(p) => p.theme.dark["+2"]}; + margin-bottom: 12px; + padding: 12px 0; +`; + +const TypeKind = styled.span` + color: ${(p) => p.theme.yellow["+5"]}; + margin-right: 6px; + + &[data-kind="interface"] { + color: ${(p) => p.theme.red["+5"]}; + } + + &[data-kind="enum"] { + color: ${(p) => p.theme.purple["+5"]}; + } + + &[data-kind="union"] { + color: ${(p) => p.theme.blue["+5"]}; + } +`; + +const TextButton = styled.button` + display: inline-block; + background: transparent; + outline: none; + border: none; + cursor: pointer; + color: ${(p) => p.theme.orange["+3"]}; + font-size: inherit; + text-align: left; + padding: 0; + margin: 0; + + &:hover { + text-decoration: underline; + } +`; + +const BackButton = styled(TextButton)` + width: max-content; + color: ${(p) => p.theme.light["0"]}; + border: 1px solid ${(p) => p.theme.dark["+5"]}; + border-radius: 3px; + margin-right: 6px; + padding: 6px; +`; + +const StackButtons = styled.menu` + display: flex; + padding: 0; +`; diff --git a/src/panel/pages/request/components/Type.tsx b/src/panel/pages/request/components/Type.tsx new file mode 100644 index 00000000..b5628c4e --- /dev/null +++ b/src/panel/pages/request/components/Type.tsx @@ -0,0 +1,58 @@ +import React, { FC } from "react"; +import { + GraphQLType, + GraphQLList, + GraphQLNonNull, + GraphQLNamedType, +} from "graphql"; +import styled from "styled-components"; + +interface TypeProps { + type?: GraphQLType; + setType: (type: GraphQLNamedType) => void; +} + +export const Type: FC = ({ setType, type }) => { + if (!type) return null; + + if (type instanceof GraphQLNonNull) { + return ( + <> + ! + + ); + } + + if (type instanceof GraphQLList) { + return ( + <> + {"["} + + {"]"} + + ); + } + + return ( + setType(type)}> + {type.name} + + ); +}; + +const TextButton = styled.button` + display: inline-block; + background: transparent; + outline: none; + border: none; + cursor: pointer; + color: ${(p) => p.theme.orange["+3"]}; + font-size: inherit; + text-align: left; + padding: 0; + margin: 0; + + &:hover { + text-decoration: underline; + } +`; diff --git a/src/panel/pages/request/components/index.ts b/src/panel/pages/request/components/index.ts index 6251396b..aa7f0567 100644 --- a/src/panel/pages/request/components/index.ts +++ b/src/panel/pages/request/components/index.ts @@ -1,3 +1,3 @@ export * from "./Query"; -export * from "./Response"; +export * from "./PaneContent"; export * from "./Settings"; From 23769ffe2578f370083d4c2009705978aefc5715 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Sat, 23 May 2020 18:57:15 +0100 Subject: [PATCH 2/9] Update UI for root schema --- src/panel/components/IndicatorArrow.tsx | 27 ++++ src/panel/components/index.ts | 1 + src/panel/pages/explorer/components/Icons.tsx | 9 -- .../pages/explorer/components/ListItem.tsx | 19 +-- .../request/components/Fields.fixture.tsx | 42 +++++ src/panel/pages/request/components/Fields.tsx | 79 ++++++--- .../request/components/Schema.fixture.tsx | 12 +- src/panel/pages/request/components/Schema.tsx | 111 +++++++++---- src/panel/pages/request/components/Stack.tsx | 153 +++++++++++------- 9 files changed, 311 insertions(+), 142 deletions(-) create mode 100644 src/panel/components/IndicatorArrow.tsx create mode 100644 src/panel/pages/request/components/Fields.fixture.tsx diff --git a/src/panel/components/IndicatorArrow.tsx b/src/panel/components/IndicatorArrow.tsx new file mode 100644 index 00000000..fa2ef031 --- /dev/null +++ b/src/panel/components/IndicatorArrow.tsx @@ -0,0 +1,27 @@ +import styled from "styled-components"; +import React, { FC } from "react"; + +const ArrowIcon: FC = (props) => ( + + + +); + +export const Arrow = styled(ArrowIcon)` + flex-shrink: 0; + height: 10px; + width: 10px; + margin-left: 2px; + margin-right: 5px; + color: ${(p) => p.theme.light["-5"]}; + transform: rotate(0deg); + transition: transform 100ms ease; + + &[data-active="true"] { + color: ${(p) => p.theme.light["0"]}; + transform: rotate(90deg); + } +`; diff --git a/src/panel/components/index.ts b/src/panel/components/index.ts index 8294a563..6d436dd4 100644 --- a/src/panel/components/index.ts +++ b/src/panel/components/index.ts @@ -5,3 +5,4 @@ export * from "./Portal"; export * from "./CodeHighlight"; export * from "./Collapsible"; export * from "./Navigation"; +export * from "./IndicatorArrow"; diff --git a/src/panel/pages/explorer/components/Icons.tsx b/src/panel/pages/explorer/components/Icons.tsx index f87f3c40..a63ca9f0 100644 --- a/src/panel/pages/explorer/components/Icons.tsx +++ b/src/panel/pages/explorer/components/Icons.tsx @@ -1,15 +1,6 @@ import React, { FC } from "react"; import { useTheme } from "styled-components"; -export const ArrowIcon: FC = (props) => ( - - - -); - export const SeeMoreIcon: FC = (props) => ( diff --git a/src/panel/pages/explorer/components/ListItem.tsx b/src/panel/pages/explorer/components/ListItem.tsx index 7a6733a0..4114c868 100644 --- a/src/panel/pages/explorer/components/ListItem.tsx +++ b/src/panel/pages/explorer/components/ListItem.tsx @@ -11,8 +11,7 @@ import styled from "styled-components"; import { ParsedFieldNode } from "../../../context/Explorer/ast"; import { ExplorerContext } from "../../../context"; import { useFlash } from "../hooks"; -import { InlineCodeHighlight } from "../../../components"; -import { ArrowIcon } from "./Icons"; +import { InlineCodeHighlight, Arrow } from "../../../components"; import { Arguments } from "./Arguments"; import { Tree } from "./Tree"; @@ -163,22 +162,6 @@ const ChildrenName = styled.span` font-size: 13px; `; -const Arrow = styled(ArrowIcon)` - flex-shrink: 0; - height: 10px; - width: 10px; - margin-left: 2px; - margin-right: 5px; - color: ${(p) => p.theme.light["-5"]}; - transform: rotate(0deg); - transition: transform 100ms ease; - - &[data-active="true"] { - color: ${(p) => p.theme.light["0"]}; - transform: rotate(90deg); - } -`; - const Typename = styled.div` display: inline-block; margin-left: -7px; diff --git a/src/panel/pages/request/components/Fields.fixture.tsx b/src/panel/pages/request/components/Fields.fixture.tsx new file mode 100644 index 00000000..d3408fee --- /dev/null +++ b/src/panel/pages/request/components/Fields.fixture.tsx @@ -0,0 +1,42 @@ +import React from "react"; +import { schema } from "./Schema.fixture"; +import { Fields } from "./Fields"; +import { BorderBox } from "./Stack"; + +const typeMap = schema.getTypeMap(); +const setTypeMock = (type: any) => console.log(type); + +const Objects = () => ( + +

Basic

+ +

Arg and Field Descriptions

+ +

Default args

+ + +); + +export default { + object: , + interface: ( + + + + ), + enum: ( + + + + ), + union: ( + + + + ), + input: ( + + + + ), +}; diff --git a/src/panel/pages/request/components/Fields.tsx b/src/panel/pages/request/components/Fields.tsx index 9afecebd..b1b81de1 100644 --- a/src/panel/pages/request/components/Fields.tsx +++ b/src/panel/pages/request/components/Fields.tsx @@ -9,6 +9,8 @@ import { GraphQLInputField, GraphQLNamedType, GraphQLArgument, + GraphQLEnumValue, + GraphQLObjectType, } from "graphql"; import styled from "styled-components"; import { Type } from "./Type"; @@ -23,7 +25,9 @@ export const Fields: FC = ({ node, setType }) => { return null; } - const isDeprecated = (field: GraphQLField) => + const isDeprecated = ( + field: GraphQLField | GraphQLEnumValue + ) => field.isDeprecated ? ( {`Deprecated: ${field.deprecationReason}`} ) : null; @@ -34,6 +38,18 @@ export const Fields: FC = ({ node, setType }) => { ) : null; }; + const getDescription = ( + field: + | GraphQLField + | GraphQLArgument + | GraphQLInputField + | GraphQLEnumValue + | GraphQLObjectType + ) => + field.description ? ( + {`"${field.description}"`} + ) : null; + if (isObjectType(node) || isInterfaceType(node)) { const fields = node.getFields(); const keys = Object.keys(fields); @@ -46,9 +62,7 @@ export const Fields: FC = ({ node, setType }) => { return ( - {fields[field].description ? ( - {`"${fields[field].description}"`} - ) : null} + {getDescription(fields[field])} {fields[field].name} {args.length ? "(" : null} @@ -58,16 +72,16 @@ export const Fields: FC = ({ node, setType }) => { {args.map((arg, idx) => ( <> - {arg.description ? ( - {`"${arg.description}"`} - ) : null} + {getDescription(arg)} {arg.name} - + {getDefaultValue(arg)} - {idx !== args.length - 1 && ", "} + {idx !== args.length - 1 && ( + + )} @@ -78,7 +92,7 @@ export const Fields: FC = ({ node, setType }) => {
{args.length ? ")" : null} - + {isDeprecated(fields[field])} @@ -99,8 +113,9 @@ export const Fields: FC = ({ node, setType }) => { {keys.map((field, i) => { return ( + {getDescription(fields[field])} {fields[field].name} - + {getDefaultValue(fields[field])} @@ -112,15 +127,17 @@ export const Fields: FC = ({ node, setType }) => { if (isUnionType(node)) { const types = node.getTypes(); - return ( <> {types.map((type, i) => { return ( - - | - - + + {getDescription(type)} + + + + + ); })} @@ -129,14 +146,17 @@ export const Fields: FC = ({ node, setType }) => { if (isEnumType(node)) { const types = node.getValues(); - return ( <> {types.map((type, i) => { return ( - - {type.value} - + + {getDescription(type)} + + {type.value} + {isDeprecated(type)} + + ); })} @@ -155,7 +175,20 @@ const FieldWrapper = styled.div` display: flex; align-items: baseline; font-size: 13px; - margin-bottom: 12px; + padding-top: 6px; + padding-bottom: 6px; + padding-left: 12px; + color: ${(p) => p.theme.light["-3"]}; + white-space: nowrap; + + &:first-child { + padding-top: 12px; + } + + &:last-child { + padding-bottom: 12px; + border: none; + } &[data-multiline="true"] { flex-direction: column; @@ -167,9 +200,9 @@ const FieldWrapper = styled.div` } `; -const Colon = styled.span` +const Separator = styled.span` &::before { - content: ":"; + content: ${({ content }: { content: string }) => `"${content}"`}; display: inline-block; color: ${(p) => p.theme.light["0"]}; margin-right: 6px; diff --git a/src/panel/pages/request/components/Schema.fixture.tsx b/src/panel/pages/request/components/Schema.fixture.tsx index 155db81d..568c0828 100644 --- a/src/panel/pages/request/components/Schema.fixture.tsx +++ b/src/panel/pages/request/components/Schema.fixture.tsx @@ -39,7 +39,7 @@ type Mutation { likeThread(threadId: ID!): Thread! likeReply(replyId: ID!): Reply! signup(username: String!, password: String!): SigninResult! - signin(username: String!, password: String!): SigninResult! + signin(username: String!, password: String!): SigninResult! @deprecated(reason: "Test") } type Query { @@ -74,6 +74,13 @@ enum SortBy { OLDEST } +interface Test { + foo: String! + bar: SortBy! +} + +union Action = Like | Reply + type Subscription { newThread: Thread! newReply(threadId: ID!): Reply! @@ -92,10 +99,11 @@ type Thread { likesNumber: Int likes(skip: Int, limit: Int): [Like!] hasUserLiked: Boolean + test: Test } input ThreadInput { - title: String! + title: String! = "Title!" text: String } diff --git a/src/panel/pages/request/components/Schema.tsx b/src/panel/pages/request/components/Schema.tsx index 535fe49f..d1535aae 100644 --- a/src/panel/pages/request/components/Schema.tsx +++ b/src/panel/pages/request/components/Schema.tsx @@ -1,11 +1,15 @@ -import React, { useContext, useState } from "react"; +import React, { useContext, useState, useCallback } from "react"; import { GraphQLNamedType } from "graphql"; import styled from "styled-components"; import { RequestContext } from "../../../context"; +import { Arrow } from "../../../components"; import { Stack } from "./Stack"; import { Fields } from "./Fields"; +type ActiveIds = 1 | 2 | 3; + export const Schema = () => { + const [activeIds, setActiveIds] = useState([1]); const [stack, setStack] = useState([]); const { schema } = useContext(RequestContext); @@ -28,6 +32,19 @@ export const Schema = () => { ); } + const isActiveId = useCallback((id) => activeIds.includes(id), [activeIds]); + + const handleHeaderClick = useCallback( + (id) => { + if (isActiveId(id)) { + setActiveIds((current) => current.filter((cur) => cur !== id)); + } else { + setActiveIds((current) => [id, ...current]); + } + }, + [setActiveIds, activeIds, isActiveId] + ); + const schemaTypes = schema.getTypeMap(); const setType = (type: GraphQLNamedType) => { @@ -35,36 +52,71 @@ export const Schema = () => { }; return ( - - {schemaTypes.Query ? ( - <> - Query - - - - - ) : null} - {schemaTypes.Mutation ? ( - <> - Mutation - - - - - ) : null} - {schemaTypes.Subscription ? ( - <> - Subscription - - - - - ) : null} - - + <> + {stack.length > 0 ? ( + + ) : ( + + {schemaTypes.Query ? ( + <> + handleHeaderClick(1)}> + + Query + + {isActiveId(1) && ( + + + + )} + + ) : null} + {schemaTypes.Mutation ? ( + <> + handleHeaderClick(2)}> + + Mutation + + {isActiveId(2) && ( + + + + )} + + ) : null} + {schemaTypes.Subscription ? ( + <> + handleHeaderClick(3)}> + + Subscription + + {isActiveId(3) && ( + + + + )} + + ) : null} + + )} + ); }; +const CollapsibleHeader = styled.button` + display: flex; + align-items: center; + width: 100%; + color: ${(p) => p.theme.light["-5"]}; + background-color: ${(p) => p.theme.dark["+3"]}; + border: 1px solid ${(p) => p.theme.dark["+7"]}; + font-size: 13px; + padding: 6px; + + &:hover { + background-color: ${(p) => p.theme.dark["+5"]}; + } +`; + const Title = styled.h3` color: ${(p) => p.theme.light["0"]}; font-size: 13px; @@ -78,9 +130,8 @@ const Wrapper = styled.div` position: relative; width: 100%; color: ${(p) => p.theme.light["-3"]}; - padding: 30px; `; const FieldsContainer = styled.div` - padding: 8px; + background-color: ${(p) => p.theme.dark["+1"]}; `; diff --git a/src/panel/pages/request/components/Stack.tsx b/src/panel/pages/request/components/Stack.tsx index 2ba1f888..6ef92eb1 100644 --- a/src/panel/pages/request/components/Stack.tsx +++ b/src/panel/pages/request/components/Stack.tsx @@ -1,31 +1,23 @@ -import React, { FC } from "react"; -import { Kind, TypeDefinitionNode, GraphQLNamedType } from "graphql"; +import React, { FC, useMemo } from "react"; +import { + GraphQLNamedType, + GraphQLScalarType, + GraphQLInputObjectType, + GraphQLUnionType, + GraphQLEnumType, + GraphQLInterfaceType, +} from "graphql"; import styled from "styled-components"; import { Fields } from "./Fields"; -const getKind = (node: TypeDefinitionNode | null | undefined) => { - if (!node) { - return null; - } +const getKind = (node: GraphQLNamedType) => { + if (node instanceof GraphQLScalarType) return "scalar"; + if (node instanceof GraphQLInputObjectType) return "input"; + if (node instanceof GraphQLUnionType) return "union"; + if (node instanceof GraphQLEnumType) return "enum"; + if (node instanceof GraphQLInterfaceType) return "interface"; - switch (node.kind) { - case Kind.INPUT_OBJECT_TYPE_DEFINITION: { - return "input"; - } - case Kind.INTERFACE_TYPE_DEFINITION: { - return "interface"; - } - case Kind.UNION_TYPE_DEFINITION: { - return "union"; - } - case Kind.ENUM_TYPE_DEFINITION: { - return "enum"; - } - - default: { - return "type"; - } - } + return "type"; }; interface StackProps { @@ -46,44 +38,68 @@ export const Stack: FC = ({ stack, setStack, setType }) => { return null; } - const kind = getKind(currentType.astNode); + const kind = useMemo(() => getKind(currentType), [currentType]); + + const hasFields = useMemo(() => { + return Boolean( + "getFields" in currentType || + "getTypes" in currentType || + "getValues" in currentType + ); + }, [currentType]); return ( - - {stack.length > 1 ? ( - setStack([])}>Root - ) : null} + setStack([...stack].slice(0, -1))}> {(prevType && prevType.name) || "Root"} - - - + <span> <TypeKind data-kind={kind}>{kind}</TypeKind> <span>{currentType.name}</span> - - + +
+ {stack.length > 1 ? ( + setStack([])}>Root + ) : null} +
+ {currentType.description ? ( -

Description

-

{currentType.description}

-
+ + Description + + {currentType.description} +
+ ) : null} + {hasFields ? ( + + + Fields + + ) : null} - - -
); }; -const Title = styled.h3` - color: ${(p) => p.theme.light["0"]}; +const Title = styled.span` + color: ${(p) => p.theme.light["-9"]}; + display: inline-block; + margin-left: 4px; +`; + +const StackHeading = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + color: ${(p) => p.theme.light["-5"]}; + background-color: ${(p) => p.theme.dark["+3"]}; + border-top: 1px solid ${(p) => p.theme.dark["+7"]}; + border-bottom: 1px solid ${(p) => p.theme.dark["+7"]}; font-size: 13px; - font-weight: normal; - margin-top: 0; - margin-bottom: 0.5rem; + padding: 6px 12px; `; const StackWrapper = styled.div` @@ -95,32 +111,39 @@ const StackWrapper = styled.div` width: 100%; display: flex; flex-direction: column; - padding: 30px; - background-color: ${(p) => p.theme.dark["0"]}; + background-color: ${(p) => p.theme.dark["+1"]}; `; -const BorderBox = styled.div` +export const BorderBox = styled.div` display: flex; flex-direction: column; - border-bottom: 1px solid ${(p) => p.theme.dark["+2"]}; + border-bottom: 1px solid ${(p) => p.theme.dark["+3"]}; margin-bottom: 12px; padding: 12px 0; + + &:last-child { + border-bottom: none; + } `; -const TypeKind = styled.span` - color: ${(p) => p.theme.yellow["+5"]}; +const TypeKind = styled.code` + color: ${(p) => p.theme.yellow["+3"]}; margin-right: 6px; &[data-kind="interface"] { - color: ${(p) => p.theme.red["+5"]}; + color: ${(p) => p.theme.red["+3"]}; } &[data-kind="enum"] { - color: ${(p) => p.theme.purple["+5"]}; + color: ${(p) => p.theme.purple["+3"]}; } &[data-kind="union"] { - color: ${(p) => p.theme.blue["+5"]}; + color: ${(p) => p.theme.blue["+3"]}; + } + + &[data-kind="scalar"] { + color: ${(p) => p.theme.orange["+3"]}; } `; @@ -143,14 +166,24 @@ const TextButton = styled.button` const BackButton = styled(TextButton)` width: max-content; - color: ${(p) => p.theme.light["0"]}; - border: 1px solid ${(p) => p.theme.dark["+5"]}; + color: ${(p) => p.theme.light["-9"]}; + font-size: 12px; border-radius: 3px; margin-right: 6px; - padding: 6px; + padding: 4px 6px; + + &:last-child { + margin-right: 0; + } + + &:hover { + background-color: ${(p) => p.theme.grey["-9"]}; + text-decoration: none; + } `; -const StackButtons = styled.menu` - display: flex; - padding: 0; +const Description = styled.p` + font-size: 13px; + color: ${(p) => p.theme.light["-9"]}; + margin: 12px; `; From 050124bfd2aefc174fb6614f9eeba58765f511b1 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Sat, 23 May 2020 19:19:18 +0100 Subject: [PATCH 3/9] Add fixtures --- .../request/components/Fields.fixture.tsx | 22 +++++------ .../request/components/Schema.fixture.tsx | 1 + .../request/components/Stack.fixture.tsx | 13 +++++++ src/panel/pages/request/components/Stack.tsx | 37 ++++++++++--------- 4 files changed, 44 insertions(+), 29 deletions(-) create mode 100644 src/panel/pages/request/components/Stack.fixture.tsx diff --git a/src/panel/pages/request/components/Fields.fixture.tsx b/src/panel/pages/request/components/Fields.fixture.tsx index d3408fee..18164141 100644 --- a/src/panel/pages/request/components/Fields.fixture.tsx +++ b/src/panel/pages/request/components/Fields.fixture.tsx @@ -1,42 +1,42 @@ import React from "react"; import { schema } from "./Schema.fixture"; import { Fields } from "./Fields"; -import { BorderBox } from "./Stack"; +import { Box } from "./Stack"; const typeMap = schema.getTypeMap(); const setTypeMock = (type: any) => console.log(type); const Objects = () => ( - +

Basic

Arg and Field Descriptions

Default args

-
+ ); export default { object: , interface: ( - + - + ), enum: ( - + - + ), union: ( - + - + ), input: ( - + - + ), }; diff --git a/src/panel/pages/request/components/Schema.fixture.tsx b/src/panel/pages/request/components/Schema.fixture.tsx index 568c0828..189d60e0 100644 --- a/src/panel/pages/request/components/Schema.fixture.tsx +++ b/src/panel/pages/request/components/Schema.fixture.tsx @@ -48,6 +48,7 @@ type Query { me: User } +"Reply to a post, this is a little longer description" type Reply { id: ID! text: String! diff --git a/src/panel/pages/request/components/Stack.fixture.tsx b/src/panel/pages/request/components/Stack.fixture.tsx new file mode 100644 index 00000000..0be4ca76 --- /dev/null +++ b/src/panel/pages/request/components/Stack.fixture.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import { schema } from "./Schema.fixture"; +import { Stack } from "./Stack"; + +const typeMap = schema.getTypeMap(); +const stackMock = [typeMap["Reply"]]; +const setTypeMock = (type: any) => console.log(type); + +export default { + basic: ( + + ), +}; diff --git a/src/panel/pages/request/components/Stack.tsx b/src/panel/pages/request/components/Stack.tsx index 6ef92eb1..331d244e 100644 --- a/src/panel/pages/request/components/Stack.tsx +++ b/src/panel/pages/request/components/Stack.tsx @@ -65,31 +65,27 @@ export const Stack: FC = ({ stack, setStack, setType }) => {
{currentType.description ? ( - + <> Description {currentType.description} - + ) : null} {hasFields ? ( - + <> Fields - - + + + + ) : null} ); }; -const Title = styled.span` - color: ${(p) => p.theme.light["-9"]}; - display: inline-block; - margin-left: 4px; -`; - const StackHeading = styled.div` display: flex; align-items: center; @@ -100,6 +96,11 @@ const StackHeading = styled.div` border-bottom: 1px solid ${(p) => p.theme.dark["+7"]}; font-size: 13px; padding: 6px 12px; + + &:first-of-type { + background-color: ${(p) => p.theme.dark["+5"]}; + border-bottom: none; + } `; const StackWrapper = styled.div` @@ -114,16 +115,10 @@ const StackWrapper = styled.div` background-color: ${(p) => p.theme.dark["+1"]}; `; -export const BorderBox = styled.div` +export const Box = styled.div` display: flex; flex-direction: column; - border-bottom: 1px solid ${(p) => p.theme.dark["+3"]}; - margin-bottom: 12px; padding: 12px 0; - - &:last-child { - border-bottom: none; - } `; const TypeKind = styled.code` @@ -182,6 +177,12 @@ const BackButton = styled(TextButton)` } `; +const Title = styled.span` + color: ${(p) => p.theme.light["-9"]}; + display: inline-block; + padding: 4px 6px; +`; + const Description = styled.p` font-size: 13px; color: ${(p) => p.theme.light["-9"]}; From 001cecabeae143d0e2be94d524710dbec9fe8c06 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Sun, 24 May 2020 02:45:19 +0100 Subject: [PATCH 4/9] Add into request pane layout clean up --- src/panel/components/Pane.tsx | 31 +++++-- src/panel/context/Explorer/ast/index.ts | 7 -- src/panel/pages/request/Request.tsx | 59 ++++++++++++- src/panel/pages/request/components/Fields.tsx | 30 +++---- .../pages/request/components/PaneContent.tsx | 84 ------------------- src/panel/pages/request/components/Schema.tsx | 15 +--- src/panel/pages/request/components/Stack.tsx | 1 - src/panel/pages/request/components/Type.tsx | 8 +- src/panel/pages/request/components/index.ts | 3 +- 9 files changed, 104 insertions(+), 134 deletions(-) delete mode 100644 src/panel/pages/request/components/PaneContent.tsx diff --git a/src/panel/components/Pane.tsx b/src/panel/components/Pane.tsx index 191126fa..1b8337a8 100644 --- a/src/panel/components/Pane.tsx +++ b/src/panel/components/Pane.tsx @@ -5,17 +5,30 @@ import React, { useMemo, MouseEventHandler, ComponentProps, + useRef, } from "react"; import styled from "styled-components"; import { useOrientationWatcher } from "../hooks"; -const PaneRoot: FC> = ({ +interface OverrideProps { + forcedOrientation?: { isPortrait: boolean }; + initSize: { x: number; y: number }; +} + +const PaneRoot: FC & OverrideProps> = ({ children, + forcedOrientation, + initSize, ...props }) => { const [grabbed, setGrabbed] = useState(false); - const [size, setSize] = useState({ x: 400, y: 400 }); - const { isPortrait } = useOrientationWatcher(); + const [size, setSize] = useState(initSize ? initSize : { x: 400, y: 400 }); + const dynamicOrientation = useOrientationWatcher(); + const paneRef = useRef(null); + + const { isPortrait } = forcedOrientation + ? forcedOrientation + : dynamicOrientation; type position = { x: number; y: number }; const handleClick = useCallback( @@ -73,13 +86,19 @@ const PaneRoot: FC> = ({ ); return ( - + {children} ); @@ -95,7 +114,7 @@ const PaneContainer = styled.div` width: 100%; height: 400px; - @media (min-aspect-ratio: 1/1) { + &[data-portrait="false"] { width: 400px; height: 100%; border-top: none; @@ -115,7 +134,7 @@ const DraggingEdge = styled.div` height: ${edgeWidth}px; top: -${edgeWidth / 2}px; - @media (min-aspect-ratio: 1/1) { + &[data-portrait="false"] { width: ${edgeWidth}px; height: 100%; margin-top: 0; diff --git a/src/panel/context/Explorer/ast/index.ts b/src/panel/context/Explorer/ast/index.ts index 558848ed..070ca64d 100644 --- a/src/panel/context/Explorer/ast/index.ts +++ b/src/panel/context/Explorer/ast/index.ts @@ -126,10 +126,6 @@ const parseNodes = (copyArgs: CopyFromDataArgs): ParsedNodeMap => { return parsedNodemap; } - if (isSchemaField(selectionNode)) { - return parsedNodemap; - } - const name = selectionNode.name.value || "query"; const args = getFieldArguments(selectionNode, variables); const key = getFieldKey(name, args); @@ -223,6 +219,3 @@ const isFragmentSpread = (node: ASTNode): node is FragmentSpreadNode => const isFragmentNode = (node: ASTNode): node is FragmentDefinitionNode => { return node.kind === Kind.FRAGMENT_DEFINITION; }; - -const isSchemaField = (node: FieldNode): boolean => - node.name.value === "__schema"; diff --git a/src/panel/pages/request/Request.tsx b/src/panel/pages/request/Request.tsx index cc3388c0..f1ffe863 100644 --- a/src/panel/pages/request/Request.tsx +++ b/src/panel/pages/request/Request.tsx @@ -1,7 +1,8 @@ import React, { ComponentProps, FC } from "react"; import styled from "styled-components"; import { Background } from "../../components/Background"; -import { Query, PaneContent, Settings } from "./components"; +import { Pane } from "../../components"; +import { Query, Schema, Settings, Response } from "./components"; export const Request: FC> = (props) => { return ( @@ -9,12 +10,59 @@ export const Request: FC> = (props) => { - + {/* {TODO: Hack to offset the panels so they aren't on top of each other. + There's definitely better way to do this */} + + + + + + + {/* {TODO: Also a hack to make these panes work together, sorry! */} + + + + + + ); }; +const PaneBody = styled(Pane.Body)` + display: flex; + flex-grow: 1; +`; + +const PaneSection = styled.section` + color: #fff; + background: ${(props) => props.theme.dark[0]}; + overflow: auto; + flex-grow: 1; + flex-basis: 0; + padding: 30px; + + h1 { + background-color: ${(p) => p.theme.dark["+3"]}; + position: sticky; + top: -20px; + margin: -20px; + padding: 2px 10px; + font-size: 13px; + font-weight: 400; + border-bottom: solid 1px ${(p) => p.theme.dark["+5"]}; + z-index: 1; + } + + h1 + * { + margin-top: 40px; + } +`; + const Page = styled(Background)` background-color: ${(p) => p.theme.dark["0"]}; @media (min-aspect-ratio: 1/1) { @@ -22,6 +70,13 @@ const Page = styled(Background)` } `; +const SchemaContainer = styled(Pane)` + & > div { + min-width: 100%; + width: 100%; + } +`; + const PageContent = styled.div` overflow: hidden; display: flex; diff --git a/src/panel/pages/request/components/Fields.tsx b/src/panel/pages/request/components/Fields.tsx index b1b81de1..68fd7f95 100644 --- a/src/panel/pages/request/components/Fields.tsx +++ b/src/panel/pages/request/components/Fields.tsx @@ -1,4 +1,4 @@ -import React, { FC } from "react"; +import React, { FC, Fragment } from "react"; import { isInterfaceType, isObjectType, @@ -58,33 +58,29 @@ export const Fields: FC = ({ node, setType }) => { <> {keys.map((field, i) => { const args = fields[field].args; - const hasDescriptions = args.some((arg) => arg.description); + const hasDescription = args.some((arg) => arg.description); return ( - + {getDescription(fields[field])} {fields[field].name} - {args.length ? "(" : null} + {args.length > 0 ? "(" : null} {args.length > 0 ? ( <> - + {args.map((arg, idx) => ( - <> + {getDescription(arg)} - - - {arg.name} - - - {getDefaultValue(arg)} - {idx !== args.length - 1 && ( - - )} - + + {arg.name} + + + {getDefaultValue(arg)} + {idx !== args.length - 1 && } - + ))} diff --git a/src/panel/pages/request/components/PaneContent.tsx b/src/panel/pages/request/components/PaneContent.tsx deleted file mode 100644 index e68eb542..00000000 --- a/src/panel/pages/request/components/PaneContent.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useState } from "react"; -import styled from "styled-components"; -import { Pane } from "../../../components"; -import { Response } from "./Response"; -import { Schema } from "./Schema"; - -export const PaneContent = () => { - const [activeTab, setActiveTab] = useState(0); - - return ( - - - setActiveTab(0)}> - Response - - setActiveTab(1)}> - Schema - - - - - {activeTab === 0 && } - {activeTab === 1 && } - - - - ); -}; - -const Tabs = styled.menu` - display: flex; - align-items: center; - padding: 0; - margin: 12px; -`; - -const Tab = styled.button` - padding: 3px 5px; - border: 1px solid ${(p) => `${p.theme.grey["-1"]}`}; - border-radius: 2px; - background-color: ${(p) => p.theme.dark["+1"]}; - color: ${(p) => p.theme.grey["+2"]}; - font-size: 11px; - line-height: 1rem; - - &:first-of-type { - margin-right: 5px; - } - - &[data-active="true"] { - color: ${(p) => p.theme.grey["+4"]}; - background-color: ${(p) => p.theme.dark["+5"]}; - } -`; - -const PaneBody = styled(Pane.Body)` - display: flex; - flex-grow: 1; -`; - -const PaneSection = styled.section` - color: #fff; - background: ${(props) => props.theme.dark[0]}; - padding: 20px; - overflow: auto; - flex-grow: 1; - flex-basis: 0; - - h1 { - background-color: ${(p) => p.theme.dark["+3"]}; - position: sticky; - top: -20px; - margin: -20px; - padding: 2px 10px; - font-size: 13px; - font-weight: 400; - border-bottom: solid 1px ${(p) => p.theme.dark["+5"]}; - z-index: 1; - } - - h1 + * { - margin-top: 40px; - } -`; diff --git a/src/panel/pages/request/components/Schema.tsx b/src/panel/pages/request/components/Schema.tsx index d1535aae..9150aa4d 100644 --- a/src/panel/pages/request/components/Schema.tsx +++ b/src/panel/pages/request/components/Schema.tsx @@ -64,9 +64,7 @@ export const Schema = () => { Query {isActiveId(1) && ( - - - + )} ) : null} @@ -77,9 +75,7 @@ export const Schema = () => { Mutation {isActiveId(2) && ( - - - + )} ) : null} @@ -90,9 +86,7 @@ export const Schema = () => { Subscription {isActiveId(3) && ( - - - + )} ) : null} @@ -130,8 +124,5 @@ const Wrapper = styled.div` position: relative; width: 100%; color: ${(p) => p.theme.light["-3"]}; -`; - -const FieldsContainer = styled.div` background-color: ${(p) => p.theme.dark["+1"]}; `; diff --git a/src/panel/pages/request/components/Stack.tsx b/src/panel/pages/request/components/Stack.tsx index 331d244e..e78150b7 100644 --- a/src/panel/pages/request/components/Stack.tsx +++ b/src/panel/pages/request/components/Stack.tsx @@ -118,7 +118,6 @@ const StackWrapper = styled.div` export const Box = styled.div` display: flex; flex-direction: column; - padding: 12px 0; `; const TypeKind = styled.code` diff --git a/src/panel/pages/request/components/Type.tsx b/src/panel/pages/request/components/Type.tsx index b5628c4e..31bab498 100644 --- a/src/panel/pages/request/components/Type.tsx +++ b/src/panel/pages/request/components/Type.tsx @@ -1,9 +1,9 @@ import React, { FC } from "react"; import { GraphQLType, - GraphQLList, - GraphQLNonNull, GraphQLNamedType, + isNonNullType, + isListType, } from "graphql"; import styled from "styled-components"; @@ -15,7 +15,7 @@ interface TypeProps { export const Type: FC = ({ setType, type }) => { if (!type) return null; - if (type instanceof GraphQLNonNull) { + if (isNonNullType(type)) { return ( <> ! @@ -23,7 +23,7 @@ export const Type: FC = ({ setType, type }) => { ); } - if (type instanceof GraphQLList) { + if (isListType(type)) { return ( <> {"["} diff --git a/src/panel/pages/request/components/index.ts b/src/panel/pages/request/components/index.ts index aa7f0567..f8e138af 100644 --- a/src/panel/pages/request/components/index.ts +++ b/src/panel/pages/request/components/index.ts @@ -1,3 +1,4 @@ export * from "./Query"; -export * from "./PaneContent"; export * from "./Settings"; +export * from "./Schema"; +export * from "./Response"; From bd47f32907b0e11b1d0f151992df8dcc309ff9ed Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Mon, 25 May 2020 13:49:38 +0100 Subject: [PATCH 5/9] Add search component start finished search add fixture --- src/panel/pages/request/components/Schema.tsx | 105 ++++++----- .../request/components/Search.fixture.tsx | 14 ++ src/panel/pages/request/components/Search.tsx | 174 ++++++++++++++++++ 3 files changed, 252 insertions(+), 41 deletions(-) create mode 100644 src/panel/pages/request/components/Search.fixture.tsx create mode 100644 src/panel/pages/request/components/Search.tsx diff --git a/src/panel/pages/request/components/Schema.tsx b/src/panel/pages/request/components/Schema.tsx index 9150aa4d..16d2db7d 100644 --- a/src/panel/pages/request/components/Schema.tsx +++ b/src/panel/pages/request/components/Schema.tsx @@ -5,6 +5,7 @@ import { RequestContext } from "../../../context"; import { Arrow } from "../../../components"; import { Stack } from "./Stack"; import { Fields } from "./Fields"; +import { Search } from "./Search"; type ActiveIds = 1 | 2 | 3; @@ -52,50 +53,72 @@ export const Schema = () => { }; return ( - <> - {stack.length > 0 ? ( - - ) : ( - - {schemaTypes.Query ? ( - <> - handleHeaderClick(1)}> - - Query - - {isActiveId(1) && ( - - )} - - ) : null} - {schemaTypes.Mutation ? ( - <> - handleHeaderClick(2)}> - - Mutation - - {isActiveId(2) && ( - - )} - - ) : null} - {schemaTypes.Subscription ? ( - <> - handleHeaderClick(3)}> - - Subscription - - {isActiveId(3) && ( - - )} - - ) : null} - - )} - + + + + {stack.length > 0 ? ( + + ) : ( + + {schemaTypes.Query ? ( + <> + handleHeaderClick(1)} + aria-expanded={isActiveId(1)} + > + + Query + + {isActiveId(1) && ( + + )} + + ) : null} + {schemaTypes.Mutation ? ( + <> + handleHeaderClick(2)} + aria-expanded={isActiveId(2)} + > + + Mutation + + {isActiveId(2) && ( + + )} + + ) : null} + {schemaTypes.Subscription ? ( + <> + handleHeaderClick(3)} + aria-expanded={isActiveId(3)} + > + + Subscription + + {isActiveId(3) && ( + + )} + + ) : null} + + )} + + ); }; +const FlexContainer = styled.div` + display: flex; + flex-direction: column; + width: 100%; +`; + +const Container = styled.div` + position: relative; +`; + const CollapsibleHeader = styled.button` display: flex; align-items: center; diff --git a/src/panel/pages/request/components/Search.fixture.tsx b/src/panel/pages/request/components/Search.fixture.tsx new file mode 100644 index 00000000..d3c5364f --- /dev/null +++ b/src/panel/pages/request/components/Search.fixture.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import { schema } from "./Schema.fixture"; +import { Search } from "./Search"; + +const typeMap = schema.getTypeMap(); +const setTypeMock = (type: any) => console.log(type); + +export default { + basic: ( +
+ +
+ ), +}; diff --git a/src/panel/pages/request/components/Search.tsx b/src/panel/pages/request/components/Search.tsx new file mode 100644 index 00000000..5d1cc787 --- /dev/null +++ b/src/panel/pages/request/components/Search.tsx @@ -0,0 +1,174 @@ +import React, { + FC, + useMemo, + useCallback, + ChangeEvent, + useState, + useEffect, + useRef, +} from "react"; +import { GraphQLNamedType } from "graphql"; +import styled from "styled-components"; +import { TypeMap } from "graphql/type/schema"; +import { faSearch } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +interface SearchProps { + typeMap: TypeMap; + setType: (type: GraphQLNamedType) => void; +} + +export const Search: FC = ({ typeMap, setType }) => { + const containerRef = useRef(undefined as any); + const [searchValue, setSearchValue] = useState(""); + const [listOpen, setListOpen] = useState(false); + let typeKeys = useMemo(() => Object.keys(typeMap), [typeMap]); + const results = useMemo( + () => + (typeKeys = typeKeys.filter((key) => + key.toLowerCase().startsWith(searchValue.toLowerCase()) + )), + [searchValue] + ); + + useEffect(() => { + if (searchValue && results.length) { + setListOpen(true); + } else { + setListOpen(false); + } + }, [searchValue, results]); + + useEffect(() => { + const onOutsideClick = (e: MouseEvent) => { + if (!containerRef?.current?.contains(e.target as Node)) { + setListOpen(false); + } else if (searchValue && results.length) { + setListOpen(true); + } + }; + + window.addEventListener("click", onOutsideClick); + + return () => { + window.removeEventListener("click", onOutsideClick); + }; + }, [searchValue, results]); + + const handleOnChange = useCallback( + (e: ChangeEvent) => { + setSearchValue(e.target.value || ""); + }, + [setSearchValue] + ); + + const handleTypeSelect = useCallback( + (type) => { + setType(type); + setListOpen(false); + }, + [setListOpen, setType] + ); + + return ( + + + + + + {listOpen ? ( + + {results.map((res, i) => ( + + handleTypeSelect(typeMap[res])}> + {typeMap[res].name} + + + ))} + + ) : null} + + ); +}; + +const Container = styled.div` + background-color: ${(p) => p.theme.dark["+5"]}; +`; + +const Icon = styled(FontAwesomeIcon)` + font-size: 13px; + margin-right: 6px; + color: ${(p) => p.theme.light["-9"]}; +`; + +const InputWrapper = styled.div` + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + max-width: 250px; + color: ${(p) => p.theme.light["-5"]}; + font-size: 13px; + padding: 6px 12px; + + &::after { + content: "|"; + color: ${(p) => p.theme.grey["-2"]}; + } +`; + +const Input = styled.input` + background-color: transparent; + border: none; + width: 100%; + color: ${(p) => p.theme.light["-5"]}; +`; + +const List = styled.ul` + position: absolute; + right: 0; + left: 0; + display: flex; + width: 250px; + max-height: 400px; + margin-top: 0; + padding: 12px 6px; + list-style: none; + flex-direction: column; + background-color: ${(p) => p.theme.dark["+2"]}; + border: 1px solid ${(p) => p.theme.dark["+4"]}; + + z-index: 2; + overflow: auto; +`; + +const ListItem = styled.li` + padding: 6px; + + &:hover { + background-color: ${(p) => p.theme.dark["+3"]}; + } +`; + +const TextButton = styled.button` + display: inline-block; + width: 100%; + background: transparent; + outline: none; + border: none; + cursor: pointer; + color: ${(p) => p.theme.orange["+3"]}; + font-size: inherit; + text-align: left; + padding: 0; + margin: 0; + + &:hover { + text-decoration: underline; + } +`; From be33c0f1f5475bbe6850703d87878c286aa010c4 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Mon, 25 May 2020 18:36:16 +0100 Subject: [PATCH 6/9] resolve conflicts --- src/panel/pages/request/components/Schema.fixture.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/panel/pages/request/components/Schema.fixture.tsx b/src/panel/pages/request/components/Schema.fixture.tsx index 189d60e0..5a2678ea 100644 --- a/src/panel/pages/request/components/Schema.fixture.tsx +++ b/src/panel/pages/request/components/Schema.fixture.tsx @@ -1,7 +1,6 @@ import React, { FC, ContextType, useState, useMemo } from "react"; import { buildSchema } from "graphql"; import { RequestContext } from "../../../context"; -import { appendPopulateDirective } from "../../../context/schema-transforms"; import { Schema } from "./Schema"; export const schema = buildSchema(` @@ -134,7 +133,7 @@ const RequestProviderMock: FC>> = ({ execute: () => null as any, fetching: false, response: undefined, - schema: appendPopulateDirective(schema), + schema, ...value, }), [value] From 8b848e11c3c15933efad244353fe9b7bd91397b8 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Mon, 25 May 2020 23:50:59 +0100 Subject: [PATCH 7/9] improve search --- src/panel/pages/request/components/Search.tsx | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/panel/pages/request/components/Search.tsx b/src/panel/pages/request/components/Search.tsx index 5d1cc787..2c8d08d9 100644 --- a/src/panel/pages/request/components/Search.tsx +++ b/src/panel/pages/request/components/Search.tsx @@ -26,7 +26,9 @@ export const Search: FC = ({ typeMap, setType }) => { const results = useMemo( () => (typeKeys = typeKeys.filter((key) => - key.toLowerCase().startsWith(searchValue.toLowerCase()) + searchValue.length === 1 + ? key.toLowerCase().startsWith(searchValue.toLowerCase()) + : key.toLowerCase().includes(searchValue.toLowerCase()) )), [searchValue] ); @@ -86,7 +88,7 @@ export const Search: FC = ({ typeMap, setType }) => { {results.map((res, i) => ( handleTypeSelect(typeMap[res])}> - {typeMap[res].name} + ))} @@ -96,6 +98,24 @@ export const Search: FC = ({ typeMap, setType }) => { ); }; +interface HighlightProps { + name: string; + term: string; +} + +const HighlightMatch: FC = ({ name, term }) => { + const start = name.toLowerCase().indexOf(term.toLowerCase()); + const end = start + term.length; + + return ( + <> + {name.slice(0, start)} + {name.slice(start, end)} + {name.slice(end, name.length)} + + ); +}; + const Container = styled.div` background-color: ${(p) => p.theme.dark["+5"]}; `; From ad4ff52c145e7d0b235f7d09dde24a9315e55b45 Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Thu, 28 May 2020 15:26:45 +0100 Subject: [PATCH 8/9] add top bar and breadcrumbs --- .../pages/request/components/Collapsible.tsx | 42 +++++ src/panel/pages/request/components/Schema.tsx | 85 ++++------ src/panel/pages/request/components/Search.tsx | 10 +- src/panel/pages/request/components/Stack.tsx | 130 +++++---------- src/panel/pages/request/components/TopBar.tsx | 149 ++++++++++++++++++ 5 files changed, 271 insertions(+), 145 deletions(-) create mode 100644 src/panel/pages/request/components/Collapsible.tsx create mode 100644 src/panel/pages/request/components/TopBar.tsx diff --git a/src/panel/pages/request/components/Collapsible.tsx b/src/panel/pages/request/components/Collapsible.tsx new file mode 100644 index 00000000..403ee127 --- /dev/null +++ b/src/panel/pages/request/components/Collapsible.tsx @@ -0,0 +1,42 @@ +import React, { FC, ReactChild } from "react"; +import styled from "styled-components"; +import { Arrow } from "../../../components"; + +interface CollapsibleProps { + title: string; + isActive: boolean; + children: ReactChild; + onClick: () => void; +} + +export const Collapsible: FC = ({ + title, + isActive, + children, + onClick, +}) => { + return ( + <> + + + {title} + + {isActive &&
{children}
} + + ); +}; + +const CollapsibleHeader = styled.button` + display: flex; + align-items: center; + width: 100%; + color: ${(p) => p.theme.light["-5"]}; + background-color: ${(p) => p.theme.dark["+3"]}; + border: 1px solid ${(p) => p.theme.dark["+7"]}; + font-size: 13px; + padding: 6px; + + &:hover { + background-color: ${(p) => p.theme.dark["+5"]}; + } +`; diff --git a/src/panel/pages/request/components/Schema.tsx b/src/panel/pages/request/components/Schema.tsx index 16d2db7d..ac8a70b6 100644 --- a/src/panel/pages/request/components/Schema.tsx +++ b/src/panel/pages/request/components/Schema.tsx @@ -2,10 +2,11 @@ import React, { useContext, useState, useCallback } from "react"; import { GraphQLNamedType } from "graphql"; import styled from "styled-components"; import { RequestContext } from "../../../context"; -import { Arrow } from "../../../components"; import { Stack } from "./Stack"; import { Fields } from "./Fields"; import { Search } from "./Search"; +import { TopBar } from "./TopBar"; +import { Collapsible } from "./Collapsible"; type ActiveIds = 1 | 2 | 3; @@ -54,53 +55,44 @@ export const Schema = () => { return ( - + + + {stack.length > 0 ? ( - + ) : ( {schemaTypes.Query ? ( - <> - handleHeaderClick(1)} - aria-expanded={isActiveId(1)} - > - - Query - - {isActiveId(1) && ( - - )} - + handleHeaderClick(1)} + > + + ) : null} {schemaTypes.Mutation ? ( - <> - handleHeaderClick(2)} - aria-expanded={isActiveId(2)} - > - - Mutation - - {isActiveId(2) && ( - - )} - + handleHeaderClick(2)} + > + + ) : null} {schemaTypes.Subscription ? ( - <> - handleHeaderClick(3)} - aria-expanded={isActiveId(3)} - > - - Subscription - - {isActiveId(3) && ( - - )} - + handleHeaderClick(3)} + > + + ) : null} )} @@ -119,21 +111,6 @@ const Container = styled.div` position: relative; `; -const CollapsibleHeader = styled.button` - display: flex; - align-items: center; - width: 100%; - color: ${(p) => p.theme.light["-5"]}; - background-color: ${(p) => p.theme.dark["+3"]}; - border: 1px solid ${(p) => p.theme.dark["+7"]}; - font-size: 13px; - padding: 6px; - - &:hover { - background-color: ${(p) => p.theme.dark["+5"]}; - } -`; - const Title = styled.h3` color: ${(p) => p.theme.light["0"]}; font-size: 13px; diff --git a/src/panel/pages/request/components/Search.tsx b/src/panel/pages/request/components/Search.tsx index 2c8d08d9..b391c54b 100644 --- a/src/panel/pages/request/components/Search.tsx +++ b/src/panel/pages/request/components/Search.tsx @@ -22,7 +22,9 @@ export const Search: FC = ({ typeMap, setType }) => { const containerRef = useRef(undefined as any); const [searchValue, setSearchValue] = useState(""); const [listOpen, setListOpen] = useState(false); + let typeKeys = useMemo(() => Object.keys(typeMap), [typeMap]); + const results = useMemo( () => (typeKeys = typeKeys.filter((key) => @@ -117,6 +119,7 @@ const HighlightMatch: FC = ({ name, term }) => { }; const Container = styled.div` + width: 250px; background-color: ${(p) => p.theme.dark["+5"]}; `; @@ -131,14 +134,17 @@ const InputWrapper = styled.div` display: flex; align-items: center; justify-content: space-between; - max-width: 250px; + width: 100%; color: ${(p) => p.theme.light["-5"]}; font-size: 13px; padding: 6px 12px; + padding-left: 0; - &::after { + &::before { content: "|"; + display: inline-block; color: ${(p) => p.theme.grey["-2"]}; + padding-right: 6px; } `; diff --git a/src/panel/pages/request/components/Stack.tsx b/src/panel/pages/request/components/Stack.tsx index e78150b7..7542972b 100644 --- a/src/panel/pages/request/components/Stack.tsx +++ b/src/panel/pages/request/components/Stack.tsx @@ -1,4 +1,4 @@ -import React, { FC, useMemo } from "react"; +import React, { FC, useMemo, useCallback, useState } from "react"; import { GraphQLNamedType, GraphQLScalarType, @@ -9,6 +9,7 @@ import { } from "graphql"; import styled from "styled-components"; import { Fields } from "./Fields"; +import { Collapsible } from "./Collapsible"; const getKind = (node: GraphQLNamedType) => { if (node instanceof GraphQLScalarType) return "scalar"; @@ -21,18 +22,15 @@ const getKind = (node: GraphQLNamedType) => { }; interface StackProps { - stack: GraphQLNamedType[] | []; + currentType?: GraphQLNamedType; setStack: (type: GraphQLNamedType[] | []) => void; setType: (type: GraphQLNamedType) => void; } -export const Stack: FC = ({ stack, setStack, setType }) => { - if (!stack.length) { - return null; - } +type ActiveIds = 1 | 2; - const currentType = stack[stack.length - 1]; - const prevType = stack[stack.length - 2]; +export const Stack: FC = ({ currentType, setType }) => { + const [activeIds, setActiveIds] = useState([1, 2]); if (!currentType) { return null; @@ -48,61 +46,49 @@ export const Stack: FC = ({ stack, setStack, setType }) => { ); }, [currentType]); + const isActiveId = useCallback((id) => activeIds.includes(id), [activeIds]); + + const handleOnClick = useCallback( + (id) => { + if (isActiveId(id)) { + setActiveIds((current) => current.filter((cur) => cur !== id)); + } else { + setActiveIds((current) => [id, ...current]); + } + }, + [setActiveIds, activeIds, isActiveId] + ); + return ( - - setStack([...stack].slice(0, -1))}> - {(prevType && prevType.name) || "Root"} - - - {kind} - {currentType.name} - -
- {stack.length > 1 ? ( - setStack([])}>Root - ) : null} -
-
+ + {kind} + {currentType.name} + {currentType.description ? ( - <> - - Description - + handleOnClick(1)} + isActive={isActiveId(1)} + > {currentType.description} - + ) : null} {hasFields ? ( - <> - - Fields - + handleOnClick(2)} + isActive={isActiveId(2)} + > - + ) : null}
); }; -const StackHeading = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - color: ${(p) => p.theme.light["-5"]}; - background-color: ${(p) => p.theme.dark["+3"]}; - border-top: 1px solid ${(p) => p.theme.dark["+7"]}; - border-bottom: 1px solid ${(p) => p.theme.dark["+7"]}; - font-size: 13px; - padding: 6px 12px; - - &:first-of-type { - background-color: ${(p) => p.theme.dark["+5"]}; - border-bottom: none; - } -`; - const StackWrapper = styled.div` box-sizing: border-box; position: absolute; @@ -141,49 +127,15 @@ const TypeKind = styled.code` } `; -const TextButton = styled.button` - display: inline-block; - background: transparent; - outline: none; - border: none; - cursor: pointer; - color: ${(p) => p.theme.orange["+3"]}; - font-size: inherit; - text-align: left; - padding: 0; - margin: 0; - - &:hover { - text-decoration: underline; - } -`; - -const BackButton = styled(TextButton)` - width: max-content; - color: ${(p) => p.theme.light["-9"]}; - font-size: 12px; - border-radius: 3px; - margin-right: 6px; - padding: 4px 6px; - - &:last-child { - margin-right: 0; - } - - &:hover { - background-color: ${(p) => p.theme.grey["-9"]}; - text-decoration: none; - } -`; - -const Title = styled.span` +const Description = styled.p` + font-size: 13px; color: ${(p) => p.theme.light["-9"]}; - display: inline-block; - padding: 4px 6px; + margin: 12px; `; -const Description = styled.p` +const TypeNameWrapper = styled.div` font-size: 13px; - color: ${(p) => p.theme.light["-9"]}; + color: ${(p) => p.theme.light["0"]}; margin: 12px; + padding: 0 4px; `; diff --git a/src/panel/pages/request/components/TopBar.tsx b/src/panel/pages/request/components/TopBar.tsx new file mode 100644 index 00000000..d5df187b --- /dev/null +++ b/src/panel/pages/request/components/TopBar.tsx @@ -0,0 +1,149 @@ +import React, { FC } from "react"; +import { GraphQLNamedType } from "graphql"; +import styled from "styled-components"; +import { faHome, faArrowLeft } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +interface TopBarProps { + setStack: (stack: GraphQLNamedType[] | []) => void; + stack: GraphQLNamedType[] | []; +} + +export const TopBar: FC = ({ setStack, stack, children }) => { + const prevType = stack[stack.length - 2]; + + return ( + + + + setStack([])} + data-disabled={stack.length < 2} + > + + + setStack([...stack].slice(0, -1))} + data-disabled={stack.length === 0} + > + + + + {children} + + + setStack([])} + > + Root + + {stack.length > 0 + ? (stack as GraphQLNamedType[]).map((item, i) => ( + setStack([...stack].slice(0, i + 1))} + data-disabled={i === stack.length - 1} + key={i} + > + {item.name} + + )) + : null} + + + ); +}; + +const Container = styled.div` + display: flex; + justify-content: flex-start; + align-items: center; +`; + +const FlexContainer = styled.div` + background-color: ${(p) => p.theme.dark["+5"]}; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + width: 100%; +`; + +const ButtonContainer = styled.menu` + display: flex; + align-items: center; + padding: 0; + margin: 0 4px; +`; + +const Icon = styled(FontAwesomeIcon)` + font-size: 13px; + color: currentColor; +`; + +const IconButton = styled.button` + display: inline-block; + background: transparent; + outline: none; + border: none; + cursor: pointer; + color: ${(p) => p.theme.light["-9"]}; + font-size: inherit; + text-align: left; + padding: 4px; + margin: 0; + border-radius: 3px; + + &:first-of-type { + margin-right: 4px; + } + + &:hover { + background-color: ${(p) => p.theme.grey["-9"]}; + } + + &[data-disabled="true"] { + pointer-events: none; + color: ${(p) => p.theme.grey["-6"]}; + } +`; + +const TextButton = styled.button` + display: inline-block; + background: transparent; + outline: none; + border: none; + cursor: pointer; + font-size: 11px; + text-align: left; + padding: 0; + margin: 0; + color: inherit; + color: ${(p) => p.theme.orange["+3"]}; + + &:hover { + text-decoration: underline; + } + + &[data-disabled="true"] { + color: ${(p) => p.theme.grey["0"]}; + pointer-events: none; + } + + &[data-disabled="false"] { + &::after { + content: ">"; + display: inline-block; + margin: 0 3px; + color: ${(p) => p.theme.grey["0"]}; + } + } +`; + +const Breadcrumbs = styled.nav` + display: flex; + align-items: center; + padding: 5px; + margin: 0 4px; + color: ${(p) => p.theme.grey["0"]}; +`; From 3469821964462ca23f2d60392bc944adb5638d8f Mon Sep 17 00:00:00 2001 From: Sofia Pohjalainen Date: Thu, 28 May 2020 18:58:16 +0100 Subject: [PATCH 9/9] add visual regression snapshots --- .../Request - basic-landscape-snap.png | Bin 7326 -> 14491 bytes .../Request - basic-portrait-snap.png | Bin 8527 -> 15785 bytes .../Request - error-landscape-snap.png | Bin 9302 -> 16437 bytes .../Request - error-portrait-snap.png | Bin 10436 -> 17633 bytes .../Request - fetching-landscape-snap.png | Bin 6976 -> 14123 bytes .../Request - fetching-portrait-snap.png | Bin 8137 -> 15406 bytes .../Request - response-landscape-snap.png | Bin 10154 -> 17318 bytes .../Request - response-portrait-snap.png | Bin 11334 -> 18496 bytes .../__snapshots__/Pane.test.tsx.snap | 4 ++++ .../request/components/Fields.fixture.tsx | 12 ++++++++---- .../request/components/Schema.fixture.tsx | 2 +- .../request/components/Search.fixture.tsx | 2 +- 12 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/panel/__image_snapshots__/Request - basic-landscape-snap.png b/src/panel/__image_snapshots__/Request - basic-landscape-snap.png index 9878dcf76473c652e18a431a81b4c7e4f9737d51..d7f1ff054d456aa9acc4350a4d3987774d2077f9 100644 GIT binary patch literal 14491 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 literal 7326 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 bhk4~@?z;ZCy_#SE1hju|;2!p_sI&h7*(B^1 diff --git a/src/panel/__image_snapshots__/Request - error-landscape-snap.png b/src/panel/__image_snapshots__/Request - error-landscape-snap.png index fc5b3c295934a8c75c57bb08a39a3dd97a40de08..b99b6e488fc55004479bee76d24b9c25f3183bc4 100644 GIT binary patch literal 16437 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 literal 9302 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 E0X;avGynhq diff --git a/src/panel/__image_snapshots__/Request - error-portrait-snap.png b/src/panel/__image_snapshots__/Request - error-portrait-snap.png index 75f0c44b820f28dd77eb34026660b49612828eb2..e617ae84b39b6c0d062803278a618bd9fe258fcd 100644 GIT binary patch literal 17633 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 literal 10436 zcmeHNX;@R|w%*PI1?u$(iVSVNE!U$+Ee13YutiH-1S$}M3<(w$Nf=a!K*HcqrB)>! ztSAVGREEq7Atn%lV!?`lN(M}Th$urs7=$E{kmP=w_6$9z_j%6kbI+gq@QXZqZ@yuD zYrXHg*80wU9_VMe(rzULL6)C>vMU&Z7KTI6V)pW-;E8kTwiV#df|Ovtk055d{V)W* z1%0~f!_f3=>K<~9lvp%2p*xh^b>c>pJ4bM0mIx`xjb3Z|#X$ z0DZY)GjxJoo>xEpU;~9Nkw^*sj%G=6<&R)O?hOzKC_LnHRJV5t0HUY zEru_Kjb(B;9B&bswxQ8PMV3ws*5V;w3O$Y% zY^21mMc_korALHopz*MY^2L%1>)d)TbV5+7MbR;9iGS@YM_?^3KX3(ou$Y`wDBQgq zd}wP;&+}ep0X=7Iu?eqo<_TvHY4eM75eZ%F0Lp>%8MoWr(^gQbpTkP}%;X@3Kp^xG zrO}Aw-ueeSTQ9rNz|zCOLreSZU^|&ii9c3Wd!+9pq3?1i)!#wy@(~1KhXXS9EP@*4 z=NcD6%UA#A01=vzXVtVg2PbJ=(M$6tORhuKdY;&V`pv56+-@jfG@wnOI_+Fy`dZ!5POfy+ z_a|1t_9hf*!M;y$H#x0Z_=}JJ&gy<^hyP&<^B?_#zs%cd4)f;y>GuMDK3e9ZpE74bL_`Fiv=lm_{;c!6cm03)`88$vg8ywg z`3GWz_*o36wpOAOnvDf+ae=7GM{b(ur>!NF?5Q$4Wa?0PER(OK%2GN|T)e>J*k))a zMs=x?Kl{3spizp6kG8gmzIoeMIaEerwm9X~2YOB14`>;w8*7LZ^se7w16`+q861u@ zE+85;QfYOEccem%R4V?_m8}|s z!rTC=6QAq4Q-T7nyx)hQpk~LL2(p@ZM2=~eZy2ppP4`pAE^rq>>;OApME7!A!O)HK z%C1-nqjgIiy*#J{3x=$+T<@MBQ*?EOTi9-)uiEgjsGs74ZEI_rD^U2%Hu;D|RUs<) zzno0txy0uumr0)9^!M;Q{`mTbL|sps6fCf*2uVS)Dvoa2W016@uoKcApOC(_)-A8-{ zM4&W+SBk0%vu2k=kAFbE%XUxd4wpu!MFUHe zYM;fGAp5>tjep*Fk|;)F1OtSI@iVTXqO{(9LEbY5T%zu<^;&hLrKKfnJ2S^@;(dC$RoI`B| zvRDcVdvs)KxRVCzSSki zcL?kxZ6!X!@;z6BX<-cNxz)~L;`2^#2VVW)CX+W%fK<_|l^CHO4SzHW)===l!Owa~ zDh9C)Ar-xw9~GQyf9%1b7G?y83QxNFy*-t@ltBq7C1E;>r~(p+@)NOUa;S zQeQMvW&ekWDm*04#p~9=d?fECCxWb{3TwDx^!XBolS{^N8kXF?V=$EBSjbht69=I* zp>Y>hLT`#Uo<#IFuF{N_W6=ajC?m5$JJb`kOkIn~Dkpw&vA`{bCYk;@C_C6ce~bFU z1Oy?`v5JN)*H5-=2UF>HneU=oFJm~YoTIS@Jw9`PqFTgFc8OMC%{)ENg?aS;DnAh@ za}hv6kkuuv2r5AWdlF_|zaoO;k?!?#Ku->|(FRL$vdPP*8EY^| z;HZY{f-2?;X#C@!STR}0#<#d)d89QcTzYBXx^BMMX-&iB=H_OAD2I*Xxju9dk)q~{ z>v3s{bI!%#6mR`u;|p71C2$e(#)@mfn5d(>!Ql%=3qW-3@?tMVXy_3$c9?8zcqGG9 z%|@%PW$T9vO{V*+gG84$hPcafT3xuIWU_(QpfxKzjy!L)dp~ApPsU&o=V*U3X}T|0 z_1M>%0gqo|nyO$#tcGF;KP^(ZsuK}4X(?h00*+Ummg16t06pL;yvp~Bu3bgI?sM=6fiqg;YrH97 zWSgeyJ^qAo6)vMum3kG61)@EnFb?+ci|gFVL1}p(TnNR@zOdya^+>X!;B$hjh|_#~ zXy-R24;TFVm=(Z3T<+$iPrL}ofzh1XOCnr!@T_$UTn0U6Y$HnURTPu(Mt~qRD%Cqn zFY@!zKjDwuZdHEk=UBBPWgt}&zX0NQ7rtKA2a4x&`*SW%zhSlGaDNgoJ0f=zf<6SmM zHyRz=lE(m5a2mie^y#IRR02y-n?2KtlXx3OLI$s;1ZItq6*Pgaw=U1?^#eP%Lwg*E zqP>XB>2dyWd7-iuXF3KZ}%y#j)$axdc8%LmArm){dcx^5Bgt#A%Cn~a3lFMmdW z;=e4%Y$QDW@l(xDuGzP|r%J8Sk&%&_(Vn`z9RpYN5B$7?VOPi+iFKk`XOEwb^io_N zSPZ4R6lquWi7`0AGhtjuarA2EK)R1{IEeUgV}mQz; z+kc|0hClt{Jnoh@O=#$e;2k^IcGaySseYo_4%GL-%B8mtwklhEOh?gZxWfRyK>{C8 zmF7BvZim0CpeBqSz88+DTt`ynalncND6*DNJO*S$cH0iu`tf^#Gh<7kdJR#wh8_}x z;w-gxj5@u{nu#;L&ex1LSxW;vdP31?qd~`ly{meCU(3by7$7^ysPV={#O8HzqOC3V zA!)rCaRG(yj9#-zmt3nYG0zSLYUMOw zO5(uPIEm0G7m7`WF=2d;zrR1qIMs>Pyl6>p&3A=`51K$w9a7Z*(RE|@d2CvP6sb_P zfq=yKULv!Lv$W4(QKYdZM2eRN_77Br^krg!^BuLL7Z@Uq3;~ znX}8q^&S#nC(YNI_W}w+jd~4jk+l~)&vWz+9|$YFerlN08R#hh#b0pS_w>` zQf`Hy+I`%W^aYESiWV%h|D3DHCSxcIA$A)d9is+V!8y`*FG4^f{`Dc;SdxJ*8tDz_ zgw=4^NwG*23e@o!JQVUr`Qk9Z;Dn*ar5a$iG|hiOki%1#g|uWvgXUaN=8em)IIM-u z<{{-#`0L2U5~Y}?qSBaDcmY6@^GQITSPk2pL~Fh{fCBizktfv=e;FomA;4OJKw!5X z82Z=Q0W%pSQ!;@066Qa5tjUjx=e^IHIQ9qRcr8xCAuFFE<5{f^teJe)hO z?=7@yxd#uhNrk_8501+RN5V$E`OhsWZe~n$#;YGdb8zNWK8$c&`M#y<8sAhDbbYe^ z)go9a0`vn!P3k*i>n=|NaVA~mXTJ)ixGd>@x>^23MMIXdvn7uj*)Vwqner$XeDkzY zCt=tYF@l7_7XfpWAKyV%Jn=WJHR8b;9}9j+sJI2ewYyZ;_u+n`O*R5C@6`$*Hyb>s?x{oic z-Mb0Hq@UlyuXM~Dze}asZ9ftN6n+NBY%)k6{;)|^;bV-4iId!e;5LuW(L7={rl9ODt?e(grQZ&O0+b%OF=U0oRTZrQLS0?gxS(K{G*+%Wy=)#k96(BZ^!B znWFE=umConIOFdgJt3<~F0s><`Z|U1??TY>WAI%7mCo9WKipLua8aXK(IVyLM@N^K zUHyblxDb?ZM*RW1_D2Axnv>R<*8@=+5uQMxfws38Kqz{dL+a-+Yr$=Jm|sjrgA`2W{Q+v_pW!61Ho6Xn=bLy*00rCz#Z3DcB z2y3sIJ()Jp^WDjHjrhbw1^{*avySZA_(+N)3g38Q0UE72?KFEm&{I9fs)Sb$e;{ha z7%51A>hRqzGRDoEXsx0d-UB)Z+kmgmDiNd~L+BEyuEof5Q_G-<{~k8=pyfI*wn^WV zE4ku|d%An|qDFbsaffh__*Mdm(pC$1uHhZ^H(#V_wV3S19x%ARez-}s%xC&TH2^D( zhLs~2=qSN~1o9<;`E1Q`rM!YUd+)wpi|`OT4YbQ^j6HRN>f;VIDLqI-UxZwO^${LC z6s@7eg`vgH6l8txlbi~^>bo4EqXvpmsj)>-ujcN+BHn}@#BEr8@@YCYk=c^elh ztbPC@qd^ibF7u-RiH&Y6M%A^0EDc}~6Sn!jxFYnTWmaG;I2xMs9N=sgmXRPkWr1A6 zg~{WbwRXZTvp=#kSApp$Z|2Wl6IKx_I;iI9{;Wc^yflr)AAb~rAM#upMsc(x-g}@E z<#=mf822f7+H%>TF#D#~bCSSOT*c7}N3*Y+UJVLuFwmQ|(YU)X@xrofE;|H1jDd3> zIIZ3S#7V)n_~3wIFP=;;SHW`orhh)LKw86Ok$!g22M62O7Motm1S+t=Be_?_?F)c(q8hI%WZInpeAWeI7|tG$)Yj(>cH)#zmkPA_{rP3_QCLR z10|UXGmo4e8GTol$nBZa_JCOCXbn7F5*8a93zTD;W-Ux}jD;|iNtn@caV)s4@CkPX zJx!pBhA9e`n=peue!J%#c0oablHFuQ1I)&NXB}dny?pud#h;fLwCchrE9iPBkSIt# zmJ3S+HtL^m=KRfc|MJC+@DS2nF%46Z4|KHu(ItO>&*u+}_OIU+`2)qh`Oe~eXK}u> g_;2nkcA1ydAG9X#r^!6QwM6LC-GRH9AH|&dZ?n}`pa1{> diff --git a/src/panel/__image_snapshots__/Request - fetching-landscape-snap.png b/src/panel/__image_snapshots__/Request - fetching-landscape-snap.png index 309592b7dbcdeabca955b76aa328316f802cb2a5..8a545124cf37a81a139d1b2273baae6232817646 100644 GIT binary patch literal 14123 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 WCIUCiNB@TfgWG4bH*5E)zy2FK*UudQ literal 6976 zcmeHMX;hO}8V*85r4d`J2nuOymFb~?R#|1SA})h~f&r1e85I&RI1mE_2o!}|{eCc*K`jin;>4_%IA4(_8|B$X6_FcY^TGWu#jE=CvNIwF4B_>C zpL%X8?roD?|Ni@VUCHpflI-~&d2#=aSV2SPd%z)BdHba|E1(Y}Q3hW?AIY$M=88CoYb2`}+KlND765o2K(E7S!Ku zutE>BQjthHc9AkZ?ROFfewoaoVFyH&KM;Ap=8kM^G&chTEG(uoia7=CMUBNvoBSBs4aQ(b6Jm zo-8H15*D`1H(Ogjvg=Hb%cxVU9LoF1n>SYsYLMiB)Q<|Ftwugd@DpX=ew=O9Hv(T_ zBKaMI8et0_p$uHLbX}9>8WB5CTh5~d2db5FgsghW12{amO)Qg9!3&Du>h5`M0X-bY zMIw=QAam&GXea4_`(-EwBbWQV>F>)Y{iY2NCkx1Npw*$Yv*DZLkF_vr+o>Di_Tc*oE(O4?6SSqcd1UK;nbPT4a z*lBBg1+1zrtFf^$b1M@hd4$8~@d8|3T_3y2dx_flLRZ3hjf&5vUbhP5b=tB+GBYzh z*besg0eC#V`{vGy#+a9WsE*4NoP@{CPkU2wvN0y8yVSMCBJJ&{ic{r=+;d*)7$d!N z_$qo@Kv(paX&ZnpTw%=pWF>iV5J3s5Kh4F^nD$cTinc2+GXNkjp^Z#zY7n}&9k^~g zJ_kCH;K4bRX0Cu;GvBjE{_VJ0t(M&Hv>{uTrQBbT4~MhWLOEJ4Vsc-+nDs?rAB<*+ zr>3e65h=AQl?u%zA?YzM?=xQA2=-Zs)thmH;Jbrl?vhx0|Imo2k_wLqtF zpX98^%#J-pB=#7m&15EzUNjLa_~A5}OlIbAHpFiC?#2EGtJiPmyk`<}6wB5uJZBGL z*~}hy-Qv|GFW6#cWNOYH0K`MV?6g#k^o%>%T|1j^cV0SRwrP{2RB4+!F49 zfgL2_(`XqP8G_cN`41+Y-yk1LsPm_A=~w;+!E^^Y^zYBMDJI=@%@bX>{Lhr&0_^PV zdDlMo7ZZlnVU#c?L#0+@;^Jyo8X8Jk=X=QQ?d=eh@WZK1VML9>SyEFk&URmnR45c& z;O>ksDv%ly1T@$VD{6I~@7g69%eAEf4dh=k-E~04)AO-f3JhAKpb;q-jZAo2KuePl(6wt4`a&sL@9kxdMT6Ungu6vhYAMqzRTJqH0K7=GL^f)T!D` zC91BYxgt^F1o6$D(AtQv@-{nA*IKwZCe+l|*M}v&x=u`zfeetEo15)p1qnkK_kTd} zy}=Z>wGAq*6$0v@cCt1K_m|VtnywN>o#k2AN~evsVIhFNy61e^>(}>Y z$2*J(ZOIe2&Sc@-(qH&MM?OH&PQ{bU2KK-*_ z0A+4{)Lf8<`&19JAbrUl27FaeU6h*nt1xgE=Pez+*8Y1Xs3IMgT_1ZX#kao z^CE8t;cBo%<^U z_KJMBlSpLzM3>W8va_?Z7+MqG>xzHfs?};4?a5aMSQP;(E`VJP<< zm(79loZ~bX78Na#3ew89w!N{#EM{ra#I156@W-}wW*>a*THeC+Ai1fjX}eEx;t`2U zLKu)yusgvn^3es*0#skVd^uUxJc$Oxw#SM>fN{~zZo?fX2bPraBs^7~GGasa$TzXb z-OAL*Ji4&j?sV5pl?=~T>-d-`2v!Ij6}v&!!B+7HBZw!AFfYLsRiz>T)7hc;uaE|Ni>pymL-@77z9l&%2ue`&+ zm|4pd%SXl7a4oIEEiCa1$U0P;He*}s3JVL-Ll4d=F50G)p9~JpZkGz^{M^Ic{672=V!RV*d}wn4H;DjwWN))!J+Zpc2Fz|opESDT-luv zqli1dgbj@#jPW3vtEze_%(CWsKy_2qhod{F#y#B-$Z=H;`D-+qCBRTaTS!0(Saa8DOY<$~r%9(eZ*WUp3EEc*k#57Iss1WH z5bbx#+IN$ZcavrA;-r$25<9$X2&#CP&KuU2r>aca4xvGBwa2k97l@EgYHVyQx4(Z^ zU#H_MP+~Yrwob#)Y1PawbH`Il4M4=TB2b6DZ+&^!%*+hke#w-M>R3Cw#_{g2SD|tv zOdQX%i|)IVte$R?OjVUxOl{M9-)bobh}B?-YyBT~albFb|E<1p+2S8O=`9CmIXFOR z{`J83AL*!;iM(!^R?D#~4ODQAs!8 PJnXQi&wlE@h;RN0>FL;ny6alZ52OP`y9hCMY{vv{fJ>Jj$_zoPyetAUeUR0v>Lw11^;OKEmlC^IDuh*#_Yb^ z_fvT0^kCGjp2e71QIG5Gzzv^`n%^1t?)kYq{qzm$TQ1x|~~mojH{ugxRd*`-O21!E{GsyYf9bc283Mw101~e;v8eTeV?a zJbdPxwHGg$oN5~>T<_B^CbC#;kx+WAG@L6Wl33oi%|kEXF>G6Bc!>^%%^lnP6vKXB zy#u>+X2lxp&h7dY*tYKIZF<&%f#A-Ljs%KK%sx>Q9@u;}-eRVrq@+aK?%EfsiGmuo zRg@);Ff-uGsKzNgi#nz+-sNr?6n4)i;Vs9_&OcOLy7SBv(3Nh zWZy;?lvm1*5e_NfDp+iW#cYjLos3SXGrSY1SM}j9G1exp^)YPK`t z+C*Am^?NlE>LZ6PE5yI_=TALfqc^|~Ca_`zYcp5F$qr=JD7_t^60~8g8h{*EJ39)W9y;9A1AsD=TXYA&A6z zHC;U$YaBZHR%#l_u_{s;eJ&u>PPxf5kDZdkV$mMIQo$dBC(?{r=&+IA8uC{+@jv9{ zhc?MlBQ7js6*lzic@##hj_l8{dKbHqj%*CR#-Z5R z`ZwWpoOfs6m3aO}3}gP7-t)wTP{M|oOL_n0CTy=hY|RgcU>RSogT#6D+4_I}C7%M# zr`|ughkCAsCfmqk;+FFp zj4%Ae8r~4j-R^b&QN+!!c3?w2@jidE?vH73EHWV~cuL=l&BcWej^w3Srm{7cy}SJ3 zVcshB=l($sBf6P=|A&9~A^zp3|MbRxJAgiI;ioP9*GkW)$oUjGpCaeqYu}%8=eFQ82k6zN~s-OJup$RWr#Iq-I zDfE_PUEXvtW4xaw4cqFN`Ht2us1wv4N;5dOcSNJ948vku4=d)=gc-Evl$|a?!@sC_ zKEJx!OeW?PhfKT?^8;jIvOR{LZ5!so6^eFZ^}|6w$xpE))udD{$p_mLr5BDyMnx4z zE>4OkC{pjbWtmBrMtDt|$)hZph(ysAwzI_TZ5bwdt*Lqp53*H?F103z z(qA{_Hrt{>7)VgTN9*(0491pJ*PsxkFR`W4H@h#qeOPy|lqch}q%PxaX-Vq-6`KSs z5-FRwJTcu@nkN(H7C=$U51?((|iBqwV# z^*z4tJo*zh+j>gHLg90jx|_4nYzs5VLT7NNgUJ|R{Wd+~{PlaGO;|nk^1Z5`LkB~9 z#+Ik3j1yj2$+AV7)H$0Z6^gs?lA{e|Em{vJDl*c*qv3{lE*94YEQ>p$B{S_W^J~4j zdYyYYN64m7LZ`aNGFW2IGXKGJ1&0H-xOeyxB+VPl}n98vfm!Pp^XV2w@ z2_al3bM5B+qfsmo(;Cm4a3Yy2UBPvm?L3i{GmRGpq#nOG}L{fE11hukWhb=Ij=FlqeIB za86c>KZVT-U?OoNQ^tN$0hx+27W1%KEv=vN`3-<;gtW3oYqxy}G3{h%2GL zOtT>PONX_joA8oJ=iol?Tuz~%v$JzS#rxk~BgT?XJUz9~AGUlTuu&soG{H8$dy_my z+ZsQKr~~tN@#BsEN=_@)hxWLoZnC+yk>d?CC#c;vYK2v&^{s4gt%LafCL>=rN;h77 zMVu zNW=#tD=?aQ{Do6~Rbqvx@49B*^@U9~8cuiHD;PDPY|cMfI(bQ8b^7_$lJfFYh3-KD z%gtO9o6BQATzQO9qWs|W)bba#l64X?N9l<(aVntGkYgk7-rSdwl9J*YKKzT>{L6L4 z5Uc}45$8l@&^h3@3Am*zxC3yqiD$d>PuL|=qsMgZ5*x-CPtt|335L^VOA$-7dxcgH>0o!?2+b z=8rFzQZMz@riX63Yz*nWu&^+y&RW`!g415F)`-M2AtfoQ?-|v_3lGw*Mboe$Y>2eJ zkx;bks;VmPB9&xy&z4LdOT}jg#7w#LR)zW`o^89WUpe2PZWuQGE_&gfR{Qf`)_mNM zkWL4?MEhNpXQ{lj-KW3xubBs4Znu%J(ZOg((hR*c7xd+^03}<_ z*MhpT1d(Ds{4cM@zNaNQUr@{MbB*GZ3Y%=L6SY;1&i}yVmzAHJ8K|7#aN41K6`y`_ z?a=Mrr)eIFu!}lbAwSO0WYXz@O2fQkPg>wm2WfrD+NdOiar%;v<{f*Gm#4cK&g!)# zfmTplZ0J(v+dMb?qVvt0L?paCQ_yNFaH|GIB+<9G22mU{3WAj3j z97-VMf}#VGj3l88#H=`VlbqaK_8oSyUWQ44qmPeIdPYWZFq_Vum%DUtZ5+dUfNQN4l- zb-sRm69lSJD8-CkFG?14iyImid!SAU_dWSh@g<+rUkumD4DCLFHej?l$uN9w=tYqp zHq>PHxZHa~*wlllf%M_MvsX%SGBHDzDWJ(DsPYs;^|OQq*IN@2EaO3)b@gmdPj-r# zJTfsc(cEsr%5=!sGX?@(lY;f!<><*Hl$IQa4AhfytE)wd0zseCTE~n%JBz&-bQ@)> zTd|sv=V{dHk$4O4UFDcdS zI8hzuM}z>^;A{uEsp%t%aa_CN-;jJhVaC71jQURd<{y()RQ7OS6uN1kh4+zT+>6&2by_zh1ZXP}5(&zg`4jEm2?K39P8{!(Xl& z1dq1?((!6fH%>DNaG$B+(V^pyJ>{ri;XW7CEW)N26}Uf_m6aWWp2OjA5Tbs4*Tyh< zX%4wXFRm%JqFzXpEZbzi1Mp>VuH}}|o;{wOIS$az%tql({OR6GexHvaQM@GWDhGtn zmT6{~n;CRalejdDP{7k^b-0=Noq9F>Gv7H{&c8$#0N8P&*wdlRw>J@b+pb0pf@|Wf z&$?$S4kkXZPaOvgX8kbGlaXD^GR**w20ppYHs&bYopuV(ZJ_)*1S~ds@S7(e14aX7AHzy?nvjyIBMm*x^=X z1UxICLV~QWPA8ld>?$-t&f43aiX9lqJn zPcaJ~*N!kQsN*J67jV`jsd$G=*$!lRp;aGBH`)#~Nqw#Yh}s3TH5AFTS8rWR)G9@_ zTg^#2h$-2p?%Iiq{~W9@L|Tp&xJG;@=w~vC-wDbQPLE(`*@jRs@p8nA`bf^=F*i52 z2%zpk?|;+b%U+lQaV{w>U9>$G6%_@zBL$x7etEgz(pFwy#pKKk!dVS*>Vhf`;_iT4 zR&-9#~jFpx|?PStQL0L4JmP4!1>kNIoMIM= zrp{a^CwM?aMghga7W-0zm&U$&9@8#M%|e(C&J=NJOJ18HQX`5lbUm(FdVk$6v97Kz z6P(6~<%!(lbFC?vG5lUccMZ_Jjg0OClwPB<>kuB#BC;4geYLdenJV2UPo9{uGlRJ= z*EyX94&V&|mTv6BU)J2xyfD#e=s!?lWNeHOIm24yyC;B|Iod_5R^SD{>!~4|jo;1; zrkh1@n{^B!RZ(Vu^XYxzLW`YF)-COiM@)5(**j~7**2)J>TXLjL|Vq;RFBuvx{KRp`;^2~aL=kKakyxA475syL!p(_Pb?k= zT3A>F!!6mrsJJ)5dGlIysnhe(_V)J3gdIny7&z0dyEd`o3!P33ghQXWlzRf*Lkog0 zN%|fQqnrRz6#AaYWTFQI^bYXc0e~oTKAtcN48FOq)CU>U1d`TF{uEsu}pp-9RMY*0nTX}mo{ zaQg+22!QafamPG7My%Pg)}A6O@!Shk@PfdTJqHgtF*SvpNGL&3u_P5fmP?(8D%8JsojZ zByZ_tUi=oNQmT98cBEBpJ#_nKlB4BkE&lpGXr%_!V92|t$e`xvCv#e zSpX}$ySuwKUUX7EO;!hco&&`Oy%nzr8kQ|=5j1P4m;F$AE^laxDuJ~kqM2qIcqYe* zk_|%?n^#9X8R++$uC8PSt?0SXelk>ibdeD6=5T@C{tEJ5*`Yl`Yc zAc#OcKKtgrU4*Egl?}aJbAfT1#IwGs&exobQrcT;4nyIO(ZcMc9_!I7Wijy4Mi*w(3bNm~`qw*j0%{Qw%$ zp})!o2rFefs3*F$R9U+^A~e?@9*&!N$GzIJ|}eXq}_!rntB`bOj_R-I-!4os~kUKtZ#I zZYjIa1|e4jQpO>QbqtkqKGQNH2$mL%+AwHUaA^rd$Tz6kI9hN@knCp1ubAgNlWu%G z9`omqjbtD7l!kw`^AjjRPa9k8N(U2+L5)Qv*3R9nG#y7G?k8(zF=A$dy#oRmY->Sf zG?b3$7s>e$WtO7pVx%%VS_?;^?ws09oKRr?@J zt)Tku+h4X5ZGCWXFnYHbw2CQBQD0@S7g7ZgZZ!0wx1mEqy|kymEp{P$T9W`0ID)&V zonIV&4#P|Hiq6NN6bZ~^(3a|E((i!eHFm?0jsWm7tN$zAW25(z9Q&pojU%xIOb$o5 zNL*gNYo!4KoB%Jg8X6ix2n2Ss4&_kL94=NOu`<2+Rla--6b-SOqt)VD zIf+X7qet5T97bQ6*fN`;+E!)b%37%w=L>}qc(x#J8X00U?PAc@9 zwcw;2gaj*UQKaJ|hhbu7hVEBB z7*>+YODPk{%PB;9IAh_(5uMpzM;o3f^F2{ew>){zDz3Z+?XY-hJ~kvz84EYuFb8T4 zwrbo#h*TT=x&JX8_Rl&^?ee`3!4}Y3s#jR1u}XcMtE#JuVaq|v6hC!P!iJnXF0IhD zgM;8QK=raq1X<|@a1Sp^Oc)^1G-zG&ecm1(9%yGN(uG`wJua{yIeDdgd^bpLP!OfF zAkL<3Kaz95uuva5NfU$sEr&`Cppq$IqClP=M}`iJniY@k1@&;ps*T41U{y{RwZf80 zypJG7A9W;9zL4%ZPS487vLKA-7t>qr+a(o2Rjjp^&b?4(BkRYB$W3|?^aF<3cJ9mi zIunAZufM;uw>M2&6}SjmGW1hzI~YRC9)1xE0^~U=8LYg5WmCAdk<#RmtJhWZ=+H?K z1gW)Vy?%XhFIgU|N#6L=DGoF~^jm;rN!s8cH7(7LKzgS@6$h<$6LOWxTu{Y2Y>#>wx`lg(z27h+H@WmF;klA&_Shh%Cg<~ zi6K2y|r%CgeooN z>d6dDnBgAM4`k^!z%VVTH1Qasmwy$m_s4Hc1M+kwLMCES02h?to}$76r#seRtEJI& zcLlbwNX~7PIQ67_#_&#}^T=eW?tZE<;!p3MZi3n$6$1o(5#YuLqJRW+1kq#q&hmjo zU{VMJAaKnEp_@t?=ntTQ0by0i&W;LtzFOxj^gg>pLG5fzC68_)s3gJB%S*o;uKU`D z6qu|H*pm)Gw)5@Vk{-4#tP=_;hrj}c=L=3IMKnvJ$rzbt!HDQe{UD-mY9km3Sw$Ir ze_hWJfqm3N@vyh6f_}xYElMB077T7$9MdD20Xh(h**F>tI6ZP5k)N^)#zuR7p(8K> zopTJRH}qjq-nt9^binjU+Q8xtBm&OciZY9|q%0c_9hqg0m+JlmHXoUnOIprFNA?C% zc&s&5tLZfCU7~!Qa`%&RW;!`$+N1LQ@4C$01&Q~ot1Vc|-Q_`?(w=efX`0bv0&@cE z)1(Jaim6+C5^!#$Ar7@-X*QJdA5;!}&j!CggA_k=$G>w9%8u4+{>R{Qc8}OX6IIhPP!_bew?{yK<|4zJ zF;E$tr0r7f-yUbeye;G6rS@v->d0wEx&f4d0|WxWTGY!JheSAwbPuFn2s_BcTOj^d zkycKnqS;P5vJ1gv6P!|7iw)f|Mpi`(cn?-*EH(nD@UNQ45x>HVzn_6fK+vnUwsuS; zeAj550>EZ$4Swlc;X4cy8AL98*euHnI`-sbGETr9wmV3#fj{r<Tlb|7LZ=gv^WdO2^p7zjc1*#i*zyrM6bS2ZL2wLHUNw{VQlfhf9 zyQ+5}bO?|O?J+tjq>}8SiMhy-%Gl%A5+fK)g@ZN$5{J4Vw}4Qq3ykPQ;hFF2M1!-Q zV=c*0tgMsJfB+gwK=>04Jc|bQ*v-_5W(J~p?LvMzE#`m%Ey%-JN@T7R=8;KvWQE0! z=9_wC^awNW>0k4iZ?ghq3-e-5E&0LSO_fqEFSxhb)AM5M9n0b~4$`G@Kmub`1M|Hs z#{A}M+_#XbCV^E0wWcQy;h=0t=v=MC?Pp3@hSs8Wtt=qDIUvCVGJAF*YRJ4qea z7r3V8G&HoCg^SC@}HUc*eo3FoH8&lGV@3exvEJ7mkbylj~$fcLyF)qZ>x zCZ06^aO5g5053GDfv7vcy|ak)0oDN}bqmaR+b5!8k6uTh)^g#sjjF-f10TN^jwV%t ztIap#!%&OCke~9~cFJ;=lxpJ3Ocbr((dtzf6_7ZZIkAq%P4ScH{=iEuXvuQ2rmS%? z(`U(g4OR8;@0`U&T$qXG3Zpsn*w*pSu$t11A*Vt^Ll;T40CsMu8GnPI1YDn6#kr=e zm5tCZ8ZDuNHR~EV@c>QD1FB461HKCN&}u4Em@Mr%B`NB#=`S8np0Uz&5w)b;P`B1* z6dccxjbzAfk!gYwF+Mdb10Pbrph$-5EX88`SW6vj=*id}`6(FtXa^3qOan4NhpjMx zE@f2~Lg&TYiIDd-0DyxrB_URqp6I8}j+- zEnZ(3d~^I)x&9Trf)%j?V}De;PLK@yjvfo?_|mV?Kj+bvw5oliuog!ZjRftrY6<#f zciT5+u-vCRk}6#cM=YkoHObX10esM+j>4LqY-Wo@L=sJ6$NmfxPpAq!)KKjNPKShT z@a@q#CQUPIEntwr4tUH~hxCtG3)HS1c(nm&xC78skmi=SkzB0pZKS5Es@e=XY${mo z;-PnxH>7E1s`rtTTtbiR=t&)iHkK=2Mc7|SN{g%JkItx%L;I}LRXJp#8>cN&mIOZV zA64ebj`o)rIh{A(84MMuvZ40pMbLE4L8_QdeuP7Q@~`HUAwd-%J^wwj z2&Q|Bb-dCllbAmr`4cCSf z3S{CK_v2wM(uvY6p&v{1fVTpZmKcHIkf)y_kCX{p%?NEY+tt+63-B~x}5QG%T~K8M-v0%G&XE#LQV(3?D*wy?9#ki&z9%& z-*p2gN^%LPUA*dtbQi%OflR9d#S>`(>l%=hjpkH}VXOiXY3TRpvp|VwVWtgfG@U&? zsb~xfbT_-8H}7Vtr`$rjjv}!YDbi5PPypE>y9nXZs;Pojq+kJkMllC^v|7Ik12U7KS~}AwT0qtTG!!DmqN+A;EP2y#(zDz%+(NMz?CC z1fH|ZTF}|YE5`qTi6hL%s{a7kZ~8EK@abtA&>##!VniLb7f9mvELiHSBk+6V-GFNK z09h@1?9$TGa~ChpUG$SeiRN}QQmJwWYe>d zfq*8TBq9MDDRHM|gcOZblL$?A{oRfjPluYDP^L*2ttHBv^uolYm;?)k2mroDc9Hh@COGF9XOk z7gRX*J+if04;yMkT@C=joIuF&!-}X=)z{Z=mxX}6o%ngpuJhu7BzVZAitj#ss_4ITwLgu!{Hq_A`!wbAe}Bqn cnuKvj@A^MJYl?Cmy3MZovUcEkdBT$+VUp6E!k^1p|bjUe-yY42h+NRCa!oOgS1^~=k|Ac z{h@H9DkC3LasK@|t+r4!pIDzDKCH2@Yg~B!bOZERXW-rh0|+X$NZA1Gu&IQgC+kh2 z&mOd_gErxv3-1!@$I>DQgo-#RkIO3$+Ot)yYDZ#hZEewL#I?CM>@~GCOGSQu`$L42 zQve#BnwrW?T$2AtHh|8UXNnQqwwl@P)({BM;lf zjY9RDCTP{t3Vt|pW$?h=5LT4nbdNFgsc<|6tz2yMDblWr=`0qjFj3wx#3G0uup%#B zq%AHk9?04NISpn=eQwBPGUZ)DQn6jbo3C+0Z-T|)6jLRlS z#vpE*ooN8gv7vcBZ1LXGxsZhE?~5zW$BSL6M^xLP{EW;`D(eU$3t`-$Dob^mz&>CY2w^0P^PX^{8yW{bR_ zh?lh#*i)+%NxQTHOb|A>K)3}q%Y*{YRO-g0k~ZiY4>x}D=Ds)~$>#AuK-0R-jux5+*_3MJd$ z_q_3+8~&wO{|y!WpkzG+dI%sr1bPU-A)(g-Jp}qH&=W!TgHf*qdI@~|vWou}1N!L%8Iv!mplI-#NylbdcXxO10neO$v^)Eo;=SfA zy8@tOlgQw8(pDquGR?{oKmTwHTwGin)>9ZF5D1jY3JNK<^S(dk@Z@r4*gmKw-N7zJ zNkfs~!fTV?3{~OWEuCW@V<;M>dNzv^e8+4*1BQ{SW5&vKRMI0}S)h+-ZIMNXC6jps z22#7+!|m(y+5f}LQQP498B#kYQO4wQx#(dQp+YI;^MAND-!}0n1Z8@B5fn5$w(uSB zE_x#5BMnMARs;Jnf&=$AE}YqBY@9_F4GaV{HZ~$+COai^Ib*YlO@G=p3&}0y>N(q> zy0Xdcf*@n$YBWjRSHuY6T(vxKRnkvmk~M1e3l#ZG){(grAu(MDXqYo^@e1aW*WfwD3@RDHoyGj7)Wc&lCgsB63Nd++sw7XnePN?*$( z@s;Eyj)|BWQGOSk3=ZZvFx?eebp(Drg^72k-^q4ud#W_h8?K=C+ zgc&{dMEzzjG7!5m#D|$oX3oCAxu)SH?TV;ETtsQYkd$1BOje$5ve)m6FP?JRyuUg4 zy&Ze%QNqMs$1k-}jY=MS=E>IfiBkZvvwiMW*>^1*c_@myPd#C+1y+OCGPkgx*VNQBtq2snTm(KMH1ylFTetA>@$~?T>k*eOm4RAMke0I~Tz_o2?hW!x zsW&CtCFv5k@DPG_XUB(XWCRNR_#IPj z2vLC6RY#<#sWHbcbUEgYJwR*JFe~wcZ+#8(A3n#)+`R=$DZ6|UhFGL7*F2|)9G|jlG$z_K*_j+b|_%@ z*%nl?OEUKy(qWd4&WV`cuyc^Ti(v&N9UH~RQWXSD{Yu}{M+f= znU{UIp+z}I!2mhrjXl+>EF}yEBVqY16&X7W$QTh7#Q?^i)%=jCLq|Ohhf{ZH@cjZa z$Vrpo87d2$5xF1Zp15SGqPj?NDB;19!=OmcxLkebBq0%FWBb4J$R1BozN_i^QfvsF z#Ll*u*C&w?3(bLITMmAq=H4sy3RO$rXjg=sv=3B#4?dHf-}q32uXrezmiW~dIwVX! zh7OE0_C%%&Tvb&C!;B`i1cuq#wH3fyFf$`BicJgad~h0MLs^Q{(CQ+G9h?=<&9K3I zEQN${bmYTmx&&O8!7zb5pBJ~bEcVCYaODA2k9ZYWB)jX;@jH^~(jvxSO}KwdOiX!j zL$$-Dfm3KSNG_(U2-$o#CIh;^@LwtJM-QQhTj{ zvbM|&ZM~kL8oNbrZf=I*67M`eW7maK-bHSWQ5;#FE+@JtR-}bq7|wMh2oo8lKnbl9 zrXJ=xL=H_|1uMtRcRBi_P$<{M0UQF?mH`Y`dgk&2gJd7iRhy-!VlPb#V0U-_fv%Y0 zNEVm0B=BDn5U~Ql4>X!PG7{_`eEGNzmhG0#zCd4@cs>I-wyKtf+`K$#b%!1O{wMxA zcFG2-iVI1LgS|B&Xmk%!n*=nEpK0j=S5#C0tlDe4@5vGp6Y<(L4dTMfzeND+HZwCb zLEa#a0L%ml@>^L_Sob9Xhjl-BBmJSaYsu9Uab-DrpHOO5_K{CXe_(h4TD06vT&rqM zOUpfU@wHJm;^OP?%y;iDYi(`q?QtLoSDPk`L7d*+?pmyUwcyQ*Y-vl1Vcg7UYjL3= zKXz1tz{yce6E(p?TR7pt*c=l@l*b0YR_G%})>mXECpF6tB2KsIalY(!cy$(U!f ztWi*~*wt|}De%Z?V`F0pv(L@&3Snchh#>r-K}Qqzk}wf$=Uc19cU8Jb;^N}C{!MfD z|9-!x(3N>E&uXCqI^X1?p+x`IQMW&7|=k^ zV1t%jUyYDI7JIQSPqeXT+brJ5ou7{G21^;e6v?(Ti$G>>t`qoC@ r+UQ#weQWcpTN}M#{9g&ifYy*6%!u=uto<1LHxGFnKY5ICH1zsU)EfRc diff --git a/src/panel/__image_snapshots__/Request - response-landscape-snap.png b/src/panel/__image_snapshots__/Request - response-landscape-snap.png index 7d7364407a5ba2dd1597e7fa12f87dd83a64623f..50f2e62ffa4af686da93c04b58f18a31737477bf 100644 GIT binary patch literal 17318 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 b5u^?mJsQgn=U!LDB2L_A_UDW}r+)Y!zd6Le literal 10154 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 diff --git a/src/panel/__image_snapshots__/Request - response-portrait-snap.png b/src/panel/__image_snapshots__/Request - response-portrait-snap.png index 6268f9e875e8f536451abdc8da8f83f71571c311..a0b7a7795c3869012a2be6156388b6c478077e03 100644 GIT binary patch literal 18496 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 diff --git a/src/panel/components/__snapshots__/Pane.test.tsx.snap b/src/panel/components/__snapshots__/Pane.test.tsx.snap index 2bd57291..79d9e9c8 100644 --- a/src/panel/components/__snapshots__/Pane.test.tsx.snap +++ b/src/panel/components/__snapshots__/Pane.test.tsx.snap @@ -2,6 +2,7 @@ exports[`on mount on landscape orientation matches snapshot 1`] = ` @@ -21,6 +23,7 @@ exports[`on mount on landscape orientation matches snapshot 1`] = ` exports[`on mount on portrait orientation matches snapshot 1`] = ` diff --git a/src/panel/pages/request/components/Fields.fixture.tsx b/src/panel/pages/request/components/Fields.fixture.tsx index 18164141..a7fc4aff 100644 --- a/src/panel/pages/request/components/Fields.fixture.tsx +++ b/src/panel/pages/request/components/Fields.fixture.tsx @@ -21,22 +21,26 @@ export default { object: , interface: ( - + ), enum: ( - + ), union: ( - + ), input: ( - + ), }; diff --git a/src/panel/pages/request/components/Schema.fixture.tsx b/src/panel/pages/request/components/Schema.fixture.tsx index 5a2678ea..c272e36b 100644 --- a/src/panel/pages/request/components/Schema.fixture.tsx +++ b/src/panel/pages/request/components/Schema.fixture.tsx @@ -145,7 +145,7 @@ const RequestProviderMock: FC>> = ({ export default { basic: ( - + ), }; diff --git a/src/panel/pages/request/components/Search.fixture.tsx b/src/panel/pages/request/components/Search.fixture.tsx index d3c5364f..bb405490 100644 --- a/src/panel/pages/request/components/Search.fixture.tsx +++ b/src/panel/pages/request/components/Search.fixture.tsx @@ -8,7 +8,7 @@ const setTypeMock = (type: any) => console.log(type); export default { basic: (
- +
), };