{"id":15944682,"url":"https://github.com/zofe/rapyd-admin","last_synced_at":"2025-05-07T05:47:36.982Z","repository":{"id":232845418,"uuid":"773079480","full_name":"zofe/rapyd-admin","owner":"zofe","description":"rapid laravel components, modules, application boilerplate","archived":false,"fork":false,"pushed_at":"2025-03-29T10:50:50.000Z","size":12842,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-03T12:36:48.352Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zofe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"zofe"}},"created_at":"2024-03-16T17:30:20.000Z","updated_at":"2025-03-01T08:41:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"e3e9fc0a-f00d-488e-8ecb-410c20c7b0c5","html_url":"https://github.com/zofe/rapyd-admin","commit_stats":null,"previous_names":["zofe/rapyd"],"tags_count":83,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-admin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-admin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-admin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-admin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zofe","download_url":"https://codeload.github.com/zofe/rapyd-admin/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252823685,"owners_count":21809707,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-07T08:41:45.837Z","updated_at":"2025-05-07T05:47:36.959Z","avatar_url":"https://github.com/zofe.png","language":"CSS","readme":"# Rapyd Admin: Simplifying Laravel Development\n\n\u003ca href=\"https://github.com/zofe/rapyd-admin/actions/workflows/run-tests.yml\"\u003e\u003cimg src=\"https://github.com/zofe/rapyd-admin/actions/workflows/run-tests.yml/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/zofe/rapyd-admin\"\u003e\u003cimg src=\"https://img.shields.io/packagist/dt/zofe/rapyd-admin\" alt=\"Total Downloads\"\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/zofe/rapyd-admin\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/zofe/rapyd-admin\" alt=\"Latest Stable Version\"\u003e\u003c/a\u003e\n\n[![rapyd.dev](screencast.gif)](https://rapyd.dev/demo)\n\n\n## Installation\n\nCreate new laravel app then install rapyd-admin package.\n\n(answer “y” to the question about writes \"allow-plugins\" to composer.json)\n\n```bash\ncomposer create-project --prefer-dist laravel/laravel myapp \n\ncd myapp\ncomposer require zofe/rapyd-admin\n```\n\nThen you can customize roles \u0026 permissions in app/Modules/Auth/permissions.php then run\n\n```bash\nphp artisan rpd:make:setup\n\n#then you can serve the app with\nphp artisan serve\n```\n\nNow you can login with a default admin user:\n```\nadmin@laravel\nadmin\n```\n\n---\n\n## Rapyd Admin\n\n\nRapyd Admin enhances Laravel by offering essential admin features with modular approach:\n\n- **BALL Stack Environment:** Bundles Bootstrap CSS, Alpine.js, Laravel, and Livewire for a quick boilerplate.\n\n- **Layout Module:** Classic sidebar/navbar design based on SBAdmin 3, updated to Bootstrap 5.3 with customizable SCSS and a variety of blade anonymous components for standardized, extendable frontends.\n\n- **Auth Module:** Robust authentication with socialite integration, Fortify, 2FA, and role/permission management.\n\n- **Custom Modules:** Structured handling of components and modules, REST API endpoints, and more, with an emphasis on reusable, encapsulated code for cleaner organization and maintainability.\n\n\n\n## Generators\n\nRapyd has some commands to generate models, components, modules (bundled components \u0026 views isolated in a folder) via artisan command line:\n\n\n### Models\n\ngenerate a model (via command line)\n```bash\nphp artisan rpd:make:model {ModelName} \n\n# example\nphp artisan rpd:make:model Article\n```\n\n### Livewire components \n```bash\nphp artisan rpd:make {ComponentName} {Model}\n\n# example\nphp artisan rpd:make UserTable User\n```\n\nwill generate \n\n```\nlaravel/\n├─ app/\n│  ├─ Livewire/\n│  │  ├─ UserTable.php\n│  resources/\n│  │  ├─ views/\n│  │  │  ├─livewire/\n│  │  │  │  ├─ user_table.php\n```\n\n\n## Modules \u0026 Generators\n\nexample of out of the box module structure you can use after installing rapyd-admin.\n\n```bash\nphp artisan rpd:make {ComponentsName} {Model} --module={module}\n\n# example\nphp artisan rpd:make Articles Article --module=Blog\n```\n- Will create `Blog` folder in you app/Modules directory.\n- Three livewire components in the `Livewire` subfolder (ArticlesEdit, ArticlesTable, ArticlesView)\n- Three blade components in the `Views` subfolder (articles_edit, articles_table, articles_view)\n- Inside your Module folder you can reply (if needed) the laravel application folder structure (controllers, migrations, jobs, etc..)\n\n\n```\nlaravel/\n├─ app/\n│  ├─ Modules/\n│  │  ├─ Blog/\n│  │  │  ├─ Livewire/\n│  │  │  │  ├─ ArticlesEdit.php\n│  │  │  │  ├─ ArticlesTable.php\n│  │  │  │  ├─ ArticlesView.php\n│  │  │  ├─ Views/\n│  │  │  │  ├─ articles_edit.blade.php\n│  │  │  │  ├─ articles_table.blade.php\n│  │  │  │  ├─ articles_view.blade.php\n│  │  │  ├─ routes.php\n```\n\n\n---\n\n## Blade views and Components\n\n\n### Table\n\nA Table is a \"listing component\" with these features:\n- \"input filters\" to search in a custom data set \n- \"buttons\" (for example \"add\" record or \"reset\" filters)\n- \"pagination links\"\n- \"sort links\" \n\nyou can generate a Table component with:\n```bash\nphp artisan rpd:make ArticlesTable Article\n```\n\nor and entire crud (Table/View/Edit) in a module named Blog with;\n```bash\nphp artisan rpd:make Articles Article --module=Blog\n```\n\nGenerated \u0026 Customized view can be something like:\n\n```bash\n# articles_view.blade.php\n```html\n\u003cx-rpd::table\n    title=\"Article List\"\n    :items=\"$items\"\n\u003e\n\n    \u003cx-slot name=\"filters\"\u003e\n      \u003cx-rpd::input col=\"col-8\" debounce=\"350\" model=\"search\"  placeholder=\"search...\" /\u003e\n      \u003cx-rpd::select col=\"col-4\" model=\"author_id\" :options=\"$authors\" placeholder=\"author...\" addempty /\u003e\n    \u003c/x-slot\u003e\n\n    \u003ctable class=\"table\"\u003e\n        \u003cthead\u003e\n        \u003ctr\u003e\n            \u003cth\u003e\n                \u003cx-rpd::sort model=\"id\" label=\"id\" /\u003e\n            \u003c/th\u003e\n            \u003cth\u003etitle\u003c/th\u003e\n            \u003cth\u003eauthor\u003c/th\u003e\n            \u003cth\u003ebody\u003c/th\u003e\n        \u003c/tr\u003e\n        \u003c/thead\u003e\n        \u003ctbody\u003e\n        @foreach ($items as $article)\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"{{ route('articles.view',$article-\u003eid) }}\"\u003e{{ $article-\u003eid }}\u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e{{ $article-\u003etitle }}\u003c/td\u003e\n            \u003ctd\u003e{{ $article-\u003eauthor-\u003efirstname }}\u003c/td\u003e\n            \u003ctd\u003e{{ Str::limit($article-\u003ebody,50) }}\u003c/td\u003e\n        \u003c/tr\u003e\n        @endforeach\n        \u003c/tbody\u003e\n    \u003c/table\u003e\n\n\u003c/x-rpd::table\u003e\n```\n\nprops\n- `title`: the heading title for this crud\n\ncontent/slots\n- should be a html table that loops model $items\n- `buttons`: buttons panel\n\nexample: [rapyd.dev/demo/articles](https://rapyd.dev/demo/articles)\n\n\n---\n### View\na View is a \"detail page component\" with :  \n\n- \"buttons\" slot (for example back to \"list\" or \"edit\" current record)\n- \"actions\" any link that trigger a server-side  \n\n```html\n    \u003cx-rpd::view title=\"Article Detail\"\u003e\n\n        \u003cx-slot name=\"buttons\"\u003e\n            \u003ca href=\"{{ route('articles') }}\" class=\"btn btn-outline-primary\"\u003elist\u003c/a\u003e\n            \u003ca href=\"{{ route('articles.edit',$model-\u003egetKey()) }}\" class=\"btn btn-outline-primary\"\u003eedit\u003c/a\u003e\n        \u003c/x-slot\u003e\n\n        \u003cdiv\u003eTitle: {{ $article-\u003etitle }}\u003c/div\u003e\n        \u003cdiv\u003eAuthor: {{ $article-\u003eauthor-\u003efirstname }} {{ $model-\u003eauthor-\u003elastname }}\u003c/div\u003e\n        \u003cdiv\u003e\u003ca wire:click.prevent=\"someAction\"\u003eDownload TXT version\u003c/a\u003e\u003c/div\u003e\n          \n    \u003c/x-rpd::view\u003e\n```\n\nprops\n- `title`: the heading title for this crud\n\ncontent/slots\n- should be a detail of $model\n- `buttons`: buttons panel\n- `actions`: buttons panel\n\nexample: [rapyd.dev/demo/article/view/1](https://rapyd.dev/demo/article/view/1)\n\n\n---\n### Edit\nEdit is a \"form component\" usually binded to a model with:  \n\n- \"buttons\" and \"actions\" (undo, save, etc..)\n- form \"fields\"\n- automatic errors massages / rules management\n\n\n```html\n    \u003cx-rpd::edit title=\"Article Edit\"\u003e\n\n       \u003cx-rpd::input model=\"article.title\" label=\"Title\" /\u003e\n       \u003cx-rpd::rich-text model=\"article.body\" label=\"Body\" /\u003e\n\n    \u003c/x-rpd::edit\u003e\n```\n\nprops\n- `title`: the heading title for this crud\n\ncontent/slots\n- form fields binded with public/model properties\n\nexample: [rapyd.dev/demo/article/edit/1](https://rapyd.dev/demo/article/edit/1)\n\n\n---\n\n\n### Fields \n\ninside some widget views you can drastically semplify the syntax using \npredefined blade components that interacts with livewire\n\n```html\n\u003cx-rpd::input model=\"search\" debounce=\"350\" placeholder=\"search...\" /\u003e\n```\n\n```html\n\u003cx-rpd::select model=\"author_id\" lazy :options=\"$authors\" /\u003e\n```\n\n```html\n\u003c!-- tom select dropdown --\u003e\n\u003cx-rpd::select-list model=\"roles\" multiple :options=\"$available_roles\" label=\"Roles\" /\u003e\nor\n\u003cx-rpd::select-list model=\"roles\" multiple endpoint=\"/ajax/roles\" label=\"Roles\" /\u003e\n```\n\n```html\n\u003c!-- date, datetime and date-range components --\u003e\n\u003cx-rpd::date-time model=\"date_time\" format=\"dd/MM/yyyy HH:mm:ss\" value-format=\"yyyy-MM-dd HH:mm:ss\" label=\"DateTime\" /\u003e\n\n\u003cx-rpd::date model=\"date\" format=\"dd/MM/yyyy\" value-format=\"yyyy-MM-dd\" label=\"Date\" /\u003e\n\n\u003cx-rpd::date-range\n    model_from=\"date_from\"\n    model_to=\"date_to\"\n    range-separator=\"-\"\n    start-placeholder=\"from\"\n    end-placeholder=\"to\"\n    type=\"daterange\"\n    format=\"dd/MM/yyyy\"\n    value-format=\"yyyy-MM-dd\"\n/\u003e\n```\n\n```html\n\u003cx-rpd::textarea model=\"body\" label=\"Body\" rows=\"5\" :help=\"__('the article summary')\"/\u003e\n```\n\n```html\n\u003c!-- quill wysiwyg editor --\u003e\n\u003cx-rpd::rich-text model=\"body\" label=\"Body\" /\u003e\n```\n\n\nprops\n\n- `label`: label to display above the input\n- `placeholder`: placeholder to use for the empty first option\n- `model`: Livewire model property key\n- `options`: array of options e.g. (used in selects)\n- `debounce`: Livewire time in ms to bind data on keyup\n- `lazy`: Livewire bind data only on change\n- `prepend`: addon to display before input, can be used via named slot\n- `append`: addon to display after input, can be used via named slot\n- `help`: helper label to display under the input\n- `icon`: Font Awesome icon to show before input e.g. `cog`, `envelope`\n- `size`: Bootstrap input size e.g. `sm`, `lg`\n- `rows`: rows nums\n- `multiple`: allow multiple option selection (used in select-list)\n- `endpoint`: a remote url for fetch optioms (used in select-list)\n- `format`: the client-side field format (used in date and date-time)\n- `value-format`: the server-side field value format (used in date and date-time)\n\n\n## special tags\n\n```html\n\u003c!-- sort ascending/descending link actions (in a datatable view context)--\u003e\n\u003cx-rpd::sort model=\"id\" label=\"id\" /\u003e\n```\n## navigation\n\nNav Tabs: bootstrap nav-link menu with self-determined active link\n\n```html\n\u003cul class=\"nav nav-tabs\"\u003e\n    \u003cx-rpd::nav-link label=\"Home\" route=\"home\" /\u003e\n    \u003cx-rpd::nav-link label=\"Articles\" route=\"articles\" /\u003e\n    \u003cx-rpd::nav-link label=\"Article Detail\" route=\"articles.view\" :params=\"1\"/\u003e\n    \u003cx-rpd::nav-link label=\"Article edit\" route=\"articles.edit\" /\u003e\n\u003c/ul\u003e\n```\n\nNav Items: boostrap vertical menu items / single or grouped (collapsed)\n\n```html\n\u003cx-rpd::nav-dropdown icon=\"fas fa-fw fa-book\" label=\"KnowledgeBase\" active=\"/kb\"\u003e\n    \u003cx-rpd::nav-link label=\"Edit Categories\" route=\"kb.admin.categories.table\" type=\"collapse-item\" /\u003e\n    \u003cx-rpd::nav-link label=\"Edit Articles\" route=\"kb.admin.articles.table\" type=\"collapse-item\" /\u003e\n\u003c/x-rpd::nav-dropdown\u003e\n```\n\n\nNav Sidebar: bootstrap sidebar with self-determined or segment-based active link\n```html\n\u003cx-rpd::sidebar title=\"Rapyd.dev\" class=\"p-3 text-white border-end\"\u003e\n   \u003cx-rpd::nav-item label=\"Demo\" route=\"demo\" active=\"/rapyd-demo\" /\u003e\n   \u003cx-rpd::nav-item label=\"Page\" route=\"page\"  /\u003e\n\u003c/x-rpd::sidebar\u003e\n```\n\n\n\n\n\n## Credits\n\n- [Felice Ostuni](https://github.com/zofe)\n- [All Contributors](../../contributors)\n\n\nInspirations:\n\n- [rapyd-laravel](https://github.com/zofe/rapyd-laravel) my old laravel library (150k downloads)\n- [livewire](https://livewire.laravel.com/)  widely used \"full-stack framework\" to compose laravel application by widgets\n- [laravel-bootstrap-components](https://github.com/bastinald/laravel-bootstrap-components) smart library which reduced the complexity of this one\n\n\n\n## License \u0026 Contacts\n\nRapyd is licensed under the [MIT license](http://opensource.org/licenses/MIT)\n\nPlease join me and review my work on [Linkedin](https://www.linkedin.com/in/feliceostuni/)\n\nthanks\n\n\n\n","funding_links":["https://github.com/sponsors/zofe"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzofe%2Frapyd-admin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzofe%2Frapyd-admin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzofe%2Frapyd-admin/lists"}