UNPKG

@scalar/api-client

Version:

the open source API testing client

210 lines (209 loc) 8.83 kB
import { defineComponent as W, useAttrs as j, ref as i, computed as d, toRef as r, watch as H, createElementBlock as u, openBlock as n, Fragment as Q, createBlock as c, createCommentVNode as p, normalizeClass as G, unref as h, createElementVNode as w, toDisplayString as J, mergeProps as X, withKeys as b, withModifiers as $, createTextVNode as V, renderSlot as q } from "vue"; import { useCodeMirror as Y, useDropdown as Z, colorPicker as _ } from "@scalar/use-codemirror"; import { nanoid as ee } from "nanoid"; import oe from "../../views/Environment/EnvironmentVariableDropdown.vue.js"; import x from "../DataTable/DataTableInputSelect.vue.js"; import { pillPlugin as le, backspaceCommand as te } from "./codeVariableWidget.js"; import { useLayout as ne } from "../../hooks/useLayout.js"; const ae = { class: "whitespace-nowrap" }, re = ["id"], se = { key: 0, class: "z-context text-c-2 absolute right-1.5 bottom-1 hidden font-sans group-has-[:focus-visible]/input:block", role: "alert" }, ue = { key: 5, class: "centered-y text-orange absolute right-7 text-xs" }, ie = { key: 6, class: "centered-y absolute right-0 flex h-full items-center p-1.5 group-has-[.cm-focused]:z-1" }, de = { key: 7, class: "required centered-y text-xxs text-c-3 group-[.error]:text-red bg-b-1 pointer-events-none absolute right-0 mr-0.5 pt-px pr-2 opacity-100 shadow-[-8px_0_4px_var(--scalar-background-1)] transition-opacity duration-150 group-[.alert]:bg-transparent group-[.alert]:shadow-none group-[.error]:bg-transparent group-[.error]:shadow-none peer-has-[.cm-focused]:opacity-0" }, pe = { inheritAttrs: !1 }, he = /* @__PURE__ */ W({ ...pe, __name: "CodeInput", props: { colorPicker: { type: Boolean, default: !1 }, disabled: { type: Boolean, default: !1 }, modelValue: {}, error: { type: Boolean }, emitOnBlur: { type: Boolean, default: !0 }, extensions: { default: () => [] }, lineNumbers: { type: Boolean }, lint: { type: Boolean }, disableTabIndent: { type: Boolean, default: !1 }, language: {}, handleFieldSubmit: {}, handleFieldChange: {}, placeholder: {}, required: { type: Boolean }, disableEnter: { type: Boolean, default: !1 }, disableCloseBrackets: { type: Boolean, default: !1 }, enum: {}, examples: {}, type: {}, nullable: { type: Boolean, default: !1 }, withVariables: { type: Boolean, default: !0 }, importCurl: { type: Boolean }, default: {}, environment: {}, envVariables: {}, lineWrapping: { type: Boolean, default: !1 } }, emits: ["submit", "update:modelValue", "curl", "blur"], setup(R, { expose: A, emit: I }) { const o = R, s = I, B = j(), M = B.id || `id-${ee()}`, k = i(!1), y = i(!1), C = i(""), S = i({ left: 0, top: 0 }), f = i(null), { layout: g } = ne(); function D(e) { return e === o.modelValue ? null : o.importCurl && e.trim().toLowerCase().startsWith("curl") ? (s("curl", e), a.value?.dispatch({ changes: { from: 0, to: a.value.state.doc.length, insert: String(o.modelValue) } }), null) : o.handleFieldChange ? o.handleFieldChange(e) : s("update:modelValue", e); } function v(e) { return o.handleFieldSubmit ? o.handleFieldSubmit(e) : s("submit", e); } function P(e) { k.value = !1, o.emitOnBlur && o.modelValue && v(e), s("blur", e); } const E = [...o.extensions]; o.colorPicker && E.push(_); const N = d( () => le({ environment: o.environment, envVariables: o.envVariables, isReadOnly: g === "modal" }) ), O = d(() => [ ...E, N.value, te ]), F = i(null), { codeMirror: a } = Y({ content: r( () => o.modelValue !== void 0 ? String(o.modelValue) : "" ), onChange: (e) => { D(e), z(); }, onFocus: () => k.value = !0, onBlur: (e) => P(e), codeMirrorRef: F, disableTabIndent: r(() => o.disableTabIndent), disableEnter: r(() => o.disableEnter), disableCloseBrackets: r(() => o.disableCloseBrackets), lineNumbers: r(() => o.lineNumbers), language: r(() => o.language), lint: r(() => o.lint), extensions: O, placeholder: r(() => o.placeholder) }); a.value?.focus(), H(a, () => { a.value && Object.hasOwn(B, "autofocus") && a.value.focus(); }); const { handleDropdownSelect: K, updateDropdownVisibility: z } = Z({ codeMirror: a, query: C, showDropdown: y, dropdownPosition: S }), T = d( () => o.nullable ? ["true", "false", "null"] : ["true", "false"] ), m = (e, l) => { y.value ? e === "down" ? (l.preventDefault(), f.value?.handleArrowKey("down")) : e === "up" ? (l.preventDefault(), f.value?.handleArrowKey("up")) : e === "enter" && (l.preventDefault(), f.value?.handleSelect()) : e === "escape" ? o.disableTabIndent || l.stopPropagation() : e === "enter" && l.target instanceof HTMLDivElement && v(l.target.textContent ?? ""); }, L = d(() => Array.isArray(o.type) ? ( // Find the first type, that's not 'null' o.type.find((e) => e !== "null") ?? "string" ) : ( // If it's not an array, just return the type o.type )), U = d( () => y.value && o.withVariables && g !== "modal" && o.environment ); return A({ /** Expose focus method */ focus: () => { a.value?.focus(); }, // Expose these methods for testing handleChange: D, handleSubmit: v, handleBlur: P, booleanOptions: T, codeMirror: a, modelValue: o.modelValue }), (e, l) => (n(), u(Q, null, [ e.disabled ? (n(), u("div", { key: 0, class: G(["text-c-2 flex cursor-default items-center justify-center", h(g) === "modal" ? "font-code pr-2 pl-1 text-base" : "px-2"]), "data-testid": "code-input-disabled" }, [ w("span", ae, J(e.modelValue), 1) ], 2)) : o.enum && o.enum.length ? (n(), c(x, { key: 1, default: o.default, modelValue: e.modelValue, type: L.value, value: o.enum, "onUpdate:modelValue": l[0] || (l[0] = (t) => s("update:modelValue", t)) }, null, 8, ["default", "modelValue", "type", "value"])) : e.type === "boolean" || e.type?.includes("boolean") ? (n(), c(x, { key: 2, default: o.default, modelValue: e.modelValue, value: T.value, "onUpdate:modelValue": l[1] || (l[1] = (t) => s("update:modelValue", t)) }, null, 8, ["default", "modelValue", "value"])) : o.examples && o.examples.length ? (n(), c(x, { key: 3, default: o.default, modelValue: o.modelValue, value: o.examples, "onUpdate:modelValue": l[2] || (l[2] = (t) => s("update:modelValue", t)) }, null, 8, ["default", "modelValue", "value"])) : (n(), u("div", X({ key: 4, id: h(M) }, e.$attrs, { ref_key: "codeMirrorRef", ref: F, class: ["group/input group-[.alert]:outline-orange group-[.error]:outline-red font-code peer relative w-full overflow-hidden text-xs leading-[1.44] whitespace-nowrap -outline-offset-1 has-[:focus-visible]:rounded-[4px] has-[:focus-visible]:outline", { "line-wrapping has-[:focus-visible]:bg-b-1 has-[:focus-visible]:absolute has-[:focus-visible]:z-1": e.lineWrapping, "flow-code-input--error": e.error }], onKeydown: [ l[3] || (l[3] = b($((t) => m("down", t), ["stop"]), ["down"])), l[4] || (l[4] = b((t) => m("enter", t), ["enter"])), l[5] || (l[5] = b((t) => m("escape", t), ["escape"])), l[6] || (l[6] = b($((t) => m("up", t), ["stop"]), ["up"])) ] }), [ e.disableTabIndent ? p("", !0) : (n(), u("div", se, [...l[7] || (l[7] = [ V(" Press ", -1), w("kbd", { class: "-mx-0.25 rounded border px-0.5 font-mono" }, "Esc", -1), V(" then ", -1), w("kbd", { class: "-mx-0.25 rounded border px-0.5 font-mono" }, "Tab", -1), V(" to exit ", -1) ])])) ], 16, re)), e.$slots.warning ? (n(), u("div", ue, [ q(e.$slots, "warning", {}, void 0, !0) ])) : p("", !0), e.$slots.icon ? (n(), u("div", ie, [ q(e.$slots, "icon", {}, void 0, !0) ])) : p("", !0), e.required ? (n(), u("div", de, " Required ")) : p("", !0), U.value ? (n(), c(oe, { key: 8, ref_key: "dropdownRef", ref: f, dropdownPosition: S.value, envVariables: e.envVariables, environment: e.environment, query: C.value, onSelect: h(K) }, null, 8, ["dropdownPosition", "envVariables", "environment", "query", "onSelect"])) : p("", !0) ], 64)); } }); export { he as default };