diff --git a/app/Filament/Exports/StickerStructureDetailExporter.php b/app/Filament/Exports/StickerStructureDetailExporter.php new file mode 100644 index 0000000..8c3766a --- /dev/null +++ b/app/Filament/Exports/StickerStructureDetailExporter.php @@ -0,0 +1,62 @@ +label('NO') + ->state(function ($record) use (&$rowNumber) { + // Increment and return the row number + return ++$rowNumber; + }), + ExportColumn::make('sticker_id') + ->label('STICKER ID'), + ExportColumn::make('sticker_width') + ->label('STICKER WIDTH'), + ExportColumn::make('sticker_height') + ->label('STICKER HEIGHT'), + ExportColumn::make('sticker_lmargin') + ->label('STICKER LEFT MARGIN'), + ExportColumn::make('sticker_rmargin') + ->label('STICKER RIGHT MARGIN'), + ExportColumn::make('sticker_tmargin') + ->label('STICKER TOP MARGIN'), + ExportColumn::make('sticker_bmargin') + ->label('STICKER BOTTOM MARGIN'), + ExportColumn::make('created_at') + ->label('CREATED AT'), + ExportColumn::make('updated_at') + ->label('UPDATED AT'), + ExportColumn::make('created_by') + ->label('CREATED BY'), + ExportColumn::make('updated_by') + ->label('UPDATED BY'), + ExportColumn::make('deleted_at') + ->label('DELETED AT') + ->enabledByDefault(false), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your sticker structure detail export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; + + if ($failedRowsCount = $export->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/StickerStructureDetailImporter.php b/app/Filament/Imports/StickerStructureDetailImporter.php new file mode 100644 index 0000000..b33455e --- /dev/null +++ b/app/Filament/Imports/StickerStructureDetailImporter.php @@ -0,0 +1,49 @@ +data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new StickerStructureDetail(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your sticker structure detail import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Resources/StickerStructureDetailResource.php b/app/Filament/Resources/StickerStructureDetailResource.php new file mode 100644 index 0000000..13351b8 --- /dev/null +++ b/app/Filament/Resources/StickerStructureDetailResource.php @@ -0,0 +1,207 @@ +schema([ + Forms\Components\TextInput::make('sticker_id') + ->label('Sticker ID') + ->reactive() + ->required() + ->afterStateUpdated(function ($state, callable $set) { + //\Log::info('Sticker ID typed:', ['sticker_id' => $state]); + $set('sticker_id_live', $state); + }), + Forms\Components\TextInput::make('sticker_width') + ->label('Sticker Width') + ->required(), + Forms\Components\TextInput::make('sticker_height') + ->label('Sticker Height') + ->required(), + Forms\Components\TextInput::make('sticker_lmargin') + ->label('Sticker Left Margin') + ->required(), + Forms\Components\TextInput::make('sticker_rmargin') + ->label('Sticker Right Margin') + ->required(), + Forms\Components\TextInput::make('sticker_tmargin') + ->label('Sticker Top Margin') + ->required(), + Forms\Components\TextInput::make('sticker_bmargin') + ->label('Sticker Bottom Margin') + ->required(), + Forms\Components\Hidden::make('created_by') + ->label('Created By') + ->default(Filament::auth()->user()?->name), + Forms\Components\Hidden::make('updated_by') + ->label('Updated By') + ->default(Filament::auth()->user()?->name), + Forms\Components\Hidden::make('sticker_id_live') + ->default(fn ($get) => $get('sticker_id')) + ->reactive() + ->afterStateUpdated(function ($state, callable $set) { + $set('sticker_id_live', $state); + }), + Forms\Components\ViewField::make('generate_template') + ->view('fields.generate-template') + ->reactive() + //->key(fn ($get) => 'generate-template' . ($get('sticker_id_live') ?? 'empty')) + ->key(fn (Get $get) => + 'generate-template-' . + ($get('sticker_id_live') ?? 'empty') . '-' . + ($get('plant_id') ?? 'empty') . '-' . + ($get('item_characteristic_id') ?? 'empty') + ) + // ->viewData(fn (Get $get) => [ + // 'sticker_id' => $get('sticker_id_live') ?? 'empty', + // ]), + ->viewData(fn (Get $get) => [ + 'sticker_id' => $get('sticker_id_live') ?? 'empty', + 'plant_id' => $get('plant_id') ?? 'empty', + 'item_characteristic_id' => $get('item_characteristic_id') ?? 'empty', + ]) + + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('No.') + ->label('No.') + ->getStateUsing(function ($record, $livewire, $column, $rowLoop) { + $paginator = $livewire->getTableRecords(); + $perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10; + $currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1; + + return ($currentPage - 1) * $perPage + $rowLoop->iteration; + }), + Tables\Columns\TextColumn::make('sticker_id') + ->label('Sticker ID') + ->alignCenter(), + Tables\Columns\TextColumn::make('sticker_width') + ->label('Sticker Width') + ->alignCenter(), + Tables\Columns\TextColumn::make('sticker_height') + ->label('Sticker Height') + ->alignCenter(), + Tables\Columns\TextColumn::make('sticker_lmargin') + ->label('Sticker Left Margin') + ->alignCenter(), + Tables\Columns\TextColumn::make('sticker_rmargin') + ->label('Sticker Right Margin') + ->alignCenter(), + Tables\Columns\TextColumn::make('sticker_tmargin') + ->label('Sticker Top Margin') + ->alignCenter(), + Tables\Columns\TextColumn::make('sticker_bmargin') + ->label('Sticker Bottom Margin') + ->alignCenter(), + Tables\Columns\TextColumn::make('created_at') + ->label('Created At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_at') + ->label('Updated At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('deleted_at') + ->label('Deleted At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + Tables\Filters\TrashedFilter::make(), + ]) + ->actions([ + Tables\Actions\ViewAction::make(), + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + Tables\Actions\ForceDeleteBulkAction::make(), + Tables\Actions\RestoreBulkAction::make(), + ]), + ]) + ->headerActions([ + ImportAction::make() + ->label('Import Sticker Structure Details') + ->color('warning') + ->importer(StickerStructureDetailImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import sticker structure details'); + }), + ExportAction::make() + ->label('Export Sticker Structure Details') + ->color('warning') + ->exporter(StickerStructureDetailExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export sticker structure details'); + }), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListStickerStructureDetails::route('/'), + 'create' => Pages\CreateStickerStructureDetail::route('/create'), + 'view' => Pages\ViewStickerStructureDetail::route('/{record}'), + 'edit' => Pages\EditStickerStructureDetail::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + return parent::getEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/StickerStructureDetailResource/Pages/CreateStickerStructureDetail.php b/app/Filament/Resources/StickerStructureDetailResource/Pages/CreateStickerStructureDetail.php new file mode 100644 index 0000000..2adf130 --- /dev/null +++ b/app/Filament/Resources/StickerStructureDetailResource/Pages/CreateStickerStructureDetail.php @@ -0,0 +1,12 @@ +checkPermissionTo('view-any StickerStructureDetail'); + } + + /** + * Determine whether the user can view the model. + */ + public function view(User $user, StickerStructureDetail $stickerstructuredetail): bool + { + return $user->checkPermissionTo('view StickerStructureDetail'); + } + + /** + * Determine whether the user can create models. + */ + public function create(User $user): bool + { + return $user->checkPermissionTo('create StickerStructureDetail'); + } + + /** + * Determine whether the user can update the model. + */ + public function update(User $user, StickerStructureDetail $stickerstructuredetail): bool + { + return $user->checkPermissionTo('update StickerStructureDetail'); + } + + /** + * Determine whether the user can delete the model. + */ + public function delete(User $user, StickerStructureDetail $stickerstructuredetail): bool + { + return $user->checkPermissionTo('delete StickerStructureDetail'); + } + + /** + * Determine whether the user can delete any models. + */ + public function deleteAny(User $user): bool + { + return $user->checkPermissionTo('delete-any StickerStructureDetail'); + } + + /** + * Determine whether the user can restore the model. + */ + public function restore(User $user, StickerStructureDetail $stickerstructuredetail): bool + { + return $user->checkPermissionTo('restore StickerStructureDetail'); + } + + /** + * Determine whether the user can restore any models. + */ + public function restoreAny(User $user): bool + { + return $user->checkPermissionTo('restore-any StickerStructureDetail'); + } + + /** + * Determine whether the user can replicate the model. + */ + public function replicate(User $user, StickerStructureDetail $stickerstructuredetail): bool + { + return $user->checkPermissionTo('replicate StickerStructureDetail'); + } + + /** + * Determine whether the user can reorder the models. + */ + public function reorder(User $user): bool + { + return $user->checkPermissionTo('reorder StickerStructureDetail'); + } + + /** + * Determine whether the user can permanently delete the model. + */ + public function forceDelete(User $user, StickerStructureDetail $stickerstructuredetail): bool + { + return $user->checkPermissionTo('force-delete StickerStructureDetail'); + } + + /** + * Determine whether the user can permanently delete any models. + */ + public function forceDeleteAny(User $user): bool + { + return $user->checkPermissionTo('force-delete-any StickerStructureDetail'); + } +} diff --git a/database/migrations/2026_07_29_151858_create_sticker_structure_details_table.php b/database/migrations/2026_07_29_151858_create_sticker_structure_details_table.php new file mode 100644 index 0000000..e9bf7be --- /dev/null +++ b/database/migrations/2026_07_29_151858_create_sticker_structure_details_table.php @@ -0,0 +1,42 @@ +