@dskripchenko/laravel-admin 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +139 -0
- package/README.md +104 -195
- package/README.ru.md +135 -0
- package/README.zh.md +130 -0
- package/dist/components/dashboard/StatWidget.vue.d.ts +26 -0
- package/dist/components/fields/SelectField.vue.d.ts +6 -0
- package/dist/components/infolist/IconEntry.vue.d.ts +2 -3
- package/dist/components/infolist/RepeatableEntry.vue.d.ts +23 -0
- package/dist/components/layouts/ColumnsLayout.vue.d.ts +1 -1
- package/dist/components/render/FieldRenderer.vue.d.ts +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +23967 -4929
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.de.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# dskripchenko/laravel-admin
|
|
2
|
+
|
|
3
|
+
> 🌐 [English](README.md) · [Русский](README.ru.md) · **Deutsch** · [中文](README.zh.md)
|
|
4
|
+
|
|
5
|
+
Ein Laravel Admin-Panel-Konstruktor im Stil von Orchid mit einem Vue 3 SPA-Frontend.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@dskripchenko/laravel-admin)
|
|
8
|
+
[](https://packagist.org/packages/dskripchenko/laravel-admin)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
|
|
11
|
+
```php
|
|
12
|
+
Admin::resources([UserResource::class, ArticleResource::class]);
|
|
13
|
+
Admin::screen([ContactScreen::class, SystemStatusScreen::class]);
|
|
14
|
+
Admin::menu()->add(
|
|
15
|
+
MenuNode::make('content', 'Inhalte')->icon('book')->children([
|
|
16
|
+
MenuNode::resource('articles'),
|
|
17
|
+
MenuNode::dashboard('analytics'),
|
|
18
|
+
]),
|
|
19
|
+
);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Was ist enthalten
|
|
23
|
+
|
|
24
|
+
- **CRUD-Pipeline** — deklarieren Sie ein Eloquent-Modell als
|
|
25
|
+
`Resource` und erhalten Sie List/Create/Edit/View-Screens automatisch.
|
|
26
|
+
- **Custom Screens** — Nicht-CRUD-Seiten (Formulare, Berichte,
|
|
27
|
+
Dashboards) mit `Admin::screen()`. Verwaltet State, Layout,
|
|
28
|
+
Command-Bar, Validierung, Permissions.
|
|
29
|
+
- **Hierarchisches Menü** — fluentes API
|
|
30
|
+
`Admin::menu()->add(MenuNode::...)`, beliebige Tiefe, automatische
|
|
31
|
+
Auflösung von `resource()`/`screen()`/`dashboard()`.
|
|
32
|
+
- **30+ Feldtypen** — Input/Number/Select/Combobox/DatePicker/
|
|
33
|
+
ColorPicker/FileUpload/Wysiwyg/Markdown/TranslatableInput/Repeater/
|
|
34
|
+
RelationSelect/Cascader/TreeSelect/Slug/KeyValue/TagsInput/...
|
|
35
|
+
- **15+ Layouts** — Rows/Columns/Tabs/Wizard+Step/Block/Modal/Drawer/
|
|
36
|
+
Wrapper/Infolist/Dashboard/Accordion/View/...
|
|
37
|
+
- **Tabellen** — sortierbare Spalten, Presets, Filter, Inline-Edit,
|
|
38
|
+
Summary, Saved Views, Group-by, Polling, Export (CSV/XLSX/PDF).
|
|
39
|
+
- **Dashboard** — 8 Widget-Typen (Stats/Chart/RecentList/Markdown/
|
|
40
|
+
Iframe/Table/Heatmap/Gauge), benutzerspezifische Layout-Overrides,
|
|
41
|
+
Drag/Resize, Polling.
|
|
42
|
+
- **Auth & RBAC** — Multi-Guard, AdminUser, Roles, 2FA TOTP, Profile,
|
|
43
|
+
Impersonation, Password-Reset, E-Mail-Verifikation.
|
|
44
|
+
- **Audit** — Append-Only-Log von Admin-Aktionen
|
|
45
|
+
(`AuditLog` + `Loggable`-Trait).
|
|
46
|
+
- **Settings** — Singleton-Konfigurationsscreens.
|
|
47
|
+
- **Notifications** — Bell-Badge + Drawer (Database-Notifications).
|
|
48
|
+
- **API-Tokens** — Sanctum-Integration im Profil (optional).
|
|
49
|
+
- **Theming** — Light/Dark + Benutzerpräferenz, `@dskripchenko/ui`
|
|
50
|
+
Design-Tokens.
|
|
51
|
+
- **i18n** — Locale-Resolver (5-Stufen-Priorität),
|
|
52
|
+
`TranslatableField`-Bridge für
|
|
53
|
+
`dskripchenko/laravel-translatable`.
|
|
54
|
+
- **Mandantenfähigkeit** — `TenantResolver` / `TenantContext` /
|
|
55
|
+
`TenantScoped`-Trait. Strategie ist host-seitig; wir liefern den
|
|
56
|
+
Vertrag.
|
|
57
|
+
- **Plugins** — `AdminPlugin`-Interface; Sister-Packs nutzen denselben
|
|
58
|
+
Hook.
|
|
59
|
+
- **Testing** — `ResourceTestCase`, `ScreenTestCase`,
|
|
60
|
+
`ActsAsAdmin`-Trait.
|
|
61
|
+
- **OpenAPI 3.0** — generiert aus Docblock-Tags `@input`/`@output`.
|
|
62
|
+
|
|
63
|
+
## Installation
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
composer require dskripchenko/laravel-admin
|
|
67
|
+
php artisan vendor:publish --tag=admin-config
|
|
68
|
+
php artisan migrate
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```js
|
|
72
|
+
// resources/js/admin.js
|
|
73
|
+
import { createAdminApp } from '@dskripchenko/laravel-admin'
|
|
74
|
+
import '@dskripchenko/ui/styles/all.css'
|
|
75
|
+
import '@dskripchenko/laravel-admin/style.css'
|
|
76
|
+
|
|
77
|
+
const { app } = createAdminApp(window.__ADMIN_BOOTSTRAP__)
|
|
78
|
+
app.mount('#admin-app')
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm i @dskripchenko/laravel-admin @dskripchenko/ui
|
|
83
|
+
npm run build
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Öffnen Sie `/admin/login`. Siehe
|
|
87
|
+
[getting-started.md](docs/de/getting-started.md) für die erste Resource.
|
|
88
|
+
|
|
89
|
+
## Dokumentation
|
|
90
|
+
|
|
91
|
+
- [Erste Schritte](docs/de/getting-started.md)
|
|
92
|
+
- [Architektur](docs/de/architecture.md)
|
|
93
|
+
- Konzepte: [Resources](docs/de/concepts/resources.md) ·
|
|
94
|
+
[Screens](docs/de/concepts/screens.md) ·
|
|
95
|
+
[Widgets & Dashboards](docs/de/concepts/widgets-and-dashboards.md) ·
|
|
96
|
+
[Menü](docs/de/concepts/menu.md) ·
|
|
97
|
+
[Actions](docs/en/concepts/actions.md) (en) ·
|
|
98
|
+
[Permissions](docs/en/concepts/permissions.md) (en) ·
|
|
99
|
+
[i18n](docs/en/concepts/i18n.md) (en) ·
|
|
100
|
+
[Mandanten](docs/en/concepts/tenancy.md) (en)
|
|
101
|
+
- [Felder-Referenz](docs/en/fields-reference.md) (en)
|
|
102
|
+
- [Layouts-Referenz](docs/en/layouts-reference.md) (en)
|
|
103
|
+
- [API-Referenz](docs/en/api-reference.md) (en)
|
|
104
|
+
- [Frontend-Erweiterung](docs/en/frontend-extension.md) (en)
|
|
105
|
+
- [Testen](docs/en/testing.md) (en)
|
|
106
|
+
- [Migration Guide](docs/en/migration-guide.md) (en)
|
|
107
|
+
- [Glossar](docs/de/glossary.md)
|
|
108
|
+
|
|
109
|
+
## Stack
|
|
110
|
+
|
|
111
|
+
- **PHP** ^8.5
|
|
112
|
+
- **Laravel** ^12
|
|
113
|
+
- **Vue** ^3.4 + TypeScript + Pinia + Vue Router
|
|
114
|
+
- **Bundle** — `@dskripchenko/laravel-admin` ~62 KB gz (esm + cjs)
|
|
115
|
+
- **Kein Vendor-Lock-In** für Editor/Charts — bringen Sie Ihre eigenen
|
|
116
|
+
(Sister-Pack-Adapter: `quill`, `tinymce`)
|
|
117
|
+
|
|
118
|
+
## Sister-Packs
|
|
119
|
+
|
|
120
|
+
Optionale Erweiterungen, installieren Sie nur was Sie brauchen:
|
|
121
|
+
|
|
122
|
+
| Paket | Zweck |
|
|
123
|
+
|---|---|
|
|
124
|
+
| `dskripchenko/laravel-admin-starter` | User/Role/Audit/Settings/Translations/Blocks Resources |
|
|
125
|
+
| `dskripchenko/laravel-admin-tinymce` | TinyMCE WYSIWYG-Adapter |
|
|
126
|
+
| `dskripchenko/laravel-admin-quill` | Quill WYSIWYG-Adapter |
|
|
127
|
+
| `dskripchenko/laravel-admin-search` | ⌘K Command Palette + Scout Suggest |
|
|
128
|
+
| `dskripchenko/laravel-admin-media` | Medienbibliothek (ohne Spatie/medialibrary) |
|
|
129
|
+
| `dskripchenko/laravel-admin-health` | Health-Checks (ohne Spatie/laravel-health) |
|
|
130
|
+
| `dskripchenko/laravel-admin-pulse` | Telemetrie (ohne laravel/pulse) |
|
|
131
|
+
| `dskripchenko/laravel-admin-jobs` | Failed-Jobs / Batches Viewer |
|
|
132
|
+
|
|
133
|
+
## Mitwirken
|
|
134
|
+
|
|
135
|
+
Siehe [CONTRIBUTING.md](CONTRIBUTING.md). PRs willkommen.
|
|
136
|
+
|
|
137
|
+
## Lizenz
|
|
138
|
+
|
|
139
|
+
[MIT](LICENSE) © Denis Skripchenko
|
package/README.md
CHANGED
|
@@ -1,226 +1,135 @@
|
|
|
1
1
|
# dskripchenko/laravel-admin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 🌐 **English** · [Русский](README.ru.md) · [Deutsch](README.de.md) · [中文](README.zh.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A Laravel admin-panel constructor inspired by Orchid, with a Vue 3 SPA frontend.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
[](https://www.npmjs.com/package/@dskripchenko/laravel-admin)
|
|
8
|
+
[](https://packagist.org/packages/dskripchenko/laravel-admin)
|
|
9
|
+
[](LICENSE)
|
|
8
10
|
|
|
9
11
|
```php
|
|
10
|
-
class
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Field\Input::make('name')->required(),
|
|
19
|
-
Field\Input::make('email')->type('email')->required()->unique(),
|
|
20
|
-
Field\Switch::make('is_active'),
|
|
21
|
-
];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public function columns(): array
|
|
25
|
-
{
|
|
26
|
-
return [
|
|
27
|
-
TC::make('id')->sort(),
|
|
28
|
-
TC::make('name')->sort()->search(),
|
|
29
|
-
TC::make('email')->copyable(),
|
|
30
|
-
TC::make('is_active')->as('badge'),
|
|
31
|
-
];
|
|
32
|
-
}
|
|
33
|
-
}
|
|
12
|
+
Admin::resources([UserResource::class, ArticleResource::class]);
|
|
13
|
+
Admin::screen([ContactScreen::class, SystemStatusScreen::class]);
|
|
14
|
+
Admin::menu()->add(
|
|
15
|
+
MenuNode::make('content', 'Content')->icon('book')->children([
|
|
16
|
+
MenuNode::resource('articles'),
|
|
17
|
+
MenuNode::dashboard('analytics'),
|
|
18
|
+
]),
|
|
19
|
+
);
|
|
34
20
|
```
|
|
35
21
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
|
|
50
|
-
|
|
22
|
+
## What's inside
|
|
23
|
+
|
|
24
|
+
- **CRUD pipeline** — declare an Eloquent model as a `Resource`, get
|
|
25
|
+
list/create/edit/view screens for free.
|
|
26
|
+
- **Custom Screens** — non-CRUD pages (forms, dashboards, reports) with
|
|
27
|
+
`Admin::screen()`. Handles state, layout, command-bar, validation,
|
|
28
|
+
permissions.
|
|
29
|
+
- **Hierarchical menu** — fluent `Admin::menu()->add(MenuNode::...)`,
|
|
30
|
+
any depth, auto-resolve `resource()`/`screen()`/`dashboard()`.
|
|
31
|
+
- **30+ field types** — Input/Number/Select/Combobox/DatePicker/
|
|
32
|
+
ColorPicker/FileUpload/Wysiwyg/Markdown/TranslatableInput/Repeater/
|
|
33
|
+
RelationSelect/Cascader/TreeSelect/Slug/KeyValue/TagsInput/...
|
|
34
|
+
- **15+ layouts** — Rows/Columns/Tabs/Wizard+Step/Block/Modal/Drawer/
|
|
35
|
+
Wrapper/Infolist/Dashboard/Accordion/View/...
|
|
36
|
+
- **Tables** — sortable columns, presets, filters (input/date/switcher/
|
|
37
|
+
options/select-from-model), inline-edit, summary, saved views,
|
|
38
|
+
group-by, polling, exports (CSV/XLSX/PDF).
|
|
39
|
+
- **Dashboard** — 8 widget types (Stats/Chart/RecentList/Markdown/
|
|
40
|
+
Iframe/Table/Heatmap/Gauge), per-user layout overrides, drag/resize,
|
|
41
|
+
polling.
|
|
42
|
+
- **Auth & RBAC** — multi-guard, AdminUser, Roles, 2FA TOTP, profile,
|
|
43
|
+
impersonation, password reset, email verification.
|
|
44
|
+
- **Audit** — append-only log of admin actions (`AuditLog` + `Loggable`
|
|
45
|
+
trait).
|
|
46
|
+
- **Settings** — singleton-style configuration screens.
|
|
47
|
+
- **Notifications** — bell badge + drawer (Database notifications).
|
|
48
|
+
- **API tokens** — Sanctum integration in Profile (conditional).
|
|
49
|
+
- **Theming** — light/dark + per-user preference, `@dskripchenko/ui`
|
|
50
|
+
design tokens.
|
|
51
|
+
- **i18n** — locale resolver (5-step priority), `TranslatableField`
|
|
52
|
+
bridge for `dskripchenko/laravel-translatable`.
|
|
53
|
+
- **Tenancy** — `TenantResolver` / `TenantContext` / `TenantScoped`
|
|
54
|
+
trait. Strategy is host-side; we provide the contract.
|
|
55
|
+
- **Plugins** — `AdminPlugin` interface; sister-packs use the same hook.
|
|
56
|
+
- **Testing** — `ResourceTestCase`, `ScreenTestCase`, `ActsAsAdmin` trait.
|
|
57
|
+
- **OpenAPI 3.0** — generated from docblock `@input`/`@output` tags.
|
|
58
|
+
|
|
59
|
+
## Install
|
|
51
60
|
|
|
52
61
|
```bash
|
|
53
62
|
composer require dskripchenko/laravel-admin
|
|
54
|
-
php artisan admin
|
|
63
|
+
php artisan vendor:publish --tag=admin-config
|
|
55
64
|
php artisan migrate
|
|
56
|
-
php artisan admin:user "Admin" admin@example.com secret
|
|
57
|
-
npm install
|
|
58
|
-
npm run admin:build
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
После этого админка доступна на `/admin`.
|
|
62
|
-
|
|
63
|
-
## Frontend SPA (`@dskripchenko/laravel-admin` npm-пакет)
|
|
64
|
-
|
|
65
|
-
Для host-проектов которые хотят встроить SPA в свой Vite-bundle вместо Blade-shell'а либо построить кастомный admin-фронт поверх готовых блоков.
|
|
66
|
-
|
|
67
|
-
### Установка
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
npm install @dskripchenko/laravel-admin @dskripchenko/ui vue@^3.4 vue-router@^4.3 pinia axios
|
|
71
65
|
```
|
|
72
66
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// resources/admin-spa/main.ts
|
|
77
|
-
import { createApp } from 'vue'
|
|
78
|
-
import { createPinia } from 'pinia'
|
|
79
|
-
|
|
80
|
-
// (1) UI-кит: токены + темы + reset + global + Uid*-стили
|
|
67
|
+
```js
|
|
68
|
+
// resources/js/admin.js
|
|
69
|
+
import { createAdminApp } from '@dskripchenko/laravel-admin'
|
|
81
70
|
import '@dskripchenko/ui/styles/all.css'
|
|
82
|
-
// (2) admin-каркас (impersonation banner, polling-dot, page utilities)
|
|
83
71
|
import '@dskripchenko/laravel-admin/style.css'
|
|
84
72
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
setAdminClient,
|
|
88
|
-
loadBootstrap,
|
|
89
|
-
createAdminRouter,
|
|
90
|
-
registerBuiltinComponents,
|
|
91
|
-
registerBuiltinInfolistEntries,
|
|
92
|
-
registerBuiltinWidgets,
|
|
93
|
-
AdminShell,
|
|
94
|
-
ResourceIndexPage,
|
|
95
|
-
ResourceFormPage,
|
|
96
|
-
ResourceViewPage,
|
|
97
|
-
DashboardPage,
|
|
98
|
-
} from '@dskripchenko/laravel-admin'
|
|
99
|
-
|
|
100
|
-
// 1. HTTP-клиент с envelope/CSRF/error handling
|
|
101
|
-
const client = createAdminClient({
|
|
102
|
-
baseURL: '/api/admin',
|
|
103
|
-
onUnauthenticated: () => router.push({ name: 'admin.login' }),
|
|
104
|
-
})
|
|
105
|
-
setAdminClient(client)
|
|
106
|
-
|
|
107
|
-
// 2. Bootstrap (inline через <script> либо xhr через /system/bootstrap)
|
|
108
|
-
const bootstrap = await loadBootstrap({ client })
|
|
109
|
-
|
|
110
|
-
// 3. Pinia + hydrate stores
|
|
111
|
-
const pinia = createPinia()
|
|
112
|
-
const app = createApp(AdminShell)
|
|
113
|
-
app.use(pinia)
|
|
114
|
-
|
|
115
|
-
// 4. Регистрация builtin-компонентов в JSON-renderer'ы
|
|
116
|
-
registerBuiltinComponents() // Field/Layout (text/textarea/number/select/...)
|
|
117
|
-
registerBuiltinInfolistEntries() // Read-only display (text/badge/icon/keyvalue)
|
|
118
|
-
registerBuiltinWidgets() // Dashboard widgets (stat/charts/heatmap/gauge)
|
|
119
|
-
|
|
120
|
-
// 5. Router с динамическими роутами из manifest'а
|
|
121
|
-
const router = createAdminRouter({
|
|
122
|
-
base: '/admin',
|
|
123
|
-
components: {
|
|
124
|
-
login: () => import('./pages/Login.vue'),
|
|
125
|
-
home: () => import('./pages/Home.vue'),
|
|
126
|
-
forbidden: () => import('./pages/403.vue'),
|
|
127
|
-
notFound: () => import('./pages/404.vue'),
|
|
128
|
-
resourceIndex: ResourceIndexPage,
|
|
129
|
-
resourceCreate: ResourceFormPage,
|
|
130
|
-
resourceEdit: ResourceFormPage,
|
|
131
|
-
screen: () => import('./pages/Screen.vue'),
|
|
132
|
-
settings: () => import('./pages/Settings.vue'),
|
|
133
|
-
dashboard: DashboardPage,
|
|
134
|
-
},
|
|
135
|
-
})
|
|
136
|
-
app.use(router)
|
|
137
|
-
app.mount('#admin')
|
|
73
|
+
const { app } = createAdminApp(window.__ADMIN_BOOTSTRAP__)
|
|
74
|
+
app.mount('#admin-app')
|
|
138
75
|
```
|
|
139
76
|
|
|
140
|
-
### Готовые компоненты-страницы
|
|
141
|
-
|
|
142
|
-
- `LoginPage` + `LoginForm` + `TwoFactorForm` — auth + TOTP/recovery
|
|
143
|
-
- `ResourceIndexPage` — список с filter-bar / bulk toolbar / pagination
|
|
144
|
-
- `ResourceFormPage` — create/edit unified с sticky save-bar
|
|
145
|
-
- `ResourceViewPage` — read-only display через Infolist
|
|
146
|
-
- `DashboardPage` — 12-col widget grid
|
|
147
|
-
- `ProfilePage` — sidebar nav + cards
|
|
148
|
-
- `ImportWizardPage` — 4-step wizard
|
|
149
|
-
- `NotificationsDrawer` — UidDrawer right с tabs
|
|
150
|
-
- `FieldGalleryPage` — каталог field-типов (docs/playground)
|
|
151
|
-
|
|
152
|
-
### Расширение через registry
|
|
153
|
-
|
|
154
|
-
```ts
|
|
155
|
-
import { registerField, registerWidget, registerInfolistEntry } from '@dskripchenko/laravel-admin'
|
|
156
|
-
import MyCustomField from './fields/MyCustomField.vue'
|
|
157
|
-
|
|
158
|
-
registerField('my-custom', MyCustomField)
|
|
159
|
-
// теперь manifest узел { type: 'my-custom', name: 'x', ... } рендерится через MyCustomField
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Шрифты (опционально)
|
|
163
|
-
|
|
164
|
-
UID design system предполагает Inter Variable + Inter Display. Library не bundle'ит шрифты в style.css (Vite lib-mode инлайнит base64 → 1.4 MB). Варианты:
|
|
165
|
-
|
|
166
|
-
- `npm i @fontsource-variable/inter @fontsource/inter-display` + `import` (рекомендуется)
|
|
167
|
-
- Google Fonts CDN
|
|
168
|
-
- Self-hosted — копировать `node_modules/@dskripchenko/laravel-admin/resources/fonts/*.woff2` в `public/fonts/` + подключить `fonts.css`
|
|
169
|
-
|
|
170
|
-
### Скрипты разработки
|
|
171
|
-
|
|
172
77
|
```bash
|
|
173
|
-
npm
|
|
174
|
-
npm run
|
|
175
|
-
npm test # vitest (jsdom)
|
|
176
|
-
npm run build # vite build + vue-tsc --emitDeclarationOnly
|
|
177
|
-
npm run build:analyze # с rollup-plugin-visualizer → dist/stats.html
|
|
178
|
-
npm run size # size-limit budgets (ESM/CJS gzipped + CSS)
|
|
179
|
-
npm run preflight # lint + typecheck + test + build (CI gate)
|
|
78
|
+
npm i @dskripchenko/laravel-admin @dskripchenko/ui
|
|
79
|
+
npm run build
|
|
180
80
|
```
|
|
181
81
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
82
|
+
Visit `/admin/login`. See [getting-started.md](docs/en/getting-started.md)
|
|
83
|
+
for the first resource.
|
|
84
|
+
|
|
85
|
+
## Documentation
|
|
86
|
+
|
|
87
|
+
- [Getting started](docs/en/getting-started.md)
|
|
88
|
+
- [Architecture](docs/en/architecture.md)
|
|
89
|
+
- Concepts: [Resources](docs/en/concepts/resources.md) ·
|
|
90
|
+
[Screens](docs/en/concepts/screens.md) ·
|
|
91
|
+
[Widgets & Dashboards](docs/en/concepts/widgets-and-dashboards.md) ·
|
|
92
|
+
[Menu](docs/en/concepts/menu.md) ·
|
|
93
|
+
[Actions](docs/en/concepts/actions.md) ·
|
|
94
|
+
[Permissions](docs/en/concepts/permissions.md) ·
|
|
95
|
+
[i18n](docs/en/concepts/i18n.md) ·
|
|
96
|
+
[Tenancy](docs/en/concepts/tenancy.md)
|
|
97
|
+
- [Fields reference](docs/en/fields-reference.md)
|
|
98
|
+
- [Layouts reference](docs/en/layouts-reference.md)
|
|
99
|
+
- [API reference](docs/en/api-reference.md)
|
|
100
|
+
- [Frontend extension](docs/en/frontend-extension.md)
|
|
101
|
+
- [Testing](docs/en/testing.md)
|
|
102
|
+
- [Migration guide](docs/en/migration-guide.md)
|
|
103
|
+
- [Glossary](docs/en/glossary.md)
|
|
104
|
+
|
|
105
|
+
## Stack
|
|
106
|
+
|
|
107
|
+
- **PHP** ^8.5
|
|
108
|
+
- **Laravel** ^12
|
|
109
|
+
- **Vue** ^3.4 + TypeScript + Pinia + Vue Router
|
|
110
|
+
- **Bundle** — `@dskripchenko/laravel-admin` ~62 KB gz (esm + cjs)
|
|
111
|
+
- **No vendor lock-in** for editor/charts — bring your own
|
|
112
|
+
(sister-pack adapters: `quill`, `tinymce`)
|
|
187
113
|
|
|
188
114
|
## Sister-packs
|
|
189
115
|
|
|
190
|
-
|
|
191
|
-
|---|---|
|
|
192
|
-
| `dskripchenko/laravel-admin-starter` | Готовые системные Resource'ы |
|
|
193
|
-
| `dskripchenko/laravel-admin-tinymce` / `*-quill` | Альтернативные WYSIWYG |
|
|
194
|
-
| `dskripchenko/laravel-admin-search` | Глобальный поиск |
|
|
195
|
-
| `dskripchenko/laravel-admin-media` | Медиа-библиотека |
|
|
196
|
-
| `dskripchenko/laravel-admin-health` | Health-checks |
|
|
197
|
-
| `dskripchenko/laravel-admin-pulse` | Лёгкая телеметрия |
|
|
198
|
-
| `dskripchenko/laravel-admin-jobs` | Failed jobs viewer |
|
|
199
|
-
|
|
200
|
-
## Структура репозитория (dev)
|
|
116
|
+
Optional extensions, install only what you need:
|
|
201
117
|
|
|
202
|
-
|
|
118
|
+
| Package | Purpose |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `dskripchenko/laravel-admin-starter` | User/Role/Audit/Settings/Translations/Blocks resources |
|
|
121
|
+
| `dskripchenko/laravel-admin-tinymce` | TinyMCE WYSIWYG adapter |
|
|
122
|
+
| `dskripchenko/laravel-admin-quill` | Quill WYSIWYG adapter |
|
|
123
|
+
| `dskripchenko/laravel-admin-search` | ⌘K command palette + Scout suggest |
|
|
124
|
+
| `dskripchenko/laravel-admin-media` | Media library (no Spatie/medialibrary dependency) |
|
|
125
|
+
| `dskripchenko/laravel-admin-health` | Health checks (no Spatie/laravel-health dependency) |
|
|
126
|
+
| `dskripchenko/laravel-admin-pulse` | Telemetry sampler (no laravel/pulse dependency) |
|
|
127
|
+
| `dskripchenko/laravel-admin-jobs` | Failed jobs / batches viewer |
|
|
203
128
|
|
|
204
|
-
|
|
205
|
-
laravel-admin/
|
|
206
|
-
├── src/ # основной пакет dskripchenko/laravel-admin
|
|
207
|
-
├── resources/ts/ # SPA-бандл @dskripchenko/laravel-admin
|
|
208
|
-
├── packages/ # sister-packs, локально
|
|
209
|
-
│ ├── starter/
|
|
210
|
-
│ ├── tinymce/
|
|
211
|
-
│ ├── quill/
|
|
212
|
-
│ ├── search/
|
|
213
|
-
│ ├── media/
|
|
214
|
-
│ ├── health/
|
|
215
|
-
│ ├── pulse/
|
|
216
|
-
│ └── jobs/
|
|
217
|
-
└── docs/
|
|
218
|
-
```
|
|
129
|
+
## Contributing
|
|
219
130
|
|
|
220
|
-
|
|
221
|
-
- NPM: workspaces для `packages/tinymce` и `packages/quill` (только им нужны npm-зависимости). `npm install` из корня устанавливает зависимости всем сразу.
|
|
222
|
-
- **Перед первым стабильным релизом** sister-packs выносятся в отдельные репозитории на github.com/dskripchenko и публикуются на packagist/npm независимо. На этот момент `repositories` в корневом `composer.json` удаляются, sister-packs ставятся обычным `composer require`.
|
|
131
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). PRs welcome.
|
|
223
132
|
|
|
224
133
|
## License
|
|
225
134
|
|
|
226
|
-
MIT
|
|
135
|
+
[MIT](LICENSE) © Denis Skripchenko
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# dskripchenko/laravel-admin
|
|
2
|
+
|
|
3
|
+
> 🌐 [English](README.md) · **Русский** · [Deutsch](README.de.md) · [中文](README.zh.md)
|
|
4
|
+
|
|
5
|
+
Конструктор админ-панели для Laravel в духе Orchid — с собственным Vue 3 SPA-фронтендом.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@dskripchenko/laravel-admin)
|
|
8
|
+
[](https://packagist.org/packages/dskripchenko/laravel-admin)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
|
|
11
|
+
```php
|
|
12
|
+
Admin::resources([UserResource::class, ArticleResource::class]);
|
|
13
|
+
Admin::screen([ContactScreen::class, SystemStatusScreen::class]);
|
|
14
|
+
Admin::menu()->add(
|
|
15
|
+
MenuNode::make('content', 'Контент')->icon('book')->children([
|
|
16
|
+
MenuNode::resource('articles'),
|
|
17
|
+
MenuNode::dashboard('analytics'),
|
|
18
|
+
]),
|
|
19
|
+
);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Что внутри
|
|
23
|
+
|
|
24
|
+
- **CRUD-pipeline** — объявите Eloquent-модель как `Resource` и
|
|
25
|
+
получите list/create/edit/view-страницы автоматически.
|
|
26
|
+
- **Кастомные Screen'ы** — формы, отчёты, дашборды и любые non-CRUD
|
|
27
|
+
страницы через `Admin::screen()`. State, layout, command-bar,
|
|
28
|
+
валидация, permissions.
|
|
29
|
+
- **Иерархическое меню** — fluent API `Admin::menu()->add(MenuNode::...)`,
|
|
30
|
+
любая глубина, auto-resolve `resource()`/`screen()`/`dashboard()`.
|
|
31
|
+
- **30+ типов полей** — Input/Number/Select/Combobox/DatePicker/
|
|
32
|
+
ColorPicker/FileUpload/Wysiwyg/Markdown/TranslatableInput/Repeater/
|
|
33
|
+
RelationSelect/Cascader/TreeSelect/Slug/KeyValue/TagsInput/...
|
|
34
|
+
- **15+ layout'ов** — Rows/Columns/Tabs/Wizard+Step/Block/Modal/Drawer/
|
|
35
|
+
Wrapper/Infolist/Dashboard/Accordion/View/...
|
|
36
|
+
- **Таблицы** — sortable/searchable колонки, presets, фильтры,
|
|
37
|
+
inline-edit, summary, saved views, group-by, polling, экспорт
|
|
38
|
+
(CSV/XLSX/PDF).
|
|
39
|
+
- **Dashboard** — 8 типов виджетов (Stats/Chart/RecentList/Markdown/
|
|
40
|
+
Iframe/Table/Heatmap/Gauge), per-user layout-override'ы, drag/resize,
|
|
41
|
+
polling.
|
|
42
|
+
- **Auth & RBAC** — multi-guard, AdminUser, Roles, 2FA TOTP, profile,
|
|
43
|
+
impersonation, password-reset, email-verification.
|
|
44
|
+
- **Audit** — append-only журнал админских действий
|
|
45
|
+
(`AuditLog` + trait `Loggable`).
|
|
46
|
+
- **Settings** — singleton-страницы конфигурации.
|
|
47
|
+
- **Уведомления** — bell-badge + drawer (Database notifications).
|
|
48
|
+
- **API-токены** — Sanctum в Profile (опционально).
|
|
49
|
+
- **Темы** — light/dark + per-user, дизайн-токены `@dskripchenko/ui`.
|
|
50
|
+
- **i18n** — locale-resolver (5 уровней приоритета),
|
|
51
|
+
`TranslatableField`-bridge с `dskripchenko/laravel-translatable`.
|
|
52
|
+
- **Tenancy** — `TenantResolver` / `TenantContext` / trait
|
|
53
|
+
`TenantScoped`. Стратегия — на стороне host'а, мы даём контракт.
|
|
54
|
+
- **Plugins** — интерфейс `AdminPlugin`; sister-pack'и используют тот же hook.
|
|
55
|
+
- **Тестирование** — `ResourceTestCase`, `ScreenTestCase`, trait
|
|
56
|
+
`ActsAsAdmin`.
|
|
57
|
+
- **OpenAPI 3.0** — генерируется из docblock-тегов `@input`/`@output`.
|
|
58
|
+
|
|
59
|
+
## Установка
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
composer require dskripchenko/laravel-admin
|
|
63
|
+
php artisan vendor:publish --tag=admin-config
|
|
64
|
+
php artisan migrate
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
// resources/js/admin.js
|
|
69
|
+
import { createAdminApp } from '@dskripchenko/laravel-admin'
|
|
70
|
+
import '@dskripchenko/ui/styles/all.css'
|
|
71
|
+
import '@dskripchenko/laravel-admin/style.css'
|
|
72
|
+
|
|
73
|
+
const { app } = createAdminApp(window.__ADMIN_BOOTSTRAP__)
|
|
74
|
+
app.mount('#admin-app')
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm i @dskripchenko/laravel-admin @dskripchenko/ui
|
|
79
|
+
npm run build
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Открой `/admin/login`. См. [getting-started.md](docs/ru/getting-started.md)
|
|
83
|
+
для первого resource'а.
|
|
84
|
+
|
|
85
|
+
## Документация
|
|
86
|
+
|
|
87
|
+
- [Быстрый старт](docs/ru/getting-started.md)
|
|
88
|
+
- [Архитектура](docs/ru/architecture.md)
|
|
89
|
+
- Концепции: [Resources](docs/ru/concepts/resources.md) ·
|
|
90
|
+
[Screens](docs/ru/concepts/screens.md) ·
|
|
91
|
+
[Widgets & Dashboards](docs/ru/concepts/widgets-and-dashboards.md) ·
|
|
92
|
+
[Menu](docs/ru/concepts/menu.md) ·
|
|
93
|
+
[Actions](docs/en/concepts/actions.md) (en) ·
|
|
94
|
+
[Permissions](docs/en/concepts/permissions.md) (en) ·
|
|
95
|
+
[i18n](docs/en/concepts/i18n.md) (en) ·
|
|
96
|
+
[Tenancy](docs/en/concepts/tenancy.md) (en)
|
|
97
|
+
- [Каталог полей](docs/en/fields-reference.md) (en)
|
|
98
|
+
- [Каталог layout'ов](docs/en/layouts-reference.md) (en)
|
|
99
|
+
- [API reference](docs/en/api-reference.md) (en)
|
|
100
|
+
- [Frontend-расширение](docs/en/frontend-extension.md) (en)
|
|
101
|
+
- [Тестирование](docs/en/testing.md) (en)
|
|
102
|
+
- [Migration guide](docs/en/migration-guide.md) (en)
|
|
103
|
+
- [Глоссарий](docs/ru/glossary.md)
|
|
104
|
+
|
|
105
|
+
## Стек
|
|
106
|
+
|
|
107
|
+
- **PHP** ^8.5
|
|
108
|
+
- **Laravel** ^12
|
|
109
|
+
- **Vue** ^3.4 + TypeScript + Pinia + Vue Router
|
|
110
|
+
- **Bundle** — `@dskripchenko/laravel-admin` ~62 KB gz (esm + cjs)
|
|
111
|
+
- **Без vendor lock-in** для редактора/чартов — подключай свой
|
|
112
|
+
(sister-pack-адаптеры: `quill`, `tinymce`)
|
|
113
|
+
|
|
114
|
+
## Sister-пакеты
|
|
115
|
+
|
|
116
|
+
Опциональные расширения, ставь только нужные:
|
|
117
|
+
|
|
118
|
+
| Пакет | Назначение |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `dskripchenko/laravel-admin-starter` | Resources для User/Role/Audit/Settings/Translations/Blocks |
|
|
121
|
+
| `dskripchenko/laravel-admin-tinymce` | TinyMCE WYSIWYG-адаптер |
|
|
122
|
+
| `dskripchenko/laravel-admin-quill` | Quill WYSIWYG-адаптер |
|
|
123
|
+
| `dskripchenko/laravel-admin-search` | ⌘K command palette + Scout suggest |
|
|
124
|
+
| `dskripchenko/laravel-admin-media` | Медиа-библиотека (без Spatie/medialibrary) |
|
|
125
|
+
| `dskripchenko/laravel-admin-health` | Health checks (без Spatie/laravel-health) |
|
|
126
|
+
| `dskripchenko/laravel-admin-pulse` | Telemetry (без laravel/pulse) |
|
|
127
|
+
| `dskripchenko/laravel-admin-jobs` | Failed jobs / batches viewer |
|
|
128
|
+
|
|
129
|
+
## Contributing
|
|
130
|
+
|
|
131
|
+
См. [CONTRIBUTING.md](CONTRIBUTING.md). PR'ы welcome.
|
|
132
|
+
|
|
133
|
+
## Лицензия
|
|
134
|
+
|
|
135
|
+
[MIT](LICENSE) © Denis Skripchenko
|