Ability to remove logo and pagination to system logs
This commit is contained in:
@@ -16,8 +16,9 @@ class DashboardController extends Controller
|
||||
'servers' => Server::count(),
|
||||
'sites' => Site::count(),
|
||||
'users' => User::count(),
|
||||
'logs' => SystemLog::latest()->limit(10)->with('model')->get()
|
||||
->map(function (SystemLog $systemLog) {
|
||||
'logs' => SystemLog::query()
|
||||
->latest()->limit(10)->with('model')->paginate()
|
||||
->through(function (SystemLog $systemLog) {
|
||||
return [
|
||||
'title' => __($systemLog->title, [
|
||||
'site' => $systemLog->model->domain ?? '-Unknown-'
|
||||
|
||||
@@ -26,7 +26,8 @@ class SettingController extends Controller
|
||||
'enable_api' => setting('enable_api'),
|
||||
'api_token' => setting('api_token') ? decrypt(setting('api_token')) : null,
|
||||
'rotate_logs_after' => setting('rotate_logs_after') ? setting('rotate_logs_after') : null,
|
||||
'default_language' => setting('default_language', 'en')
|
||||
'default_language' => setting('default_language', 'en'),
|
||||
'has_logo' => (bool)setting('logo'),
|
||||
];
|
||||
|
||||
$packages = Package::pluck('name', 'id');
|
||||
@@ -128,4 +129,13 @@ class SettingController extends Controller
|
||||
|
||||
return ['content' => $template];
|
||||
}
|
||||
|
||||
public function removeLogo(Request $request)
|
||||
{
|
||||
Storage::delete(setting('logo'));
|
||||
|
||||
setting(['logo' => null]);
|
||||
|
||||
return redirect()->back()->with('success', 'Logo has ben removed');
|
||||
}
|
||||
}
|
||||
|
||||
2
public/js/app.js
vendored
2
public/js/app.js
vendored
File diff suppressed because one or more lines are too long
@@ -11,12 +11,12 @@
|
||||
</PageHeader>
|
||||
|
||||
<PageBody>
|
||||
<SettingsLayout>
|
||||
<SettingsLayout space="space-y-0">
|
||||
<template #nav>
|
||||
<Tabs />
|
||||
<Tabs class="mb-16" />
|
||||
</template>
|
||||
<template #segments>
|
||||
<div>
|
||||
<div class="mb-16">
|
||||
<ul class="grid grid-cols-3 gap-4">
|
||||
<li class="p-6 rounded shadow bg-surface-3">
|
||||
<div class="flex space-x-4">
|
||||
@@ -54,10 +54,10 @@
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="pb-4">
|
||||
<h2>{{ __('Recent logs') }}</h2>
|
||||
<List>
|
||||
<ListItem v-for="log in logs" :key="log.id">
|
||||
<ListItem v-for="log in logs.data" :key="log.id">
|
||||
<template #title>
|
||||
{{ log.title }}
|
||||
</template>
|
||||
@@ -66,7 +66,7 @@
|
||||
</ListItem>
|
||||
</List>
|
||||
</div>
|
||||
|
||||
<pagination :links="logs"/>
|
||||
</template>
|
||||
</SettingsLayout>
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
import Container from '@/components/Container'
|
||||
import Content from '@/components/Content'
|
||||
import Page from '@/components/Page'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import PageHeader from '@/components/PageHeader'
|
||||
import PageHeaderTitle from '@/components/PageHeaderTitle'
|
||||
import PageBody from '@/components/PageBody'
|
||||
@@ -116,6 +117,7 @@
|
||||
Container,
|
||||
Content,
|
||||
Page,
|
||||
Pagination,
|
||||
PageHeader,
|
||||
PageHeaderTitle,
|
||||
PageBody,
|
||||
@@ -140,7 +142,7 @@
|
||||
servers: Number,
|
||||
sites: Number,
|
||||
users: Number,
|
||||
logs: Array,
|
||||
logs: [Array, Object],
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<SettingsSegment>
|
||||
<template #title>{{ __('Overview') }}</template>
|
||||
<template #subtitle>
|
||||
{{ __('Change all the system settings here. All changes are in effect immediately.')}}
|
||||
{{ __('Change all the system settings here. All changes are in effect immediately.') }}
|
||||
</template>
|
||||
<template #form>
|
||||
<form class="space-y-4" @submit.prevent="submit">
|
||||
@@ -29,21 +29,35 @@
|
||||
<FormInput :label="__('E-mail address')" :errors="$page.props.errors.email"
|
||||
v-model="form.email"/>
|
||||
|
||||
<FormFileInput accept="image/*" :label="__('Logo')" type="file" :errors="$page.props.errors.logo"
|
||||
v-model="form.logo"/>
|
||||
<FormFileInput accept="image/*" :label="__('Logo')" type="file"
|
||||
:errors="$page.props.errors.logo"
|
||||
v-model="form.logo"/>
|
||||
|
||||
<FormInput :helper-text="__('Separate by comma to allow more email addresses')" :label="__('Support email addresses')" :errors="$page.props.errors.support_emails"
|
||||
<Button v-if="company_settings.has_logo" variant="danger" type="button" class="ml-2 px-4 py-1 bg-gray-500 hover:bg-gray-700 rounded-sm text-xs font-medium text-white" @click="removeLogo">
|
||||
Remove logo
|
||||
</Button>
|
||||
|
||||
<FormInput :helper-text="__('Separate by comma to allow more email addresses')"
|
||||
:label="__('Support email addresses')"
|
||||
:errors="$page.props.errors.support_emails"
|
||||
v-model="form.support_emails"/>
|
||||
|
||||
<FormSelect :helper-text="__('Select the default package a user should get when you create or they register')" :label="__('Select default package')" v-model="form.default_package">
|
||||
<FormSelect
|
||||
:helper-text="__('Select the default package a user should get when you create or they register')"
|
||||
:label="__('Select default package')" v-model="form.default_package">
|
||||
<option v-for="(name, id) in packages" :value="id" v-text="name"></option>
|
||||
</FormSelect>
|
||||
|
||||
<FormSelect :helper-text="__('Select the default package a user should get when you create or they register')" :label="__('Select default language')" v-model="form.default_language">
|
||||
<option v-for="language in languages" :value="language" v-text="language"></option>
|
||||
<FormSelect
|
||||
:helper-text="__('Select the default package a user should get when you create or they register')"
|
||||
:label="__('Select default language')" v-model="form.default_language">
|
||||
<option v-for="language in languages" :value="language"
|
||||
v-text="language"></option>
|
||||
</FormSelect>
|
||||
|
||||
<FormSelect :helper-text="__('This will rotate any logs older than selected, this helps cleanup your database')" :label="__('Rotate logs after')" v-model="form.rotate_logs_after">
|
||||
<FormSelect
|
||||
:helper-text="__('This will rotate any logs older than selected, this helps cleanup your database')"
|
||||
:label="__('Rotate logs after')" v-model="form.rotate_logs_after">
|
||||
<option value="">Don't rotate logs</option>
|
||||
<option value="weeks-1">Older than 1 week</option>
|
||||
<option value="months-1">Older than 1 month</option>
|
||||
@@ -58,36 +72,50 @@
|
||||
<div>
|
||||
<input id="support" class="form-checkbox" type="checkbox"
|
||||
v-model="form.support">
|
||||
<label for="support" class="ml-2 text-sm">{{ __('Enable support platform') }}</label>
|
||||
<label for="support" class="ml-2 text-sm">{{
|
||||
__('Enable support platform')
|
||||
}}</label>
|
||||
<p class="text-small mt-1 text-medium-emphasis">
|
||||
{{ __('This will allow your customers to make support requests to you.') }}
|
||||
{{
|
||||
__('This will allow your customers to make support requests to you.')
|
||||
}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input id="documentation" class="form-checkbox" type="checkbox"
|
||||
v-model="form.documentation">
|
||||
<label for="documentation" class="ml-2 text-sm">{{ __('Enable documentation platform') }}</label>
|
||||
<label for="documentation" class="ml-2 text-sm">{{
|
||||
__('Enable documentation platform')
|
||||
}}</label>
|
||||
<p class="text-small mt-1 text-medium-emphasis">
|
||||
{{ __('This will allow you to create articles for your users to look at.') }}
|
||||
{{
|
||||
__('This will allow you to create articles for your users to look at.')
|
||||
}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input id="allow_registration" class="form-checkbox" type="checkbox"
|
||||
v-model="form.allow_registration">
|
||||
<label for="allow_registration" class="ml-2 text-sm">{{ __('Allow customer registration') }}</label>
|
||||
<label for="allow_registration"
|
||||
class="ml-2 text-sm">{{ __('Allow customer registration') }}</label>
|
||||
<p class="text-small mt-1 text-medium-emphasis">
|
||||
{{ __('This will allow public users to register on your platform.') }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input id="receive_email_on_server_creation" class="form-checkbox" type="checkbox"
|
||||
<input id="receive_email_on_server_creation" class="form-checkbox"
|
||||
type="checkbox"
|
||||
v-model="form.receive_email_on_server_creation">
|
||||
<label for="receive_email_on_server_creation" class="ml-2 text-sm">{{ __('Receive email when customers create server') }}</label>
|
||||
<label for="receive_email_on_server_creation" class="ml-2 text-sm">{{
|
||||
__('Receive email when customers create server')
|
||||
}}</label>
|
||||
<p class="text-small mt-1 text-medium-emphasis">
|
||||
{{ __('This will send an email to all admins notifying them about a new server installation.') }}
|
||||
{{
|
||||
__('This will send an email to all admins notifying them about a new server installation.')
|
||||
}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -96,19 +124,27 @@
|
||||
v-model="form.enable_api">
|
||||
<label for="enable_api" class="ml-2 text-sm">{{ __('Enable API') }}</label>
|
||||
<p class="text-small mt-1 text-medium-emphasis">
|
||||
{{ __('This will allow you to interact with your system via the API.') }} <a href="https://docs.ploi-core.io/core-api/introduction" class="text-primary" target="_blank">More information</a>
|
||||
{{
|
||||
__('This will allow you to interact with your system via the API.')
|
||||
}} <a href="https://docs.ploi-core.io/core-api/introduction"
|
||||
class="text-primary" target="_blank">More information</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<FormInput v-if="form.enable_api" allow-random-string :label="__('API token')" :errors="$page.props.errors.api_token"
|
||||
<FormInput v-if="form.enable_api" allow-random-string :label="__('API token')"
|
||||
:errors="$page.props.errors.api_token"
|
||||
v-model="form.api_token"/>
|
||||
|
||||
<div>
|
||||
<input id="isolate_per_site_per_user" class="form-checkbox" type="checkbox"
|
||||
v-model="form.isolate_per_site_per_user">
|
||||
<label for="isolate_per_site_per_user" class="ml-2 text-sm">{{ __('Enable site isolation per site & user') }}</label>
|
||||
<label for="isolate_per_site_per_user" class="ml-2 text-sm">{{
|
||||
__('Enable site isolation per site & user')
|
||||
}}</label>
|
||||
<p class="text-small mt-1 text-medium-emphasis">
|
||||
{{ __('This will make sure each site created by one user is always isolated from another.') }}
|
||||
{{
|
||||
__('This will make sure each site created by one user is always isolated from another.')
|
||||
}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -127,122 +163,130 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import TopBar from './components/TopBar'
|
||||
import Container from '@/components/Container'
|
||||
import Content from '@/components/Content'
|
||||
import Page from '@/components/Page'
|
||||
import PageHeader from '@/components/PageHeader'
|
||||
import PageHeaderTitle from '@/components/PageHeaderTitle'
|
||||
import PageBody from '@/components/PageBody'
|
||||
import Button from '@/components/Button'
|
||||
import List from '@/components/List'
|
||||
import ListItem from '@/components/ListItem'
|
||||
import StatusBubble from '@/components/StatusBubble'
|
||||
import NotificationBadge from '@/components/NotificationBadge'
|
||||
import MainLayout from '@/Layouts/MainLayout'
|
||||
import SettingsLayout from '@/components/layouts/SettingsLayout'
|
||||
import SettingsSegment from '@/components/SettingsSegment'
|
||||
import FormInput from '@/components/forms/FormInput'
|
||||
import FormFileInput from '@/components/forms/FormFileInput'
|
||||
import FormSelect from '@/components/forms/FormSelect'
|
||||
import Form from '@/components/Form'
|
||||
import FormActions from '@/components/FormActions'
|
||||
import {useNotification} from '@/hooks/notification'
|
||||
import Tabs from './Tabs'
|
||||
import TopBar from './components/TopBar'
|
||||
import Container from '@/components/Container'
|
||||
import Content from '@/components/Content'
|
||||
import Page from '@/components/Page'
|
||||
import PageHeader from '@/components/PageHeader'
|
||||
import PageHeaderTitle from '@/components/PageHeaderTitle'
|
||||
import PageBody from '@/components/PageBody'
|
||||
import Button from '@/components/Button'
|
||||
import List from '@/components/List'
|
||||
import ListItem from '@/components/ListItem'
|
||||
import StatusBubble from '@/components/StatusBubble'
|
||||
import NotificationBadge from '@/components/NotificationBadge'
|
||||
import MainLayout from '@/Layouts/MainLayout'
|
||||
import SettingsLayout from '@/components/layouts/SettingsLayout'
|
||||
import SettingsSegment from '@/components/SettingsSegment'
|
||||
import FormInput from '@/components/forms/FormInput'
|
||||
import FormFileInput from '@/components/forms/FormFileInput'
|
||||
import FormSelect from '@/components/forms/FormSelect'
|
||||
import Form from '@/components/Form'
|
||||
import FormActions from '@/components/FormActions'
|
||||
import {useNotification} from '@/hooks/notification'
|
||||
import Tabs from './Tabs'
|
||||
|
||||
export default {
|
||||
metaInfo() {
|
||||
return {
|
||||
title: `${this.__('Settings')}`,
|
||||
}
|
||||
},
|
||||
export default {
|
||||
metaInfo() {
|
||||
return {
|
||||
title: `${this.__('Settings')}`,
|
||||
}
|
||||
},
|
||||
|
||||
layout: MainLayout,
|
||||
layout: MainLayout,
|
||||
|
||||
components: {
|
||||
TopBar,
|
||||
Container,
|
||||
Content,
|
||||
Page,
|
||||
PageHeader,
|
||||
PageHeaderTitle,
|
||||
PageBody,
|
||||
Button,
|
||||
List,
|
||||
ListItem,
|
||||
StatusBubble,
|
||||
NotificationBadge,
|
||||
FormInput,
|
||||
FormFileInput,
|
||||
FormSelect,
|
||||
SettingsLayout,
|
||||
SettingsSegment,
|
||||
Form,
|
||||
FormActions,
|
||||
Tabs,
|
||||
},
|
||||
components: {
|
||||
TopBar,
|
||||
Container,
|
||||
Content,
|
||||
Page,
|
||||
PageHeader,
|
||||
PageHeaderTitle,
|
||||
PageBody,
|
||||
Button,
|
||||
List,
|
||||
ListItem,
|
||||
StatusBubble,
|
||||
NotificationBadge,
|
||||
FormInput,
|
||||
FormFileInput,
|
||||
FormSelect,
|
||||
SettingsLayout,
|
||||
SettingsSegment,
|
||||
Form,
|
||||
FormActions,
|
||||
Tabs,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
sending: false,
|
||||
data() {
|
||||
return {
|
||||
sending: false,
|
||||
|
||||
form: {
|
||||
name: this.company_settings.name,
|
||||
email: this.company_settings.email,
|
||||
support_emails: this.company_settings.support_emails,
|
||||
support: this.company_settings.support,
|
||||
enable_api: this.company_settings.enable_api,
|
||||
api_token: this.company_settings.api_token,
|
||||
documentation: this.company_settings.documentation,
|
||||
allow_registration: this.company_settings.allow_registration,
|
||||
receive_email_on_server_creation: this.company_settings.receive_email_on_server_creation,
|
||||
default_package: this.company_settings.default_package,
|
||||
isolate_per_site_per_user: this.company_settings.isolate_per_site_per_user,
|
||||
default_language: this.company_settings.default_language,
|
||||
logo: null,
|
||||
rotate_logs_after: this.company_settings.rotate_logs_after,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
props: {
|
||||
company_settings: Object,
|
||||
packages: {},
|
||||
languages: {}
|
||||
},
|
||||
|
||||
methods: {
|
||||
useNotification,
|
||||
|
||||
submit() {
|
||||
var data = new FormData();
|
||||
data.append('name', this.form.name || '')
|
||||
data.append('email', this.form.email || '')
|
||||
data.append('support_emails', this.form.support_emails || '')
|
||||
data.append('support', this.form.support || false)
|
||||
data.append('enable_api', this.form.enable_api || false)
|
||||
data.append('api_token', this.form.api_token || '')
|
||||
data.append('documentation', this.form.documentation || false)
|
||||
data.append('allow_registration', this.form.allow_registration || false)
|
||||
data.append('receive_email_on_server_creation', this.form.receive_email_on_server_creation || false)
|
||||
data.append('default_package', this.form.receive_email_on_server_creation || '')
|
||||
data.append('isolate_per_site_per_user', this.form.isolate_per_site_per_user || false)
|
||||
data.append('default_language', this.form.default_language || 'en')
|
||||
data.append('logo', this.form.logo || '')
|
||||
data.append('rotate_logs_after', this.form.rotate_logs_after || '')
|
||||
data.append('_method', 'patch')
|
||||
|
||||
this.$inertia.post(this.route('admin.settings.update'), data, {
|
||||
preserveScroll: true,
|
||||
onStart: () => this.sending = true,
|
||||
onFinish: () => this.sending = false,
|
||||
onSuccess: () => {
|
||||
if (Object.keys(this.$page.props.errors).length === 0) {
|
||||
this.form.logo = null
|
||||
}
|
||||
},
|
||||
})
|
||||
form: {
|
||||
name: this.company_settings.name,
|
||||
email: this.company_settings.email,
|
||||
support_emails: this.company_settings.support_emails,
|
||||
support: this.company_settings.support,
|
||||
enable_api: this.company_settings.enable_api,
|
||||
api_token: this.company_settings.api_token,
|
||||
documentation: this.company_settings.documentation,
|
||||
allow_registration: this.company_settings.allow_registration,
|
||||
receive_email_on_server_creation: this.company_settings.receive_email_on_server_creation,
|
||||
default_package: this.company_settings.default_package,
|
||||
isolate_per_site_per_user: this.company_settings.isolate_per_site_per_user,
|
||||
default_language: this.company_settings.default_language,
|
||||
logo: null,
|
||||
rotate_logs_after: this.company_settings.rotate_logs_after,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
props: {
|
||||
company_settings: Object,
|
||||
packages: {},
|
||||
languages: {}
|
||||
},
|
||||
|
||||
methods: {
|
||||
useNotification,
|
||||
|
||||
submit() {
|
||||
var data = new FormData();
|
||||
data.append('name', this.form.name || '')
|
||||
data.append('email', this.form.email || '')
|
||||
data.append('support_emails', this.form.support_emails || '')
|
||||
data.append('support', this.form.support || false)
|
||||
data.append('enable_api', this.form.enable_api || false)
|
||||
data.append('api_token', this.form.api_token || '')
|
||||
data.append('documentation', this.form.documentation || false)
|
||||
data.append('allow_registration', this.form.allow_registration || false)
|
||||
data.append('receive_email_on_server_creation', this.form.receive_email_on_server_creation || false)
|
||||
data.append('default_package', this.form.receive_email_on_server_creation || '')
|
||||
data.append('isolate_per_site_per_user', this.form.isolate_per_site_per_user || false)
|
||||
data.append('default_language', this.form.default_language || 'en')
|
||||
data.append('logo', this.form.logo || '')
|
||||
data.append('rotate_logs_after', this.form.rotate_logs_after || '')
|
||||
data.append('_method', 'patch')
|
||||
|
||||
this.$inertia.post(this.route('admin.settings.update'), data, {
|
||||
preserveScroll: true,
|
||||
onStart: () => this.sending = true,
|
||||
onFinish: () => this.sending = false,
|
||||
onSuccess: () => {
|
||||
if (Object.keys(this.$page.props.errors).length === 0) {
|
||||
this.form.logo = null
|
||||
}
|
||||
},
|
||||
})
|
||||
},
|
||||
|
||||
removeLogo() {
|
||||
this.$inertia.delete(this.route('admin.settings.remove-logo'), {
|
||||
preserveScroll: true,
|
||||
onStart: () => this.sending = true,
|
||||
onFinish: () => this.sending = false,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<slot name="nav" />
|
||||
</aside>
|
||||
<section class="col-span-4 md:col-span-3">
|
||||
<div class="space-y-16">
|
||||
<div :class="space">
|
||||
<slot name="segments"></slot>
|
||||
</div>
|
||||
</section>
|
||||
@@ -18,6 +18,10 @@ export default {
|
||||
type: Array,
|
||||
required: false,
|
||||
},
|
||||
space: {
|
||||
type: String,
|
||||
default: 'space-y-16'
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -10,6 +10,7 @@ Route::group(['prefix' => 'settings'], function () {
|
||||
Route::get('terms', 'SettingController@terms')->name('settings.terms');
|
||||
Route::get('terms/template', 'SettingController@termsTemplate')->name('settings.terms.template');
|
||||
Route::patch('terms', 'SettingController@updateTerms')->name('settings.terms.update');
|
||||
Route::delete('remove-logo', 'SettingController@removeLogo')->name('settings.remove-logo');
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user