Release 2.16.1
This commit is contained in:
1 parent
3514d514a3
commit
8ce8228091
25 files changed
+1307
-613
No files matched your search
@@ -1,50 +1,67 @@
|
||||
{{#*inline "api-request-card"}}
|
||||
<div class="card card-outline card-secondary mt-3" data-api-request-card data-request-id="{{id}}">
|
||||
<div class="card-header bg-body-tertiary d-flex align-items-center">
|
||||
<h3 class="card-title mb-0 me-2 text-break" data-api-request-title>Request - {{name}}</h3>
|
||||
<div class="card-tools d-flex align-items-center ms-auto me-0 flex-shrink-0">
|
||||
<button type="button" class="btn btn-sm btn-outline-danger" data-api-request-remove {{#if inUse}}data-request-protected disabled title="This request is used by slides"{{else if id}}{{#unless (hasPermission currentUser 'api-sources.delete')}}data-request-protected disabled{{/unless}} title="Delete request"{{else}}title="Delete request"{{/if}} aria-label="Delete request"><i class="bi bi-trash me-1" aria-hidden="true"></i>Delete</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row g-3">
|
||||
<div class="col-12 col-lg-9"><label class="form-label w-100">Request name<input class="form-control" data-request-field="name" value="{{name}}" maxlength="255" required /></label></div>
|
||||
<div class="col-12 col-lg-3 d-flex align-items-end"><label class="form-check form-switch d-flex align-items-center gap-2 ps-0 py-2 mb-2"><input type="checkbox" class="form-check-input float-none ms-0 mt-0 flex-shrink-0" data-request-field="enabled" {{#if enabled}}checked{{/if}} /><span class="form-check-label">Enabled</span></label></div>
|
||||
<div class="col-12 col-lg-9"><label class="form-label w-100">API URL<input type="url" class="form-control" data-request-field="api_url" value="{{api_url}}" maxlength="1024" required /></label></div>
|
||||
<div class="col-12 col-lg-3"><label class="form-label w-100">Request method<select class="form-select" data-request-field="request_method"><option value="GET" {{#if (eq request_method 'GET')}}selected{{/if}}>GET</option><option value="POST" {{#if (eq request_method 'POST')}}selected{{/if}}>POST</option></select></label></div>
|
||||
<div class="col-12" data-api-request-body-section {{#unless (eq request_method 'POST')}}hidden{{/unless}}><label class="form-label w-100">JSON request body<textarea class="form-control font-monospace" rows="4" data-request-field="request_body_json" spellcheck="false">{{request_body_json}}</textarea></label></div>
|
||||
<div class="col-12 col-lg-6"><label class="form-label w-100">Items path<input class="form-control" data-request-field="items_path" value="{{items_path}}" maxlength="255" placeholder="data, items, or results.data" /></label></div>
|
||||
<div class="col-6 col-lg-3"><label class="form-label w-100">Update interval<input type="number" min="1" class="form-control" data-request-field="update_interval_value" value="{{update_interval_value}}" required /></label></div>
|
||||
<div class="col-6 col-lg-3"><label class="form-label w-100">Unit<select class="form-select" data-request-field="update_interval_unit"><option value="seconds" {{#if (eq update_interval_unit 'seconds')}}selected{{/if}}>Seconds</option><option value="minutes" {{#if (eq update_interval_unit 'minutes')}}selected{{/if}}>Minutes</option><option value="hours" {{#if (eq update_interval_unit 'hours')}}selected{{/if}}>Hours</option></select></label></div>
|
||||
</div>
|
||||
{{#if id}}
|
||||
<section class="mt-3 border-top pt-3" data-api-request-response aria-label="Latest response">
|
||||
<div class="d-flex align-items-center justify-content-between flex-wrap gap-2 mb-3">
|
||||
<h4 class="h6 mb-0">Latest response{{#if last_response_status}} <span class="badge text-bg-secondary ms-1">HTTP {{last_response_status}}</span>{{/if}}</h4>
|
||||
{{#if lastResponseJson}}
|
||||
<div class="btn-group btn-group-sm" role="group" aria-label="Response JSON actions">
|
||||
<button type="button" class="btn btn-outline-secondary" data-json-toggle-collapse-all><i class="bi bi-arrows-collapse me-1" aria-hidden="true"></i>Collapse all</button>
|
||||
<button type="button" class="btn btn-outline-secondary" data-json-toggle-expand-all><i class="bi bi-arrows-expand me-1" aria-hidden="true"></i>Expand all</button>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if last_pull_error}}<div class="alert alert-warning text-break">{{last_pull_error}}</div>{{/if}}
|
||||
<dl class="row mb-3"><dt class="col-12 col-md-3">Last pulled</dt><dd class="col-12 col-md-9">{{#if lastPulledAtValue}}<time data-local-datetime datetime="{{lastPulledAtValue}}">{{lastPulledAtValue}}</time>{{else}}Never{{/if}}</dd><dt class="col-12 col-md-3">Content type</dt><dd class="col-12 col-md-9 text-break">{{last_response_content_type}}</dd></dl>
|
||||
{{#if lastResponseJson}}<div data-json-toggle-panel><script type="application/json" data-json-toggle-source>{{json lastResponseJson}}</script><div class="small bg-body-tertiary border rounded p-3 font-monospace" style="white-space:pre-wrap;overflow-wrap:anywhere" data-json-toggle-output>{{lastResponseJson}}</div></div>{{else}}<p class="text-body-secondary mb-0">No JSON response is stored yet.</p>{{/if}}
|
||||
</section>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="card-footer d-flex gap-2 flex-wrap">
|
||||
<button type="button" class="btn btn-outline-primary" data-api-source-test-url="{{#if groupId}}/data-sources/api-sources/{{groupId}}/test{{else}}/data-sources/api-sources/test{{/if}}"><i class="bi bi-plug me-1" aria-hidden="true"></i>Test Connection</button>
|
||||
{{#if id}}{{#if (hasPermission currentUser 'api-sources.allow')}}<button type="button" class="btn btn-outline-secondary" data-manual-refresh-url="/data-sources/api-sources/{{groupId}}/requests/{{id}}/refresh" {{#unless enabled}}disabled{{/unless}}><i class="bi bi-arrow-clockwise me-1" aria-hidden="true"></i>Refresh now</button>{{/if}}{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/inline}}
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<h2>{{#if isEdit}}Edit API source - {{apiSource.name}}{{else}}Add API source{{/if}}</h2>
|
||||
<p>{{#if isEdit}}Adjust the endpoint or refresh cadence and review the latest JSON response.{{else}}Adjust the endpoint or refresh cadence for this API source.{{/if}}</p>
|
||||
<p>{{#if isEdit}}Manage shared authentication, request URLs, and latest responses.{{else}}Configure shared authentication and the requests for this API source.{{/if}}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if isEdit}}<form id="api-source-toggle-form" method="post" action="/data-sources/api-sources/{{apiSource.id}}" data-async-command><input type="hidden" name="data_source_action" value="toggle" /></form>{{/if}}
|
||||
|
||||
<div class="row g-3 align-items-start api-source-layout">
|
||||
<div class="col-12">
|
||||
<form id="api-source-form" method="post" action="{{formAction}}" {{{formAttrs}}}>
|
||||
<input type="hidden" name="requests_json" value="{{requestsJson}}" />
|
||||
<div class="card card-outline card-primary admin-form-card">
|
||||
<div class="card-header bg-body-tertiary">
|
||||
<h3 class="card-title">Connection</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row g-3 g-md-3">
|
||||
<div class="col-12 col-lg-5">
|
||||
<div class="col-12 col-lg-8">
|
||||
<label for="api-source-name" class="form-label">Name</label>
|
||||
<input id="api-source-name" name="name" class="form-control" value="{{apiSource.name}}" maxlength="128" data-limit-text-length required />
|
||||
</div>
|
||||
<div class="col-12 col-lg-5">
|
||||
<label for="api-source-url" class="form-label">API URL</label>
|
||||
<input id="api-source-url" name="api_url" type="url" class="form-control" value="{{apiSource.apiUrl}}" maxlength="1024" data-limit-text-length placeholder="https://example.com/api.json" required />
|
||||
</div>
|
||||
<div class="col-12 col-lg-2">
|
||||
<label for="api-source-request-method" class="form-label">Request method</label>
|
||||
<select id="api-source-request-method" name="request_method" class="form-select" data-api-source-request-method>
|
||||
<option value="GET" {{#if (eq apiSource.requestMethod 'GET')}}selected{{/if}}>GET</option>
|
||||
<option value="POST" {{#if (eq apiSource.requestMethod 'POST')}}selected{{/if}}>POST</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-3 mb-2" data-api-source-request-section>
|
||||
<h4 class="api-source-section-heading">Request</h4>
|
||||
<div class="row g-3 align-items-end">
|
||||
<div class="col-12">
|
||||
<div class="form-text mb-2">POST requests use JSON with the existing authentication settings.</div>
|
||||
<textarea id="api-source-request-body" name="request_body_json" class="form-control font-monospace" rows="5" data-api-source-request-body placeholder="{ "ids": [1, 2, 3] }" spellcheck="false">{{apiSource.requestBodyJson}}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-3 mb-2">
|
||||
<h4 class="api-source-section-heading">Access and parsing</h4>
|
||||
<div class="row g-3 align-items-end">
|
||||
<div class="col-12 col-md-4">
|
||||
<div class="col-12 col-lg-4">
|
||||
<label for="api-source-auth-method" class="form-label">Auth method</label>
|
||||
<select id="api-source-auth-method" name="auth_method" class="form-select" data-api-source-auth-method>
|
||||
<option value="none" {{#if (eq apiSource.authMethod 'none')}}selected{{/if}}>None</option>
|
||||
@@ -54,41 +71,19 @@
|
||||
<option value="token_login" {{#if (eq apiSource.authMethod 'token_login')}}selected{{/if}}>Login then token</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 col-md-8">
|
||||
<label for="api-source-items-path" class="form-label">Items path</label>
|
||||
<input id="api-source-items-path" name="items_path" class="form-control" value="{{apiSource.itemsPath}}" maxlength="255" data-limit-text-length placeholder="items, results.data, or another array path" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-8 offset-md-4">
|
||||
<div class="form-text">Optional. Use dot notation to change the default base for placeholders.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="api-source-section-heading">Refresh</h4>
|
||||
<div class="row g-3">
|
||||
<div class="col-12 col-md-4">
|
||||
<label for="api-source-interval" class="form-label">Update interval</label>
|
||||
<input id="api-source-interval" name="update_interval_value" type="number" min="1" class="form-control" value="{{apiSource.updateIntervalValue}}" required />
|
||||
</div>
|
||||
<div class="col-12 col-md-4">
|
||||
<label for="api-source-interval-unit" class="form-label">Unit</label>
|
||||
<select id="api-source-interval-unit" name="update_interval_unit" class="form-select">
|
||||
<option value="seconds" {{#if (eq apiSource.updateIntervalUnit 'seconds')}}selected{{/if}}>Seconds</option>
|
||||
<option value="minutes" {{#if (eq apiSource.updateIntervalUnit 'minutes')}}selected{{/if}}>Minutes</option>
|
||||
<option value="hours" {{#if (eq apiSource.updateIntervalUnit 'hours')}}selected{{/if}}>Hours</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="card-footer d-flex align-items-center justify-content-between row-gap-2 flex-wrap">
|
||||
<div class="d-flex align-items-center flex-wrap gap-2 me-2">
|
||||
<button type="button" class="btn btn-outline-primary" data-api-auth-test-url="{{#if isEdit}}/data-sources/api-sources/{{apiSource.id}}/auth-test{{else}}/data-sources/api-sources/auth-test{{/if}}"><i class="bi bi-shield-check me-1" aria-hidden="true"></i>Test Authentication</button>
|
||||
<button type="button" class="btn btn-primary" data-api-request-add><i class="bi bi-plus-lg me-1" aria-hidden="true"></i>Add request</button>
|
||||
</div>
|
||||
<div class="d-flex align-items-center justify-content-end flex-wrap ms-auto">
|
||||
{{{saveActionButtons formId="api-source-form" saveUrl=formAction cancelUrl=cancelUrl deleteUrl=deleteUrl deleteDisabled=deleteDisabled showSaveAndClose=showSaveSecondaryActions showSaveAndNew=showSaveSecondaryActions}}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex justify-content-end align-items-center">
|
||||
<div class="me-auto">{{#if isEdit}}{{#if (hasPermission currentUser "api-sources.update")}}<button type="submit" form="api-source-toggle-form" data-async-data-source-toggle data-enabled="{{#if apiSource.enabled}}true{{else}}false{{/if}}" class="btn {{#if apiSource.enabled}}btn-danger{{else}}btn-success{{/if}}"><i class="bi {{#if apiSource.enabled}}bi-pause-fill{{else}}bi-play-fill{{/if}} me-1" aria-hidden="true"></i>{{#if apiSource.enabled}}Disable{{else}}Enable{{/if}}</button>{{/if}} {{#if (hasPermission currentUser "api-sources.allow")}}<button type="button" data-manual-refresh-url="/data-sources/api-sources/{{apiSource.id}}/refresh" class="btn btn-outline-secondary"><i class="bi bi-arrow-clockwise me-1" aria-hidden="true"></i>Refresh now</button>{{/if}}{{/if}}</div>
|
||||
{{{saveActionButtons formId="api-source-form" saveUrl=formAction cancelUrl=cancelUrl deleteUrl=deleteUrl deleteDisabled=deleteDisabled showSaveAndClose=showSaveSecondaryActions showSaveAndNew=showSaveSecondaryActions}}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card card-outline card-info admin-form-card mt-3 overflow-hidden api-source-auth-card{{#if isEdit}} collapsed-card{{/if}}" data-api-source-auth-card hidden>
|
||||
<div class="card card-outline card-info admin-form-card mt-3 overflow-hidden api-source-auth-card collapsed-card" data-api-source-auth-card hidden>
|
||||
<div class="card-header bg-body-tertiary d-flex align-items-center">
|
||||
<h3 class="card-title mb-0">Authentication</h3>
|
||||
<div class="card-tools d-flex align-items-center ms-auto me-0 flex-shrink-0">
|
||||
@@ -99,9 +94,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-4" data-api-source-auth-details-section>
|
||||
<h4 class="api-source-section-heading">Authentication details</h4>
|
||||
<div class="row g-3 mb-3" data-api-source-auth-panel="basic" hidden>
|
||||
<div data-api-source-auth-details-section>
|
||||
<div class="row g-3" data-api-source-auth-panel="basic" hidden>
|
||||
<div class="col-12 col-md-6">
|
||||
<label for="api-source-auth-username" class="form-label">Username</label>
|
||||
<input id="api-source-auth-username" name="auth_username" class="form-control" value="{{apiSource.authUsername}}" maxlength="255" data-limit-text-length autocomplete="username" />
|
||||
@@ -111,7 +105,7 @@
|
||||
<input id="api-source-auth-password" name="auth_password" type="password" class="form-control" value="{{apiSource.authPassword}}" maxlength="255" data-limit-text-length autocomplete="current-password" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3 mb-3" data-api-source-auth-panel="bearer" hidden>
|
||||
<div class="row g-3" data-api-source-auth-panel="bearer" hidden>
|
||||
<div class="col-12">
|
||||
<label for="api-source-auth-bearer-token" class="form-label">Bearer token</label>
|
||||
<div class="input-group">
|
||||
@@ -122,7 +116,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3 mb-3" data-api-source-auth-panel="api_key_header" hidden>
|
||||
<div class="row g-3" data-api-source-auth-panel="api_key_header" hidden>
|
||||
<div class="col-12 col-md-5">
|
||||
<label for="api-source-auth-header-name" class="form-label">Header name</label>
|
||||
<input id="api-source-auth-header-name" name="auth_header_name" class="form-control" value="{{apiSource.authHeaderName}}" maxlength="255" data-limit-text-length placeholder="X-API-Key" />
|
||||
@@ -132,7 +126,7 @@
|
||||
<input id="api-source-auth-header-value" name="auth_header_value" class="form-control" value="{{apiSource.authHeaderValue}}" maxlength="255" data-limit-text-length />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3 mb-3" data-api-source-auth-panel="token_login" hidden>
|
||||
<div class="row g-3" data-api-source-auth-panel="token_login" hidden>
|
||||
<div class="col-12 col-md-8">
|
||||
<label for="api-source-token-url" class="form-label">Login / token URL</label>
|
||||
<input id="api-source-token-url" name="token_url" type="url" class="form-control" value="{{apiSource.tokenUrl}}" maxlength="1024" placeholder="https://example.com/login" />
|
||||
@@ -172,56 +166,25 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div data-api-request-list>
|
||||
{{#each apiRequests}}{{> api-request-card groupId=../apiSource.id currentUser=../currentUser}}{{/each}}
|
||||
</div>
|
||||
<template data-api-request-template>{{#with newRequest}}{{> api-request-card groupId=../apiSource.id currentUser=../currentUser}}{{/with}}</template>
|
||||
<section class="card card-outline card-info admin-form-card mt-3" data-api-source-diagnostics hidden aria-labelledby="api-source-diagnostics-title" aria-busy="false">
|
||||
<div class="card-header bg-body-tertiary d-flex align-items-center row-gap-2 flex-wrap">
|
||||
<h3 id="api-source-diagnostics-title" class="card-title mb-0 me-2">Connection test</h3>
|
||||
<div class="card-tools d-flex align-items-center gap-2 ms-auto me-0 flex-shrink-0">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" data-api-source-copy-report disabled><i class="bi bi-clipboard me-1" aria-hidden="true"></i>Copy diagnostic report</button>
|
||||
<button type="button" class="btn btn-tool p-0 m-0" data-api-source-dismiss-diagnostics aria-label="Dismiss connection test" title="Dismiss connection test"><i class="bi bi-x-lg" aria-hidden="true"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p data-api-source-test-status role="status" class="mb-2"></p>
|
||||
<div data-api-source-test-results></div>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="card card-outline card-secondary api-source-response-card" id="api-source-response-panel">
|
||||
<div class="card-header bg-body-tertiary d-flex align-items-center">
|
||||
<h3 class="card-title mb-0">Latest response</h3>
|
||||
{{#if lastResponseJson}}
|
||||
<div class="btn-group btn-group-sm ms-auto" role="group" aria-label="JSON tree actions">
|
||||
<button type="button" class="btn btn-outline-secondary" data-json-toggle-collapse-all>
|
||||
<i class="bi bi-arrows-collapse me-1"></i>
|
||||
Collapse all
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-secondary" data-json-toggle-expand-all>
|
||||
<i class="bi bi-arrows-expand me-1"></i>
|
||||
Expand all
|
||||
</button>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{#if lastPullError}}
|
||||
<div class="alert alert-warning">{{lastPullError}}</div>
|
||||
{{/if}}
|
||||
<dl class="row">
|
||||
<dt class="col-12 col-md-3">Last pulled</dt>
|
||||
<dd class="col-12 col-md-9">
|
||||
{{#if apiSource.lastPulledAtValue}}
|
||||
<time data-local-datetime datetime="{{apiSource.lastPulledAtValue}}">{{#if apiSource.lastPulledAtLabel}}{{apiSource.lastPulledAtLabel}}{{else}}{{apiSource.lastPulledAtValue}}{{/if}}</time>
|
||||
{{else}}
|
||||
-
|
||||
{{/if}}
|
||||
</dd>
|
||||
|
||||
<dt class="col-12 col-md-3">Status</dt>
|
||||
<dd class="col-12 col-md-9">{{#if apiSource.lastResponseStatus}}{{apiSource.lastResponseStatus}}{{else}}-{{/if}}</dd>
|
||||
|
||||
<dt class="col-12 col-md-3">Content type</dt>
|
||||
<dd class="col-12 col-md-9">{{#if apiSource.lastResponseContentType}}{{apiSource.lastResponseContentType}}{{else}}-{{/if}}</dd>
|
||||
</dl>
|
||||
{{#if lastResponseJson}}
|
||||
<div data-json-toggle-panel>
|
||||
<script type="application/json" data-json-toggle-source>{{json lastResponseJson}}</script>
|
||||
<div class="mb-0 small bg-body-tertiary border rounded p-3 font-monospace" style="white-space: pre-wrap; word-break: break-word;" data-json-toggle-output>{{lastResponseJson}}</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="alert alert-secondary mb-0">No JSON response is stored yet.</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/assets/js/data-sources/api-source-form.js?v={{appVersion}}"></script>
|
||||
@@ -1,7 +1,7 @@
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<h2>API sources</h2>
|
||||
<p>Store API endpoints, refresh cadence, and the latest JSON response pulled from each endpoint.</p>
|
||||
<p>Manage API sources, shared authentication, and request refresh schedules.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -23,11 +23,9 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-table-sort-key="name">Name</th>
|
||||
<th data-table-sort-key="url">API URL</th>
|
||||
<th data-table-sort-key="interval">Refresh interval</th>
|
||||
<th>Authentication</th>
|
||||
<th data-table-sort-key="requests">Requests</th>
|
||||
<th data-table-sort-key="last_pulled">Last pulled</th>
|
||||
<th data-table-sort-key="last_response">Last response</th>
|
||||
<th>Status</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -36,8 +34,8 @@
|
||||
{{#each apiSources}}
|
||||
<tr data-table-search-row>
|
||||
<td data-label="Name">{{name}}</td>
|
||||
<td data-label="API URL" class="text-break">{{api_url}}</td>
|
||||
<td data-label="Refresh interval">{{intervalLabel}}</td>
|
||||
<td data-label="Authentication">{{#if (eq auth_method 'none')}}None{{else if (eq auth_method 'token_login')}}Login then token{{else if (eq auth_method 'bearer')}}Bearer token{{else if (eq auth_method 'basic')}}Basic{{else}}API key header{{/if}}</td>
|
||||
<td data-label="Requests">{{request_count}}</td>
|
||||
<td data-label="Last pulled">
|
||||
{{#if lastPulledAtValue}}
|
||||
<time data-local-datetime datetime="{{lastPulledAtValue}}">{{lastPullLabel}}</time>
|
||||
@@ -45,17 +43,6 @@
|
||||
{{lastPullLabel}}
|
||||
{{/if}}
|
||||
</td>
|
||||
<td data-label="Last response">
|
||||
{{#if last_pull_error}}
|
||||
<span class="text-danger">Failed</span>
|
||||
{{else if last_response_status}}
|
||||
<span>{{last_response_status}}</span>
|
||||
{{#if last_response_content_type}}<span class="text-muted small ms-2">{{last_response_content_type}}</span>{{/if}}
|
||||
{{else}}
|
||||
<span class="empty">-</span>
|
||||
{{/if}}
|
||||
</td>
|
||||
<td data-label="Status"><span class="badge text-bg-{{#if enabled}}success{{else}}danger{{/if}}">{{#if enabled}}Enabled{{else}}Disabled{{/if}}</span></td>
|
||||
<td data-label="Actions">
|
||||
{{#if (anyPermission ../currentUser 'api-sources.create' 'api-sources.update' 'api-sources.delete')}}
|
||||
<div class="actions">
|
||||
@@ -82,7 +69,7 @@
|
||||
</tr>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<tr data-table-search-empty-default><td colspan="7" class="empty">No API sources yet.</td></tr>
|
||||
<tr data-table-search-empty-default><td colspan="5" class="empty">No API sources yet.</td></tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
Reference in new issue
Block a user