This commit is contained in:
Saeed Vaziry
2023-07-02 12:47:50 +02:00
commit 5c72f12490
825 changed files with 41659 additions and 0 deletions

View File

@ -0,0 +1,46 @@
<div x-data="">
<x-card-header>
<x-slot name="title">{{ __("Databases") }}</x-slot>
<x-slot name="description">{{ __("You can see and manage your databases here") }}</x-slot>
<x-slot name="aside">
<div>
<x-primary-button x-data="" x-on:click.prevent="$dispatch('open-modal', 'create-database')">
{{ __('Create Database') }}
</x-primary-button>
@include('livewire.databases.partials.create-database-modal')
</div>
</x-slot>
</x-card-header>
@if(count($databases) > 0)
<x-table>
<tr>
<x-td>{{ __("Name") }}</x-td>
<x-td>{{ __("Created") }}</x-td>
<x-td>{{ __("Status") }}</x-td>
<x-td></x-td>
</tr>
@foreach($databases as $database)
<tr>
<x-td>{{ $database->name }}</x-td>
<x-td>
<x-datetime :value="$database->created_at"/>
</x-td>
<x-td>
<div class="inline-flex">
@include('livewire.databases.partials.database-status', ['status' => $database->status])
</div>
</x-td>
<x-td class="flex w-full justify-end">
<x-icon-button x-on:click="$wire.deleteId = '{{ $database->id }}'; $dispatch('open-modal', 'delete-database')">
<x-heroicon-o-trash class="w-4 h-4" />
</x-icon-button>
</x-td>
</tr>
@endforeach
</x-table>
@include('livewire.databases.partials.delete-database-modal')
@else
<x-simple-card class="text-center">{{ __("You don't have any databases yet") }}</x-simple-card>
@endif
</div>

View File

@ -0,0 +1,56 @@
<div x-data="">
<x-card-header>
<x-slot name="title">{{ __("Database Users") }}</x-slot>
<x-slot name="description">{{ __("You can see and manage your database users here") }}</x-slot>
<x-slot name="aside">
<div>
<x-primary-button x-data="" x-on:click.prevent="$dispatch('open-modal', 'create-database-user')">
{{ __('Create Database User') }}
</x-primary-button>
@include('livewire.databases.partials.create-database-user-modal')
</div>
</x-slot>
</x-card-header>
@if(count($databaseUsers) > 0)
<x-table>
<tr>
<x-td>{{ __("Username") }}</x-td>
<x-td>{{ __("Created") }}</x-td>
<x-td>{{ __("Linked Databases") }}</x-td>
<x-td>{{ __("Status") }}</x-td>
<x-td></x-td>
</tr>
@foreach($databaseUsers as $databaseUser)
<tr>
<x-td>{{ $databaseUser->username }}</x-td>
<x-td>
<x-datetime :value="$databaseUser->created_at" />
</x-td>
<x-td>[{{ $databaseUser->databases ? implode(', ', $databaseUser->databases) : '-' }}]</x-td>
<x-td>
<div class="inline-flex">
@include('livewire.databases.partials.database-user-status', ['status' => $databaseUser->status])
</div>
</x-td>
<x-td class="flex w-full justify-end">
<x-icon-button x-on:click="$wire.deleteId = '{{ $databaseUser->id }}'; $dispatch('open-modal', 'delete-database-user')">
<x-heroicon-o-trash class="w-4 h-4" />
</x-icon-button>
<x-icon-button wire:click="viewPassword({{ $databaseUser->id }})">
<x-heroicon-o-eye class="w-4 h-4" />
</x-icon-button>
<x-icon-button wire:click="showLink({{ $databaseUser->id }})">
<x-heroicon-o-link class="w-4 h-4" />
</x-icon-button>
</x-td>
</tr>
@endforeach
</x-table>
@include('livewire.databases.partials.delete-database-user-modal')
@include('livewire.databases.partials.database-user-password-modal')
@include('livewire.databases.partials.link-database-user-modal')
@else
<x-simple-card class="text-center">{{ __("You don't have any database users yet") }}</x-simple-card>
@endif
</div>

View File

@ -0,0 +1,68 @@
<x-modal name="create-database">
<form wire:submit.prevent="create" class="p-6" x-data="{user: false, remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create Database') }}
</h2>
<div class="mt-6">
<x-input-label for="name" :value="__('Name')" />
<x-text-input wire:model.defer="name" id="name" name="name" type="text" class="mt-1 w-full" />
@error('name')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="mt-6">
<label for="create_user" class="inline-flex items-center">
<input id="create_user" wire:model.defer="user" type="checkbox" x-model="user" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="create_user">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Create a user for this database') }}</span>
</label>
</div>
<div x-show="user">
<div class="mt-6">
<x-input-label for="db-username" :value="__('Username')" />
<x-text-input wire:model.defer="username" id="db-username" name="username" type="text" class="mt-1 w-full" />
@error('username')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="mt-6">
<x-input-label for="db-password" :value="__('Password')" />
<x-text-input wire:model.defer="password" id="db-password" name="password" type="text" class="mt-1 w-full" />
@error('password')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="mt-6">
<label for="db-remote" class="inline-flex items-center">
<input id="db-remote" wire:model="remote" type="checkbox" x-model="remote" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remote">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Enable remote access') }}</span>
</label>
</div>
<div x-show="remote">
<div class="mt-6">
<x-input-label for="db-host" :value="__('Host')" />
<x-text-input wire:model.defer="host" id="db-host" name="host" type="text" class="mt-1 w-full" />
<x-input-label for="db-host" :value="__('You might also need to open the database port in Firewall')" class="mt-1"/>
@error('host')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>
</div>
<div class="mt-6 flex justify-end">
<x-secondary-button type="button" x-on:click="$dispatch('close')">
{{ __('Cancel') }}
</x-secondary-button>
<x-primary-button class="ml-3" @database-created.window="$dispatch('close')">
{{ __('Create') }}
</x-primary-button>
</div>
</form>
</x-modal>

View File

@ -0,0 +1,51 @@
<x-modal name="create-database-user">
<form wire:submit.prevent="create" class="p-6" x-data="{remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Create Database User') }}
</h2>
<div class="mt-6">
<x-input-label for="user-username" :value="__('Username')" />
<x-text-input wire:model.defer="username" id="user-username" name="username" type="text" class="mt-1 w-full" />
@error('username')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="mt-6">
<x-input-label for="user-password" :value="__('Password')" />
<x-text-input wire:model.defer="password" id="user-password" name="password" type="text" class="mt-1 w-full" />
@error('password')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="mt-6">
<label for="user-remote" class="inline-flex items-center">
<input id="user-remote" wire:model="remote" type="checkbox" x-model="remote" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remote">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Enable remote access') }}</span>
</label>
</div>
<div x-show="remote">
<div class="mt-6">
<x-input-label for="user-host" :value="__('Host')" />
<x-text-input wire:model.defer="host" id="user-host" name="host" type="text" class="mt-1 w-full" />
<x-input-label for="user-host" :value="__('You might also need to open the database port in Firewall')" class="mt-1"/>
@error('host')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>
<div class="mt-6 flex justify-end">
<x-secondary-button type="button" x-on:click="$dispatch('close')">
{{ __('Cancel') }}
</x-secondary-button>
<x-primary-button class="ml-3" @database-user-created.window="$dispatch('close')">
{{ __('Create') }}
</x-primary-button>
</div>
</form>
</x-modal>

View File

@ -0,0 +1,12 @@
@if($status == \App\Enums\DatabaseStatus::READY)
<x-status status="success">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\DatabaseStatus::CREATING)
<x-status status="warning">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\DatabaseStatus::DELETING)
<x-status status="danger">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\DatabaseStatus::FAILED)
<x-status status="danger">{{ $status }}</x-status>
@endif

View File

@ -0,0 +1,23 @@
<x-modal name="database-user-password">
<form wire:submit.prevent="create" class="p-6" x-data="{remote: false}">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('View Password') }}
</h2>
<div class="mt-6">
<x-input-label :value="__('Password')" />
<x-text-input wire:model.defer="viewPassword" type="text" class="mt-1 w-full" disabled />
</div>
<div class="mt-6 flex justify-end">
<x-secondary-button type="button" x-on:click="$dispatch('close')">
{{ __('Close') }}
</x-secondary-button>
<x-primary-button x-data="{ copied: false }" x-clipboard.raw="{{ $viewPassword }}" class="ml-2">
<div x-show="copied" class="flex items-center">{{ __("Copied") }}</div>
<div x-show="!copied" x-on:click="copied = true; setTimeout(() => {copied = false}, 2000)">{{ __("Copy") }}</div>
</x-primary-button>
</div>
</form>
</x-modal>

View File

@ -0,0 +1,12 @@
@if($status == \App\Enums\DatabaseUserStatus::READY)
<x-status status="success">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\DatabaseUserStatus::CREATING)
<x-status status="warning">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\DatabaseUserStatus::DELETING)
<x-status status="danger">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\DatabaseUserStatus::FAILED)
<x-status status="danger">{{ $status }}</x-status>
@endif

View File

@ -0,0 +1,6 @@
<x-confirm-modal
name="delete-database"
:title="__('Confirm')"
:description="__('Are you sure that you want to delete this database?')"
method="delete"
/>

View File

@ -0,0 +1,6 @@
<x-confirm-modal
name="delete-database-user"
:title="__('Confirm')"
:description="__('Are you sure that you want to delete this database?')"
method="delete"
/>

View File

@ -0,0 +1,28 @@
<x-modal name="link-database-user">
<form wire:submit.prevent="link" class="p-6">
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Link User to Databases') }}
</h2>
<div class="mt-6">
@foreach($databases as $database)
<div class="mb-2">
<label for="db-{{ $database->id }}" class="inline-flex items-center">
<input id="db-{{ $database->id }}" wire:model.defer="link" value="{{ $database->name }}" type="checkbox" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="link">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ $database->name }}</span>
</label>
</div>
@endforeach
</div>
<div class="mt-6 flex justify-end">
<x-secondary-button type="button" x-on:click="$dispatch('close')">
{{ __('Close') }}
</x-secondary-button>
<x-primary-button class="ml-2" @linked.window="$dispatch('close')">
{{ __('Save') }}
</x-primary-button>
</div>
</form>
</x-modal>