PHPackages                             fazzinipierluigi/laraccoon-layouts - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. fazzinipierluigi/laraccoon-layouts

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

fazzinipierluigi/laraccoon-layouts
==================================

Laravel package for saving and managing Raccoon Tables layouts

1.0.3(1mo ago)08MITBladePHP ^8.0

Since Jun 11Pushed 1mo agoCompare

[ Source](https://github.com/fazzinipierluigi/laraccoon_layouts)[ Packagist](https://packagist.org/packages/fazzinipierluigi/laraccoon-layouts)[ RSS](/packages/fazzinipierluigi-laraccoon-layouts/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (4)Dependencies (4)Versions (5)Used By (0)

laraccoon-layouts
=================

[](#laraccoon-layouts)

Laravel package per il salvataggio e la gestione dei layout di [Raccoon Tables](https://github.com/fazzinipierluigi/raccoon-tables).

---

1. Installazione e pubblicazione asset
--------------------------------------

[](#1-installazione-e-pubblicazione-asset)

### Installazione via Composer

[](#installazione-via-composer)

```
composer require fazzinipierluigi/laraccoon-layouts
```

Il service provider viene registrato automaticamente tramite Laravel package auto-discovery.

### Pubblicazione della configurazione

[](#pubblicazione-della-configurazione)

```
php artisan vendor:publish --tag=raccoon-layouts-config
```

Crea il file `config/raccoon_layouts.php` nella tua applicazione.

### Pubblicazione della migrazione

[](#pubblicazione-della-migrazione)

```
php artisan vendor:publish --tag=raccoon-layouts-migrations
php artisan migrate
```

---

2. Registrazione dello stack scripts nel layout base
----------------------------------------------------

[](#2-registrazione-dello-stack-scripts-nel-layout-base)

La direttiva `@raccoonLayoutsScripts` emette il tag `` inline. Se vuoi controllarne il posizionamento con lo stack di Blade, aggiungi nel tuo layout base (es. `layouts/app.blade.php`) prima di ``:

```
@stack('scripts')
```

Poi nella tua view usa:

```
@push('scripts')
    @raccoonLayoutsScripts
@endpush
```

Oppure includi direttamente la direttiva dove preferisci:

```
@raccoonLayoutsScripts
```

---

3. Uso delle direttive con esempi HTML completi
-----------------------------------------------

[](#3-uso-delle-direttive-con-esempi-html-completi)

### Esempio completo di una pagina con Raccoon Tables

[](#esempio-completo-di-una-pagina-con-raccoon-tables)

```

    La mia tabella

    @raccoonLayoutsDropdown(['class' => 'my-toolbar'])

        var table = new RaccoonTable('#my-table', { /* opzioni */ });

    @raccoonLayoutsScripts

```

### @raccoonLayoutsDropdown con classe personalizzata

[](#raccoonlayoutsdropdown-con-classe-personalizzata)

```
@raccoonLayoutsDropdown(['class' => 'toolbar__layouts'])
```

### @raccoonLayoutsScripts con pageKey manuale

[](#raccoonlayoutsscripts-con-pagekey-manuale)

```

    window.RaccoonLayoutsConfig = {
        pageKey: '{{ sha1("pagina-ordini") }}'
    };

@raccoonLayoutsScripts
```

---

4. Guida alla stilizzazione: classi BEM
---------------------------------------

[](#4-guida-alla-stilizzazione-classi-bem)

Il dropdown emette markup con classi BEM `raccoon-layouts__*`. Nessuno stile inline è presente — personalizza liberamente con CSS.

ClasseElementoDescrizione`raccoon-layouts__wrapper```Contenitore radice del pannello`raccoon-layouts__select-group```Wrapper attorno al ```raccoon-layouts__select```Dropdown per la selezione del layout`raccoon-layouts__option```Singola voce nel dropdown`raccoon-layouts__option--placeholder```Voce "Layout Standard" (nessun layout caricato)`raccoon-layouts__menu-container```Wrapper del menu a tendina azioni`raccoon-layouts__btn--menu```Bottone trigger del menu`raccoon-layouts__menu```Menu a tendina delle azioni`raccoon-layouts__menu-item```Classe base voce menu`raccoon-layouts__menu-item--save```Voce "Salva" (aggiorna layout corrente; disabilitata su Standard)`raccoon-layouts__menu-item--save-as```Voce "Salva come" (crea nuovo layout; sempre abilitata)`raccoon-layouts__menu-item--rename```Voce "Rinomina"`raccoon-layouts__menu-item--copy```Voce "Copia"`raccoon-layouts__menu-item--set-default```Voce "Imposta Default"`raccoon-layouts__menu-item--delete```Voce "Elimina"`raccoon-layouts__menu-item--danger```Modificatore per azioni distruttive`raccoon-layouts__menu-item--needs-selection```Modificatore: voce disabilitata (`aria-disabled`) se nessun layout selezionato`raccoon-layouts__menu-divider```Separatore visivo nel menu### Esempio CSS

[](#esempio-css)

```
.raccoon-layouts__wrapper {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px;
    background: #f5f5f5;
    border-radius: 4px;
}

.raccoon-layouts__select {
    min-width: 200px;
    padding: 4px 8px;
    border: 1px solid #ccc;
    border-radius: 4px;
}

.raccoon-layouts__btn {
    padding: 4px 12px;
    border: 1px solid #999;
    border-radius: 4px;
    background: #fff;
    cursor: pointer;
}

.raccoon-layouts__btn:hover {
    background: #e8e8e8;
}

.raccoon-layouts__menu-item--danger {
    color: #c00;
}

.raccoon-layouts__menu-item[aria-disabled="true"] {
    opacity: 0.4;
    pointer-events: none;
}
```

---

5. Guida al page\_key
---------------------

[](#5-guida-al-page_key)

### Come viene generato

[](#come-viene-generato)

Il `page_key` è un hash SHA1 calcolato server-side al momento del rendering della direttiva `@raccoonLayoutsScripts`. La strategia dipende dal valore di `page_key_strategy` nella configurazione:

StrategiaSorgente del hashEsempio sorgente`url` (default)URL completo della richiesta (`request()->url()`)`https://example.com/ordini?tab=aperti``route_name`Nome della route Laravel (`request()->route()->getName()`)`ordini.index`La strategia `route_name` è consigliata quando l'URL contiene parametri variabili (query string, paginazione) ma si vuole condividere lo stesso pool di layout.

### Sovrascrivere il pageKey manualmente

[](#sovrascrivere-il-pagekey-manualmente)

Per usare un pageKey custom (utile per condividere layout tra URL diversi o per chiavi semantiche):

```

    window.RaccoonLayoutsConfig = {
        pageKey: '{{ sha1("chiave-semantica-custom") }}'
    };

@raccoonLayoutsScripts
```

Oppure con un hash già calcolato:

```

    window.RaccoonLayoutsConfig = {
        pageKey: 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'
    };

@raccoonLayoutsScripts
```

> Il pageKey deve essere una stringa di 40 caratteri esadecimali (SHA1) per rispettare il vincolo della colonna `page_key VARCHAR(40)`.

---

6. Esempi integrazione con Raccoon Tables
-----------------------------------------

[](#6-esempi-integrazione-con-raccoon-tables)

### Inizializzazione base

[](#inizializzazione-base)

```

@raccoonLayoutsDropdown

    var myTable = new RaccoonTable('#my-raccoon-table', {
        columns: [ /* ... */ ],
        data: [ /* ... */ ]
    });

@raccoonLayoutsScripts
```

> `@raccoonLayoutsScripts` deve essere incluso **dopo** l'inizializzazione di Raccoon Tables, perché utilizza le funzioni globali `getLayout()`, `setLayout()` e `resetLayout()` esposte dal plugin.

### Salvataggio programmatico

[](#salvataggio-programmatico)

```
// Aggiorna il layout correntemente selezionato (sovrascrive layout_data)
var id = 12;
RaccoonLayouts.save(id).then(function(layout) {
    console.log('Aggiornato:', layout.name);
});

// Crea un nuovo layout con nome specifico
RaccoonLayouts.saveAs('Layout Mensile').then(function(layout) {
    console.log('Creato con ID', layout.id);
});

// Crea un nuovo layout pubblico
RaccoonLayouts.saveAs('Layout Condiviso', true);
```

### Risposta agli eventi

[](#risposta-agli-eventi)

Evento`e.detail`Quando`raccoon-layouts:loaded``layout[]`Lista layout fetchata all'init`raccoon-layouts:saved`oggetto layoutLayout corrente aggiornato via `save(id)``raccoon-layouts:saved-as`oggetto layoutNuovo layout creato via `saveAs(name)``raccoon-layouts:renamed`oggetto layoutLayout rinominato`raccoon-layouts:copied`oggetto layoutLayout duplicato`raccoon-layouts:default-set`oggetto layoutDefault impostato`raccoon-layouts:deleted``{ id }`Layout eliminato```
document.addEventListener('raccoon-layouts:loaded', function(e) {
    console.log('Layout disponibili:', e.detail);
});

document.addEventListener('raccoon-layouts:saved', function(e) {
    console.log('Layout aggiornato:', e.detail.name);
});

document.addEventListener('raccoon-layouts:saved-as', function(e) {
    console.log('Nuovo layout creato con ID', e.detail.id);
});

document.addEventListener('raccoon-layouts:deleted', function(e) {
    console.log('Eliminato layout ID', e.detail.id);
});
```

### Override delle routes JS

[](#override-delle-routes-js)

```

    window.RaccoonLayoutsConfig = {
        pageKey: '{{ sha1(request()->route()->getName()) }}',
        routes: {
            byPage: '/api/v2/raccoon-layouts/page/',
            store:  '/api/v2/raccoon-layouts/store',
            update: '/api/v2/raccoon-layouts/',
            destroy:'/api/v2/raccoon-layouts/',
            setDefault: function(id) { return '/api/v2/raccoon-layouts/' + id + '/default'; },
            copy:       function(id) { return '/api/v2/raccoon-layouts/' + id + '/copy'; }
        }
    };

@raccoonLayoutsScripts
```

---

7. Configurazione middleware e autenticazione
---------------------------------------------

[](#7-configurazione-middleware-e-autenticazione)

Il file `config/raccoon_layouts.php`:

```
return [
    'route_prefix' => 'raccoon-layouts',
    'middleware' => ['web', 'auth'],
    'user_model' => App\Models\User::class,
    'page_key_strategy' => 'url', // 'url' | 'route_name'
];
```

### Opzioni comuni

[](#opzioni-comuni)

**Proteggere le route con un guard specifico:**

```
'middleware' => ['web', 'auth:sanctum'],
```

**Aggiungere middleware di policy custom:**

```
'middleware' => ['web', 'auth', 'verified'],
```

**Cambiare il modello User (es. con multi-tenancy):**

```
'user_model' => App\Models\Admin::class,
```

**Prefisso route custom:**

```
'route_prefix' => 'api/layouts',
```

---

8. API Reference
----------------

[](#8-api-reference)

Tutti gli endpoint usano il prefisso configurato (default: `/raccoon-layouts`). Richiedono autenticazione e CSRF token nell'header `X-CSRF-TOKEN`.

---

### GET `/raccoon-layouts/page/{page_key}`

[](#get-raccoon-layoutspagepage_key)

Lista i layout disponibili per la pagina: quelli dell'utente corrente + quelli pubblici di altri utenti.

**Risposta 200:**

```
[
    {
        "id": 1,
        "user_id": 42,
        "name": "Layout Mensile",
        "is_public": false,
        "is_default": true
    },
    {
        "id": 7,
        "user_id": 15,
        "name": "Layout Condiviso",
        "is_public": true,
        "is_default": false
    }
]
```

---

### POST `/raccoon-layouts/store`

[](#post-raccoon-layoutsstore)

Crea un nuovo layout (corrisponde a `saveAs` nel JS).

**Body:**

```
{
    "name": "Il mio layout",
    "page_key": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
    "layout_data": { "columns": [], "sort": null },
    "is_public": false
}
```

**Risposta 201:**

```
{
    "id": 12,
    "user_id": 42,
    "page_key": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
    "name": "Il mio layout",
    "layout_data": { "columns": [], "sort": null },
    "is_public": false,
    "is_default": false,
    "created_at": "2024-01-15T10:30:00.000000Z",
    "updated_at": "2024-01-15T10:30:00.000000Z"
}
```

---

### PUT `/raccoon-layouts/{id}`

[](#put-raccoon-layoutsid)

Aggiorna un layout esistente — nome, `layout_data`, visibilità (solo proprietario). Usato sia da "Salva" (aggiorna `layout_data`) che da "Rinomina" (aggiorna `name`).

**Body (tutti i campi opzionali):**

```
{
    "name": "Nuovo nome",
    "layout_data": { "columns": [], "sort": "name" },
    "is_public": true
}
```

**Risposta 200:** oggetto layout aggiornato (stesso schema del POST).

---

### DELETE `/raccoon-layouts/{id}`

[](#delete-raccoon-layoutsid)

Elimina un layout (solo proprietario).

**Risposta 200:**

```
{
    "message": "Deleted"
}
```

---

### POST `/raccoon-layouts/{id}/default`

[](#post-raccoon-layoutsiddefault)

Imposta il layout come default per l'utente corrente su quella pagina. Rimuove automaticamente il default precedente per la stessa coppia utente+pagina.

**Risposta 200:** oggetto layout con `is_default: true`.

---

### POST `/raccoon-layouts/{id}/copy`

[](#post-raccoon-layoutsidcopy)

Duplica un layout (proprio o pubblico). Il nome della copia usa il prefisso localizzato (es. "Copy of", "Copia di") configurato via `i18n.copyPrefix`. La copia è sempre privata e non-default.

**Risposta 201:**

```
{
    "id": 13,
    "user_id": 42,
    "page_key": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
    "name": "Copia di Layout Mensile",
    "layout_data": { "columns": [], "sort": null },
    "is_public": false,
    "is_default": false,
    "created_at": "2024-01-15T10:35:00.000000Z",
    "updated_at": "2024-01-15T10:35:00.000000Z"
}
```

---

### Errori comuni

[](#errori-comuni)

CodiceCausa401Utente non autenticato403Operazione non permessa (es. delete su layout altrui non pubblico)404Layout non trovato422Validazione fallita — body della risposta contiene `errors`

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance91

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

4

Last Release

41d ago

PHP version history (2 changes)1.0.0PHP ^8.1

1.0.1PHP ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/1df4d6b7ede1ad143f400743960438450ae0a1721520e0b077de4ca7478f2c44?d=identicon)[GG91](/maintainers/GG91)

---

Top Contributors

[![fazzinipierluigi](https://avatars.githubusercontent.com/u/32109679?v=4)](https://github.com/fazzinipierluigi "fazzinipierluigi (6 commits)")

### Embed Badge

![Health badge](/badges/fazzinipierluigi-laraccoon-layouts/health.svg)

```
[![Health](https://phpackages.com/badges/fazzinipierluigi-laraccoon-layouts/health.svg)](https://phpackages.com/packages/fazzinipierluigi-laraccoon-layouts)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[api-platform/laravel

API Platform support for Laravel

58174.6k17](/packages/api-platform-laravel)[fleetbase/core-api

Core Framework and Resources for Fleetbase API

1235.9k21](/packages/fleetbase-core-api)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

255.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
