try_it_out.blade.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. @php
  2. use Knuckles\Scribe\Tools\Utils as u;
  3. /** @var \Knuckles\Camel\Output\OutputEndpointData $endpoint */
  4. @endphp
  5. <div class="sl-inverted">
  6. <div class="sl-overflow-y-hidden sl-rounded-lg">
  7. <form class="TryItPanel sl-bg-canvas-100 sl-rounded-lg"
  8. data-method="{{ $endpoint->httpMethods[0] }}"
  9. data-path="{{ $endpoint->uri }}"
  10. data-hasfiles="{{ $endpoint->hasFiles() ? 1 : 0 }}"
  11. data-hasjsonbody="{{ $endpoint->hasJsonBody() ? 1 : 0 }}">
  12. @if($endpoint->isAuthed() && $metadata['auth']['location'] !== 'body')
  13. <div class="sl-panel sl-outline-none sl-w-full expandable">
  14. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  15. role="button">
  16. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  17. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  18. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  19. data-icon="caret-down"
  20. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  21. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  22. <path fill="currentColor"
  23. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  24. </svg>
  25. </div>
  26. Auth
  27. </div>
  28. </div>
  29. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  30. <div class="ParameterGrid sl-p-4">
  31. <label aria-hidden="true"
  32. for="auth-{{ $endpoint->endpointId() }}">{{ $metadata['auth']['name'] }}</label>
  33. <span class="sl-mx-3">:</span>
  34. <div class="sl-flex sl-flex-1">
  35. <div class="sl-input sl-flex-1 sl-relative">
  36. <code>{{ $metadata['auth']['prefix'] }}</code>
  37. <input aria-label="{{ $metadata['auth']['name'] }}"
  38. id="auth-{{ $endpoint->endpointId() }}"
  39. data-component="{{ $metadata['auth']['location'] }}"
  40. data-prefix="{{ $metadata['auth']['prefix'] }}"
  41. name="{{ $metadata['auth']['name'] }}"
  42. placeholder="{{ $metadata['auth']['placeholder'] }}"
  43. class="auth-value sl-relative {{ $metadata['auth']['prefix'] ? 'sl-w-3/5' : 'sl-w-full sl-pr-2.5 sl-pl-2.5' }} sl-h-md sl-text-base sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border">
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. @endif
  50. @if(count($endpoint->headers))
  51. <div class="sl-panel sl-outline-none sl-w-full expandable">
  52. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  53. role="button">
  54. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  55. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  56. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  57. data-icon="caret-down"
  58. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  59. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  60. <path fill="currentColor"
  61. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  62. </svg>
  63. </div>
  64. Headers
  65. </div>
  66. </div>
  67. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  68. <div class="ParameterGrid sl-p-4">
  69. @foreach($endpoint->headers as $name => $example)
  70. @php
  71. if($endpoint->isAuthed() && $metadata['auth']['location'] === 'header' && $name === $metadata['auth']['name']) continue;
  72. @endphp
  73. <label aria-hidden="true"
  74. for="header-{{ $endpoint->endpointId() }}-{{ $name }}">{{ $name }}</label>
  75. <span class="sl-mx-3">:</span>
  76. <div class="sl-flex sl-flex-1">
  77. <div class="sl-input sl-flex-1 sl-relative">
  78. <input aria-label="{{ $name }}" name="{{ $name }}"
  79. id="header-{{ $endpoint->endpointId() }}-{{ $name }}"
  80. value="{{ $example }}" data-component="header"
  81. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border">
  82. </div>
  83. </div>
  84. @endforeach
  85. </div>
  86. </div>
  87. </div>
  88. @endif
  89. @if(count($endpoint->urlParameters))
  90. <div class="sl-panel sl-outline-none sl-w-full expandable">
  91. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  92. role="button">
  93. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  94. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  95. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  96. data-icon="caret-down"
  97. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  98. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  99. <path fill="currentColor"
  100. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  101. </svg>
  102. </div>
  103. URL Parameters
  104. </div>
  105. </div>
  106. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  107. <div class="ParameterGrid sl-p-4">
  108. @foreach($endpoint->urlParameters as $name => $parameter)
  109. <label aria-hidden="true"
  110. for="urlparam-{{ $endpoint->endpointId() }}-{{ $name }}">{{ $name }}</label>
  111. <span class="sl-mx-3">:</span>
  112. <div class="sl-flex sl-flex-1">
  113. <div class="sl-input sl-flex-1 sl-relative">
  114. <input aria-label="{{ $name }}" name="{{ $name }}"
  115. id="urlparam-{{ $endpoint->endpointId() }}-{{ $name }}"
  116. placeholder="{{ $parameter->description }}"
  117. value="{{ $parameter->example }}" data-component="url"
  118. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border">
  119. </div>
  120. </div>
  121. @endforeach
  122. </div>
  123. </div>
  124. </div>
  125. @endif
  126. @if(count($endpoint->queryParameters))
  127. <div class="sl-panel sl-outline-none sl-w-full expandable">
  128. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  129. role="button">
  130. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  131. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  132. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  133. data-icon="caret-down"
  134. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  135. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  136. <path fill="currentColor"
  137. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  138. </svg>
  139. </div>
  140. Query Parameters
  141. </div>
  142. </div>
  143. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  144. <div class="ParameterGrid sl-p-4">
  145. @foreach($endpoint->queryParameters as $name => $parameter)
  146. @php
  147. /** @var \Knuckles\Camel\Output\Parameter $parameter */
  148. if ($parameter->type == 'object') // Skip; individual object children are listed
  149. continue;
  150. if (str_contains($name, "[]"))
  151. // This likely belongs to an obj-array (eg objs[].a); we only show the parent (objs[]), so skip
  152. continue;
  153. if($endpoint->isAuthed() && $metadata['auth']['location'] === 'query'
  154. && $name === $metadata['auth']['name']) continue;
  155. @endphp
  156. <label aria-hidden="true"
  157. for="queryparam-{{ $endpoint->endpointId() }}-{{ $name }}">{{ $name }}</label>
  158. <span class="sl-mx-3">:</span>
  159. <div class="sl-flex sl-flex-1">
  160. <div class="sl-input sl-flex-1 sl-relative">
  161. @if(str_ends_with($parameter->type, '[]'))
  162. <input aria-label="{{ $name }}" name="{{ $name }}"
  163. id="queryparam-{{ $endpoint->endpointId() }}-{{ $name }}"
  164. placeholder="{{ $parameter->description }}"
  165. value="{{ json_encode($parameter->example) }}" data-component="query"
  166. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border"
  167. >
  168. @else
  169. <input aria-label="{{ $name }}" name="{{ $name }}"
  170. id="queryparam-{{ $endpoint->endpointId() }}-{{ $name }}"
  171. placeholder="{{ $parameter->description }}"
  172. value="{{ $parameter->example }}" data-component="query"
  173. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border"
  174. >
  175. @endif
  176. </div>
  177. </div>
  178. @endforeach
  179. </div>
  180. </div>
  181. </div>
  182. @endif
  183. @if(count($endpoint->bodyParameters))
  184. <div class="sl-panel sl-outline-none sl-w-full expandable">
  185. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  186. role="button">
  187. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  188. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  189. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  190. data-icon="caret-down"
  191. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  192. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  193. <path fill="currentColor"
  194. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  195. </svg>
  196. </div>
  197. Body
  198. </div>
  199. </div>
  200. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  201. @if($endpoint->hasJsonBody())
  202. <div class="TextRequestBody sl-p-4">
  203. <div class="code-editor language-json"
  204. id="json-body-{{ $endpoint->endpointId() }}"
  205. style="font-family: var(--font-code); font-size: 12px; line-height: var(--lh-code);"
  206. >{!! json_encode($endpoint->getSampleBody(), JSON_PRETTY_PRINT) !!}</div>
  207. </div>
  208. @else
  209. <div class="ParameterGrid sl-p-4">
  210. @foreach($endpoint->bodyParameters as $name => $parameter)
  211. @php
  212. /** @var \Knuckles\Camel\Output\Parameter $parameter */
  213. if ($parameter->type == 'object') // Skip; individual object children are listed
  214. continue;
  215. if (str_contains($name, "[]"))
  216. // This likely belongs to an obj-array (eg objs[].a); we only show the parent (objs[]), so skip
  217. continue;
  218. @endphp
  219. <label aria-hidden="true"
  220. for="bodyparam-{{ $endpoint->endpointId() }}-{{ $name }}">{{ $name }}</label>
  221. <span class="sl-mx-3">:</span>
  222. <div class="sl-flex sl-flex-1">
  223. <div class="sl-input sl-flex-1 sl-relative">
  224. @if($parameter->type == 'file')
  225. <input aria-label="{{ $name }}" name="{{ $name }}"
  226. id="bodyparam-{{ $endpoint->endpointId() }}-{{ $name }}"
  227. type="file" data-component="body"
  228. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border"
  229. >
  230. @elseif(str_ends_with($parameter->type, '[]'))
  231. <input aria-label="{{ $name }}" name="{{ $name }}"
  232. id="bodyparam-{{ $endpoint->endpointId() }}-{{ $name }}"
  233. placeholder="{{ $parameter->description }}"
  234. value="{{ json_encode($parameter->example) }}" data-component="body"
  235. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border"
  236. >
  237. @else
  238. <input aria-label="{{ $name }}" name="{{ $name }}"
  239. id="bodyparam-{{ $endpoint->endpointId() }}-{{ $name }}"
  240. placeholder="{{ $parameter->description }}"
  241. value="{{ $parameter->example }}" data-component="body"
  242. class="sl-relative sl-w-full sl-h-md sl-text-base sl-pr-2.5 sl-pl-2.5 sl-rounded sl-border-transparent hover:sl-border-input focus:sl-border-primary sl-border"
  243. >
  244. @endif
  245. </div>
  246. </div>
  247. @endforeach
  248. </div>
  249. @endif
  250. </div>
  251. </div>
  252. @endif
  253. <div class="SendButtonHolder sl-mt-4 sl-p-4 sl-pt-0">
  254. <div class="sl-stack sl-stack--horizontal sl-stack--2 sl-flex sl-flex-row sl-items-center">
  255. <button type="button" data-endpoint="{{ $endpoint->endpointId() }}"
  256. class="tryItOut-btn sl-button sl-h-sm sl-text-base sl-font-medium sl-px-1.5 sl-bg-primary hover:sl-bg-primary-dark active:sl-bg-primary-darker disabled:sl-bg-canvas-100 sl-text-on-primary disabled:sl-text-body sl-rounded sl-border-transparent sl-border disabled:sl-opacity-70"
  257. >
  258. {{ u::trans("scribe::try_it_out.send") }}
  259. </button>
  260. </div>
  261. </div>
  262. <div data-endpoint="{{ $endpoint->endpointId() }}"
  263. class="tryItOut-error expandable sl-panel sl-outline-none sl-w-full" hidden>
  264. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  265. role="button">
  266. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  267. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  268. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  269. data-icon="caret-down"
  270. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  271. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  272. <path fill="currentColor"
  273. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  274. </svg>
  275. </div>
  276. {{ u::trans("scribe::try_it_out.request_failed") }}
  277. </div>
  278. </div>
  279. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  280. <div class="sl-panel__content sl-p-4">
  281. <p class="sl-pb-2"><strong class="error-message"></strong></p>
  282. <p class="sl-pb-2">{{ u::trans("scribe::try_it_out.error_help") }}</p>
  283. </div>
  284. </div>
  285. </div>
  286. <div data-endpoint="{{ $endpoint->endpointId() }}"
  287. class="tryItOut-response expandable sl-panel sl-outline-none sl-w-full" hidden>
  288. <div class="sl-panel__titlebar sl-flex sl-items-center sl-relative focus:sl-z-10 sl-text-base sl-leading-none sl-pr-4 sl-pl-3 sl-bg-canvas-200 sl-text-body sl-border-input focus:sl-border-primary sl-cursor-pointer sl-select-none"
  289. role="button">
  290. <div class="sl-flex sl-flex-1 sl-items-center sl-h-lg">
  291. <div class="sl-flex sl-items-center sl-mr-1.5 expansion-chevrons expansion-chevrons-solid expanded">
  292. <svg aria-hidden="true" focusable="false" data-prefix="fas"
  293. data-icon="caret-down"
  294. class="svg-inline--fa fa-caret-down fa-fw sl-icon" role="img"
  295. xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
  296. <path fill="currentColor"
  297. d="M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z"></path>
  298. </svg>
  299. </div>
  300. {{ u::trans("scribe::try_it_out.received_response") }}
  301. </div>
  302. </div>
  303. <div class="sl-panel__content-wrapper sl-bg-canvas-100 children" role="region">
  304. <div class="sl-panel__content sl-p-4">
  305. <p class="sl-pb-2 response-status"></p>
  306. <pre><code class="sl-pb-2 response-content language-json"
  307. data-empty-response-text="<{{ u::trans("scribe::endpoint.responses.empty") }}>"
  308. style="max-height: 300px;"></code></pre>
  309. </div>
  310. </div>
  311. </div>
  312. </form>
  313. </div>
  314. </div>