# istlab/admin-crud

Laravel アプリのデータベーステーブルをブラウザ上から参照・インライン編集するための管理用 CRUD パッケージです。
ReviewHub の `AdminController` の CRUD 機能 (`admin.crud*`) を切り出したもので、デフォルト設定では元の URI・ルート名をそのまま再現します。

## 機能

- テーブル一覧と行数の表示 (`GET /admin_crud`)
- テーブル内容の表示・カラム絞り込み (LIKE / 整数完全一致)
- セルのクリック編集 (Ajax, `POST /admin_crud`)
- tinyint カラムのトグルスイッチ
- 行の追加 (Eloquent ファクトリ) / コピー (replicate) / 削除
- チェックした行の一括コピー・一括削除
- 全行削除 (truncate)
- AUTO_INCREMENT 値の設定 (MySQL / SQLite)
- 予約更新 (scheduled update) 連携 (オプション)

## インストール

ローカルパスリポジトリとして読み込む場合:

```json
// 宿主アプリ側 composer.json
"repositories": [
    {
        "type": "path",
        "url": "../CrudPkg",
        "options": { "symlink": true }
    }
],
```

```bash
composer require istlab/admin-crud:*
php artisan vendor:publish --tag=admin-crud-assets   # public/vendor/admin-crud に JS/CSS を配置 (必須)
php artisan vendor:publish --tag=admin-crud-config   # config/admin-crud.php を公開 (任意)
```

サービスプロバイダ (`Istlab\AdminCrud\AdminCrudServiceProvider`) はパッケージ自動検出で登録されます。

## 設定 (`config/admin-crud.php`)

| キー | デフォルト | 説明 |
|---|---|---|
| `path` | `admin_crud` | ルート URI のベース。`/admin_crud`, `/admin_crudcopy`, ... のようになります |
| `route_name_prefix` | `admin.` | ルート名プレフィックス (`admin.crud` 等) |
| `middleware` | `['web', 'auth']` | 全ルートに適用するミドルウェア |
| `gate` | `role_any` | 認可に使う Gate 名。`null` でチェック無効 |
| `roles` | `admin` | 参照・コピー・削除等に必要なロール (`$user->can($gate, $roles)`) |
| `post_roles` | `admin\|manager\|ec\|pub` | セル更新 (crudpost) に必要なロール |
| `model_namespace` | `App\Models` | Eloquent モデルの名前空間 |
| `layout_component` | `admin-crud::layout` | ページレイアウトの Blade コンポーネント名 |
| `limit` | `100` | 1ページの最大表示行数 |
| `scheduled_update_create_route` | `null` | 予約更新作成ページのルート名 (例: `scheduled_update.create`) |
| `jquery_url` | CDN (jquery 3.7.1) | ビューで読み込む jQuery の URL |

### ReviewHub で使う場合の設定例

```php
// config/admin-crud.php
'layout_component' => 'app-layout',              // <x-app-layout> 内に描画
'jquery_url' => '/js/jquery.min.js',             // 既存の jQuery を利用
'scheduled_update_create_route' => 'scheduled_update.create',
```

`app-layout` を使う場合、レイアウトに `@stack('localcss')` と `@stack('localjs')` が必要です。

## 認可について

デフォルトでは `role_any` という Gate を `$user->can('role_any', 'admin')` の形で呼びます。
宿主アプリ側で次のような Gate を定義してください (ReviewHub では定義済みです):

```php
Gate::define('role_any', function ($user, string $roles_str) {
    // $roles_str は 'admin|manager' のようなパイプ区切り
    ...
});
```

Gate を使わない場合は `'gate' => null` にし、`middleware` で独自に保護してください。

## 旧実装からの移行 (ReviewHub)

1. 上記の設定でパッケージをインストール
2. `routes/web.php` の `// begin CRUD` 〜 `// end CRUD` のルート定義を削除
3. `AdminController` の `crud*` メソッドと `resources/views/admin/crud*.blade.php` は不要になります
   (パッケージ側が同じ URI・ルート名を引き継ぐため、既存の `route('admin.crud', ...)` へのリンクはそのまま動きます)

## 既存アプリとの共存

旧ルートを残したままインストールする場合は、ルート名・URI が衝突しないよう
`path` と `route_name_prefix` を変更してください (例: `'path' => 'crud'`, `'route_name_prefix' => 'crud.'`)。

## セキュリティ上の注意

- テーブル名は実在テーブルのホワイトリストで検証されます。
- 更新対象カラム名もスキーマ情報で検証されます。
- それでも本パッケージは任意テーブルを直接編集できる強力な管理機能です。必ず認証・認可を設定した上で、信頼できる管理者のみに公開してください。
