Setup, Markup and Styling
This commit is contained in:
commit
369a9eb8e7
2678 changed files with 250073 additions and 0 deletions
18
.editorconfig
Normal file
18
.editorconfig
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_size = 2
|
||||
|
||||
[compose.yaml]
|
||||
indent_size = 4
|
||||
65
.env.example
Normal file
65
.env.example
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
APP_NAME=Laravel
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
|
||||
APP_LOCALE=en
|
||||
APP_FALLBACK_LOCALE=en
|
||||
APP_FAKER_LOCALE=en_US
|
||||
|
||||
APP_MAINTENANCE_DRIVER=file
|
||||
# APP_MAINTENANCE_STORE=database
|
||||
|
||||
# PHP_CLI_SERVER_WORKERS=4
|
||||
|
||||
BCRYPT_ROUNDS=12
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
LOG_STACK=single
|
||||
LOG_DEPRECATIONS_CHANNEL=null
|
||||
LOG_LEVEL=debug
|
||||
|
||||
DB_CONNECTION=sqlite
|
||||
# DB_HOST=127.0.0.1
|
||||
# DB_PORT=3306
|
||||
# DB_DATABASE=laravel
|
||||
# DB_USERNAME=root
|
||||
# DB_PASSWORD=
|
||||
|
||||
SESSION_DRIVER=database
|
||||
SESSION_LIFETIME=120
|
||||
SESSION_ENCRYPT=false
|
||||
SESSION_PATH=/
|
||||
SESSION_DOMAIN=null
|
||||
|
||||
BROADCAST_CONNECTION=log
|
||||
FILESYSTEM_DISK=local
|
||||
QUEUE_CONNECTION=database
|
||||
|
||||
CACHE_STORE=database
|
||||
# CACHE_PREFIX=
|
||||
|
||||
MEMCACHED_HOST=127.0.0.1
|
||||
|
||||
REDIS_CLIENT=phpredis
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_MAILER=log
|
||||
MAIL_SCHEME=null
|
||||
MAIL_HOST=127.0.0.1
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_FROM_ADDRESS="hello@example.com"
|
||||
MAIL_FROM_NAME="${APP_NAME}"
|
||||
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_DEFAULT_REGION=us-east-1
|
||||
AWS_BUCKET=
|
||||
AWS_USE_PATH_STYLE_ENDPOINT=false
|
||||
|
||||
VITE_APP_NAME="${APP_NAME}"
|
||||
11
.gitattributes
vendored
Normal file
11
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
* text=auto eol=lf
|
||||
|
||||
*.blade.php diff=html
|
||||
*.css diff=css
|
||||
*.html diff=html
|
||||
*.md diff=markdown
|
||||
*.php diff=php
|
||||
|
||||
/.github export-ignore
|
||||
CHANGELOG.md export-ignore
|
||||
.styleci.yml export-ignore
|
||||
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
*.log
|
||||
.DS_Store
|
||||
.env
|
||||
.env.backup
|
||||
.env.production
|
||||
.phpactor.json
|
||||
.phpunit.result.cache
|
||||
/.fleet
|
||||
/.idea
|
||||
/.nova
|
||||
/.phpunit.cache
|
||||
/.vscode
|
||||
/.zed
|
||||
/auth.json
|
||||
/node_modules
|
||||
/public/build
|
||||
/public/hot
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
/storage/pail
|
||||
/vendor
|
||||
_ide_helper.php
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
Thumbs.db
|
||||
33
Dockerfile
Normal file
33
Dockerfile
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
FROM php:8.4-apache
|
||||
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gnupg2 \
|
||||
libzip-dev \
|
||||
zlib1g-dev \
|
||||
libpng-dev \
|
||||
libfreetype6-dev \
|
||||
libjpeg62-turbo-dev \
|
||||
libmcrypt-dev \
|
||||
libxml2-dev \
|
||||
libicu-dev \
|
||||
libpq-dev \
|
||||
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||
&& docker-php-ext-install -j$(nproc) zip pdo exif pdo_pgsql gd intl \
|
||||
&& docker-php-ext-enable exif \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Enable Apache modules
|
||||
RUN a2enmod rewrite
|
||||
|
||||
# Align www-data UID for permission consistency with host (optional but common)
|
||||
RUN usermod -u 1000 www-data
|
||||
|
||||
# Install Composer using the official image (faster/cleaner than curl)
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
|
||||
# Configure Apache Document Root
|
||||
ENV APACHE_DOCUMENT_ROOT /var/www/html/public
|
||||
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
|
||||
&& sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
|
||||
|
||||
WORKDIR /var/www/html
|
||||
58
README.md
Normal file
58
README.md
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
|
||||
</p>
|
||||
|
||||
## About Laravel
|
||||
|
||||
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
|
||||
|
||||
- [Simple, fast routing engine](https://laravel.com/docs/routing).
|
||||
- [Powerful dependency injection container](https://laravel.com/docs/container).
|
||||
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
|
||||
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
|
||||
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
|
||||
- [Robust background job processing](https://laravel.com/docs/queues).
|
||||
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
|
||||
|
||||
Laravel is accessible, powerful, and provides tools required for large, robust applications.
|
||||
|
||||
## Learning Laravel
|
||||
|
||||
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
|
||||
|
||||
In addition, [Laracasts](https://laracasts.com) contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
|
||||
|
||||
You can also watch bite-sized lessons with real-world projects on [Laravel Learn](https://laravel.com/learn), where you will be guided through building a Laravel application from scratch while learning PHP fundamentals.
|
||||
|
||||
## Agentic Development
|
||||
|
||||
Laravel's predictable structure and conventions make it ideal for AI coding agents like Claude Code, Cursor, and GitHub Copilot. Install [Laravel Boost](https://laravel.com/docs/ai) to supercharge your AI workflow:
|
||||
|
||||
```bash
|
||||
composer require laravel/boost --dev
|
||||
|
||||
php artisan boost:install
|
||||
```
|
||||
|
||||
Boost provides your agent 15+ tools and skills that help agents build Laravel applications while following best practices.
|
||||
|
||||
## Contributing
|
||||
|
||||
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
|
||||
|
||||
## Security Vulnerabilities
|
||||
|
||||
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
|
||||
|
||||
## License
|
||||
|
||||
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
||||
29
app/Filament/Pages/Home.php
Normal file
29
app/Filament/Pages/Home.php
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use Filament\Pages\Dashboard as BaseDashboard;
|
||||
|
||||
class Home extends BaseDashboard
|
||||
{
|
||||
|
||||
|
||||
public static function shouldRegisterNavigation(): bool
|
||||
{
|
||||
return false; // Hides it from the sidebar
|
||||
}
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$user = auth()->user();
|
||||
|
||||
// Redirect based on role or specific logic
|
||||
if ($user->role === 'admin') {
|
||||
// Your specific resource create path
|
||||
redirect('/photo-geo-data');
|
||||
} else {
|
||||
// Redirect regular users to the list view
|
||||
redirect('/photo-geo-data/create');
|
||||
}
|
||||
}
|
||||
}
|
||||
31
app/Filament/Pages/ThankYou.php
Normal file
31
app/Filament/Pages/ThankYou.php
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use Filament\Pages\Page;
|
||||
|
||||
class ThankYou extends Page
|
||||
{
|
||||
protected string $view = 'filament.pages.thank-you';
|
||||
|
||||
public ?array $record = null;
|
||||
protected static ?string $title = 'Tack för ditt bidrag!';
|
||||
|
||||
public static function shouldRegisterNavigation(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$this->record = session('created_record') ?? [
|
||||
'title' => 'Test Photo',
|
||||
'uploaded_by' => 'Anna-Sara',
|
||||
'captured_at' => '2026-04-05',
|
||||
'lat' => '59.3293',
|
||||
'lng' => '18.0686',
|
||||
'desc' => 'A test description',
|
||||
'story' => 'A longer story about this photo.',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData\Pages\Concerns;
|
||||
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
trait HandlesImageMetadata
|
||||
{
|
||||
protected function syncMetadataFromImage(): void
|
||||
{
|
||||
$metadata = $this->extractImageMetadata($this->record->image_path);
|
||||
|
||||
if ($metadata === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->record->update(['metadata' => $metadata]);
|
||||
}
|
||||
|
||||
private function extractImageMetadata(mixed $imagePath): ?array
|
||||
{
|
||||
if (empty($imagePath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$path = is_array($imagePath) ? reset($imagePath) : $imagePath;
|
||||
$fullPath = Storage::disk('public')->path($path);
|
||||
|
||||
if (!file_exists($fullPath)) {
|
||||
Log::warning('extractImageMetadata: file not found', ['path' => $fullPath]);
|
||||
return null;
|
||||
}
|
||||
|
||||
$exif = @exif_read_data($fullPath, null, true);
|
||||
|
||||
if ($exif === false) {
|
||||
Log::debug('extractImageMetadata: no EXIF data', ['path' => $fullPath]);
|
||||
return null;
|
||||
}
|
||||
|
||||
return $exif;
|
||||
}
|
||||
|
||||
private function extractGpsCoordinates(array $exif): ?array
|
||||
{
|
||||
$gps = $exif['GPS'] ?? null;
|
||||
|
||||
if (!$gps) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$lat = $this->rationalToDecimal($gps['GPSLatitude'] ?? null);
|
||||
$lng = $this->rationalToDecimal($gps['GPSLongitude'] ?? null);
|
||||
|
||||
if ($lat === null || $lng === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (($gps['GPSLatitudeRef'] ?? 'N') === 'S') {
|
||||
$lat = -$lat;
|
||||
}
|
||||
|
||||
if (($gps['GPSLongitudeRef'] ?? 'E') === 'W') {
|
||||
$lng = -$lng;
|
||||
}
|
||||
|
||||
return ['lat' => $lat, 'lng' => $lng];
|
||||
}
|
||||
|
||||
private function rationalToDecimal(?array $rational): ?float
|
||||
{
|
||||
if (!$rational || count($rational) < 3) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->rationalValue($rational[0])
|
||||
+ $this->rationalValue($rational[1]) / 60
|
||||
+ $this->rationalValue($rational[2]) / 3600;
|
||||
}
|
||||
|
||||
private function rationalValue(string $rational): float
|
||||
{
|
||||
[$num, $den] = array_pad(explode('/', $rational, 2), 2, '1');
|
||||
return $den != 0 ? (float) $num / (float) $den : 0.0;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData\Pages;
|
||||
|
||||
use App\Filament\Resources\PhotoGeoData\PhotoGeoDataResource;
|
||||
use App\Filament\Resources\PhotoGeoData\Pages\Concerns\HandlesImageMetadata;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
|
||||
class CreatePhotoGeoData extends CreateRecord
|
||||
{
|
||||
use HandlesImageMetadata;
|
||||
|
||||
protected static string $resource = PhotoGeoDataResource::class;
|
||||
|
||||
protected function getRedirectUrl(): string
|
||||
{
|
||||
return \App\Filament\Pages\ThankYou::getUrl([]);
|
||||
}
|
||||
|
||||
public function getBreadcrumbs(): array
|
||||
{
|
||||
if(auth()->user()?->role === 'user') {
|
||||
return [];
|
||||
}
|
||||
|
||||
return parent::getBreadcrumbs();
|
||||
}
|
||||
|
||||
|
||||
protected function getFormActions(): array
|
||||
{
|
||||
return [
|
||||
$this->getCreateFormAction(),
|
||||
$this->getCancelFormAction(),
|
||||
];
|
||||
}
|
||||
|
||||
protected function afterCreate(): void
|
||||
{
|
||||
$this->syncMetadataFromImage();
|
||||
|
||||
session()->flash('created_record', $this->record->only([
|
||||
'title', 'uploaded_by', 'captured_at', 'lat', 'lng', 'desc', 'story', 'image_path',
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData\Pages;
|
||||
|
||||
use App\Filament\Resources\PhotoGeoData\PhotoGeoDataResource;
|
||||
use App\Filament\Resources\PhotoGeoData\Pages\Concerns\HandlesImageMetadata;
|
||||
use Filament\Actions\DeleteAction;
|
||||
use Filament\Resources\Pages\EditRecord;
|
||||
|
||||
class EditPhotoGeoData extends EditRecord
|
||||
{
|
||||
use HandlesImageMetadata;
|
||||
|
||||
protected static string $resource = PhotoGeoDataResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
DeleteAction::make(),
|
||||
];
|
||||
}
|
||||
|
||||
protected function afterSave(): void
|
||||
{
|
||||
$this->syncMetadataFromImage();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData\Pages;
|
||||
|
||||
use App\Filament\Resources\PhotoGeoData\PhotoGeoDataResource;
|
||||
use Filament\Actions\CreateAction;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
|
||||
class ListPhotoGeoData extends ListRecords
|
||||
{
|
||||
protected static string $resource = PhotoGeoDataResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
CreateAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
62
app/Filament/Resources/PhotoGeoData/PhotoGeoDataResource.php
Normal file
62
app/Filament/Resources/PhotoGeoData/PhotoGeoDataResource.php
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData;
|
||||
|
||||
use App\Filament\Resources\PhotoGeoData\Pages\CreatePhotoGeoData;
|
||||
use App\Filament\Resources\PhotoGeoData\Pages\EditPhotoGeoData;
|
||||
use App\Filament\Resources\PhotoGeoData\Pages\ListPhotoGeoData;
|
||||
use App\Filament\Resources\PhotoGeoData\Schemas\PhotoGeoDataForm;
|
||||
use App\Filament\Resources\PhotoGeoData\Tables\PhotoGeoDataTable;
|
||||
use App\Models\PhotoGeoData;
|
||||
use BackedEnum;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Schemas\Schema;
|
||||
use Filament\Support\Icons\Heroicon;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class PhotoGeoDataResource extends Resource
|
||||
{
|
||||
protected static ?string $model = PhotoGeoData::class;
|
||||
|
||||
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
|
||||
|
||||
public static function form(Schema $schema): Schema
|
||||
{
|
||||
return PhotoGeoDataForm::configure($schema);
|
||||
}
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return PhotoGeoDataTable::configure($table);
|
||||
}
|
||||
|
||||
public static function shouldRegisterNavigation(): bool
|
||||
{
|
||||
// Only show in the sidebar if the user is an admin
|
||||
return auth()->user()?->role === 'admin';
|
||||
}
|
||||
|
||||
|
||||
public static function getNavigationIcon(): string
|
||||
{
|
||||
return 'heroicon-o-plus-circle'; // Your symbol for the left menu
|
||||
}
|
||||
|
||||
|
||||
public static function getRelations(): array
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPages(): array
|
||||
{
|
||||
return [
|
||||
'index' => ListPhotoGeoData::route('/'),
|
||||
'create' => CreatePhotoGeoData::route('/create'),
|
||||
'edit' => EditPhotoGeoData::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData\Schemas;
|
||||
|
||||
use Filament\Forms\Components\DatePicker;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
use Filament\Schemas\Schema;
|
||||
use EduardoRibeiroDev\FilamentLeaflet\Fields\MapPicker;
|
||||
use EduardoRibeiroDev\FilamentLeaflet\Enums\TileLayer;
|
||||
|
||||
class PhotoGeoDataForm
|
||||
{
|
||||
public static function configure(Schema $schema): Schema
|
||||
{
|
||||
return $schema
|
||||
->components([
|
||||
FileUpload::make('image_path')
|
||||
->label('Bild')
|
||||
->required()
|
||||
->columnSpan('full')
|
||||
->disk('public')
|
||||
->directory('photos')
|
||||
->image(),
|
||||
TextInput::make('title')
|
||||
->label('Rubrik')
|
||||
->columnSpan('full')
|
||||
->required(),
|
||||
TextInput::make('uploaded_by')
|
||||
->label('Uppladdat av')
|
||||
->columnSpan('full')
|
||||
->required(),
|
||||
DatePicker::make('captured_at')
|
||||
->label('Datum då foto togs')
|
||||
->columnSpan('full'),
|
||||
TextInput::make('desc')
|
||||
->label('Kort beskrivning')
|
||||
->columnSpan('full'),
|
||||
Textarea::make('story')
|
||||
->label('Berättelse')
|
||||
->columnSpanFull(),
|
||||
MapPicker::make('location')
|
||||
->label('Plats')
|
||||
->height(400)
|
||||
->center(57.63072, 12.847787)
|
||||
->zoom(15)
|
||||
->autoCenter()
|
||||
->tileLayersUrl(TileLayer::OpenStreetMap)
|
||||
->columnSpanFull()
|
||||
->latitudeFieldName('lat')
|
||||
->longitudeFieldName('lng'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PhotoGeoData\Tables;
|
||||
|
||||
use Filament\Actions\BulkActionGroup;
|
||||
use Filament\Actions\DeleteBulkAction;
|
||||
use Filament\Actions\EditAction;
|
||||
use Filament\Tables\Columns\ImageColumn;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables\Table;
|
||||
|
||||
class PhotoGeoDataTable
|
||||
{
|
||||
public static function configure(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
TextColumn::make('id')
|
||||
->label('ID')
|
||||
->searchable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
TextColumn::make('uploaded_by')
|
||||
|
||||
->searchable()
|
||||
->toggleable(isToggledHiddenByDefault: true)
|
||||
->searchable(),
|
||||
ImageColumn::make('image_path')
|
||||
->disk('public'),
|
||||
TextColumn::make('captured_at')
|
||||
->dateTime()
|
||||
->sortable(),
|
||||
TextColumn::make('lat')
|
||||
->numeric()
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
TextColumn::make('lng')
|
||||
->numeric()
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
TextColumn::make('title')
|
||||
->searchable(),
|
||||
TextColumn::make('created_at')
|
||||
->dateTime()
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
TextColumn::make('updated_at')
|
||||
->dateTime()
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
])
|
||||
->filters([
|
||||
//
|
||||
])
|
||||
->recordActions([
|
||||
EditAction::make(),
|
||||
])
|
||||
->toolbarActions([
|
||||
BulkActionGroup::make([
|
||||
DeleteBulkAction::make(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
||||
11
app/Filament/Resources/Users/Pages/CreateUser.php
Normal file
11
app/Filament/Resources/Users/Pages/CreateUser.php
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\Users\Pages;
|
||||
|
||||
use App\Filament\Resources\Users\UserResource;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
|
||||
class CreateUser extends CreateRecord
|
||||
{
|
||||
protected static string $resource = UserResource::class;
|
||||
}
|
||||
19
app/Filament/Resources/Users/Pages/EditUser.php
Normal file
19
app/Filament/Resources/Users/Pages/EditUser.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\Users\Pages;
|
||||
|
||||
use App\Filament\Resources\Users\UserResource;
|
||||
use Filament\Actions\DeleteAction;
|
||||
use Filament\Resources\Pages\EditRecord;
|
||||
|
||||
class EditUser extends EditRecord
|
||||
{
|
||||
protected static string $resource = UserResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
DeleteAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
19
app/Filament/Resources/Users/Pages/ListUsers.php
Normal file
19
app/Filament/Resources/Users/Pages/ListUsers.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\Users\Pages;
|
||||
|
||||
use App\Filament\Resources\Users\UserResource;
|
||||
use Filament\Actions\CreateAction;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
|
||||
class ListUsers extends ListRecords
|
||||
{
|
||||
protected static string $resource = UserResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
CreateAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
30
app/Filament/Resources/Users/Schemas/UserForm.php
Normal file
30
app/Filament/Resources/Users/Schemas/UserForm.php
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\Users\Schemas;
|
||||
|
||||
use Filament\Forms\Components\DateTimePicker;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Schemas\Schema;
|
||||
|
||||
class UserForm
|
||||
{
|
||||
public static function configure(Schema $schema): Schema
|
||||
{
|
||||
return $schema
|
||||
->components([
|
||||
TextInput::make('name')
|
||||
->required(),
|
||||
TextInput::make('email')
|
||||
->label('Email address')
|
||||
->email()
|
||||
->required(),
|
||||
DateTimePicker::make('email_verified_at'),
|
||||
TextInput::make('password')
|
||||
->password()
|
||||
->required(),
|
||||
TextInput::make('role')
|
||||
->required()
|
||||
->default('admin'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
48
app/Filament/Resources/Users/Tables/UsersTable.php
Normal file
48
app/Filament/Resources/Users/Tables/UsersTable.php
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\Users\Tables;
|
||||
|
||||
use Filament\Actions\BulkActionGroup;
|
||||
use Filament\Actions\DeleteBulkAction;
|
||||
use Filament\Actions\EditAction;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables\Table;
|
||||
|
||||
class UsersTable
|
||||
{
|
||||
public static function configure(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
TextColumn::make('name')
|
||||
->searchable(),
|
||||
TextColumn::make('email')
|
||||
->label('Email address')
|
||||
->searchable(),
|
||||
TextColumn::make('email_verified_at')
|
||||
->dateTime()
|
||||
->sortable(),
|
||||
TextColumn::make('role')
|
||||
->searchable(),
|
||||
TextColumn::make('created_at')
|
||||
->dateTime()
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
TextColumn::make('updated_at')
|
||||
->dateTime()
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
])
|
||||
->filters([
|
||||
//
|
||||
])
|
||||
->recordActions([
|
||||
EditAction::make(),
|
||||
])
|
||||
->toolbarActions([
|
||||
BulkActionGroup::make([
|
||||
DeleteBulkAction::make(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
||||
54
app/Filament/Resources/Users/UserResource.php
Normal file
54
app/Filament/Resources/Users/UserResource.php
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Resources\Users;
|
||||
|
||||
use App\Filament\Resources\Users\Pages\CreateUser;
|
||||
use App\Filament\Resources\Users\Pages\EditUser;
|
||||
use App\Filament\Resources\Users\Pages\ListUsers;
|
||||
use App\Filament\Resources\Users\Schemas\UserForm;
|
||||
use App\Filament\Resources\Users\Tables\UsersTable;
|
||||
use App\Models\User;
|
||||
use BackedEnum;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Schemas\Schema;
|
||||
use Filament\Support\Icons\Heroicon;
|
||||
use Filament\Tables\Table;
|
||||
|
||||
class UserResource extends Resource
|
||||
{
|
||||
protected static ?string $model = User::class;
|
||||
|
||||
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
|
||||
|
||||
public static function form(Schema $schema): Schema
|
||||
{
|
||||
return UserForm::configure($schema);
|
||||
}
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return UsersTable::configure($table);
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
// Only allow access if the user is an admin
|
||||
return auth()->user()->role === 'admin';
|
||||
}
|
||||
|
||||
public static function getRelations(): array
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPages(): array
|
||||
{
|
||||
return [
|
||||
'index' => ListUsers::route('/'),
|
||||
'create' => CreateUser::route('/create'),
|
||||
'edit' => EditUser::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
}
|
||||
8
app/Http/Controllers/Controller.php
Normal file
8
app/Http/Controllers/Controller.php
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
abstract class Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
65
app/Http/Controllers/PhotoGeoDataController.php
Normal file
65
app/Http/Controllers/PhotoGeoDataController.php
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\PhotoGeoData;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PhotoGeoDataController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(PhotoGeoData $photoGeoData)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(PhotoGeoData $photoGeoData)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, PhotoGeoData $photoGeoData)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(PhotoGeoData $photoGeoData)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
27
app/Models/PhotoGeoData.php
Normal file
27
app/Models/PhotoGeoData.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Concerns\HasUlids;
|
||||
|
||||
class PhotoGeoData extends Model
|
||||
{
|
||||
use HasUlids;
|
||||
|
||||
protected $fillable = [
|
||||
'uploaded_by',
|
||||
'image_path',
|
||||
'title',
|
||||
'captured_at',
|
||||
'lat',
|
||||
'lng',
|
||||
'desc',
|
||||
'story',
|
||||
'metadata'
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'metadata' => 'array',
|
||||
];
|
||||
}
|
||||
32
app/Models/User.php
Normal file
32
app/Models/User.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Database\Factories\UserFactory;
|
||||
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
||||
use Illuminate\Database\Eloquent\Attributes\Hidden;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
|
||||
#[Fillable(['name', 'email', 'password','role'])]
|
||||
#[Hidden(['password', 'remember_token'])]
|
||||
class User extends Authenticatable
|
||||
{
|
||||
/** @use HasFactory<UserFactory> */
|
||||
use HasFactory, Notifiable;
|
||||
|
||||
/**
|
||||
* Get the attributes that should be cast.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'email_verified_at' => 'datetime',
|
||||
'password' => 'hashed',
|
||||
];
|
||||
}
|
||||
}
|
||||
71
app/Policies/PhotoGeoDataPolicy.php
Normal file
71
app/Policies/PhotoGeoDataPolicy.php
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\PhotoGeoData;
|
||||
|
||||
class PhotoGeoDataPolicy
|
||||
{
|
||||
/**
|
||||
* Create a new policy instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function viewAny(User $user): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can view the model.
|
||||
*/
|
||||
public function view(User $user, User $model): bool
|
||||
{
|
||||
return $user->role === 'admin';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can create models.
|
||||
*/
|
||||
public function create(User $user): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can update the model.
|
||||
*/
|
||||
public function update(User $user, PhotoGeoData $record): bool
|
||||
{
|
||||
return $user->role === 'admin';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can delete the model.
|
||||
*/
|
||||
public function delete(User $user, PhotoGeoData $record): bool
|
||||
{
|
||||
return $user->role === 'admin';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can restore the model.
|
||||
*/
|
||||
public function restore(User $user, PhotoGeoData $record): bool
|
||||
{
|
||||
return $user->role === 'admin';
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can permanently delete the model.
|
||||
*/
|
||||
public function forceDelete(User $user, PhotoGeoData $record): bool
|
||||
{
|
||||
return $user->role === 'admin';
|
||||
}
|
||||
|
||||
}
|
||||
25
app/Providers/AppServiceProvider.php
Normal file
25
app/Providers/AppServiceProvider.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
77
app/Providers/Filament/AdminPanelProvider.php
Normal file
77
app/Providers/Filament/AdminPanelProvider.php
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
|
||||
namespace App\Providers\Filament;
|
||||
|
||||
use Filament\Http\Middleware\Authenticate;
|
||||
use Filament\Http\Middleware\AuthenticateSession;
|
||||
use Filament\Http\Middleware\DisableBladeIconComponents;
|
||||
use Filament\Http\Middleware\DispatchServingFilamentEvent;
|
||||
use Filament\Panel;
|
||||
use Filament\PanelProvider;
|
||||
use Filament\Support\Colors\Color;
|
||||
use Filament\Widgets\AccountWidget;
|
||||
use Filament\Widgets\FilamentInfoWidget;
|
||||
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
|
||||
use Illuminate\Cookie\Middleware\EncryptCookies;
|
||||
use Illuminate\Foundation\Http\Middleware\PreventRequestForgery;
|
||||
use Illuminate\Routing\Middleware\SubstituteBindings;
|
||||
use Illuminate\Session\Middleware\StartSession;
|
||||
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||
use App\Filament\Resources\PhotoGeoData\PhotoGeoDataResource;
|
||||
use Filament\Support\Facades\FilamentView;
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Filament\View\PanelsRenderHook;
|
||||
|
||||
class AdminPanelProvider extends PanelProvider
|
||||
{
|
||||
public function boot()
|
||||
{
|
||||
FilamentView::registerRenderHook(
|
||||
'panels::head.end',
|
||||
fn (): string => (auth()->user()?->role !== 'admin')
|
||||
? '<style>.fi-sidebar { display: none !important; } .fi-main { margin-inline-start: 0 !important; }</style>'
|
||||
: '',
|
||||
);
|
||||
}
|
||||
|
||||
public function panel(Panel $panel): Panel
|
||||
{
|
||||
return $panel
|
||||
->default()
|
||||
->id('admin')
|
||||
->path('')
|
||||
->login()
|
||||
->renderHook(
|
||||
PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE,
|
||||
fn (): string => Blade::render('<p class="text-sm text-center text-gray-500">Välkommen! Logga in för att komma åt formuläret.</p>'),
|
||||
)
|
||||
->colors([
|
||||
'primary' => Color::Zinc,
|
||||
])
|
||||
->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources')
|
||||
->pages([
|
||||
\App\Filament\Pages\Home::class,
|
||||
\App\Filament\Pages\ThankYou::class,
|
||||
])
|
||||
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets')
|
||||
->widgets([
|
||||
|
||||
])
|
||||
->middleware([
|
||||
EncryptCookies::class,
|
||||
AddQueuedCookiesToResponse::class,
|
||||
StartSession::class,
|
||||
AuthenticateSession::class,
|
||||
ShareErrorsFromSession::class,
|
||||
PreventRequestForgery::class,
|
||||
SubstituteBindings::class,
|
||||
DisableBladeIconComponents::class,
|
||||
DispatchServingFilamentEvent::class,
|
||||
])
|
||||
->authMiddleware([
|
||||
Authenticate::class,
|
||||
])
|
||||
->darkMode(false)
|
||||
;
|
||||
}
|
||||
}
|
||||
18
artisan
Executable file
18
artisan
Executable file
|
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Symfony\Component\Console\Input\ArgvInput;
|
||||
|
||||
define('LARAVEL_START', microtime(true));
|
||||
|
||||
// Register the Composer autoloader...
|
||||
require __DIR__.'/vendor/autoload.php';
|
||||
|
||||
// Bootstrap Laravel and handle the command...
|
||||
/** @var Application $app */
|
||||
$app = require_once __DIR__.'/bootstrap/app.php';
|
||||
|
||||
$status = $app->handleCommand(new ArgvInput);
|
||||
|
||||
exit($status);
|
||||
18
bootstrap/app.php
Normal file
18
bootstrap/app.php
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Foundation\Configuration\Exceptions;
|
||||
use Illuminate\Foundation\Configuration\Middleware;
|
||||
|
||||
return Application::configure(basePath: dirname(__DIR__))
|
||||
->withRouting(
|
||||
web: __DIR__.'/../routes/web.php',
|
||||
commands: __DIR__.'/../routes/console.php',
|
||||
health: '/up',
|
||||
)
|
||||
->withMiddleware(function (Middleware $middleware): void {
|
||||
//
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions): void {
|
||||
//
|
||||
})->create();
|
||||
2
bootstrap/cache/.gitignore
vendored
Executable file
2
bootstrap/cache/.gitignore
vendored
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
*
|
||||
!.gitignore
|
||||
6
bootstrap/providers.php
Normal file
6
bootstrap/providers.php
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
App\Providers\AppServiceProvider::class,
|
||||
App\Providers\Filament\AdminPanelProvider::class,
|
||||
];
|
||||
90
composer.json
Normal file
90
composer.json
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
{
|
||||
"$schema": "https://getcomposer.org/schema.json",
|
||||
"name": "laravel/laravel",
|
||||
"type": "project",
|
||||
"description": "The skeleton application for the Laravel framework.",
|
||||
"keywords": ["laravel", "framework"],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.3",
|
||||
"eduardoribeirodev/filament-leaflet": "^4.7",
|
||||
"filament/filament": "^5.0",
|
||||
"intervention/image": "^4.0",
|
||||
"laravel/framework": "^13.0",
|
||||
"laravel/tinker": "^3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.23",
|
||||
"laravel/pail": "^1.2.5",
|
||||
"laravel/pint": "^1.27",
|
||||
"laravel/sail": "^1.56",
|
||||
"mockery/mockery": "^1.6",
|
||||
"nunomaduro/collision": "^8.6",
|
||||
"phpunit/phpunit": "^12.5.12"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Tests\\": "tests/"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"setup": [
|
||||
"composer install",
|
||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
|
||||
"@php artisan key:generate",
|
||||
"@php artisan migrate --force",
|
||||
"npm install --ignore-scripts",
|
||||
"npm run build"
|
||||
],
|
||||
"dev": [
|
||||
"Composer\\Config::disableProcessTimeout",
|
||||
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1 --timeout=0\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"
|
||||
],
|
||||
"test": [
|
||||
"@php artisan config:clear --ansi",
|
||||
"@php artisan test"
|
||||
],
|
||||
"post-autoload-dump": [
|
||||
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
||||
"@php artisan package:discover --ansi",
|
||||
"@php artisan filament:upgrade"
|
||||
],
|
||||
"post-update-cmd": [
|
||||
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
|
||||
],
|
||||
"post-root-package-install": [
|
||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
||||
],
|
||||
"post-create-project-cmd": [
|
||||
"@php artisan key:generate --ansi",
|
||||
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
|
||||
"@php artisan migrate --graceful --ansi"
|
||||
],
|
||||
"pre-package-uninstall": [
|
||||
"Illuminate\\Foundation\\ComposerScripts::prePackageUninstall"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"dont-discover": []
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"pestphp/pest-plugin": true,
|
||||
"php-http/discovery": true
|
||||
}
|
||||
},
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
}
|
||||
10404
composer.lock
generated
Normal file
10404
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
126
config/app.php
Normal file
126
config/app.php
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value is the name of your application, which will be used when the
|
||||
| framework needs to place the application's name in a notification or
|
||||
| other UI elements where an application name needs to be displayed.
|
||||
|
|
||||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Laravel'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Environment
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the "environment" your application is currently
|
||||
| running in. This may determine how you prefer to configure various
|
||||
| services the application utilizes. Set this in your ".env" file.
|
||||
|
|
||||
*/
|
||||
|
||||
'env' => env('APP_ENV', 'production'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Debug Mode
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When your application is in debug mode, detailed error messages with
|
||||
| stack traces will be shown on every error that occurs within your
|
||||
| application. If disabled, a simple generic error page is shown.
|
||||
|
|
||||
*/
|
||||
|
||||
'debug' => (bool) env('APP_DEBUG', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This URL is used by the console to properly generate URLs when using
|
||||
| the Artisan command line tool. You should set this to the root of
|
||||
| the application so that it's available within Artisan commands.
|
||||
|
|
||||
*/
|
||||
|
||||
'url' => env('APP_URL', 'http://localhost'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Timezone
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default timezone for your application, which
|
||||
| will be used by the PHP date and date-time functions. The timezone
|
||||
| is set to "UTC" by default as it is suitable for most use cases.
|
||||
|
|
||||
*/
|
||||
|
||||
'timezone' => 'UTC',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Locale Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The application locale determines the default locale that will be used
|
||||
| by Laravel's translation / localization methods. This option can be
|
||||
| set to any locale for which you plan to have translation strings.
|
||||
|
|
||||
*/
|
||||
|
||||
'locale' => env('APP_LOCALE', 'en'),
|
||||
|
||||
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
|
||||
|
||||
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This key is utilized by Laravel's encryption services and should be set
|
||||
| to a random, 32 character string to ensure that all encrypted values
|
||||
| are secure. You should do this prior to deploying the application.
|
||||
|
|
||||
*/
|
||||
|
||||
'cipher' => 'AES-256-CBC',
|
||||
|
||||
'key' => env('APP_KEY'),
|
||||
|
||||
'previous_keys' => [
|
||||
...array_filter(
|
||||
explode(',', (string) env('APP_PREVIOUS_KEYS', ''))
|
||||
),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Maintenance Mode Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options determine the driver used to determine and
|
||||
| manage Laravel's "maintenance mode" status. The "cache" driver will
|
||||
| allow maintenance mode to be controlled across multiple machines.
|
||||
|
|
||||
| Supported drivers: "file", "cache"
|
||||
|
|
||||
*/
|
||||
|
||||
'maintenance' => [
|
||||
'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
|
||||
'store' => env('APP_MAINTENANCE_STORE', 'database'),
|
||||
],
|
||||
|
||||
];
|
||||
117
config/auth.php
Normal file
117
config/auth.php
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
|
||||
use App\Models\User;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Defaults
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default authentication "guard" and password
|
||||
| reset "broker" for your application. You may change these values
|
||||
| as required, but they're a perfect start for most applications.
|
||||
|
|
||||
*/
|
||||
|
||||
'defaults' => [
|
||||
'guard' => env('AUTH_GUARD', 'web'),
|
||||
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Guards
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next, you may define every authentication guard for your application.
|
||||
| Of course, a great default configuration has been defined for you
|
||||
| which utilizes session storage plus the Eloquent user provider.
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| Supported: "session"
|
||||
|
|
||||
*/
|
||||
|
||||
'guards' => [
|
||||
'web' => [
|
||||
'driver' => 'session',
|
||||
'provider' => 'users',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User Providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| If you have multiple user tables or models you may configure multiple
|
||||
| providers to represent the model / table. These providers may then
|
||||
| be assigned to any extra authentication guards you have defined.
|
||||
|
|
||||
| Supported: "database", "eloquent"
|
||||
|
|
||||
*/
|
||||
|
||||
'providers' => [
|
||||
'users' => [
|
||||
'driver' => 'eloquent',
|
||||
'model' => env('AUTH_MODEL', User::class),
|
||||
],
|
||||
|
||||
// 'users' => [
|
||||
// 'driver' => 'database',
|
||||
// 'table' => 'users',
|
||||
// ],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Resetting Passwords
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options specify the behavior of Laravel's password
|
||||
| reset functionality, including the table utilized for token storage
|
||||
| and the user provider that is invoked to actually retrieve users.
|
||||
|
|
||||
| The expiry time is the number of minutes that each reset token will be
|
||||
| considered valid. This security feature keeps tokens short-lived so
|
||||
| they have less time to be guessed. You may change this as needed.
|
||||
|
|
||||
| The throttle setting is the number of seconds a user must wait before
|
||||
| generating more password reset tokens. This prevents the user from
|
||||
| quickly generating a very large amount of password reset tokens.
|
||||
|
|
||||
*/
|
||||
|
||||
'passwords' => [
|
||||
'users' => [
|
||||
'provider' => 'users',
|
||||
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
|
||||
'expire' => 60,
|
||||
'throttle' => 60,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Confirmation Timeout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define the number of seconds before a password confirmation
|
||||
| window expires and users are asked to re-enter their password via the
|
||||
| confirmation screen. By default, the timeout lasts for three hours.
|
||||
|
|
||||
*/
|
||||
|
||||
'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
|
||||
|
||||
];
|
||||
130
config/cache.php
Normal file
130
config/cache.php
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Cache Store
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default cache store that will be used by the
|
||||
| framework. This connection is utilized if another isn't explicitly
|
||||
| specified when running a cache operation inside the application.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('CACHE_STORE', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Stores
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define all of the cache "stores" for your application as
|
||||
| well as their drivers. You may even define multiple stores for the
|
||||
| same cache driver to group types of items stored in your caches.
|
||||
|
|
||||
| Supported drivers: "array", "database", "file", "memcached",
|
||||
| "redis", "dynamodb", "octane",
|
||||
| "failover", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'stores' => [
|
||||
|
||||
'array' => [
|
||||
'driver' => 'array',
|
||||
'serialize' => false,
|
||||
],
|
||||
|
||||
'database' => [
|
||||
'driver' => 'database',
|
||||
'connection' => env('DB_CACHE_CONNECTION'),
|
||||
'table' => env('DB_CACHE_TABLE', 'cache'),
|
||||
'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
|
||||
'lock_table' => env('DB_CACHE_LOCK_TABLE'),
|
||||
],
|
||||
|
||||
'file' => [
|
||||
'driver' => 'file',
|
||||
'path' => storage_path('framework/cache/data'),
|
||||
'lock_path' => storage_path('framework/cache/data'),
|
||||
],
|
||||
|
||||
'memcached' => [
|
||||
'driver' => 'memcached',
|
||||
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
|
||||
'sasl' => [
|
||||
env('MEMCACHED_USERNAME'),
|
||||
env('MEMCACHED_PASSWORD'),
|
||||
],
|
||||
'options' => [
|
||||
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
|
||||
],
|
||||
'servers' => [
|
||||
[
|
||||
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
|
||||
'port' => env('MEMCACHED_PORT', 11211),
|
||||
'weight' => 100,
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
|
||||
'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
|
||||
],
|
||||
|
||||
'dynamodb' => [
|
||||
'driver' => 'dynamodb',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
|
||||
'endpoint' => env('DYNAMODB_ENDPOINT'),
|
||||
],
|
||||
|
||||
'octane' => [
|
||||
'driver' => 'octane',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'driver' => 'failover',
|
||||
'stores' => [
|
||||
'database',
|
||||
'array',
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Key Prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When utilizing the APC, database, memcached, Redis, and DynamoDB cache
|
||||
| stores, there might be other applications using the same cache. For
|
||||
| that reason, you may prefix every cache key to avoid collisions.
|
||||
|
|
||||
*/
|
||||
|
||||
'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Serializable Classes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the classes that can be unserialized from cache
|
||||
| storage. By default, no PHP classes will be unserialized from your
|
||||
| cache to prevent gadget chain attacks if your APP_KEY is leaked.
|
||||
|
|
||||
*/
|
||||
|
||||
'serializable_classes' => false,
|
||||
|
||||
];
|
||||
184
config/database.php
Normal file
184
config/database.php
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Pdo\Mysql;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Database Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify which of the database connections below you wish
|
||||
| to use as your default connection for database operations. This is
|
||||
| the connection which will be utilized unless another connection
|
||||
| is explicitly specified when you execute a query / statement.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('DB_CONNECTION', 'sqlite'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Database Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Below are all of the database connections defined for your application.
|
||||
| An example configuration is provided for each database system which
|
||||
| is supported by Laravel. You're free to add / remove connections.
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'sqlite' => [
|
||||
'driver' => 'sqlite',
|
||||
'url' => env('DB_URL'),
|
||||
'database' => env('DB_DATABASE', database_path('database.sqlite')),
|
||||
'prefix' => '',
|
||||
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
|
||||
'busy_timeout' => null,
|
||||
'journal_mode' => null,
|
||||
'synchronous' => null,
|
||||
'transaction_mode' => 'DEFERRED',
|
||||
],
|
||||
|
||||
'mysql' => [
|
||||
'driver' => 'mysql',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '3306'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'unix_socket' => env('DB_SOCKET', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
'mariadb' => [
|
||||
'driver' => 'mariadb',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '3306'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'unix_socket' => env('DB_SOCKET', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
'pgsql' => [
|
||||
'driver' => 'pgsql',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '5432'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'search_path' => 'public',
|
||||
'sslmode' => env('DB_SSLMODE', 'prefer'),
|
||||
],
|
||||
|
||||
'sqlsrv' => [
|
||||
'driver' => 'sqlsrv',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', 'localhost'),
|
||||
'port' => env('DB_PORT', '1433'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
// 'encrypt' => env('DB_ENCRYPT', 'yes'),
|
||||
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Migration Repository Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This table keeps track of all the migrations that have already run for
|
||||
| your application. Using this information, we can determine which of
|
||||
| the migrations on disk haven't actually been run on the database.
|
||||
|
|
||||
*/
|
||||
|
||||
'migrations' => [
|
||||
'table' => 'migrations',
|
||||
'update_date_on_publish' => true,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Redis Databases
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Redis is an open source, fast, and advanced key-value store that also
|
||||
| provides a richer body of commands than a typical key-value system
|
||||
| such as Memcached. You may define your connection settings here.
|
||||
|
|
||||
*/
|
||||
|
||||
'redis' => [
|
||||
|
||||
'client' => env('REDIS_CLIENT', 'phpredis'),
|
||||
|
||||
'options' => [
|
||||
'cluster' => env('REDIS_CLUSTER', 'redis'),
|
||||
'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'),
|
||||
'persistent' => env('REDIS_PERSISTENT', false),
|
||||
],
|
||||
|
||||
'default' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_DB', '0'),
|
||||
'max_retries' => env('REDIS_MAX_RETRIES', 3),
|
||||
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
|
||||
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
|
||||
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
|
||||
],
|
||||
|
||||
'cache' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_CACHE_DB', '1'),
|
||||
'max_retries' => env('REDIS_MAX_RETRIES', 3),
|
||||
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
|
||||
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
|
||||
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
120
config/filament.php
Normal file
120
config/filament.php
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Broadcasting
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By uncommenting the Laravel Echo configuration, you may connect Filament
|
||||
| to any Pusher-compatible websockets server.
|
||||
|
|
||||
| This will allow your users to receive real-time notifications.
|
||||
|
|
||||
*/
|
||||
|
||||
'broadcasting' => [
|
||||
|
||||
// 'echo' => [
|
||||
// 'broadcaster' => 'pusher',
|
||||
// 'key' => env('VITE_PUSHER_APP_KEY'),
|
||||
// 'cluster' => env('VITE_PUSHER_APP_CLUSTER'),
|
||||
// 'wsHost' => env('VITE_PUSHER_HOST'),
|
||||
// 'wsPort' => env('VITE_PUSHER_PORT'),
|
||||
// 'wssPort' => env('VITE_PUSHER_PORT'),
|
||||
// 'authEndpoint' => '/broadcasting/auth',
|
||||
// 'disableStats' => true,
|
||||
// 'encrypted' => true,
|
||||
// 'forceTLS' => env('VITE_PUSHER_SCHEME', 'https') === 'https',
|
||||
// ],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Filesystem Disk
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the storage disk Filament will use to store files. You may use
|
||||
| any of the disks defined in the `config/filesystems.php`.
|
||||
|
|
||||
*/
|
||||
|
||||
'default_filesystem_disk' => env('FILESYSTEM_DISK', 'local'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Assets Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the directory where Filament's assets will be published to. It
|
||||
| is relative to the `public` directory of your Laravel application.
|
||||
|
|
||||
| After changing the path, you should run `php artisan filament:assets`.
|
||||
|
|
||||
*/
|
||||
|
||||
'assets_path' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the directory that Filament will use to store cache files that
|
||||
| are used to optimize the registration of components.
|
||||
|
|
||||
| After changing the path, you should run `php artisan filament:cache-components`.
|
||||
|
|
||||
*/
|
||||
|
||||
'cache_path' => base_path('bootstrap/cache/filament'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Livewire Loading Delay
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This sets the delay before loading indicators appear.
|
||||
|
|
||||
| Setting this to 'none' makes indicators appear immediately, which can be
|
||||
| desirable for high-latency connections. Setting it to 'default' applies
|
||||
| Livewire's standard 200ms delay.
|
||||
|
|
||||
*/
|
||||
|
||||
'livewire_loading_delay' => 'default',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| File Generation
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Artisan commands that generate files can be configured here by setting
|
||||
| configuration flags that will impact their location or content.
|
||||
|
|
||||
| Often, this is useful to preserve file generation behavior from a
|
||||
| previous version of Filament, to ensure consistency between older and
|
||||
| newer generated files. These flags are often documented in the upgrade
|
||||
| guide for the version of Filament you are upgrading to.
|
||||
|
|
||||
*/
|
||||
|
||||
'file_generation' => [
|
||||
'flags' => [],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| System Route Prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the prefix used for the system routes that Filament registers,
|
||||
| such as the routes for downloading exports and failed import rows.
|
||||
|
|
||||
*/
|
||||
|
||||
'system_route_prefix' => 'filament',
|
||||
|
||||
];
|
||||
80
config/filesystems.php
Normal file
80
config/filesystems.php
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Filesystem Disk
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default filesystem disk that should be used
|
||||
| by the framework. The "local" disk, as well as a variety of cloud
|
||||
| based disks are available to your application for file storage.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('FILESYSTEM_DISK', 'local'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filesystem Disks
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Below you may configure as many filesystem disks as necessary, and you
|
||||
| may even configure multiple disks for the same driver. Examples for
|
||||
| most supported storage drivers are configured here for reference.
|
||||
|
|
||||
| Supported drivers: "local", "ftp", "sftp", "s3"
|
||||
|
|
||||
*/
|
||||
|
||||
'disks' => [
|
||||
|
||||
'local' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/private'),
|
||||
'serve' => true,
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
'public' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/public'),
|
||||
'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage',
|
||||
'visibility' => 'public',
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
's3' => [
|
||||
'driver' => 's3',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION'),
|
||||
'bucket' => env('AWS_BUCKET'),
|
||||
'url' => env('AWS_URL'),
|
||||
'endpoint' => env('AWS_ENDPOINT'),
|
||||
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Symbolic Links
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the symbolic links that will be created when the
|
||||
| `storage:link` Artisan command is executed. The array keys should be
|
||||
| the locations of the links and the values should be their targets.
|
||||
|
|
||||
*/
|
||||
|
||||
'links' => [
|
||||
public_path('storage') => storage_path('app/public'),
|
||||
],
|
||||
|
||||
];
|
||||
46
config/image.php
Normal file
46
config/image.php
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Image Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Intervention Image supports “GD Library” and “Imagick” to process images
|
||||
| internally. Depending on your PHP setup, you can choose one of them.
|
||||
|
|
||||
| Included options:
|
||||
| - \Intervention\Image\Drivers\Gd\Driver::class
|
||||
| - \Intervention\Image\Drivers\Imagick\Driver::class
|
||||
| - \Intervention\Image\Drivers\Vips\Driver::class
|
||||
*/
|
||||
|
||||
'driver' => env('IMAGE_DRIVER', \Intervention\Image\Drivers\Gd\Driver::class),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Configuration Options
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These options control the behavior of Intervention Image.
|
||||
|
|
||||
| - "autoOrientation" controls whether an imported image should be
|
||||
| automatically rotated according to any existing Exif data.
|
||||
|
|
||||
| - "decodeAnimation" decides whether a possibly animated image is
|
||||
| decoded as such or whether the animation is discarded.
|
||||
|
|
||||
| - "backgroundColor" Defines the default background & blending color.
|
||||
|
|
||||
| - "strip" controls if meta data like exif tags should be removed when
|
||||
| encoding images.
|
||||
*/
|
||||
|
||||
'options' => [
|
||||
'autoOrientation' => true,
|
||||
'decodeAnimation' => true,
|
||||
'backgroundColor' => 'ffffff',
|
||||
'strip' => false,
|
||||
]
|
||||
];
|
||||
132
config/logging.php
Normal file
132
config/logging.php
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
<?php
|
||||
|
||||
use Monolog\Handler\NullHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Handler\SyslogUdpHandler;
|
||||
use Monolog\Processor\PsrLogMessageProcessor;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default log channel that is utilized to write
|
||||
| messages to your logs. The value provided here should match one of
|
||||
| the channels present in the list of "channels" configured below.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('LOG_CHANNEL', 'stack'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Deprecations Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the log channel that should be used to log warnings
|
||||
| regarding deprecated PHP and library features. This allows you to get
|
||||
| your application ready for upcoming major versions of dependencies.
|
||||
|
|
||||
*/
|
||||
|
||||
'deprecations' => [
|
||||
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
|
||||
'trace' => env('LOG_DEPRECATIONS_TRACE', false),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Log Channels
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the log channels for your application. Laravel
|
||||
| utilizes the Monolog PHP logging library, which includes a variety
|
||||
| of powerful log handlers and formatters that you're free to use.
|
||||
|
|
||||
| Available drivers: "single", "daily", "slack", "syslog",
|
||||
| "errorlog", "monolog", "custom", "stack"
|
||||
|
|
||||
*/
|
||||
|
||||
'channels' => [
|
||||
|
||||
'stack' => [
|
||||
'driver' => 'stack',
|
||||
'channels' => explode(',', (string) env('LOG_STACK', 'single')),
|
||||
'ignore_exceptions' => false,
|
||||
],
|
||||
|
||||
'single' => [
|
||||
'driver' => 'single',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'daily' => [
|
||||
'driver' => 'daily',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'days' => env('LOG_DAILY_DAYS', 14),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'driver' => 'slack',
|
||||
'url' => env('LOG_SLACK_WEBHOOK_URL'),
|
||||
'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')),
|
||||
'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
|
||||
'level' => env('LOG_LEVEL', 'critical'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'papertrail' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
|
||||
'handler_with' => [
|
||||
'host' => env('PAPERTRAIL_URL'),
|
||||
'port' => env('PAPERTRAIL_PORT'),
|
||||
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
|
||||
],
|
||||
'processors' => [PsrLogMessageProcessor::class],
|
||||
],
|
||||
|
||||
'stderr' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'handler' => StreamHandler::class,
|
||||
'handler_with' => [
|
||||
'stream' => 'php://stderr',
|
||||
],
|
||||
'formatter' => env('LOG_STDERR_FORMATTER'),
|
||||
'processors' => [PsrLogMessageProcessor::class],
|
||||
],
|
||||
|
||||
'syslog' => [
|
||||
'driver' => 'syslog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'errorlog' => [
|
||||
'driver' => 'errorlog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'null' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => NullHandler::class,
|
||||
],
|
||||
|
||||
'emergency' => [
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
118
config/mail.php
Normal file
118
config/mail.php
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Mailer
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default mailer that is used to send all email
|
||||
| messages unless another mailer is explicitly specified when sending
|
||||
| the message. All additional mailers can be configured within the
|
||||
| "mailers" array. Examples of each type of mailer are provided.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('MAIL_MAILER', 'log'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Mailer Configurations
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure all of the mailers used by your application plus
|
||||
| their respective settings. Several examples have been configured for
|
||||
| you and you are free to add your own as your application requires.
|
||||
|
|
||||
| Laravel supports a variety of mail "transport" drivers that can be used
|
||||
| when delivering an email. You may specify which one you're using for
|
||||
| your mailers below. You may also add additional mailers if needed.
|
||||
|
|
||||
| Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
|
||||
| "postmark", "resend", "log", "array",
|
||||
| "failover", "roundrobin"
|
||||
|
|
||||
*/
|
||||
|
||||
'mailers' => [
|
||||
|
||||
'smtp' => [
|
||||
'transport' => 'smtp',
|
||||
'scheme' => env('MAIL_SCHEME'),
|
||||
'url' => env('MAIL_URL'),
|
||||
'host' => env('MAIL_HOST', '127.0.0.1'),
|
||||
'port' => env('MAIL_PORT', 2525),
|
||||
'username' => env('MAIL_USERNAME'),
|
||||
'password' => env('MAIL_PASSWORD'),
|
||||
'timeout' => null,
|
||||
'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'transport' => 'ses',
|
||||
],
|
||||
|
||||
'postmark' => [
|
||||
'transport' => 'postmark',
|
||||
// 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
|
||||
// 'client' => [
|
||||
// 'timeout' => 5,
|
||||
// ],
|
||||
],
|
||||
|
||||
'resend' => [
|
||||
'transport' => 'resend',
|
||||
],
|
||||
|
||||
'sendmail' => [
|
||||
'transport' => 'sendmail',
|
||||
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
|
||||
],
|
||||
|
||||
'log' => [
|
||||
'transport' => 'log',
|
||||
'channel' => env('MAIL_LOG_CHANNEL'),
|
||||
],
|
||||
|
||||
'array' => [
|
||||
'transport' => 'array',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'transport' => 'failover',
|
||||
'mailers' => [
|
||||
'smtp',
|
||||
'log',
|
||||
],
|
||||
'retry_after' => 60,
|
||||
],
|
||||
|
||||
'roundrobin' => [
|
||||
'transport' => 'roundrobin',
|
||||
'mailers' => [
|
||||
'ses',
|
||||
'postmark',
|
||||
],
|
||||
'retry_after' => 60,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Global "From" Address
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may wish for all emails sent by your application to be sent from
|
||||
| the same address. Here you may specify a name and address that is
|
||||
| used globally for all emails that are sent by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'from' => [
|
||||
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
|
||||
'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')),
|
||||
],
|
||||
|
||||
];
|
||||
129
config/queue.php
Normal file
129
config/queue.php
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Queue Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Laravel's queue supports a variety of backends via a single, unified
|
||||
| API, giving you convenient access to each backend using identical
|
||||
| syntax for each. The default queue connection is defined below.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('QUEUE_CONNECTION', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Queue Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the connection options for every queue backend
|
||||
| used by your application. An example configuration is provided for
|
||||
| each backend supported by Laravel. You're also free to add more.
|
||||
|
|
||||
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis",
|
||||
| "deferred", "background", "failover", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'sync' => [
|
||||
'driver' => 'sync',
|
||||
],
|
||||
|
||||
'database' => [
|
||||
'driver' => 'database',
|
||||
'connection' => env('DB_QUEUE_CONNECTION'),
|
||||
'table' => env('DB_QUEUE_TABLE', 'jobs'),
|
||||
'queue' => env('DB_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'beanstalkd' => [
|
||||
'driver' => 'beanstalkd',
|
||||
'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
|
||||
'queue' => env('BEANSTALKD_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
|
||||
'block_for' => 0,
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'sqs' => [
|
||||
'driver' => 'sqs',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
|
||||
'queue' => env('SQS_QUEUE', 'default'),
|
||||
'suffix' => env('SQS_SUFFIX'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
|
||||
'queue' => env('REDIS_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
|
||||
'block_for' => null,
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'deferred' => [
|
||||
'driver' => 'deferred',
|
||||
],
|
||||
|
||||
'background' => [
|
||||
'driver' => 'background',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'driver' => 'failover',
|
||||
'connections' => [
|
||||
'database',
|
||||
'deferred',
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Job Batching
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following options configure the database and table that store job
|
||||
| batching information. These options can be updated to any database
|
||||
| connection and table which has been defined by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'batching' => [
|
||||
'database' => env('DB_CONNECTION', 'sqlite'),
|
||||
'table' => 'job_batches',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Failed Queue Jobs
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These options configure the behavior of failed queue job logging so you
|
||||
| can control how and where failed jobs are stored. Laravel ships with
|
||||
| support for storing failed jobs in a simple file or in a database.
|
||||
|
|
||||
| Supported drivers: "database-uuids", "dynamodb", "file", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => [
|
||||
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
|
||||
'database' => env('DB_CONNECTION', 'sqlite'),
|
||||
'table' => 'failed_jobs',
|
||||
],
|
||||
|
||||
];
|
||||
38
config/services.php
Normal file
38
config/services.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Third Party Services
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This file is for storing the credentials for third party services such
|
||||
| as Mailgun, Postmark, AWS and more. This file provides the de facto
|
||||
| location for this type of information, allowing packages to have
|
||||
| a conventional file to locate the various service credentials.
|
||||
|
|
||||
*/
|
||||
|
||||
'postmark' => [
|
||||
'key' => env('POSTMARK_API_KEY'),
|
||||
],
|
||||
|
||||
'resend' => [
|
||||
'key' => env('RESEND_API_KEY'),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'notifications' => [
|
||||
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
|
||||
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
233
config/session.php
Normal file
233
config/session.php
Normal file
|
|
@ -0,0 +1,233 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Session Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option determines the default session driver that is utilized for
|
||||
| incoming requests. Laravel supports a variety of storage options to
|
||||
| persist session data. Database storage is a great default choice.
|
||||
|
|
||||
| Supported: "file", "cookie", "database", "memcached",
|
||||
| "redis", "dynamodb", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => env('SESSION_DRIVER', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Lifetime
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the number of minutes that you wish the session
|
||||
| to be allowed to remain idle before it expires. If you want them
|
||||
| to expire immediately when the browser is closed then you may
|
||||
| indicate that via the expire_on_close configuration option.
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => (int) env('SESSION_LIFETIME', 120),
|
||||
|
||||
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Encryption
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option allows you to easily specify that all of your session data
|
||||
| should be encrypted before it's stored. All encryption is performed
|
||||
| automatically by Laravel and you may use the session like normal.
|
||||
|
|
||||
*/
|
||||
|
||||
'encrypt' => env('SESSION_ENCRYPT', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session File Location
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When utilizing the "file" session driver, the session files are placed
|
||||
| on disk. The default storage location is defined here; however, you
|
||||
| are free to provide another location where they should be stored.
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => storage_path('framework/sessions'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Connection
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" or "redis" session drivers, you may specify a
|
||||
| connection that should be used to manage these sessions. This should
|
||||
| correspond to a connection in your database configuration options.
|
||||
|
|
||||
*/
|
||||
|
||||
'connection' => env('SESSION_CONNECTION'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" session driver, you may specify the table to
|
||||
| be used to store sessions. Of course, a sensible default is defined
|
||||
| for you; however, you're welcome to change this to another table.
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => env('SESSION_TABLE', 'sessions'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cache Store
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using one of the framework's cache driven session backends, you may
|
||||
| define the cache store which should be used to store the session data
|
||||
| between requests. This must match one of your defined cache stores.
|
||||
|
|
||||
| Affects: "dynamodb", "memcached", "redis"
|
||||
|
|
||||
*/
|
||||
|
||||
'store' => env('SESSION_STORE'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Sweeping Lottery
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some session drivers must manually sweep their storage location to get
|
||||
| rid of old sessions from storage. Here are the chances that it will
|
||||
| happen on a given request. By default, the odds are 2 out of 100.
|
||||
|
|
||||
*/
|
||||
|
||||
'lottery' => [2, 100],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the name of the session cookie that is created by
|
||||
| the framework. Typically, you should not need to change this value
|
||||
| since doing so does not grant a meaningful security improvement.
|
||||
|
|
||||
*/
|
||||
|
||||
'cookie' => env(
|
||||
'SESSION_COOKIE',
|
||||
Str::slug((string) env('APP_NAME', 'laravel')).'-session'
|
||||
),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The session cookie path determines the path for which the cookie will
|
||||
| be regarded as available. Typically, this will be the root path of
|
||||
| your application, but you're free to change this when necessary.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => env('SESSION_PATH', '/'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the domain and subdomains the session cookie is
|
||||
| available to. By default, the cookie will be available to the root
|
||||
| domain without subdomains. Typically, this shouldn't be changed.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => env('SESSION_DOMAIN'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTPS Only Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By setting this option to true, session cookies will only be sent back
|
||||
| to the server if the browser has a HTTPS connection. This will keep
|
||||
| the cookie from being sent to you when it can't be done securely.
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => env('SESSION_SECURE_COOKIE'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTP Access Only
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Setting this value to true will prevent JavaScript from accessing the
|
||||
| value of the cookie and the cookie will only be accessible through
|
||||
| the HTTP protocol. It's unlikely you should disable this option.
|
||||
|
|
||||
*/
|
||||
|
||||
'http_only' => env('SESSION_HTTP_ONLY', true),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Same-Site Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option determines how your cookies behave when cross-site requests
|
||||
| take place, and can be used to mitigate CSRF attacks. By default, we
|
||||
| will set this value to "lax" to permit secure cross-site requests.
|
||||
|
|
||||
| See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
|
||||
|
|
||||
| Supported: "lax", "strict", "none", null
|
||||
|
|
||||
*/
|
||||
|
||||
'same_site' => env('SESSION_SAME_SITE', 'lax'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Partitioned Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Setting this value to true will tie the cookie to the top-level site for
|
||||
| a cross-site context. Partitioned cookies are accepted by the browser
|
||||
| when flagged "secure" and the Same-Site attribute is set to "none".
|
||||
|
|
||||
*/
|
||||
|
||||
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Serialization
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value controls the serialization strategy for session data, which
|
||||
| is JSON by default. Setting this to "php" allows the storage of PHP
|
||||
| objects in the session but can make an application vulnerable to
|
||||
| "gadget chain" serialization attacks if the APP_KEY is leaked.
|
||||
|
|
||||
| Supported: "json", "php"
|
||||
|
|
||||
*/
|
||||
|
||||
'serialization' => 'json',
|
||||
|
||||
];
|
||||
1
database/.gitignore
vendored
Normal file
1
database/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
*.sqlite*
|
||||
45
database/factories/UserFactory.php
Normal file
45
database/factories/UserFactory.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* @extends Factory<User>
|
||||
*/
|
||||
class UserFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The current password being used by the factory.
|
||||
*/
|
||||
protected static ?string $password;
|
||||
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
return [
|
||||
'name' => fake()->name(),
|
||||
'email' => fake()->unique()->safeEmail(),
|
||||
'email_verified_at' => now(),
|
||||
'password' => static::$password ??= Hash::make('password'),
|
||||
'remember_token' => Str::random(10),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicate that the model's email address should be unverified.
|
||||
*/
|
||||
public function unverified(): static
|
||||
{
|
||||
return $this->state(fn (array $attributes) => [
|
||||
'email_verified_at' => null,
|
||||
]);
|
||||
}
|
||||
}
|
||||
50
database/migrations/0001_01_01_000000_create_users_table.php
Normal file
50
database/migrations/0001_01_01_000000_create_users_table.php
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('users', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('name');
|
||||
$table->string('email')->unique();
|
||||
$table->timestamp('email_verified_at')->nullable();
|
||||
$table->string('password');
|
||||
$table->string('role')->default('admin');
|
||||
$table->rememberToken();
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
Schema::create('password_reset_tokens', function (Blueprint $table) {
|
||||
$table->string('email')->primary();
|
||||
$table->string('token');
|
||||
$table->timestamp('created_at')->nullable();
|
||||
});
|
||||
|
||||
Schema::create('sessions', function (Blueprint $table) {
|
||||
$table->string('id')->primary();
|
||||
$table->foreignId('user_id')->nullable()->index();
|
||||
$table->string('ip_address', 45)->nullable();
|
||||
$table->text('user_agent')->nullable();
|
||||
$table->longText('payload');
|
||||
$table->integer('last_activity')->index();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('users');
|
||||
Schema::dropIfExists('password_reset_tokens');
|
||||
Schema::dropIfExists('sessions');
|
||||
}
|
||||
};
|
||||
35
database/migrations/0001_01_01_000001_create_cache_table.php
Normal file
35
database/migrations/0001_01_01_000001_create_cache_table.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('cache', function (Blueprint $table) {
|
||||
$table->string('key')->primary();
|
||||
$table->mediumText('value');
|
||||
$table->bigInteger('expiration')->index();
|
||||
});
|
||||
|
||||
Schema::create('cache_locks', function (Blueprint $table) {
|
||||
$table->string('key')->primary();
|
||||
$table->string('owner');
|
||||
$table->bigInteger('expiration')->index();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('cache');
|
||||
Schema::dropIfExists('cache_locks');
|
||||
}
|
||||
};
|
||||
57
database/migrations/0001_01_01_000002_create_jobs_table.php
Normal file
57
database/migrations/0001_01_01_000002_create_jobs_table.php
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('jobs', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('queue')->index();
|
||||
$table->longText('payload');
|
||||
$table->unsignedTinyInteger('attempts');
|
||||
$table->unsignedInteger('reserved_at')->nullable();
|
||||
$table->unsignedInteger('available_at');
|
||||
$table->unsignedInteger('created_at');
|
||||
});
|
||||
|
||||
Schema::create('job_batches', function (Blueprint $table) {
|
||||
$table->string('id')->primary();
|
||||
$table->string('name');
|
||||
$table->integer('total_jobs');
|
||||
$table->integer('pending_jobs');
|
||||
$table->integer('failed_jobs');
|
||||
$table->longText('failed_job_ids');
|
||||
$table->mediumText('options')->nullable();
|
||||
$table->integer('cancelled_at')->nullable();
|
||||
$table->integer('created_at');
|
||||
$table->integer('finished_at')->nullable();
|
||||
});
|
||||
|
||||
Schema::create('failed_jobs', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uuid')->unique();
|
||||
$table->text('connection');
|
||||
$table->text('queue');
|
||||
$table->longText('payload');
|
||||
$table->longText('exception');
|
||||
$table->timestamp('failed_at')->useCurrent();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('jobs');
|
||||
Schema::dropIfExists('job_batches');
|
||||
Schema::dropIfExists('failed_jobs');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('photo_geo_data', function (Blueprint $table) {
|
||||
$table->ulid('id')->primary();
|
||||
$table->string('uploaded_by');
|
||||
$table->string('image_path');
|
||||
$table->string('title');
|
||||
$table->timestamp('captured_at')->nullable();
|
||||
$table->decimal('lat',10,8)->nullable();
|
||||
$table->decimal('lng',10,8)->nullable();
|
||||
$table->string('desc',500)->nullable();
|
||||
$table->longText('story')->nullable();
|
||||
$table->json('metadata')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('photo_geo_data');
|
||||
}
|
||||
};
|
||||
25
database/seeders/DatabaseSeeder.php
Normal file
25
database/seeders/DatabaseSeeder.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DatabaseSeeder extends Seeder
|
||||
{
|
||||
use WithoutModelEvents;
|
||||
|
||||
/**
|
||||
* Seed the application's database.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
// User::factory(10)->create();
|
||||
|
||||
User::factory()->create([
|
||||
'name' => 'Test User',
|
||||
'email' => 'test@example.com',
|
||||
]);
|
||||
}
|
||||
}
|
||||
28
docker-compose.yml
Normal file
28
docker-compose.yml
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
services:
|
||||
api:
|
||||
image: php
|
||||
build: .
|
||||
volumes:
|
||||
- .:/var/www/html
|
||||
ports:
|
||||
- "8080:80"
|
||||
networks:
|
||||
- app
|
||||
db:
|
||||
image: "postgres:latest"
|
||||
ports:
|
||||
- "5432:5432"
|
||||
environment:
|
||||
POSTGRES_DB: "photogeodata"
|
||||
POSTGRES_USER: "user" # Changed from root; Postgres best practice
|
||||
POSTGRES_PASSWORD: "password"
|
||||
volumes:
|
||||
- "appdb:/var/lib/postgresql/data"
|
||||
networks:
|
||||
- app
|
||||
networks:
|
||||
app:
|
||||
driver: bridge
|
||||
volumes:
|
||||
appdb:
|
||||
driver: local
|
||||
20
lang/en/auth.php
Normal file
20
lang/en/auth.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used during authentication for various
|
||||
| messages that we need to display to the user. You are free to modify
|
||||
| these language lines according to your application's requirements.
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => 'These credentials do not match our records.',
|
||||
'password' => 'The provided password is incorrect.',
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
|
||||
];
|
||||
19
lang/en/pagination.php
Normal file
19
lang/en/pagination.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pagination Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used by the paginator library to build
|
||||
| the simple pagination links. You are free to change them to anything
|
||||
| you want to customize your views to better match your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Previous',
|
||||
'next' => 'Next »',
|
||||
|
||||
];
|
||||
22
lang/en/passwords.php
Normal file
22
lang/en/passwords.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are the default lines which match reasons
|
||||
| that are given by the password broker for a password update attempt
|
||||
| outcome such as failure due to an invalid password / reset token.
|
||||
|
|
||||
*/
|
||||
|
||||
'reset' => 'Your password has been reset.',
|
||||
'sent' => 'We have emailed your password reset link.',
|
||||
'throttled' => 'Please wait before retrying.',
|
||||
'token' => 'This password reset token is invalid.',
|
||||
'user' => "We can't find a user with that email address.",
|
||||
|
||||
];
|
||||
200
lang/en/validation.php
Normal file
200
lang/en/validation.php
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'The :attribute field must be accepted.',
|
||||
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
|
||||
'active_url' => 'The :attribute field must be a valid URL.',
|
||||
'after' => 'The :attribute field must be a date after :date.',
|
||||
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
|
||||
'alpha' => 'The :attribute field must only contain letters.',
|
||||
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
|
||||
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
|
||||
'any_of' => 'The :attribute field is invalid.',
|
||||
'array' => 'The :attribute field must be an array.',
|
||||
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
|
||||
'before' => 'The :attribute field must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
|
||||
'between' => [
|
||||
'array' => 'The :attribute field must have between :min and :max items.',
|
||||
'file' => 'The :attribute field must be between :min and :max kilobytes.',
|
||||
'numeric' => 'The :attribute field must be between :min and :max.',
|
||||
'string' => 'The :attribute field must be between :min and :max characters.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'can' => 'The :attribute field contains an unauthorized value.',
|
||||
'confirmed' => 'The :attribute field confirmation does not match.',
|
||||
'contains' => 'The :attribute field is missing a required value.',
|
||||
'current_password' => 'The password is incorrect.',
|
||||
'date' => 'The :attribute field must be a valid date.',
|
||||
'date_equals' => 'The :attribute field must be a date equal to :date.',
|
||||
'date_format' => 'The :attribute field must match the format :format.',
|
||||
'decimal' => 'The :attribute field must have :decimal decimal places.',
|
||||
'declined' => 'The :attribute field must be declined.',
|
||||
'declined_if' => 'The :attribute field must be declined when :other is :value.',
|
||||
'different' => 'The :attribute field and :other must be different.',
|
||||
'digits' => 'The :attribute field must be :digits digits.',
|
||||
'digits_between' => 'The :attribute field must be between :min and :max digits.',
|
||||
'dimensions' => 'The :attribute field has invalid image dimensions.',
|
||||
'distinct' => 'The :attribute field has a duplicate value.',
|
||||
'doesnt_contain' => 'The :attribute field must not contain any of the following: :values.',
|
||||
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
|
||||
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
|
||||
'email' => 'The :attribute field must be a valid email address.',
|
||||
'encoding' => 'The :attribute field must be encoded in :encoding.',
|
||||
'ends_with' => 'The :attribute field must end with one of the following: :values.',
|
||||
'enum' => 'The selected :attribute is invalid.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'extensions' => 'The :attribute field must have one of the following extensions: :values.',
|
||||
'file' => 'The :attribute field must be a file.',
|
||||
'filled' => 'The :attribute field must have a value.',
|
||||
'gt' => [
|
||||
'array' => 'The :attribute field must have more than :value items.',
|
||||
'file' => 'The :attribute field must be greater than :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be greater than :value.',
|
||||
'string' => 'The :attribute field must be greater than :value characters.',
|
||||
],
|
||||
'gte' => [
|
||||
'array' => 'The :attribute field must have :value items or more.',
|
||||
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be greater than or equal to :value.',
|
||||
'string' => 'The :attribute field must be greater than or equal to :value characters.',
|
||||
],
|
||||
'hex_color' => 'The :attribute field must be a valid hexadecimal color.',
|
||||
'image' => 'The :attribute field must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'in_array' => 'The :attribute field must exist in :other.',
|
||||
'in_array_keys' => 'The :attribute field must contain at least one of the following keys: :values.',
|
||||
'integer' => 'The :attribute field must be an integer.',
|
||||
'ip' => 'The :attribute field must be a valid IP address.',
|
||||
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
|
||||
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
|
||||
'json' => 'The :attribute field must be a valid JSON string.',
|
||||
'list' => 'The :attribute field must be a list.',
|
||||
'lowercase' => 'The :attribute field must be lowercase.',
|
||||
'lt' => [
|
||||
'array' => 'The :attribute field must have less than :value items.',
|
||||
'file' => 'The :attribute field must be less than :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be less than :value.',
|
||||
'string' => 'The :attribute field must be less than :value characters.',
|
||||
],
|
||||
'lte' => [
|
||||
'array' => 'The :attribute field must not have more than :value items.',
|
||||
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be less than or equal to :value.',
|
||||
'string' => 'The :attribute field must be less than or equal to :value characters.',
|
||||
],
|
||||
'mac_address' => 'The :attribute field must be a valid MAC address.',
|
||||
'max' => [
|
||||
'array' => 'The :attribute field must not have more than :max items.',
|
||||
'file' => 'The :attribute field must not be greater than :max kilobytes.',
|
||||
'numeric' => 'The :attribute field must not be greater than :max.',
|
||||
'string' => 'The :attribute field must not be greater than :max characters.',
|
||||
],
|
||||
'max_digits' => 'The :attribute field must not have more than :max digits.',
|
||||
'mimes' => 'The :attribute field must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute field must be a file of type: :values.',
|
||||
'min' => [
|
||||
'array' => 'The :attribute field must have at least :min items.',
|
||||
'file' => 'The :attribute field must be at least :min kilobytes.',
|
||||
'numeric' => 'The :attribute field must be at least :min.',
|
||||
'string' => 'The :attribute field must be at least :min characters.',
|
||||
],
|
||||
'min_digits' => 'The :attribute field must have at least :min digits.',
|
||||
'missing' => 'The :attribute field must be missing.',
|
||||
'missing_if' => 'The :attribute field must be missing when :other is :value.',
|
||||
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
|
||||
'missing_with' => 'The :attribute field must be missing when :values is present.',
|
||||
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
|
||||
'multiple_of' => 'The :attribute field must be a multiple of :value.',
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'not_regex' => 'The :attribute field format is invalid.',
|
||||
'numeric' => 'The :attribute field must be a number.',
|
||||
'password' => [
|
||||
'letters' => 'The :attribute field must contain at least one letter.',
|
||||
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
|
||||
'numbers' => 'The :attribute field must contain at least one number.',
|
||||
'symbols' => 'The :attribute field must contain at least one symbol.',
|
||||
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
|
||||
],
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'present_if' => 'The :attribute field must be present when :other is :value.',
|
||||
'present_unless' => 'The :attribute field must be present unless :other is :value.',
|
||||
'present_with' => 'The :attribute field must be present when :values is present.',
|
||||
'present_with_all' => 'The :attribute field must be present when :values are present.',
|
||||
'prohibited' => 'The :attribute field is prohibited.',
|
||||
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
|
||||
'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.',
|
||||
'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.',
|
||||
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
|
||||
'prohibits' => 'The :attribute field prohibits :other from being present.',
|
||||
'regex' => 'The :attribute field format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
|
||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
|
||||
'required_if_declined' => 'The :attribute field is required when :other is declined.',
|
||||
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
||||
'required_with' => 'The :attribute field is required when :values is present.',
|
||||
'required_with_all' => 'The :attribute field is required when :values are present.',
|
||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||
'same' => 'The :attribute field must match :other.',
|
||||
'size' => [
|
||||
'array' => 'The :attribute field must contain :size items.',
|
||||
'file' => 'The :attribute field must be :size kilobytes.',
|
||||
'numeric' => 'The :attribute field must be :size.',
|
||||
'string' => 'The :attribute field must be :size characters.',
|
||||
],
|
||||
'starts_with' => 'The :attribute field must start with one of the following: :values.',
|
||||
'string' => 'The :attribute field must be a string.',
|
||||
'timezone' => 'The :attribute field must be a valid timezone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'uppercase' => 'The :attribute field must be uppercase.',
|
||||
'url' => 'The :attribute field must be a valid URL.',
|
||||
'ulid' => 'The :attribute field must be a valid ULID.',
|
||||
'uuid' => 'The :attribute field must be a valid UUID.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify custom validation messages for attributes using the
|
||||
| convention "attribute.rule" to name the lines. This makes it quick to
|
||||
| specify a specific custom language line for a given attribute rule.
|
||||
|
|
||||
*/
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'custom-message',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap our attribute placeholder
|
||||
| with something more reader friendly such as "E-Mail Address" instead
|
||||
| of "email". This simply helps us make our message more expressive.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
7
lang/sv/auth.php
Normal file
7
lang/sv/auth.php
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'failed' => 'Dessa uppgifter stämmer inte med våra register.',
|
||||
'password' => 'Det angivna lösenordet är felaktigt.',
|
||||
'throttle' => 'För många inloggningsförsök. Försök igen om :seconds sekunder.',
|
||||
];
|
||||
6
lang/sv/pagination.php
Normal file
6
lang/sv/pagination.php
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'previous' => '« Föregående',
|
||||
'next' => 'Nästa »',
|
||||
];
|
||||
9
lang/sv/passwords.php
Normal file
9
lang/sv/passwords.php
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'reset' => 'Ditt lösenord har återställts.',
|
||||
'sent' => 'Vi har skickat en länk för återställning av lösenordet till din e-post.',
|
||||
'throttled' => 'Vänta innan du försöker igen.',
|
||||
'token' => 'Denna token för återställning av lösenord är ogiltig.',
|
||||
'user' => 'Vi kan inte hitta någon användare med den e-postadressen.',
|
||||
];
|
||||
165
lang/sv/validation.php
Normal file
165
lang/sv/validation.php
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'accepted' => 'Fältet :attribute måste accepteras.',
|
||||
'accepted_if' => 'Fältet :attribute måste accepteras när :other är :value.',
|
||||
'active_url' => 'Fältet :attribute måste vara en giltig URL.',
|
||||
'after' => 'Fältet :attribute måste vara ett datum efter :date.',
|
||||
'after_or_equal' => 'Fältet :attribute måste vara ett datum efter eller lika med :date.',
|
||||
'alpha' => 'Fältet :attribute får bara innehålla bokstäver.',
|
||||
'alpha_dash' => 'Fältet :attribute får bara innehålla bokstäver, siffror, bindestreck och understreck.',
|
||||
'alpha_num' => 'Fältet :attribute får bara innehålla bokstäver och siffror.',
|
||||
'any_of' => 'Fältet :attribute är ogiltigt.',
|
||||
'array' => 'Fältet :attribute måste vara en array.',
|
||||
'ascii' => 'Fältet :attribute får bara innehålla enkelbyte alfanumeriska tecken och symboler.',
|
||||
'before' => 'Fältet :attribute måste vara ett datum före :date.',
|
||||
'before_or_equal' => 'Fältet :attribute måste vara ett datum före eller lika med :date.',
|
||||
'between' => [
|
||||
'array' => 'Fältet :attribute måste ha mellan :min och :max poster.',
|
||||
'file' => 'Fältet :attribute måste vara mellan :min och :max kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara mellan :min och :max.',
|
||||
'string' => 'Fältet :attribute måste vara mellan :min och :max tecken.',
|
||||
],
|
||||
'boolean' => 'Fältet :attribute måste vara sant eller falskt.',
|
||||
'can' => 'Fältet :attribute innehåller ett otillåtet värde.',
|
||||
'confirmed' => 'Bekräftelsen av fältet :attribute stämmer inte.',
|
||||
'contains' => 'Fältet :attribute saknar ett obligatoriskt värde.',
|
||||
'current_password' => 'Lösenordet är felaktigt.',
|
||||
'date' => 'Fältet :attribute måste vara ett giltigt datum.',
|
||||
'date_equals' => 'Fältet :attribute måste vara ett datum lika med :date.',
|
||||
'date_format' => 'Fältet :attribute måste matcha formatet :format.',
|
||||
'decimal' => 'Fältet :attribute måste ha :decimal decimaler.',
|
||||
'declined' => 'Fältet :attribute måste avvisas.',
|
||||
'declined_if' => 'Fältet :attribute måste avvisas när :other är :value.',
|
||||
'different' => 'Fältet :attribute och :other måste vara olika.',
|
||||
'digits' => 'Fältet :attribute måste vara :digits siffror.',
|
||||
'digits_between' => 'Fältet :attribute måste vara mellan :min och :max siffror.',
|
||||
'dimensions' => 'Fältet :attribute har ogiltiga bilddimensioner.',
|
||||
'distinct' => 'Fältet :attribute har ett duplicerat värde.',
|
||||
'doesnt_contain' => 'Fältet :attribute får inte innehålla något av följande: :values.',
|
||||
'doesnt_end_with' => 'Fältet :attribute får inte sluta med något av följande: :values.',
|
||||
'doesnt_start_with' => 'Fältet :attribute får inte börja med något av följande: :values.',
|
||||
'email' => 'Fältet :attribute måste vara en giltig e-postadress.',
|
||||
'encoding' => 'Fältet :attribute måste vara kodat i :encoding.',
|
||||
'ends_with' => 'Fältet :attribute måste sluta med något av följande: :values.',
|
||||
'enum' => 'Det valda :attribute är ogiltigt.',
|
||||
'exists' => 'Det valda :attribute är ogiltigt.',
|
||||
'extensions' => 'Fältet :attribute måste ha ett av följande filnamnstillägg: :values.',
|
||||
'file' => 'Fältet :attribute måste vara en fil.',
|
||||
'filled' => 'Fältet :attribute måste ha ett värde.',
|
||||
'gt' => [
|
||||
'array' => 'Fältet :attribute måste ha fler än :value poster.',
|
||||
'file' => 'Fältet :attribute måste vara större än :value kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara större än :value.',
|
||||
'string' => 'Fältet :attribute måste vara längre än :value tecken.',
|
||||
],
|
||||
'gte' => [
|
||||
'array' => 'Fältet :attribute måste ha :value poster eller fler.',
|
||||
'file' => 'Fältet :attribute måste vara större än eller lika med :value kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara större än eller lika med :value.',
|
||||
'string' => 'Fältet :attribute måste vara längre än eller lika med :value tecken.',
|
||||
],
|
||||
'hex_color' => 'Fältet :attribute måste vara en giltig hexadecimal färg.',
|
||||
'image' => 'Fältet :attribute måste vara en bild.',
|
||||
'in' => 'Det valda :attribute är ogiltigt.',
|
||||
'in_array' => 'Fältet :attribute måste finnas i :other.',
|
||||
'in_array_keys' => 'Fältet :attribute måste innehålla minst en av följande nycklar: :values.',
|
||||
'integer' => 'Fältet :attribute måste vara ett heltal.',
|
||||
'ip' => 'Fältet :attribute måste vara en giltig IP-adress.',
|
||||
'ipv4' => 'Fältet :attribute måste vara en giltig IPv4-adress.',
|
||||
'ipv6' => 'Fältet :attribute måste vara en giltig IPv6-adress.',
|
||||
'json' => 'Fältet :attribute måste vara en giltig JSON-sträng.',
|
||||
'list' => 'Fältet :attribute måste vara en lista.',
|
||||
'lowercase' => 'Fältet :attribute måste vara med gemener.',
|
||||
'lt' => [
|
||||
'array' => 'Fältet :attribute måste ha färre än :value poster.',
|
||||
'file' => 'Fältet :attribute måste vara mindre än :value kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara mindre än :value.',
|
||||
'string' => 'Fältet :attribute måste vara kortare än :value tecken.',
|
||||
],
|
||||
'lte' => [
|
||||
'array' => 'Fältet :attribute får inte ha fler än :value poster.',
|
||||
'file' => 'Fältet :attribute måste vara mindre än eller lika med :value kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara mindre än eller lika med :value.',
|
||||
'string' => 'Fältet :attribute måste vara kortare än eller lika med :value tecken.',
|
||||
],
|
||||
'mac_address' => 'Fältet :attribute måste vara en giltig MAC-adress.',
|
||||
'max' => [
|
||||
'array' => 'Fältet :attribute får inte ha fler än :max poster.',
|
||||
'file' => 'Fältet :attribute får inte vara större än :max kilobyte.',
|
||||
'numeric' => 'Fältet :attribute får inte vara större än :max.',
|
||||
'string' => 'Fältet :attribute får inte vara längre än :max tecken.',
|
||||
],
|
||||
'max_digits' => 'Fältet :attribute får inte ha fler än :max siffror.',
|
||||
'mimes' => 'Fältet :attribute måste vara en fil av typen: :values.',
|
||||
'mimetypes' => 'Fältet :attribute måste vara en fil av typen: :values.',
|
||||
'min' => [
|
||||
'array' => 'Fältet :attribute måste ha minst :min poster.',
|
||||
'file' => 'Fältet :attribute måste vara minst :min kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara minst :min.',
|
||||
'string' => 'Fältet :attribute måste vara minst :min tecken.',
|
||||
],
|
||||
'min_digits' => 'Fältet :attribute måste ha minst :min siffror.',
|
||||
'missing' => 'Fältet :attribute måste saknas.',
|
||||
'missing_if' => 'Fältet :attribute måste saknas när :other är :value.',
|
||||
'missing_unless' => 'Fältet :attribute måste saknas om inte :other är :value.',
|
||||
'missing_with' => 'Fältet :attribute måste saknas när :values är närvarande.',
|
||||
'missing_with_all' => 'Fältet :attribute måste saknas när :values är närvarande.',
|
||||
'multiple_of' => 'Fältet :attribute måste vara en multipel av :value.',
|
||||
'not_in' => 'Det valda :attribute är ogiltigt.',
|
||||
'not_regex' => 'Formatet för fältet :attribute är ogiltigt.',
|
||||
'numeric' => 'Fältet :attribute måste vara ett nummer.',
|
||||
'password' => [
|
||||
'letters' => 'Fältet :attribute måste innehålla minst en bokstav.',
|
||||
'mixed' => 'Fältet :attribute måste innehålla minst en stor och en liten bokstav.',
|
||||
'numbers' => 'Fältet :attribute måste innehålla minst ett nummer.',
|
||||
'symbols' => 'Fältet :attribute måste innehålla minst en symbol.',
|
||||
'uncompromised' => 'Det angivna :attribute har förekommit i en dataläcka. Välj ett annat :attribute.',
|
||||
],
|
||||
'present' => 'Fältet :attribute måste vara närvarande.',
|
||||
'present_if' => 'Fältet :attribute måste vara närvarande när :other är :value.',
|
||||
'present_unless' => 'Fältet :attribute måste vara närvarande om inte :other är :value.',
|
||||
'present_with' => 'Fältet :attribute måste vara närvarande när :values är närvarande.',
|
||||
'present_with_all' => 'Fältet :attribute måste vara närvarande när :values är närvarande.',
|
||||
'prohibited' => 'Fältet :attribute är förbjudet.',
|
||||
'prohibited_if' => 'Fältet :attribute är förbjudet när :other är :value.',
|
||||
'prohibited_if_accepted' => 'Fältet :attribute är förbjudet när :other är accepterat.',
|
||||
'prohibited_if_declined' => 'Fältet :attribute är förbjudet när :other är avvisat.',
|
||||
'prohibited_unless' => 'Fältet :attribute är förbjudet om inte :other finns i :values.',
|
||||
'prohibits' => 'Fältet :attribute förbjuder att :other är närvarande.',
|
||||
'regex' => 'Formatet för fältet :attribute är ogiltigt.',
|
||||
'required' => 'Fältet :attribute är obligatoriskt.',
|
||||
'required_array_keys' => 'Fältet :attribute måste innehålla poster för: :values.',
|
||||
'required_if' => 'Fältet :attribute är obligatoriskt när :other är :value.',
|
||||
'required_if_accepted' => 'Fältet :attribute är obligatoriskt när :other är accepterat.',
|
||||
'required_if_declined' => 'Fältet :attribute är obligatoriskt när :other är avvisat.',
|
||||
'required_unless' => 'Fältet :attribute är obligatoriskt om inte :other finns i :values.',
|
||||
'required_with' => 'Fältet :attribute är obligatoriskt när :values är närvarande.',
|
||||
'required_with_all' => 'Fältet :attribute är obligatoriskt när :values är närvarande.',
|
||||
'required_without' => 'Fältet :attribute är obligatoriskt när :values inte är närvarande.',
|
||||
'required_without_all' => 'Fältet :attribute är obligatoriskt när ingen av :values är närvarande.',
|
||||
'same' => 'Fältet :attribute måste matcha :other.',
|
||||
'size' => [
|
||||
'array' => 'Fältet :attribute måste innehålla :size poster.',
|
||||
'file' => 'Fältet :attribute måste vara :size kilobyte.',
|
||||
'numeric' => 'Fältet :attribute måste vara :size.',
|
||||
'string' => 'Fältet :attribute måste vara :size tecken.',
|
||||
],
|
||||
'starts_with' => 'Fältet :attribute måste börja med något av följande: :values.',
|
||||
'string' => 'Fältet :attribute måste vara en sträng.',
|
||||
'timezone' => 'Fältet :attribute måste vara en giltig tidszon.',
|
||||
'unique' => ':attribute har redan tagits.',
|
||||
'uploaded' => ':attribute kunde inte laddas upp.',
|
||||
'uppercase' => 'Fältet :attribute måste vara med versaler.',
|
||||
'url' => 'Fältet :attribute måste vara en giltig URL.',
|
||||
'ulid' => 'Fältet :attribute måste vara ett giltigt ULID.',
|
||||
'uuid' => 'Fältet :attribute måste vara ett giltigt UUID.',
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'custom-message',
|
||||
],
|
||||
],
|
||||
|
||||
'attributes' => [],
|
||||
];
|
||||
39
lang/vendor/filament-actions/am/associate.php
vendored
Normal file
39
lang/vendor/filament-actions/am/associate.php
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'አጣምር',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን አጣምር',
|
||||
'fields' => [
|
||||
|
||||
'record_id' => [
|
||||
|
||||
'label' => 'ሪከርድ',
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
|
||||
'associate' => [
|
||||
|
||||
'label' => 'አጣምር',
|
||||
|
||||
],
|
||||
'associate_another' => [
|
||||
|
||||
'label' => 'አጣምር & ሌላ አጣምር',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'associated' => [
|
||||
|
||||
'title' => 'ተጣምሮዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
38
lang/vendor/filament-actions/am/attach.php
vendored
Normal file
38
lang/vendor/filament-actions/am/attach.php
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'ያያይዙ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን ያያይዙ',
|
||||
'fields' => [
|
||||
|
||||
'record_id' => [
|
||||
|
||||
'label' => 'ሪከርድ',
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
|
||||
'attach' => [
|
||||
|
||||
'label' => 'ያያይዙ',
|
||||
],
|
||||
'attach_another' => [
|
||||
|
||||
'label' => 'ያያይዙ & ሌላ ያያይዙ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'attached' => [
|
||||
|
||||
'title' => 'ተያይዞዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
32
lang/vendor/filament-actions/am/create.php
vendored
Normal file
32
lang/vendor/filament-actions/am/create.php
vendored
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'አዲስ :label',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን መዝግብ',
|
||||
'actions' => [
|
||||
|
||||
'create' => [
|
||||
|
||||
'label' => 'መዝግብ',
|
||||
],
|
||||
'create_another' => [
|
||||
|
||||
'label' => 'መዝግብ & ሌላ መዝግብ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'created' => [
|
||||
|
||||
'title' => 'ተመዝግቦዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
49
lang/vendor/filament-actions/am/delete.php
vendored
Normal file
49
lang/vendor/filament-actions/am/delete.php
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'አጥፋ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን አጥፋ',
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
|
||||
'label' => 'አጥፋ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
|
||||
'title' => 'ጠፍቶዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'የተመረጡትን አጥፋ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'የተመረጡት :labelን አጥፋ',
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
|
||||
'label' => 'አጥፋ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
|
||||
'title' => 'ጠፍቶዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
49
lang/vendor/filament-actions/am/detach.php
vendored
Normal file
49
lang/vendor/filament-actions/am/detach.php
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'ለያይ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን ለያይ',
|
||||
'actions' => [
|
||||
|
||||
'detach' => [
|
||||
|
||||
'label' => 'ለያይ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'detached' => [
|
||||
|
||||
'title' => 'ተለያይቶዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'የተመረጡትን ለያይ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'የተመረጡት :labelን ለያይ',
|
||||
'actions' => [
|
||||
|
||||
'detach' => [
|
||||
|
||||
'label' => 'ለያይ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'detached' => [
|
||||
|
||||
'title' => 'ለያይ',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
49
lang/vendor/filament-actions/am/dissociate.php
vendored
Normal file
49
lang/vendor/filament-actions/am/dissociate.php
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'አለያይ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን አለያይ',
|
||||
'actions' => [
|
||||
|
||||
'dissociate' => [
|
||||
|
||||
'label' => 'አለያይ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'dissociated' => [
|
||||
|
||||
'title' => 'ተለያይቶዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'የተመረጡትን አለያይ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'የተመረጡ :labelን አለያይ',
|
||||
'actions' => [
|
||||
|
||||
'dissociate' => [
|
||||
|
||||
'label' => 'አለያይ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'dissociated' => [
|
||||
|
||||
'title' => 'ሁሉም ተለያይተዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
27
lang/vendor/filament-actions/am/edit.php
vendored
Normal file
27
lang/vendor/filament-actions/am/edit.php
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'አድስ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን አድስ',
|
||||
'actions' => [
|
||||
|
||||
'save' => [
|
||||
|
||||
'label' => 'አስቀምጥ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'saved' => [
|
||||
|
||||
'title' => 'እድሳቱ ተጠናቆዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
64
lang/vendor/filament-actions/am/export.php
vendored
Normal file
64
lang/vendor/filament-actions/am/export.php
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'label' => 'ኤክስፖርት :label',
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'ኤክስፖርት :label',
|
||||
'form' => [
|
||||
|
||||
'columns' => [
|
||||
|
||||
'label' => 'አምዶች',
|
||||
'form' => [
|
||||
|
||||
'is_enabled' => [
|
||||
|
||||
'label' => ':column በርቶዋል',
|
||||
],
|
||||
'label' => [
|
||||
|
||||
'label' => ':column መለያ',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
|
||||
'export' => [
|
||||
|
||||
'label' => 'ኤክስፖርት',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'completed' => [
|
||||
|
||||
'title' => 'ኤክስፖርት ተጠናቋል',
|
||||
'actions' => [
|
||||
|
||||
'download_csv' => [
|
||||
|
||||
'label' => '.csv አውርድ',
|
||||
],
|
||||
'download_xlsx' => [
|
||||
|
||||
'label' => '.xlsx አውርድ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'max_rows' => [
|
||||
|
||||
'title' => 'ይህ በጣም ትልቅ ነው',
|
||||
'body' => 'በአንድ ጊዜ ከ 1 ረድፍ በላይ ኤክስፖርት ማድረግ አይችሉም።|ረድፎችን በአንድ ጊዜ ከ:count በላይ ኤክስፖርት ማድረግ አይችሉም።',
|
||||
],
|
||||
'started' => [
|
||||
|
||||
'title' => 'ኤክስፖርት ተጀምሮዋል',
|
||||
'body' => 'ኤክስፖርቱ ተጀምሯል እና 1 ረድፍ ከበስተጀርባ ይካሄዳል።|ኤክስፖርቱ ጀምሯል እና :count ረድፎች ከበስተጀርባ ይከናወናሉ.',
|
||||
],
|
||||
],
|
||||
'file_name' => 'export-:export_id-:model',
|
||||
];
|
||||
49
lang/vendor/filament-actions/am/force-delete.php
vendored
Normal file
49
lang/vendor/filament-actions/am/force-delete.php
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'የምር አጥፋ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን የምር አጥፋ',
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
|
||||
'label' => 'አጥፋ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
|
||||
'title' => 'ጠፍቶዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'የተመረጡትን የምር አጥፋ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'የተመረጡትን :label የምር አጥፋ',
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
|
||||
'label' => 'አጥፋ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
|
||||
'title' => 'ጠፍቶዋል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
9
lang/vendor/filament-actions/am/group.php
vendored
Normal file
9
lang/vendor/filament-actions/am/group.php
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'trigger' => [
|
||||
|
||||
'label' => 'ድርጊቶች',
|
||||
],
|
||||
];
|
||||
73
lang/vendor/filament-actions/am/import.php
vendored
Normal file
73
lang/vendor/filament-actions/am/import.php
vendored
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'label' => ':labelን ኢምፖርት',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን ኢምፖርት',
|
||||
'form' => [
|
||||
|
||||
'file' => [
|
||||
|
||||
'label' => 'ፋይል',
|
||||
'placeholder' => 'የCSV ፋይል ይስቀሉ።',
|
||||
'rules' => [
|
||||
|
||||
'duplicate_columns' => '{0} The file must not contain more than one empty column header.|{1,*} The file must not contain duplicate column headers: :columns.',
|
||||
],
|
||||
],
|
||||
'columns' => [
|
||||
|
||||
'label' => 'አምዶች',
|
||||
'placeholder' => 'አምድ ይምረጡ',
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
|
||||
'download_example' => [
|
||||
|
||||
'label' => 'ምሳሌ የCSV ፋይል ያውርዱ',
|
||||
],
|
||||
'import' => [
|
||||
|
||||
'label' => 'ኢምፖርት',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'completed' => [
|
||||
|
||||
'title' => 'ኢምፖርቱ ተጠናቆዋል',
|
||||
'actions' => [
|
||||
|
||||
'download_failed_rows_csv' => [
|
||||
|
||||
'label' => 'ስለ ያልተሳካው ረድፍ መረጃ ያውርዱ|ስለ ያልተሳኩ ረድፎች መረጃ ያውርዱ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'max_rows' => [
|
||||
|
||||
'title' => 'የተጫነው የCSV ፋይል በጣም ትልቅ ነው።',
|
||||
'body' => 'በአንድ ጊዜ ከ1 ረድፍ በላይ መጫን አይችሉም።|ረድፎችን በአንድ ጊዜ ከ:count በላይ ማስገባት አይችሉም።',
|
||||
],
|
||||
'started' => [
|
||||
|
||||
'title' => 'ኢምፖርቱ ተጀምሮዋል',
|
||||
'body' => 'መጫን ጀምሯል እና 1 ረድፍ ከበስተጀርባ ይካሄዳል።|የእርስዎ መጫን ጀምሯል እና :count ረድፎች ከበስተጀርባ ይሰራሉ።',
|
||||
],
|
||||
],
|
||||
'example_csv' => [
|
||||
|
||||
'file_name' => ':importer-example',
|
||||
],
|
||||
'failure_csv' => [
|
||||
|
||||
'file_name' => 'import-:import_id-:csv_name-failed-rows',
|
||||
'error_header' => 'ስህተት',
|
||||
'system_error' => 'የሲስተም ስህተት፣ እባክዎ ድጋፍን ያግኙ።',
|
||||
'column_mapping_required_for_new_record' => 'The :attribute column was not mapped to a column in the file, but it is required for creating new records.',
|
||||
],
|
||||
];
|
||||
21
lang/vendor/filament-actions/am/modal.php
vendored
Normal file
21
lang/vendor/filament-actions/am/modal.php
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'confirmation' => 'እርግጠኛ ነዎት ይህን ማድረግ ይፈልጋሉ?',
|
||||
'actions' => [
|
||||
|
||||
'cancel' => [
|
||||
|
||||
'label' => 'ይቅር',
|
||||
],
|
||||
'confirm' => [
|
||||
|
||||
'label' => 'አጽድቅ',
|
||||
],
|
||||
'submit' => [
|
||||
|
||||
'label' => 'መዝግብ',
|
||||
],
|
||||
],
|
||||
];
|
||||
27
lang/vendor/filament-actions/am/replicate.php
vendored
Normal file
27
lang/vendor/filament-actions/am/replicate.php
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'ይድገሙት',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን ይድገሙት',
|
||||
'actions' => [
|
||||
|
||||
'replicate' => [
|
||||
|
||||
'label' => 'ይድገሙት',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'replicated' => [
|
||||
|
||||
'title' => 'ተደግሟል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
49
lang/vendor/filament-actions/am/restore.php
vendored
Normal file
49
lang/vendor/filament-actions/am/restore.php
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'እነበረበት መልስ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labeln መልስ',
|
||||
'actions' => [
|
||||
|
||||
'restore' => [
|
||||
|
||||
'label' => 'እነበረበት መልስ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'restored' => [
|
||||
|
||||
'title' => 'ወደነበረበት ተመልሷል',
|
||||
],
|
||||
],
|
||||
],
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'የተመረጡትን መልስ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'የተመረጡት :labelን መልስ',
|
||||
'actions' => [
|
||||
|
||||
'restore' => [
|
||||
|
||||
'label' => 'እነበረበት መልስ',
|
||||
],
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
|
||||
'restored' => [
|
||||
|
||||
'title' => 'ወደነበረበት ተመልሷል',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
20
lang/vendor/filament-actions/am/view.php
vendored
Normal file
20
lang/vendor/filament-actions/am/view.php
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'እይ',
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':labelን እይ',
|
||||
'actions' => [
|
||||
|
||||
'close' => [
|
||||
|
||||
'label' => 'ዝጋ',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
45
lang/vendor/filament-actions/ar/associate.php
vendored
Normal file
45
lang/vendor/filament-actions/ar/associate.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'ارتباط',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'ربط :label',
|
||||
|
||||
'fields' => [
|
||||
|
||||
'record_id' => [
|
||||
'label' => 'السجلات',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
|
||||
'associate' => [
|
||||
'label' => 'ربط',
|
||||
],
|
||||
|
||||
'associate_another' => [
|
||||
'label' => 'ربط وبدء ربط المزيد',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'associated' => [
|
||||
'title' => 'تم الربط',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
45
lang/vendor/filament-actions/ar/attach.php
vendored
Normal file
45
lang/vendor/filament-actions/ar/attach.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'إرفاق',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'إرفاق :label',
|
||||
|
||||
'fields' => [
|
||||
|
||||
'record_id' => [
|
||||
'label' => 'سجل',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
|
||||
'attach' => [
|
||||
'label' => 'إرفاق',
|
||||
],
|
||||
|
||||
'attach_another' => [
|
||||
'label' => 'إرفاق وبدء إرفاق المزيد',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'attached' => [
|
||||
'title' => 'تم الإرفاق',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
37
lang/vendor/filament-actions/ar/create.php
vendored
Normal file
37
lang/vendor/filament-actions/ar/create.php
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'إضافة :label',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'إضافة :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'create' => [
|
||||
'label' => 'إضافة',
|
||||
],
|
||||
|
||||
'create_another' => [
|
||||
'label' => 'إضافة وبدء إضافة المزيد',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'created' => [
|
||||
'title' => 'تمت الإضافة',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
73
lang/vendor/filament-actions/ar/delete.php
vendored
Normal file
73
lang/vendor/filament-actions/ar/delete.php
vendored
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'حذف',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'حذف :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
'label' => 'حذف',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
'title' => 'تم الحذف',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'حذف المحدد',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'حذف المحدد :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
'label' => 'حذف',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
'title' => 'تم الحذف',
|
||||
],
|
||||
|
||||
'deleted_partial' => [
|
||||
'title' => 'تم حذف :count من :total',
|
||||
'missing_authorization_failure_message' => 'ليس لديك إذن لحذف :count.',
|
||||
'missing_processing_failure_message' => ':count لم يتم حذفه.',
|
||||
],
|
||||
|
||||
'deleted_none' => [
|
||||
'title' => 'لم يتم حذف أي شيء',
|
||||
'missing_authorization_failure_message' => 'ليس لديك إذن لحذف :count.',
|
||||
'missing_processing_failure_message' => 'لم يتم حذف :count.',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
61
lang/vendor/filament-actions/ar/detach.php
vendored
Normal file
61
lang/vendor/filament-actions/ar/detach.php
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'فصل',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'فصل :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'detach' => [
|
||||
'label' => 'فصل',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'detached' => [
|
||||
'title' => 'تم الفصل',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'فصل المحدد',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'فصل المحدد :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'detach' => [
|
||||
'label' => 'فصل',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'detached' => [
|
||||
'title' => 'تم الفصل',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
61
lang/vendor/filament-actions/ar/dissociate.php
vendored
Normal file
61
lang/vendor/filament-actions/ar/dissociate.php
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'فك الارتباط',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'فك ربط :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'dissociate' => [
|
||||
'label' => 'فك الارتباط',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'dissociated' => [
|
||||
'title' => 'تم فك الارتباط',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'فك ارتباط المحدد',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'فك ارتباط :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'dissociate' => [
|
||||
'label' => 'فك الارتباط',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'dissociated' => [
|
||||
'title' => 'تم فك الارتباط',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
33
lang/vendor/filament-actions/ar/edit.php
vendored
Normal file
33
lang/vendor/filament-actions/ar/edit.php
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'تعديل',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'تعديل :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'save' => [
|
||||
'label' => 'حفظ التغييرات',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'saved' => [
|
||||
'title' => 'تم الحفظ',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
94
lang/vendor/filament-actions/ar/export.php
vendored
Normal file
94
lang/vendor/filament-actions/ar/export.php
vendored
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'label' => 'تصدير :label',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'تصدير :label',
|
||||
|
||||
'form' => [
|
||||
|
||||
'columns' => [
|
||||
|
||||
'label' => 'الأعمدة',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'select_all' => [
|
||||
'label' => 'تحديد الكل',
|
||||
],
|
||||
|
||||
'deselect_all' => [
|
||||
'label' => 'إلغاء تحديد الكل',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'form' => [
|
||||
|
||||
'is_enabled' => [
|
||||
'label' => ':column مفعل',
|
||||
],
|
||||
|
||||
'label' => [
|
||||
'label' => 'تسمية :column',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
|
||||
'export' => [
|
||||
'label' => 'تصدير',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'completed' => [
|
||||
|
||||
'title' => 'اكتمل التصدير',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'download_csv' => [
|
||||
'label' => 'تنزيل .csv',
|
||||
],
|
||||
|
||||
'download_xlsx' => [
|
||||
'label' => 'تنزيل .xlsx',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'max_rows' => [
|
||||
'title' => 'التصدير كبير جداً',
|
||||
'body' => 'لا يمكنك تصدير أكثر من صف واحد في المرة الواحدة.|لا يمكنك تصدير أكثر من :count صف في المرة الواحدة.',
|
||||
],
|
||||
|
||||
'no_columns' => [
|
||||
'title' => 'لم يتم تحديد أعمدة',
|
||||
'body' => 'يرجى تحديد عمود واحد على الأقل للتصدير.',
|
||||
],
|
||||
|
||||
'started' => [
|
||||
'title' => 'بدأ التصدير',
|
||||
'body' => 'بدأ التصدير الخاص بك وسيتم معالجة صف واحد في الخلفية. ستتلقى إشعاراً برابط التنزيل عند الانتهاء.|بدأ التصدير الخاص بك وسيتم معالجة :count صف في الخلفية. ستتلقى إشعاراً برابط التنزيل عند الانتهاء.',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'file_name' => 'export-:export_id-:model',
|
||||
|
||||
];
|
||||
73
lang/vendor/filament-actions/ar/force-delete.php
vendored
Normal file
73
lang/vendor/filament-actions/ar/force-delete.php
vendored
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'حذف نهائي',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'حذف نهائي لـ :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
'label' => 'حذف',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
'title' => 'تم الحذف',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'حذف المحدد نهائيا',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'حذف نهائي لـ :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
'label' => 'حذف',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
'title' => 'تم الحذف',
|
||||
],
|
||||
|
||||
'deleted_partial' => [
|
||||
'title' => 'تم حذف :count من أصل :total',
|
||||
'missing_authorization_failure_message' => 'ليس لديك صلاحية لحذف :count.',
|
||||
'missing_processing_failure_message' => 'تعذر حذف :count.',
|
||||
],
|
||||
|
||||
'deleted_none' => [
|
||||
'title' => 'فشل في الحذف',
|
||||
'missing_authorization_failure_message' => 'ليس لديك صلاحية لحذف :count.',
|
||||
'missing_processing_failure_message' => 'تعذر حذف :count.',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
9
lang/vendor/filament-actions/ar/group.php
vendored
Normal file
9
lang/vendor/filament-actions/ar/group.php
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'trigger' => [
|
||||
'label' => 'الإجراءات',
|
||||
],
|
||||
|
||||
];
|
||||
81
lang/vendor/filament-actions/ar/import.php
vendored
Normal file
81
lang/vendor/filament-actions/ar/import.php
vendored
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'label' => 'استيراد :label',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'استيراد :label',
|
||||
|
||||
'form' => [
|
||||
|
||||
'file' => [
|
||||
'label' => 'ملف',
|
||||
'placeholder' => 'تحميل ملف CSV',
|
||||
'rules' => [
|
||||
'duplicate_columns' => '{0} يجب ألا يحتوي الملف على أكثر من عنوان عمود فارغ واحد.|{1,*} يجب ألا يحتوي الملف على عناوين أعمدة مكررة: :columns.',
|
||||
],
|
||||
],
|
||||
|
||||
'columns' => [
|
||||
'label' => 'الأعمدة',
|
||||
'placeholder' => 'اختر عمود',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
|
||||
'download_example' => [
|
||||
'label' => 'تنزيل مثال لملف CSV',
|
||||
],
|
||||
|
||||
'import' => [
|
||||
'label' => 'استيراد',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'completed' => [
|
||||
|
||||
'title' => 'اكتمل الاستيراد',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'download_failed_rows_csv' => [
|
||||
'label' => 'تنزيل معلومات حول الصف الفاشل|تنزيل معلومات حول الصفوف الفاشلة',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'max_rows' => [
|
||||
'title' => 'ملف CSV الذي تم تحميله كبير جدًا',
|
||||
'body' => 'لا تستطيع استيراد أكثر من صف واحد في كل مرة.|لا تستطيع استيراد أكثر من :count صف في كل مرة.',
|
||||
],
|
||||
|
||||
'started' => [
|
||||
'title' => 'بدء الاستيراد',
|
||||
'body' => 'بدأت عملية الاستيراد الخاصة بك وستتم معالجة صف واحد في الخلفية.|بدأت عملية الاستيراد الخاصة بك وستتم معالجة :count صفوف في الخلفية.',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'example_csv' => [
|
||||
'file_name' => ':importer-example',
|
||||
],
|
||||
|
||||
'failure_csv' => [
|
||||
'file_name' => 'import-:import_id-:csv_name-failed-rows',
|
||||
'error_header' => 'خطأ',
|
||||
'system_error' => 'خطأ في النظام، يرجى الاتصال بالدعم.',
|
||||
'column_mapping_required_for_new_record' => 'لم يتم تعيين العمود :attribut إلى عمود في الملف، ولكنه مطلوب لإنشاء سجلات جديدة.',
|
||||
],
|
||||
|
||||
];
|
||||
23
lang/vendor/filament-actions/ar/modal.php
vendored
Normal file
23
lang/vendor/filament-actions/ar/modal.php
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'confirmation' => 'هل أنت متأكد من القيام بهذه العملية؟',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'cancel' => [
|
||||
'label' => 'إلغاء',
|
||||
],
|
||||
|
||||
'confirm' => [
|
||||
'label' => 'تأكيد',
|
||||
],
|
||||
|
||||
'submit' => [
|
||||
'label' => 'إرسال',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
10
lang/vendor/filament-actions/ar/notifications.php
vendored
Normal file
10
lang/vendor/filament-actions/ar/notifications.php
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'throttled' => [
|
||||
'title' => 'تم تجاوز الحد المسموح',
|
||||
'body' => 'يرجى المحاولة مرة أخرى بعد :seconds ثانية.',
|
||||
],
|
||||
|
||||
];
|
||||
33
lang/vendor/filament-actions/ar/replicate.php
vendored
Normal file
33
lang/vendor/filament-actions/ar/replicate.php
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'نسخة',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'استنساخ :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'replicate' => [
|
||||
'label' => 'نسخ',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'replicated' => [
|
||||
'title' => 'تم النسخ',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
73
lang/vendor/filament-actions/ar/restore.php
vendored
Normal file
73
lang/vendor/filament-actions/ar/restore.php
vendored
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'استعادة',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'استعادة :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'restore' => [
|
||||
'label' => 'استعادة',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'restored' => [
|
||||
'title' => 'تمت الاستعادة',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'استعادة المحدد',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'استعادة :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'restore' => [
|
||||
'label' => 'استعادة',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'restored' => [
|
||||
'title' => 'تمت الاستعادة',
|
||||
],
|
||||
|
||||
'restored_partial' => [
|
||||
'title' => 'تمت استعادة :count من أصل :total',
|
||||
'missing_authorization_failure_message' => 'ليس لديك صلاحية لاستعادة :count.',
|
||||
'missing_processing_failure_message' => 'تعذر استعادة :count.',
|
||||
],
|
||||
|
||||
'restored_none' => [
|
||||
'title' => 'فشل في الاستعادة',
|
||||
'missing_authorization_failure_message' => 'ليس لديك صلاحية لاستعادة :count.',
|
||||
'missing_processing_failure_message' => 'تعذر استعادة :count.',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
25
lang/vendor/filament-actions/ar/view.php
vendored
Normal file
25
lang/vendor/filament-actions/ar/view.php
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'عرض',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'عرض :label',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'close' => [
|
||||
'label' => 'إغلاق',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
45
lang/vendor/filament-actions/az/associate.php
vendored
Normal file
45
lang/vendor/filament-actions/az/associate.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'Əlaqələndir',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label Əlaqələndir',
|
||||
|
||||
'fields' => [
|
||||
|
||||
'record_id' => [
|
||||
'label' => 'Məlumat',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
|
||||
'associate' => [
|
||||
'label' => 'Əlaqələndir',
|
||||
],
|
||||
|
||||
'associate_another' => [
|
||||
'label' => 'Əlaqələndir və başqasına başla',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'associated' => [
|
||||
'title' => 'Əlaqələndirildi',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
45
lang/vendor/filament-actions/az/attach.php
vendored
Normal file
45
lang/vendor/filament-actions/az/attach.php
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'İlişdir',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label ilişdir',
|
||||
|
||||
'fields' => [
|
||||
|
||||
'record_id' => [
|
||||
'label' => 'Məlumat',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'actions' => [
|
||||
|
||||
'attach' => [
|
||||
'label' => 'İlişdir',
|
||||
],
|
||||
|
||||
'attach_another' => [
|
||||
'label' => 'İlişdir və başqasına başla',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'attached' => [
|
||||
'title' => 'İlişdirildi',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
37
lang/vendor/filament-actions/az/create.php
vendored
Normal file
37
lang/vendor/filament-actions/az/create.php
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => ':label Yarat',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label yarat',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'create' => [
|
||||
'label' => 'Yarat',
|
||||
],
|
||||
|
||||
'create_another' => [
|
||||
'label' => 'Yarat və başqasını yarat',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'created' => [
|
||||
'title' => 'Yaradıldı',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
61
lang/vendor/filament-actions/az/delete.php
vendored
Normal file
61
lang/vendor/filament-actions/az/delete.php
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'Sil',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label Sil',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
'label' => 'Sil',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
'title' => 'Silindi',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'Seçilənləri sil',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => 'Seçilənləri sil',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'delete' => [
|
||||
'label' => 'Sil',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'deleted' => [
|
||||
'title' => 'Silindi',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
61
lang/vendor/filament-actions/az/detach.php
vendored
Normal file
61
lang/vendor/filament-actions/az/detach.php
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'Ayır',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label ayır',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'detach' => [
|
||||
'label' => 'Ayır',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'detached' => [
|
||||
'title' => 'Ayrıldı',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'Seçiləni ayır',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label seçiləni ayır ',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'detach' => [
|
||||
'label' => 'Seçiləni ayır',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'detached' => [
|
||||
'title' => 'Ayrıldı',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
61
lang/vendor/filament-actions/az/dissociate.php
vendored
Normal file
61
lang/vendor/filament-actions/az/dissociate.php
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'Parçala',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label parçala',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'dissociate' => [
|
||||
'label' => 'Parçala',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'dissociated' => [
|
||||
'title' => 'Parçalandı',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'multiple' => [
|
||||
|
||||
'label' => 'Seçiləni parçala',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label seçiləni parçala',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'dissociate' => [
|
||||
'label' => 'Seçiləni parçala',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'dissociated' => [
|
||||
'title' => 'Parçalandı',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
33
lang/vendor/filament-actions/az/edit.php
vendored
Normal file
33
lang/vendor/filament-actions/az/edit.php
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'single' => [
|
||||
|
||||
'label' => 'Redaktə et',
|
||||
|
||||
'modal' => [
|
||||
|
||||
'heading' => ':label redaktə et',
|
||||
|
||||
'actions' => [
|
||||
|
||||
'save' => [
|
||||
'label' => 'Yadda saxla',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'notifications' => [
|
||||
|
||||
'saved' => [
|
||||
'title' => 'Yadda saxlanıldı',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue