try_it_out.blade.php 24 KB

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