mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-07-30 04:23:11 +03:00
Merge branch 'webhooks'
This commit is contained in:
@ -1,5 +1,27 @@
|
||||
<h1 class="list-heading text-capitals mb-l">Getting Started</h1>
|
||||
|
||||
<p class="mb-none">
|
||||
This documentation covers use of the REST API. <br>
|
||||
Some alternative options for extension and customization can be found below:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="{{ url('/settings/webhooks') }}" target="_blank" rel="noopener noreferrer">Webhooks</a> -
|
||||
HTTP POST calls upon events occurring in BookStack.
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/BookStackApp/BookStack/blob/master/dev/docs/visual-theme-system.md" target="_blank" rel="noopener noreferrer">Visual Theme System</a> -
|
||||
Methods to override views, translations and icons within BookStack.
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/BookStackApp/BookStack/blob/master/dev/docs/logical-theme-system.md" target="_blank" rel="noopener noreferrer">Logical Theme System</a> -
|
||||
Methods to extend back-end functionality within BookStack.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<hr>
|
||||
|
||||
<h5 id="authentication" class="text-mono mb-m">Authentication</h5>
|
||||
<p>
|
||||
To access the API a user has to have the <em>"Access System API"</em> permission enabled on one of their assigned roles.
|
||||
|
@ -24,8 +24,6 @@
|
||||
"{{ $activity->entity->name }}"
|
||||
@endif
|
||||
|
||||
@if($activity->extra) "{{ $activity->extra }}" @endif
|
||||
|
||||
<br>
|
||||
|
||||
<span class="text-muted"><small>@icon('time'){{ $activity->created_at->diffForHumans() }}</small></span>
|
||||
|
3
resources/views/form/errors.blade.php
Normal file
3
resources/views/form/errors.blade.php
Normal file
@ -0,0 +1,3 @@
|
||||
@if($errors->has($name))
|
||||
<div class="text-neg text-small">{{ $errors->first($name) }}</div>
|
||||
@endif
|
@ -10,7 +10,7 @@
|
||||
</div>
|
||||
|
||||
<div class="card content-wrap auto-height">
|
||||
<h2 class="list-heading">{{ trans('settings.audit') }}</h2>
|
||||
<h1 class="list-heading">{{ trans('settings.audit') }}</h1>
|
||||
<p class="text-muted">{{ trans('settings.audit_desc') }}</p>
|
||||
|
||||
<div class="flex-container-row">
|
||||
|
@ -6,10 +6,12 @@ $version - Version of bookstack to display
|
||||
<div class="py-m flex fit-content">
|
||||
@include('settings.parts.navbar', ['selected' => $selected])
|
||||
</div>
|
||||
<div class="flex"></div>
|
||||
<div class="text-right p-m flex fit-content">
|
||||
<a target="_blank" rel="noopener noreferrer" href="https://github.com/BookStackApp/BookStack/releases">
|
||||
BookStack @if(strpos($version, 'v') !== 0) version @endif {{ $version }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-s">
|
||||
<hr class="darker m-none">
|
||||
</div>
|
||||
<div class="py-l px-m flex fit-content">
|
||||
<a target="_blank" rel="noopener noreferrer" href="https://github.com/BookStackApp/BookStack/releases">
|
||||
BookStack @if(strpos($version, 'v') !== 0) version @endif {{ $version }}
|
||||
</a>
|
||||
</div>
|
@ -13,4 +13,7 @@
|
||||
@if(userCan('user-roles-manage'))
|
||||
<a href="{{ url('/settings/roles') }}" @if($selected == 'roles') class="active" @endif>@icon('lock-open'){{ trans('settings.roles') }}</a>
|
||||
@endif
|
||||
@if(userCan('settings-manage'))
|
||||
<a href="{{ url('/settings/webhooks') }}" @if($selected == 'webhooks') class="active" @endif>@icon('webhooks'){{ trans('settings.webhooks') }}</a>
|
||||
@endif
|
||||
</nav>
|
18
resources/views/settings/webhooks/create.blade.php
Normal file
18
resources/views/settings/webhooks/create.blade.php
Normal file
@ -0,0 +1,18 @@
|
||||
@extends('layouts.simple')
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="container small">
|
||||
|
||||
<div class="py-m">
|
||||
@include('settings.parts.navbar', ['selected' => 'webhooks'])
|
||||
</div>
|
||||
|
||||
<form action="{{ url("/settings/webhooks/create") }}" method="POST">
|
||||
@include('settings.webhooks.parts.form', ['title' => trans('settings.webhooks_create')])
|
||||
</form>
|
||||
|
||||
@include('settings.webhooks.parts.format-example')
|
||||
</div>
|
||||
|
||||
@stop
|
39
resources/views/settings/webhooks/delete.blade.php
Normal file
39
resources/views/settings/webhooks/delete.blade.php
Normal file
@ -0,0 +1,39 @@
|
||||
@extends('layouts.simple')
|
||||
|
||||
@section('body')
|
||||
<div class="container small">
|
||||
|
||||
<div class="py-m">
|
||||
@include('settings.parts.navbar', ['selected' => 'webhooks'])
|
||||
</div>
|
||||
|
||||
<div class="card content-wrap auto-height">
|
||||
<h1 class="list-heading"> {{ trans('settings.webhooks_delete') }}</h1>
|
||||
|
||||
<p>{{ trans('settings.webhooks_delete_warning', ['webhookName' => $webhook->name]) }}</p>
|
||||
|
||||
|
||||
<form action="{{ $webhook->getUrl() }}" method="POST">
|
||||
{!! csrf_field() !!}
|
||||
{!! method_field('DELETE') !!}
|
||||
|
||||
<div class="grid half v-center">
|
||||
<div>
|
||||
<p class="text-neg">
|
||||
<strong>{{ trans('settings.webhooks_delete_confirm') }}</strong>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="form-group text-right">
|
||||
<a href="{{ $webhook->getUrl() }}" class="button outline">{{ trans('common.cancel') }}</a>
|
||||
<button type="submit" class="button">{{ trans('common.confirm') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@stop
|
18
resources/views/settings/webhooks/edit.blade.php
Normal file
18
resources/views/settings/webhooks/edit.blade.php
Normal file
@ -0,0 +1,18 @@
|
||||
@extends('layouts.simple')
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="container small">
|
||||
<div class="py-m">
|
||||
@include('settings.parts.navbar', ['selected' => 'webhooks'])
|
||||
</div>
|
||||
|
||||
<form action="{{ $webhook->getUrl() }}" method="POST">
|
||||
{!! method_field('PUT') !!}
|
||||
@include('settings.webhooks.parts.form', ['model' => $webhook, 'title' => trans('settings.webhooks_edit')])
|
||||
</form>
|
||||
|
||||
@include('settings.webhooks.parts.format-example')
|
||||
</div>
|
||||
|
||||
@stop
|
59
resources/views/settings/webhooks/index.blade.php
Normal file
59
resources/views/settings/webhooks/index.blade.php
Normal file
@ -0,0 +1,59 @@
|
||||
@extends('layouts.simple')
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="container small">
|
||||
|
||||
<div class="py-m">
|
||||
@include('settings.parts.navbar', ['selected' => 'webhooks'])
|
||||
</div>
|
||||
|
||||
<div class="card content-wrap auto-height">
|
||||
|
||||
<div class="grid half v-center">
|
||||
<h1 class="list-heading">{{ trans('settings.webhooks') }}</h1>
|
||||
|
||||
<div class="text-right">
|
||||
<a href="{{ url("/settings/webhooks/create") }}"
|
||||
class="button outline">{{ trans('settings.webhooks_create') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(count($webhooks) > 0)
|
||||
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{ trans('common.name') }}</th>
|
||||
<th>{{ trans('settings.webhook_events_table_header') }}</th>
|
||||
<th>{{ trans('common.status') }}</th>
|
||||
</tr>
|
||||
@foreach($webhooks as $webhook)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ $webhook->getUrl() }}">{{ $webhook->name }}</a> <br>
|
||||
<span class="small text-muted italic">{{ $webhook->endpoint }}</span>
|
||||
</td>
|
||||
<td>
|
||||
@if($webhook->tracksEvent('all'))
|
||||
{{ trans('settings.webhooks_events_all') }}
|
||||
@else
|
||||
{{ $webhook->trackedEvents->count() }}
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
{{ trans('common.status_' . ($webhook->active ? 'active' : 'inactive')) }}
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
@else
|
||||
<p class="text-muted empty-text px-none">
|
||||
{{ trans('settings.webhooks_none_created') }}
|
||||
</p>
|
||||
@endif
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
75
resources/views/settings/webhooks/parts/form.blade.php
Normal file
75
resources/views/settings/webhooks/parts/form.blade.php
Normal file
@ -0,0 +1,75 @@
|
||||
{!! csrf_field() !!}
|
||||
|
||||
<div class="card content-wrap auto-height">
|
||||
<h1 class="list-heading">{{ $title }}</h1>
|
||||
|
||||
<div class="setting-list">
|
||||
|
||||
<div class="grid half">
|
||||
<div>
|
||||
<label class="setting-list-label">{{ trans('settings.webhooks_details') }}</label>
|
||||
<p class="small">{{ trans('settings.webhooks_details_desc') }}</p>
|
||||
<div>
|
||||
@include('form.toggle-switch', [
|
||||
'name' => 'active',
|
||||
'value' => old('active') ?? $model->active ?? true,
|
||||
'label' => trans('settings.webhooks_active'),
|
||||
])
|
||||
@include('form.errors', ['name' => 'active'])
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="form-group">
|
||||
<label for="name">{{ trans('settings.webhooks_name') }}</label>
|
||||
@include('form.text', ['name' => 'name'])
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="endpoint">{{ trans('settings.webhooks_endpoint') }}</label>
|
||||
@include('form.text', ['name' => 'endpoint'])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div component="webhook-events">
|
||||
<label class="setting-list-label">{{ trans('settings.webhooks_events') }}</label>
|
||||
@include('form.errors', ['name' => 'events'])
|
||||
|
||||
<p class="small">{{ trans('settings.webhooks_events_desc') }}</p>
|
||||
<p class="text-warn small">{{ trans('settings.webhooks_events_warning') }}</p>
|
||||
|
||||
<div class="toggle-switch-list">
|
||||
@include('form.custom-checkbox', [
|
||||
'name' => 'events[]',
|
||||
'value' => 'all',
|
||||
'label' => trans('settings.webhooks_events_all'),
|
||||
'checked' => old('events') ? in_array('all', old('events')) : (isset($webhook) ? $webhook->tracksEvent('all') : false),
|
||||
])
|
||||
</div>
|
||||
|
||||
<hr class="my-s">
|
||||
|
||||
<div class="dual-column-content toggle-switch-list">
|
||||
@foreach(\BookStack\Actions\ActivityType::all() as $activityType)
|
||||
<div>
|
||||
@include('form.custom-checkbox', [
|
||||
'name' => 'events[]',
|
||||
'value' => $activityType,
|
||||
'label' => $activityType,
|
||||
'checked' => old('events') ? in_array($activityType, old('events')) : (isset($webhook) ? $webhook->tracksEvent($activityType) : false),
|
||||
])
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="form-group text-right">
|
||||
<a href="{{ url("/settings/webhooks") }}" class="button outline">{{ trans('common.cancel') }}</a>
|
||||
@if ($webhook->id ?? false)
|
||||
<a href="{{ $webhook->getUrl('/delete') }}" class="button outline">{{ trans('settings.webhooks_delete') }}</a>
|
||||
@endif
|
||||
<button type="submit" class="button">{{ trans('settings.webhooks_save') }}</button>
|
||||
</div>
|
||||
|
||||
</div>
|
@ -0,0 +1,34 @@
|
||||
<div component="code-highlighter" class="card content-wrap auto-height">
|
||||
<h2 class="list-heading">{{ trans('settings.webhooks_format_example') }}</h2>
|
||||
<p>{{ trans('settings.webhooks_format_example_desc') }}</p>
|
||||
<pre><code class="language-json">{
|
||||
"event": "page_update",
|
||||
"text": "Benny updated page \"My wonderful updated page\"",
|
||||
"triggered_at": "2021-12-11T22:25:10.000000Z",
|
||||
"triggered_by": {
|
||||
"id": 1,
|
||||
"name": "Benny",
|
||||
"slug": "benny"
|
||||
},
|
||||
"triggered_by_profile_url": "https://bookstack.local/user/benny",
|
||||
"webhook_id": 2,
|
||||
"webhook_name": "My page update webhook",
|
||||
"url": "https://bookstack.local/books/my-awesome-book/page/my-wonderful-updated-page",
|
||||
"related_item": {
|
||||
"id": 2432,
|
||||
"book_id": 13,
|
||||
"chapter_id": 554,
|
||||
"name": "My wonderful updated page",
|
||||
"slug": "my-wonderful-updated-page",
|
||||
"priority": 2,
|
||||
"created_at": "2021-12-11T21:53:24.000000Z",
|
||||
"updated_at": "2021-12-11T22:25:10.000000Z",
|
||||
"created_by": 1,
|
||||
"updated_by": 1,
|
||||
"draft": false,
|
||||
"revision_count": 9,
|
||||
"template": false,
|
||||
"owned_by": 1
|
||||
}
|
||||
}</code></pre>
|
||||
</div>
|
Reference in New Issue
Block a user