├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── config.yml ├── config.yml ├── dependabot.yml ├── pull_request_template.md ├── release-drafter.yml ├── stale.yml └── workflows │ ├── add-to-project.yml │ ├── chatgpt-bot.yml │ ├── coverage.yml │ ├── support.yml │ └── testing.yml ├── .gitignore ├── .scrutinizer.yml ├── .styleci.yml ├── CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── SECURITY.md ├── composer.json ├── phpunit.xml ├── src ├── BackpackServiceProvider.php ├── Stats.php ├── ThemeServiceProvider.php ├── ViewNamespaces.php ├── app │ ├── Console │ │ └── Commands │ │ │ ├── AddCustomRouteContent.php │ │ │ ├── AddMenuContent.php │ │ │ ├── Addons │ │ │ ├── RequireDevTools.php │ │ │ ├── RequireEditableColumns.php │ │ │ └── RequirePro.php │ │ │ ├── CreateUser.php │ │ │ ├── Fix.php │ │ │ ├── Install.php │ │ │ ├── PublishBackpackMiddleware.php │ │ │ ├── PublishHeaderMetas.php │ │ │ ├── PublishView.php │ │ │ ├── Themes │ │ │ ├── InstallsTheme.php │ │ │ ├── RequireThemeCoreuiv2.php │ │ │ ├── RequireThemeCoreuiv4.php │ │ │ └── RequireThemeTabler.php │ │ │ ├── Traits │ │ │ ├── AddonsHelper.php │ │ │ └── PrettyCommandOutput.php │ │ │ └── Version.php │ ├── Exceptions │ │ ├── AccessDeniedException.php │ │ └── BackpackProRequiredException.php │ ├── Http │ │ ├── Controllers │ │ │ ├── AdminController.php │ │ │ ├── Auth │ │ │ │ ├── ForgotPasswordController.php │ │ │ │ ├── LoginController.php │ │ │ │ ├── RegisterController.php │ │ │ │ ├── ResetPasswordController.php │ │ │ │ └── VerifyEmailController.php │ │ │ ├── BaseController.php │ │ │ ├── ChartController.php │ │ │ ├── CrudController.php │ │ │ ├── MyAccountController.php │ │ │ └── Operations │ │ │ │ ├── BulkCloneOperation.php │ │ │ │ ├── BulkDeleteOperation.php │ │ │ │ ├── CloneOperation.php │ │ │ │ ├── Concerns │ │ │ │ └── HasForm.php │ │ │ │ ├── CreateOperation.php │ │ │ │ ├── DeleteOperation.php │ │ │ │ ├── FetchOperation.php │ │ │ │ ├── InlineCreateOperation.php │ │ │ │ ├── ListOperation.php │ │ │ │ ├── ReorderOperation.php │ │ │ │ ├── ShowOperation.php │ │ │ │ └── UpdateOperation.php │ │ ├── Middleware │ │ │ ├── AuthenticateSession.php │ │ │ ├── CheckIfAdmin.php │ │ │ ├── EnsureEmailVerification.php │ │ │ ├── ThrottlePasswordRecovery.php │ │ │ └── UseBackpackAuthGuardInsteadOfDefaultAuthGuard.php │ │ └── Requests │ │ │ ├── AccountInfoRequest.php │ │ │ ├── ChangePasswordRequest.php │ │ │ ├── CrudRequest.php │ │ │ └── EmailVerificationRequest.php │ ├── Library │ │ ├── Attributes │ │ │ └── DeprecatedIgnoreOnRuntime.php │ │ ├── Auth │ │ │ ├── AuthenticatesUsers.php │ │ │ ├── ConfirmsPasswords.php │ │ │ ├── PasswordBroker.php │ │ │ ├── PasswordBrokerManager.php │ │ │ ├── RedirectsUsers.php │ │ │ ├── RegistersUsers.php │ │ │ ├── ResetsPasswords.php │ │ │ ├── ThrottlesLogins.php │ │ │ ├── UserFromCookie.php │ │ │ └── VerifiesEmails.php │ │ ├── CrudPanel │ │ │ ├── CrudButton.php │ │ │ ├── CrudColumn.php │ │ │ ├── CrudField.php │ │ │ ├── CrudFilter.php │ │ │ ├── CrudObjectGroup.php │ │ │ ├── CrudPanel.php │ │ │ ├── CrudPanelFacade.php │ │ │ ├── CrudRouter.php │ │ │ └── Traits │ │ │ │ ├── Access.php │ │ │ │ ├── AutoFocus.php │ │ │ │ ├── AutoSet.php │ │ │ │ ├── Buttons.php │ │ │ │ ├── Columns.php │ │ │ │ ├── ColumnsProtectedMethods.php │ │ │ │ ├── Create.php │ │ │ │ ├── Delete.php │ │ │ │ ├── Errors.php │ │ │ │ ├── FakeColumns.php │ │ │ │ ├── FakeFields.php │ │ │ │ ├── Fields.php │ │ │ │ ├── FieldsPrivateMethods.php │ │ │ │ ├── FieldsProtectedMethods.php │ │ │ │ ├── Filters.php │ │ │ │ ├── HasViewNamespaces.php │ │ │ │ ├── HeadingsAndTitles.php │ │ │ │ ├── Input.php │ │ │ │ ├── Macroable.php │ │ │ │ ├── MorphRelationships.php │ │ │ │ ├── Operations.php │ │ │ │ ├── Query.php │ │ │ │ ├── Read.php │ │ │ │ ├── Relationships.php │ │ │ │ ├── Reorder.php │ │ │ │ ├── SaveActions.php │ │ │ │ ├── Search.php │ │ │ │ ├── Settings.php │ │ │ │ ├── Support │ │ │ │ └── MacroableWithAttributes.php │ │ │ │ ├── Tabs.php │ │ │ │ ├── Update.php │ │ │ │ ├── Validation.php │ │ │ │ └── Views.php │ │ ├── Database │ │ │ ├── DatabaseSchema.php │ │ │ ├── Table.php │ │ │ └── TableSchema.php │ │ ├── Uploaders │ │ │ ├── MultipleFiles.php │ │ │ ├── SingleBase64Image.php │ │ │ ├── SingleFile.php │ │ │ ├── Support │ │ │ │ ├── FileNameGenerator.php │ │ │ │ ├── Interfaces │ │ │ │ │ ├── FileNameGeneratorInterface.php │ │ │ │ │ └── UploaderInterface.php │ │ │ │ ├── RegisterUploadEvents.php │ │ │ │ ├── Traits │ │ │ │ │ ├── HandleFileNaming.php │ │ │ │ │ └── HandleRepeatableUploads.php │ │ │ │ └── UploadersRepository.php │ │ │ └── Uploader.php │ │ ├── Validation │ │ │ └── Rules │ │ │ │ ├── BackpackCustomRule.php │ │ │ │ ├── Support │ │ │ │ └── HasFiles.php │ │ │ │ ├── ValidFileArray.php │ │ │ │ ├── ValidUpload.php │ │ │ │ └── ValidUploadMultiple.php │ │ └── Widget.php │ ├── Models │ │ └── Traits │ │ │ ├── CrudTrait.php │ │ │ ├── HasEnumFields.php │ │ │ ├── HasFakeFields.php │ │ │ ├── HasIdentifiableAttribute.php │ │ │ ├── HasRelationshipFields.php │ │ │ ├── HasTranslatableFields.php │ │ │ ├── HasUploadFields.php │ │ │ └── SpatieTranslatable │ │ │ ├── HasTranslations.php │ │ │ ├── SlugService.php │ │ │ ├── Sluggable.php │ │ │ └── SluggableScopeHelpers.php │ ├── Notifications │ │ └── ResetPasswordNotification.php │ └── View │ │ └── Components │ │ ├── MenuDropdown.php │ │ ├── MenuDropdownHeader.php │ │ ├── MenuDropdownItem.php │ │ ├── MenuItem.php │ │ └── MenuSeparator.php ├── config │ └── backpack │ │ ├── base.php │ │ ├── crud.php │ │ ├── operations │ │ ├── create.php │ │ ├── form.php │ │ ├── list.php │ │ ├── reorder.php │ │ ├── show.php │ │ └── update.php │ │ └── ui.php ├── helpers.php ├── macros.php ├── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── mstile-70x70.png │ └── safari-pinned-tab.svg ├── resources │ ├── assets │ │ ├── css │ │ │ └── common.css │ │ ├── img │ │ │ └── spinner.svg │ │ ├── js │ │ │ └── common.js │ │ └── libs │ │ │ └── jquery.mjs.nestedSortable2.js │ ├── lang │ │ ├── ar │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── bg │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── bn │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── ca │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── cs │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ └── langfilemanager.php │ │ ├── da-DK │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── da_DK │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── de │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── el │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── en │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── es │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── fa │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── fr-CA │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── fr │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── fr_CA │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── gr │ │ │ ├── backup.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── hu │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── id │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── it │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── ja │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── lo │ │ │ ├── backup.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── lv │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── my │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── nl │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── pt-BR │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── pt │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── pt_br │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── ro │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── ru │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── sr │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── th │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── tr │ │ │ ├── crud.php │ │ │ └── langfilemanager.php │ │ ├── uk │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── vi │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ ├── zh-Hant │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ │ └── zh-cn │ │ │ ├── backup.php │ │ │ ├── base.php │ │ │ ├── crud.php │ │ │ ├── langfilemanager.php │ │ │ ├── logmanager.php │ │ │ ├── pagemanager.php │ │ │ ├── permissionmanager.php │ │ │ └── settings.php │ ├── stubs │ │ ├── browserconfig.stub │ │ ├── header_metas.stub │ │ └── manifest.stub │ └── views │ │ ├── crud │ │ ├── buttons │ │ │ ├── create.blade.php │ │ │ ├── delete.blade.php │ │ │ ├── quick.blade.php │ │ │ ├── reorder.blade.php │ │ │ ├── show.blade.php │ │ │ └── update.blade.php │ │ ├── columns │ │ │ ├── boolean.blade.php │ │ │ ├── check.blade.php │ │ │ ├── checkbox.blade.php │ │ │ ├── checklist.blade.php │ │ │ ├── checklist_dependency.blade.php │ │ │ ├── closure.blade.php │ │ │ ├── color.blade.php │ │ │ ├── custom_html.blade.php │ │ │ ├── date.blade.php │ │ │ ├── datetime.blade.php │ │ │ ├── email.blade.php │ │ │ ├── enum.blade.php │ │ │ ├── hidden.blade.php │ │ │ ├── image.blade.php │ │ │ ├── inc │ │ │ │ ├── bulk_actions_checkbox.blade.php │ │ │ │ ├── details_row_button.blade.php │ │ │ │ ├── wrapper_end.blade.php │ │ │ │ └── wrapper_start.blade.php │ │ │ ├── json.blade.php │ │ │ ├── model_function.blade.php │ │ │ ├── model_function_attribute.blade.php │ │ │ ├── month.blade.php │ │ │ ├── multidimensional_array.blade.php │ │ │ ├── number.blade.php │ │ │ ├── password.blade.php │ │ │ ├── phone.blade.php │ │ │ ├── radio.blade.php │ │ │ ├── range.blade.php │ │ │ ├── relationship_count.blade.php │ │ │ ├── row_number.blade.php │ │ │ ├── select.blade.php │ │ │ ├── select_from_array.blade.php │ │ │ ├── select_grouped.blade.php │ │ │ ├── select_multiple.blade.php │ │ │ ├── summernote.blade.php │ │ │ ├── switch.blade.php │ │ │ ├── text.blade.php │ │ │ ├── textarea.blade.php │ │ │ ├── time.blade.php │ │ │ ├── upload.blade.php │ │ │ ├── upload_multiple.blade.php │ │ │ ├── url.blade.php │ │ │ ├── view.blade.php │ │ │ └── week.blade.php │ │ ├── create.blade.php │ │ ├── details_row.blade.php │ │ ├── edit.blade.php │ │ ├── fields │ │ │ ├── boolean.blade.php │ │ │ ├── checkbox.blade.php │ │ │ ├── checklist.blade.php │ │ │ ├── checklist_dependency.blade.php │ │ │ ├── color.blade.php │ │ │ ├── custom_html.blade.php │ │ │ ├── date.blade.php │ │ │ ├── datetime.blade.php │ │ │ ├── email.blade.php │ │ │ ├── enum.blade.php │ │ │ ├── hidden.blade.php │ │ │ ├── inc │ │ │ │ ├── attributes.blade.php │ │ │ │ ├── translatable_icon.blade.php │ │ │ │ ├── wrapper_end.blade.php │ │ │ │ └── wrapper_start.blade.php │ │ │ ├── month.blade.php │ │ │ ├── number.blade.php │ │ │ ├── password.blade.php │ │ │ ├── radio.blade.php │ │ │ ├── range.blade.php │ │ │ ├── select.blade.php │ │ │ ├── select_from_array.blade.php │ │ │ ├── select_grouped.blade.php │ │ │ ├── select_multiple.blade.php │ │ │ ├── summernote.blade.php │ │ │ ├── switch.blade.php │ │ │ ├── text.blade.php │ │ │ ├── textarea.blade.php │ │ │ ├── time.blade.php │ │ │ ├── upload.blade.php │ │ │ ├── upload_multiple.blade.php │ │ │ ├── url.blade.php │ │ │ ├── view.blade.php │ │ │ └── week.blade.php │ │ ├── form_content.blade.php │ │ ├── inc │ │ │ ├── ajax_error_frame.blade.php │ │ │ ├── button_stack.blade.php │ │ │ ├── datatables_logic.blade.php │ │ │ ├── details_row_logic.blade.php │ │ │ ├── edit_translation_notice.blade.php │ │ │ ├── export_buttons.blade.php │ │ │ ├── filters_navbar.blade.php │ │ │ ├── form_fields_script.blade.php │ │ │ ├── form_page.blade.php │ │ │ ├── form_save_buttons.blade.php │ │ │ ├── grouped_errors.blade.php │ │ │ ├── show_fields.blade.php │ │ │ ├── show_tabbed_fields.blade.php │ │ │ ├── show_tabbed_table.blade.php │ │ │ └── show_table.blade.php │ │ ├── list.blade.php │ │ ├── reorder.blade.php │ │ └── show.blade.php │ │ └── ui │ │ ├── components │ │ ├── menu-dropdown-header.blade.php │ │ ├── menu-dropdown-item.blade.php │ │ ├── menu-dropdown.blade.php │ │ ├── menu-item.blade.php │ │ └── menu-separator.blade.php │ │ ├── dashboard.blade.php │ │ ├── errors │ │ ├── 400.blade.php │ │ ├── 401.blade.php │ │ ├── 403.blade.php │ │ ├── 404.blade.php │ │ ├── 405.blade.php │ │ ├── 408.blade.php │ │ ├── 429.blade.php │ │ ├── 4xx.blade.php │ │ ├── 500.blade.php │ │ ├── 503.blade.php │ │ ├── blank.blade.php │ │ └── layout.blade.php │ │ ├── inc │ │ ├── getting_started.blade.php │ │ ├── menu_items.blade.php │ │ ├── scripts.blade.php │ │ └── styles.blade.php │ │ └── widgets │ │ ├── alert.blade.php │ │ ├── card.blade.php │ │ ├── div.blade.php │ │ ├── inc │ │ ├── wrapper_end.blade.php │ │ └── wrapper_start.blade.php │ │ ├── jumbotron.blade.php │ │ ├── livewire.blade.php │ │ ├── progress.blade.php │ │ ├── progress_white.blade.php │ │ ├── script.blade.php │ │ ├── style.blade.php │ │ └── view.blade.php └── routes │ └── backpack │ ├── base.php │ ├── custom.php │ └── testing.php └── tests ├── BaseTestClass.php ├── Unit ├── CrudPanel │ ├── CrudPanelAccessTest.php │ ├── CrudPanelAutoSetTest.php │ ├── CrudPanelAutofocusTest.php │ ├── CrudPanelButtonsTest.php │ ├── CrudPanelColumnsTest.php │ ├── CrudPanelCreateTest.php │ ├── CrudPanelDeleteTest.php │ ├── CrudPanelErrorsTest.php │ ├── CrudPanelFakeColumnsTest.php │ ├── CrudPanelFakeFieldsTest.php │ ├── CrudPanelFieldsTest.php │ ├── CrudPanelFiltersTest.php │ ├── CrudPanelMacroTest.php │ ├── CrudPanelObjectGroupTest.php │ ├── CrudPanelOperationsTest.php │ ├── CrudPanelQueryDatabaseTest.php │ ├── CrudPanelQueryTest.php │ ├── CrudPanelReadTest.php │ ├── CrudPanelReorderOperationTest.php │ ├── CrudPanelReorderTest.php │ ├── CrudPanelSaveActionsTest.php │ ├── CrudPanelSearchTest.php │ ├── CrudPanelSettingsTest.php │ ├── CrudPanelTablePrefixedTests.php │ ├── CrudPanelTabsTest.php │ ├── CrudPanelTest.php │ ├── CrudPanelTitlesAndHeadingsTest.php │ ├── CrudPanelUpdateTest.php │ ├── CrudPanelValidationTest.php │ ├── CrudPanelViewsTest.php │ ├── HelpersTest.php │ ├── TranslatableFieldsTest.php │ └── ViewNamespacesTest.php └── CrudTrait │ └── CrudTraitFakeFieldsTest.php └── config ├── CrudPanel ├── BaseCrudPanel.php ├── BaseDBCrudPanel.php ├── BasePrefixedDBCrudPanel.php └── NoSqlDriverCrudPanel.php ├── CrudTrait └── BaseCrudTrait.php ├── Http ├── Controllers │ ├── ArticleCrudController.php │ └── UserCrudController.php ├── CrudControllerTest.php └── Requests │ └── UserRequest.php ├── Models ├── AccountDetails.php ├── Address.php ├── Article.php ├── ArticleWithEnum.php ├── Bang.php ├── Bill.php ├── ColumnType.php ├── Comet.php ├── Comment.php ├── Enums │ ├── StateEnum.php │ ├── StatusEnum.php │ └── StyleEnum.php ├── FakeColumnsModel.php ├── ModelWithoutCrudTrait.php ├── Planet.php ├── PlanetNonNullable.php ├── Recommend.php ├── Reorder.php ├── Role.php ├── Star.php ├── SuperArticlePivot.php ├── TestModel.php ├── TestModelWithTranslations.php ├── Traits │ └── HasTranslationsFake.php ├── Transaction.php ├── TranslatableModel.php ├── Universe.php ├── User.php ├── UserWithReturnTypes.php └── UserWithTranslations.php ├── TestsServiceProvider.php ├── database ├── migrations │ ├── 2017_09_05_000000_create_users_table.php │ ├── 2017_09_06_000000_create_articles_table.php │ ├── 2017_09_06_000001_create_column_types_table.php │ ├── 2017_09_08_000000_create_user_roles_table.php │ ├── 2017_09_08_000001_create_account_details_table.php │ ├── 2017_09_08_000001_create_addresses_table.php │ ├── 2020_03_31_114745_create_pivotable_relations_tables.php │ ├── 2024_07_30_000000_create_reorder_table.php │ └── 2024_07_30_000001_create_translatable_table.php └── seeds │ ├── ArticlesTableSeeder.php │ ├── MorphableSeeders.php │ ├── UsersRolesTableSeeder.php │ └── UsersTableSeeder.php └── views ├── buttons └── test.blade.php └── fields ├── custom_namespace └── test.blade.php └── test.blade.php /.editorconfig: -------------------------------------------------------------------------------- 1 | ; This file is for unifying the coding style for different editors and IDEs. 2 | ; More information at http://editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | indent_size = 4 9 | indent_style = space 10 | end_of_line = lf 11 | insert_final_newline = true 12 | trim_trailing_whitespace = true 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Documentation issue 4 | url: https://github.com/laravel-backpack/docs 5 | about: Please open an issue or pull request in our docs repository. 6 | - name: How Do I _____? 7 | url: https://github.com/Laravel-Backpack/community-forum/discussions 8 | about: Please use Discussions in our community forum. We've been blessed with a great community, that is happy to help. 9 | - name: Feature Request or Idea 10 | url: https://github.com/Laravel-Backpack/community-forum/discussions/new 11 | about: If you have an idea, request or want to show something you did, use our Community Forum. This is where we all hang out. 12 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: composer 4 | directory: "/" 5 | schedule: 6 | interval: monthly 7 | open-pull-requests-limit: 10 8 | - package-ecosystem: npm 9 | directory: "/" 10 | schedule: 11 | interval: monthly 12 | open-pull-requests-limit: 10 13 | ignore: 14 | - dependency-name: css-loader 15 | versions: 16 | - 5.0.1 17 | - 5.1.0 18 | - 5.1.1 19 | - dependency-name: pace-js 20 | versions: 21 | - 1.2.3 22 | - dependency-name: sass-loader 23 | versions: 24 | - 10.1.0 25 | - 10.1.1 26 | - package-ecosystem: "github-actions" 27 | directory: "/" 28 | schedule: 29 | interval: monthly 30 | open-pull-requests-limit: 10 31 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## WHY 2 | 3 | ### BEFORE - What was wrong? What was happening before this PR? 4 | 5 | ?? 6 | 7 | ### AFTER - What is happening after this PR? 8 | 9 | ?? 10 | 11 | 12 | ## HOW 13 | 14 | ### How did you achieve that, in technical terms? 15 | 16 | ?? 17 | 18 | 19 | 20 | ### Is it a breaking change? 21 | 22 | ?? 23 | 24 | 25 | ### How can we test the before & after? 26 | 27 | ?? 28 | 29 | If the PR has changes in multiple repos please provide the command to checkout all branches, eg.: 30 | ```bash 31 | git checkout "dev-branch-name" && 32 | cd vendor/backpack/crud && git checkout crud-branch-name && 33 | cd ../pro && git checkout pro-branch-name && 34 | cd ../../.. 35 | ``` 36 | -------------------------------------------------------------------------------- /.github/workflows/add-to-project.yml: -------------------------------------------------------------------------------- 1 | name: Add new bugs & PRs to This Week project 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | - transferred 8 | pull_request: 9 | types: 10 | - opened 11 | 12 | permissions: {} 13 | jobs: 14 | add-to-project: 15 | name: Add new bugs and PRs to This Week project 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: actions/add-to-project@main 19 | with: 20 | project-url: https://github.com/orgs/Laravel-Backpack/projects/13 21 | github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} 22 | -------------------------------------------------------------------------------- /.github/workflows/chatgpt-bot.yml: -------------------------------------------------------------------------------- 1 | name: ChatGPT Bot 2 | 3 | on: 4 | issue_comment: 5 | types: 6 | - created 7 | 8 | jobs: 9 | run-bot: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: austenstone/chatgpt-bot@main 13 | env: 14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 15 | OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | vendor/ 3 | node_modules/ 4 | .DS_Store 5 | .composer.lock 6 | composer.lock 7 | .phpunit.result.cache 8 | src/public/packages/ 9 | /.phpunit.cache 10 | 11 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: laravel 2 | finder: 3 | not-name: 4 | - "LicenseCheck.php" -------------------------------------------------------------------------------- /src/app/Exceptions/AccessDeniedException.php: -------------------------------------------------------------------------------- 1 | setDefaultDriver(config('backpack.base.guard')); 20 | 21 | return $next($request); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/Http/Requests/EmailVerificationRequest.php: -------------------------------------------------------------------------------- 1 | redirectTo(); 16 | } 17 | 18 | return property_exists($this, 'redirectTo') ? $this->redirectTo : '/dashboard'; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/Library/Auth/UserFromCookie.php: -------------------------------------------------------------------------------- 1 | first(); 13 | } 14 | 15 | return null; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/Library/CrudPanel/Traits/AutoFocus.php: -------------------------------------------------------------------------------- 1 | getOperationSetting('autoFocusOnFirstField'); 13 | } 14 | 15 | public function setAutoFocusOnFirstField($value) 16 | { 17 | return $this->setOperationSetting('autoFocusOnFirstField', (bool) $value); 18 | } 19 | 20 | public function enableAutoFocus() 21 | { 22 | return $this->setAutoFocusOnFirstField(true); 23 | } 24 | 25 | public function disableAutoFocus() 26 | { 27 | return $this->setAutoFocusOnFirstField(false); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/app/Library/Uploaders/Support/Interfaces/FileNameGeneratorInterface.php: -------------------------------------------------------------------------------- 1 | fileRules = self::getRulesAsArray($rules); 15 | 16 | return $this; 17 | } 18 | 19 | protected function getFileRules(): array 20 | { 21 | return $this->fileRules ?? []; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/Models/Traits/CrudTrait.php: -------------------------------------------------------------------------------- 1 | crud->setReorderContentClass('class-string') 12 | 'contentClass' => 'col-md-12 col-md-offset-2', 13 | 14 | // should the content of the reorder label be escaped? 15 | 'escaped' => false, 16 | ]; 17 | -------------------------------------------------------------------------------- /src/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/apple-touch-icon.png -------------------------------------------------------------------------------- /src/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/favicon-16x16.png -------------------------------------------------------------------------------- /src/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/favicon-32x32.png -------------------------------------------------------------------------------- /src/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/favicon.ico -------------------------------------------------------------------------------- /src/public/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/mstile-144x144.png -------------------------------------------------------------------------------- /src/public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/mstile-150x150.png -------------------------------------------------------------------------------- /src/public/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/mstile-310x150.png -------------------------------------------------------------------------------- /src/public/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/mstile-310x310.png -------------------------------------------------------------------------------- /src/public/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/src/public/mstile-70x70.png -------------------------------------------------------------------------------- /src/resources/assets/js/common.js: -------------------------------------------------------------------------------- 1 | // Ajax calls should always have the CSRF token attached to them, otherwise they won't work 2 | $.ajaxSetup({ 3 | headers: { 4 | 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, 5 | } 6 | }); 7 | 8 | // Enable deep link to tab 9 | document.querySelectorAll('.nav-tabs a').forEach(e => { 10 | if(e.dataset.name === location.hash.substring(1)) (new bootstrap.Tab(e)).show(); 11 | e.addEventListener('click', () => location.hash = e.dataset.name); 12 | }); 13 | -------------------------------------------------------------------------------- /src/resources/lang/ar/backup.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | __APP_COLOR__ 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/resources/stubs/manifest.stub: -------------------------------------------------------------------------------- 1 | { 2 | "name": "__APP_NAME__", 3 | "icons": [ 4 | { 5 | "src": "__PATH_PREFIX__android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "__PATH_PREFIX__android-chrome-512x512.png", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "__APP_COLOR__", 16 | "background_color": "__APP_COLOR__", 17 | "start_url": "/__BACKPACK_PREFIX__", 18 | "display": "standalone" 19 | } -------------------------------------------------------------------------------- /src/resources/views/crud/buttons/create.blade.php: -------------------------------------------------------------------------------- 1 | @if ($crud->hasAccess('create')) 2 | 3 | {{ trans('backpack::crud.add') }} {{ $crud->entity_name }} 4 | 5 | @endif -------------------------------------------------------------------------------- /src/resources/views/crud/buttons/reorder.blade.php: -------------------------------------------------------------------------------- 1 | @if ($crud->get('reorder.enabled') && $crud->hasAccess('reorder')) 2 | 3 | {{ trans('backpack::crud.reorder') }} {{ $crud->entity_name_plural }} 4 | 5 | @endif -------------------------------------------------------------------------------- /src/resources/views/crud/columns/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | @include('crud::columns.check') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/checklist.blade.php: -------------------------------------------------------------------------------- 1 | @include('crud::columns.select') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/email.blade.php: -------------------------------------------------------------------------------- 1 | {{-- email link --}} 2 | @php 3 | $column['value'] = $column['value'] ?? data_get($entry, $column['name']); 4 | $column['wrapper']['element'] = $column['wrapper']['element'] ?? 'a'; 5 | $column['wrapper']['href'] = $column['wrapper']['href'] ?? 'mailto:'.$column['value']; 6 | @endphp 7 | @include('crud::columns.text') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/hidden.blade.php: -------------------------------------------------------------------------------- 1 | @include('crud::columns.text') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/inc/details_row_button.blade.php: -------------------------------------------------------------------------------- 1 | {{-- expand/minimize button column --}} 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/resources/views/crud/columns/inc/wrapper_end.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | // this is made available by columns like select and select_multiple 3 | $related_key = $related_key ?? null; 4 | 5 | // define the wrapper element 6 | $wrapperElement = $column['wrapper']['element'] ?? 'a'; 7 | if(!is_string($wrapperElement) && $wrapperElement instanceof \Closure) { 8 | $wrapperElement = $wrapperElement($crud, $column, $entry, $related_key); 9 | } 10 | @endphp 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/resources/views/crud/columns/inc/wrapper_start.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | // this is made available by columns like select and select_multiple 3 | $related_key = $related_key ?? null; 4 | 5 | // each wrapper attribute can be a callback or a string 6 | // for those that are callbacks, run the callbacks to get the final string to use 7 | foreach($column['wrapper'] as $attribute => $value) { 8 | $column['wrapper'][$attribute] = !is_string($value) && $value instanceof \Closure ? $value($crud, $column, $entry, $related_key) : $value ?? ''; 9 | } 10 | @endphp 11 | 12 | <{{ $column['wrapper']['element'] ?? 'a' }} 13 | @foreach(Arr::except($column['wrapper'], 'element') as $element => $value) 14 | {{$element}}="{{$value}}" 15 | @endforeach 16 | > -------------------------------------------------------------------------------- /src/resources/views/crud/columns/month.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $column['format'] = $column['format'] ?? 'MMMM Y'; 3 | @endphp 4 | @include('crud::columns.date') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/password.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $column['value'] = "******"; 3 | $column['limit'] = $column['limit'] ?? 6; 4 | @endphp 5 | @include('crud::columns.text') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/select_grouped.blade.php: -------------------------------------------------------------------------------- 1 | @include('crud::columns.select') 2 | -------------------------------------------------------------------------------- /src/resources/views/crud/columns/summernote.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $column['escaped'] = $column['escaped'] ?? false; 3 | @endphp 4 | @include('crud::columns.textarea') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/switch.blade.php: -------------------------------------------------------------------------------- 1 | @include('crud::columns.check') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/time.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $column['format'] = $column['format'] ?? 'H:mm'; 3 | @endphp 4 | @include('crud::columns.date') 5 | -------------------------------------------------------------------------------- /src/resources/views/crud/columns/url.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $column['value'] = $column['value'] ?? data_get($entry, $column['name']); 3 | $column['wrapper']['element'] = $column['wrapper']['element'] ?? $column['element'] ?? 'a'; 4 | $column['wrapper']['target'] = $column['wrapper']['target'] ?? $column['target'] ?? '_blank'; 5 | $column['wrapper']['href'] = $column['value']; 6 | $rel = $column['wrapper']['rel'] ?? $column['rel'] ?? null; 7 | 8 | if($rel !== false) { 9 | $column['wrapper']['rel'] = $rel ?? 'noreferrer'; 10 | } 11 | @endphp 12 | @include('crud::columns.text') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/view.blade.php: -------------------------------------------------------------------------------- 1 | @includeWhen(!empty($column['wrapper']), 'crud::columns.inc.wrapper_start') 2 | @include($column['view']) 3 | @includeWhen(!empty($column['wrapper']), 'crud::columns.inc.wrapper_end') -------------------------------------------------------------------------------- /src/resources/views/crud/columns/week.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $column['prefix'] = $column['prefix'] ?? 'Week '; 3 | $column['format'] = $column['format'] ?? 'W Y'; 4 | 5 | @endphp 6 | @include('crud::columns.date') -------------------------------------------------------------------------------- /src/resources/views/crud/details_row.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | @php 4 | $widgets = app('widgets')->where('section', 'details_row'); 5 | @endphp 6 | @if($widgets->count() > 0) 7 | @include(backpack_view('inc.widgets'), ['widgets' => $widgets]) 8 | @else 9 |
10 | {{ trans('backpack::crud.details_row') }} 11 |
12 | @endif 13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /src/resources/views/crud/fields/boolean.blade.php: -------------------------------------------------------------------------------- 1 | @include('crud::fields.checkbox') 2 | -------------------------------------------------------------------------------- /src/resources/views/crud/fields/custom_html.blade.php: -------------------------------------------------------------------------------- 1 | {{-- used for heading, separators, etc --}} 2 | @includeWhen(!isset($field['wrapper']) || $field['wrapper'] !== false, 'crud::fields.inc.wrapper_start') 3 | {!! $field['value'] !!} 4 | @includeWhen(!isset($field['wrapper']) || $field['wrapper'] !== false, 'crud::fields.inc.wrapper_end') -------------------------------------------------------------------------------- /src/resources/views/crud/fields/hidden.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | // if not otherwise specified, the hidden input should take up no space in the form 3 | $field['wrapper'] = $field['wrapper'] ?? $field['wrapperAttributes'] ?? []; 4 | $field['wrapper']['class'] = $field['wrapper']['class'] ?? "hidden"; 5 | @endphp 6 | 7 | {{-- hidden input --}} 8 | @include('crud::fields.inc.wrapper_start') 9 | 15 | @include('crud::fields.inc.wrapper_end') 16 | -------------------------------------------------------------------------------- /src/resources/views/crud/fields/inc/attributes.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $field['attributes'] = $field['attributes'] ?? []; 3 | $field['attributes']['class'] = $field['attributes']['class'] ?? $default_class ?? 'form-control'; 4 | @endphp 5 | 6 | @foreach ($field['attributes'] as $attribute => $value) 7 | @if (is_string($attribute)) 8 | {{ $attribute }}="{{ $value }}" 9 | @endif 10 | @endforeach -------------------------------------------------------------------------------- /src/resources/views/crud/fields/inc/wrapper_end.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/resources/views/crud/fields/range.blade.php: -------------------------------------------------------------------------------- 1 | {{-- html5 range input --}} 2 | @include('crud::fields.inc.wrapper_start') 3 | 4 | @include('crud::fields.inc.translatable_icon') 5 | 12 | 13 | {{-- HINT --}} 14 | @if (isset($field['hint'])) 15 |

{!! $field['hint'] !!}

16 | @endif 17 | @include('crud::fields.inc.wrapper_end') 18 | -------------------------------------------------------------------------------- /src/resources/views/crud/fields/textarea.blade.php: -------------------------------------------------------------------------------- 1 | {{-- textarea --}} 2 | @include('crud::fields.inc.wrapper_start') 3 | 4 | @include('crud::fields.inc.translatable_icon') 5 | 10 | 11 | {{-- HINT --}} 12 | @if (isset($field['hint'])) 13 |

{!! $field['hint'] !!}

14 | @endif 15 | @include('crud::fields.inc.wrapper_end') 16 | -------------------------------------------------------------------------------- /src/resources/views/crud/fields/view.blade.php: -------------------------------------------------------------------------------- 1 | {{-- view field --}} 2 | @includeWhen(!isset($field['wrapper']) || $field['wrapper'] !== false, 'crud::fields.inc.wrapper_start') 3 | @include($field['view'], ['crud' => $crud, 'entry' => $entry ?? null, 'field' => $field]) 4 | @includeWhen(!isset($field['wrapper']) || $field['wrapper'] !== false, 'crud::fields.inc.wrapper_end') 5 | -------------------------------------------------------------------------------- /src/resources/views/crud/inc/button_stack.blade.php: -------------------------------------------------------------------------------- 1 | @if ($crud->buttons()->where('stack', $stack)->count()) 2 | @foreach ($crud->buttons()->where('stack', $stack) as $button) 3 | {!! $button->getHtml($entry ?? null) !!} 4 | @endforeach 5 | @endif 6 | -------------------------------------------------------------------------------- /src/resources/views/crud/inc/grouped_errors.blade.php: -------------------------------------------------------------------------------- 1 | {{-- Show the errors, if any --}} 2 | @if ($crud->groupedErrorsEnabled() && session()->get('errors')) 3 |
4 | 13 |
14 | @endif -------------------------------------------------------------------------------- /src/resources/views/crud/inc/show_fields.blade.php: -------------------------------------------------------------------------------- 1 | {{-- Show the inputs --}} 2 | @foreach ($fields as $field) 3 | @include($crud->getFirstFieldView($field['type'], $field['view_namespace'] ?? false), $field) 4 | @endforeach 5 | 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/components/menu-dropdown-header.blade.php: -------------------------------------------------------------------------------- 1 |
merge(['class' => 'dropdown-header']) }}> 2 | @if ($icon != null)@endif 3 | @if ($title!=null) {{ $title }}@endif 4 |
5 | -------------------------------------------------------------------------------- /src/resources/views/ui/components/menu-dropdown-item.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'dropdown-item', 'href' => $link]) }}> 2 | @if ($icon != null)@endif 3 | @if ($title!=null) {{ $title }}@endif 4 | 5 | -------------------------------------------------------------------------------- /src/resources/views/ui/components/menu-dropdown.blade.php: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/resources/views/ui/components/menu-item.blade.php: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /src/resources/views/ui/components/menu-separator.blade.php: -------------------------------------------------------------------------------- 1 |
  • merge(['class' => 'nav-separator']) }}>{{ $title }}
  • 2 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/400.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 400; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/401.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 401; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/403.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 403; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/404.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 404; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/405.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 405; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/408.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 408; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/429.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.4xx')) 2 | 3 | @php 4 | $error_number = 429; 5 | @endphp 6 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/4xx.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.layout')) 2 | 3 | @php 4 | $error_number ??= 400; 5 | $shouldEscape = ! in_array('developer-error-exception', $exception->getHeaders()); 6 | @endphp 7 | 8 | @section('title') 9 | {{ trans('backpack::base.error_page.'.$error_number) }} 10 | @endsection 11 | 12 | @section('description') 13 | {!! $exception?->getMessage() && config('app.debug') ? ($shouldEscape ? e($exception->getMessage()) : $exception->getMessage()) : trans('backpack::base.error_page.message_4xx', [ 14 | 'href_back' => 'href="javascript:history.back()"', 15 | 'href_homepage' => 'href="'.url('').'"', 16 | ]) !!} 17 | @endsection 18 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/500.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.layout')) 2 | 3 | @php 4 | $error_number = 500; 5 | $shouldEscape = ! in_array('developer-error-exception', $exception->getHeaders()); 6 | @endphp 7 | 8 | @section('title') 9 | {{ trans('backpack::base.error_page.500') }} 10 | @endsection 11 | 12 | @section('description') 13 | {!! $exception?->getMessage() && config('app.debug') ? ($shouldEscape ? e($exception->getMessage()) : $exception->getMessage()) : trans('backpack::base.error_page.message_500') !!} 14 | @endsection 15 | -------------------------------------------------------------------------------- /src/resources/views/ui/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | @extends(backpack_view('errors.layout')) 2 | 3 | @php 4 | $error_number = 503; 5 | $shouldEscape = ! in_array('developer-error-exception', $exception->getHeaders()); 6 | @endphp 7 | 8 | @section('title') 9 | {{ trans('backpack::base.error_page.503') }} 10 | @endsection 11 | 12 | @section('description') 13 | {!! $exception?->getMessage() && config('app.debug') ? ($shouldEscape ? e($exception->getMessage()) : $exception->getMessage()) : trans('backpack::base.error_page.message_503') !!} 14 | @endsection 15 | -------------------------------------------------------------------------------- /src/resources/views/ui/inc/menu_items.blade.php: -------------------------------------------------------------------------------- 1 | {{-- This file is used for menu items by any Backpack v6 theme --}} 2 | 3 | -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/card.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | // preserve backwards compatibility with Widgets in Backpack 4.0 3 | $widget['wrapper']['class'] = $widget['wrapper']['class'] ?? $widget['wrapperClass'] ?? 'col-sm-6 col-md-4'; 4 | @endphp 5 | 6 | @includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start')) 7 |
    8 | @if (isset($widget['content'])) 9 | @if (isset($widget['content']['header'])) 10 |
    {!! $widget['content']['header'] !!}
    11 | @endif 12 |
    {!! $widget['content']['body'] !!}
    13 | @endif 14 |
    15 | @includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end')) -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/div.blade.php: -------------------------------------------------------------------------------- 1 | @includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start')) 2 | 3 |
    2) 5 | @foreach ($widget as $attribute => $value) 6 | @if (is_string($attribute) && $attribute!='content' && $attribute!='type') 7 | {{ $attribute }}="{{ $value }}" 8 | @endif 9 | @endforeach 10 | @endif 11 | > 12 | 13 | @if (isset($widget['content'])) 14 | @include(backpack_view('inc.widgets'), [ 'widgets' => $widget['content'] ]) 15 | @endif 16 | 17 |
    18 | 19 | @includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end')) 20 | -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/inc/wrapper_end.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/inc/wrapper_start.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $widget['wrapper']['element'] = $widget['wrapper']['element'] ?? 'div'; 3 | $widget['wrapper']['class'] = $widget['wrapper']['class'] ?? "col-sm-6 col-md-4"; 4 | 5 | // each wrapper attribute can be a callback or a string 6 | // for those that are callbacks, run the callbacks to get the final string to use 7 | foreach($widget['wrapper'] as $attribute => $value) { 8 | $widget['wrapper'][$attribute] = (!is_string($value) && is_callable($value) ? $value() : $value) ?? ''; 9 | } 10 | @endphp 11 | 12 | <{{ $widget['wrapper']['element'] ?? 'div' }} 13 | @foreach(Arr::where($widget['wrapper'],function($value, $key) { return $key != 'element'; }) as $element => $value) 14 | {{$element}}="{{$value}}" 15 | @endforeach 16 | > -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/script.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $src = $widget['src'] ?? $widget['content'] ?? $widget['path']; 3 | $attributes = collect($widget)->except(['name', 'section', 'type', 'stack', 'src', 'content', 'path'])->toArray(); 4 | @endphp 5 | 6 | @push($widget['stack'] ?? 'after_scripts') 7 | @basset($src, true, $attributes) 8 | @endpush 9 | -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/style.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $widget['rel'] = $widget['rel'] ?? 'stylesheet'; 3 | 4 | $href = asset($widget['href'] ?? $widget['content'] ?? $widget['path']); 5 | $attributes = collect($widget)->except(['name', 'section', 'type', 'stack', 'href', 'content', 'path'])->toArray(); 6 | @endphp 7 | 8 | @push($widget['stack'] ?? 'after_styles') 9 | @basset($href, true, $attributes, 'style') 10 | @endpush 11 | -------------------------------------------------------------------------------- /src/resources/views/ui/widgets/view.blade.php: -------------------------------------------------------------------------------- 1 | {{-- view field --}} 2 | @includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start')) 3 | 4 | @include($widget['view'], ['widget' => $widget]) 5 | 6 | @includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end')) -------------------------------------------------------------------------------- /src/routes/backpack/testing.php: -------------------------------------------------------------------------------- 1 | config('backpack.base.route_prefix', 'admin'), 17 | ], 18 | function () { 19 | Route::crud('users', 'Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController'); 20 | } 21 | ); 22 | -------------------------------------------------------------------------------- /tests/Unit/CrudPanel/CrudPanelAutofocusTest.php: -------------------------------------------------------------------------------- 1 | crudPanel->setOperation('create'); 15 | $this->crudPanel->enableAutoFocus(); 16 | $this->assertTrue($this->crudPanel->getAutoFocusOnFirstField()); 17 | $this->crudPanel->disableAutofocus(); 18 | $this->assertFalse($this->crudPanel->getAutoFocusOnFirstField()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/config/CrudPanel/NoSqlDriverCrudPanel.php: -------------------------------------------------------------------------------- 1 | \Illuminate\Support\Facades\App::class, 13 | '\Request' => \Illuminate\Support\Facades\Request::class, 14 | ]; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tests/config/Http/Requests/UserRequest.php: -------------------------------------------------------------------------------- 1 | 'required', 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /tests/config/Models/Address.php: -------------------------------------------------------------------------------- 1 | belongsTo('Backpack\CRUD\Tests\config\Models\AccountDetails', 'account_details_id'); 21 | } 22 | 23 | public function bang() 24 | { 25 | return $this->belongsTo('Backpack\CRUD\Tests\config\Models\Bang', 'city'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/config/Models/ColumnType.php: -------------------------------------------------------------------------------- 1 | 'red', 14 | StyleEnum::PUBLISHED => 'green', 15 | }; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/config/Models/ModelWithoutCrudTrait.php: -------------------------------------------------------------------------------- 1 | belongsToMany('Backpack\CRUD\Tests\config\Models\User', 'user_role'); 21 | } 22 | 23 | public function getRoleNameAttribute() 24 | { 25 | return $this->name.'++'; 26 | } 27 | 28 | public function identifiableAttribute() 29 | { 30 | return 'name'; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /tests/config/Models/SuperArticlePivot.php: -------------------------------------------------------------------------------- 1 | null]; 15 | } 16 | 17 | public function isTranslatableAttribute(string $attribute) 18 | { 19 | return true; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/config/Models/TranslatableModel.php: -------------------------------------------------------------------------------- 1 | bang(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tests/config/Models/UserWithTranslations.php: -------------------------------------------------------------------------------- 1 | insert([ 18 | [ 19 | 'id' => 1, 20 | 'name' => 'admin', 21 | ], [ 22 | 'id' => 2, 23 | 'name' => 'user', 24 | ], 25 | ]); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/config/views/buttons/test.blade.php: -------------------------------------------------------------------------------- 1 | Test -------------------------------------------------------------------------------- /tests/config/views/fields/custom_namespace/test.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/tests/config/views/fields/custom_namespace/test.blade.php -------------------------------------------------------------------------------- /tests/config/views/fields/test.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laravel-Backpack/CRUD/e8ff80c21bc03b8b9e6163c0434285fc44ad8de4/tests/config/views/fields/test.blade.php --------------------------------------------------------------------------------