diff --git a/packages/web/src/components/request-workspace/index.ts b/packages/web/src/components/request-workspace/index.ts index bd0b569..dc90461 100644 --- a/packages/web/src/components/request-workspace/index.ts +++ b/packages/web/src/components/request-workspace/index.ts @@ -1,9 +1,30 @@ +// Model exports export { DEFAULT_REQUEST_WORKSPACE_TAB, isRequestWorkspaceTabId, REQUEST_WORKSPACE_TABS, type RequestWorkspaceTabId } from './model'; + +// Panel component exports +export { BodyPanel } from './panels/body'; +export { HeadersPanel } from './panels/headers'; +export { ParamsPanel } from './panels/params'; + +// Shared panel component exports +export { + DraftHeader, + ErrorBanner, + KeyValueTable +} from './panels/shared'; + +// Legacy panel component exports (re-exported from new locations) +export { + RequestWorkspaceBodyPanel, + RequestWorkspaceHeadersPanel, + RequestWorkspaceParamsPanel +} from './request-workspace-tab-panels'; +// Legacy exports (keep for backward compatibility) export { RequestWorkspaceTabs } from './request-workspace-tabs'; export { useRequestBodyDraftController } from './use-request-body-draft-controller'; export { useRequestHeaderDraftController } from './use-request-header-draft-controller'; diff --git a/packages/web/src/components/request-workspace/panels/body/file-editor.tsx b/packages/web/src/components/request-workspace/panels/body/file-editor.tsx new file mode 100644 index 0000000..2b94eb3 --- /dev/null +++ b/packages/web/src/components/request-workspace/panels/body/file-editor.tsx @@ -0,0 +1,59 @@ +import { Show } from 'solid-js'; +import type { FileBodyEditorProps } from './types'; + +export function FileBodyEditor(props: FileBodyEditorProps) { + return ( +
+
+ + +
+ + Unsaved + + + +
+
+ +
+ + props.onBodyFilePathChange(event.currentTarget.value)} + disabled={!props.hasRequest || props.bodyDraftSaving} + placeholder="./payload.json" + /> +
+
+ ); +} diff --git a/packages/web/src/components/request-workspace/panels/body/form-data-editor.tsx b/packages/web/src/components/request-workspace/panels/body/form-data-editor.tsx new file mode 100644 index 0000000..3e6cc94 --- /dev/null +++ b/packages/web/src/components/request-workspace/panels/body/form-data-editor.tsx @@ -0,0 +1,135 @@ +import { Index, Show } from 'solid-js'; +import type { FormDataEditorProps } from './types'; + +export function FormDataEditor(props: FormDataEditorProps) { + return ( +
+
+ + +
+ + Unsaved + + + +
+
+ +
+ + + + + + + + + + + + 0} + fallback={ + + + + } + > + + {(field, index) => ( + + + + + + + + )} + + + +
NameTypeValueFilenameActions
+ No form-data fields configured. +
+ + props.onBodyFormDataNameChange(index, event.currentTarget.value) + } + disabled={!props.hasRequest || props.bodyDraftSaving} + /> + + + + + props.onBodyFormDataValueChange(index, event.currentTarget.value) + } + placeholder={field().isFile ? './path/to/file' : 'value'} + disabled={!props.hasRequest || props.bodyDraftSaving} + /> + + + props.onBodyFormDataFilenameChange(index, event.currentTarget.value) + } + placeholder="optional" + disabled={!props.hasRequest || props.bodyDraftSaving || !field().isFile} + /> + + +
+
+
+ ); +} diff --git a/packages/web/src/components/request-workspace/panels/body/index.tsx b/packages/web/src/components/request-workspace/panels/body/index.tsx new file mode 100644 index 0000000..11bd653 --- /dev/null +++ b/packages/web/src/components/request-workspace/panels/body/index.tsx @@ -0,0 +1,86 @@ +import { Match, Show, Switch } from 'solid-js'; +import { ErrorBanner } from '../shared'; +import { FileBodyEditor } from './file-editor'; +import { FormDataEditor } from './form-data-editor'; +import { InlineBodyEditor } from './inline-editor'; +import type { BodyPanelProps } from './types'; + +export function BodyPanel(props: BodyPanelProps) { + const shouldShowDescription = () => + props.requestBodySummary.description !== 'Request includes an inline body payload.'; + + return ( +
+ + + +

{props.requestBodySummary.description}

+
+ + + Unsupported body kind: {props.requestBodySummary.kind} +

+ } + > + + + + + + + + + + + +
+
+ ); +} + +// Re-export types for backward compatibility +export type { + BodyPanelProps, + FileBodyEditorProps, + FormDataEditorProps, + InlineBodyEditorProps +} from './types'; diff --git a/packages/web/src/components/request-workspace/panels/body/inline-editor.tsx b/packages/web/src/components/request-workspace/panels/body/inline-editor.tsx new file mode 100644 index 0000000..9ee78da --- /dev/null +++ b/packages/web/src/components/request-workspace/panels/body/inline-editor.tsx @@ -0,0 +1,108 @@ +import { For, Show } from 'solid-js'; +import type { InlineBodyEditorProps } from './types'; + +export function InlineBodyEditor(props: InlineBodyEditorProps) { + return ( + +

Inline non-JSON body editing is not supported yet.

+ No inline body content was parsed.

} + > +
+              {props.requestBodySummary.text}
+            
+
+ + } + > +
+ 0}> +
+ {(warning) =>

{warning}

}
+
+
+ + + {(message) => ( + + )} + + +
+
+ + + +
+ +
+ + Unsaved + + + +
+
+ +