Skip to content

Commit

Permalink
chore: initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
shuvroroy committed Apr 30, 2023
0 parents commit 7ab93e1
Show file tree
Hide file tree
Showing 66 changed files with 6,787 additions and 0 deletions.
18 changes: 18 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.{js,vue}]
indent_size = 2

[*.{mix.js}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/.idea
/vendor
/node_modules
package-lock.json
composer.phar
composer.lock
phpunit.xml
.phpunit.result.cache
.DS_Store
Thumbs.db
160 changes: 160 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# Nova dynamic views

This package will help to add some custom placeholder components like `custom-index-header`, `custom-index-toolbar`, `custom-detail-header`, `custom-detail-toolbar`, etc in various section in views. It provides a much easier API for it and it allows you to use these "placeholder" components multiple times without overwriting each other.

## Requirements

* PHP (^8.1 or higher)
* Laravel Nova (^4.0 or higher)

## Installation

Require the package with composer

```
composer require shuvroroy/nova-dynamic-views
```

Register the tool in the `tools` method in `\App\Providers\NovaServiceProvider`:

```php
use ShuvroRoy\NovaDynamicViews\NovaDynamicViews;

...

public function tools()
{
return [
new NovaDynamicViews()
];
}
```

## Usage

Let's say you want to add a custom button to the `toolbar` of all `index` views. Just create a vue component for it, as you would do if you use the `custom-index-header` (see section "Create custom component" if you don't know how to). Let's call it `my-index-toolbar-btn`. Now the only thing you have to do is register it to your `\App\Ņova\Resource` class, within a new method called `customIndexToolbarComponents`, which returns a `\ShuvroRoy\NovaDynamicViews\CustomComponents` object:

```php
public function customIndexToolbarComponents(): CustomComponents
{
return CustomComponents::make()
->addItem('my-index-toolbar-btn');
}
```

Thats it. Now you should see the content of your component in the toolbar.

### Provide extra data

If you want to add extra data (for example a label) to your component (without extra request), just add it to the `addItem` method as second parameter (as array):

```php
public function customIndexToolbarComponents(): CustomComponents
{
return CustomComponents::make()
->addItem('my-index-toolbar-btn', [
'label' => 'My label'
]);
}
```

### Access resource data

You have access to the ressource class in all methods by using `$this`. On `detail` and `edit` components, you have access to the ID of the current model with `request('id')`. So if you need the model itself in your `customDetailHeaderComponents`, `customDetailToolbarComponents` or your `customUpdateHeaderComponents`, you can query for it like so:

```php
public function customDetailToolbarComponents(): CustomComponents
{
$model = $this->model()->query()->where('id', request('id'))->first();

//...
}
```

### Add (tailwind) class to the container

If you want to add additional CSS classes to the container div of a section (for example add `flex w-full justify-end items-center mx-3` to the `customIndexToolbarComponents` section), add the `class` in the `make` function (or use the `setClass` method):

```php
public function customIndexToolbarComponents(): CustomComponents
{
return CustomComponents::make('flex w-full justify-end items-center mx-3')
->addItem('my-index-toolbar-btn');
}
```

### Full usage example

```php
use ShuvroRoy\NovaDynamicViews\CustomComponents;

class Resource extends \Laravel\Nova\Resource
{
...

/**
* Using the `custom-index-toolbar` placeholder component
*
* @return CustomComponents
*/
public function customIndexToolbarComponents(): CustomComponents
{
return CustomComponents::make('flex w-full justify-end items-center mx-3')
->addItem('my-index-toolbar-btn', [
'title' => 'My first btn'
])
->addItem('my-index-toolbar-btn', [
'title' => 'My second btn'
]);
}

/**
* Using the `custom-detail-header` placeholder component
*
* @return CustomComponents
*/
public function customDetailHeaderComponents(): CustomComponents
{
$model = $this->model()->query()->where('id', request('id'))->first();

return CustomComponents::make()
->addItem('my-other-component', [
'id' => $model->id,
'name' => $model->name
]);
}
}
```


### Use only on specific resources

If you want to show this button only on a specific resource, for example only for Users, just add this method to the `\App\Nova\User` class.

## Available methods and areas

All `custom-*-*` nova placeholders (except `custom-dashboard-header`) are available as camel case methods postfixed with `Components`:

- [x] `customIndexHeaderComponents`
- [x] `customIndexToolbarComponents`
- [x] `customDetailHeaderComponents`
- [x] `customDetailToolbarComponents`
- [x] `customCreateHeaderComponents`
- [x] `customAttachHeaderComponents`
- [x] `customUpdateAttachHeaderComponents`
- [ ] `customUpdateHeaderComponents`
- [ ] `customLensHeaderComponents`

## Create custom component

This is just a kick start documentation for this. For more info, see https://nova.laravel.com/docs/4.0/customization/resource-tools.html

Create a new resource tool with artisan:

```bash
php artisan nova:resource-tool acme/my-index-toolbar-btn
```

and say yes to all questions of the prompt. Now you can use this component (located ad `nova-components/my-index-toolbar-btn`) inside your `customXXXComponents` (f.e. `customIndexToolbarComponents`)


36 changes: 36 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"name": "shuvroroy/nova-dynamic-views",
"description": "A tool for easier overwriting custom-header and toolbars in Laravel Nova",
"keywords": [
"laravel",
"nova"
],
"license": "MIT",
"authors": [
{
"name": "Shuvro Roy",
"email": "[email protected]"
}
],
"require": {
"php": "^8.1",
"laravel/nova": "^4.0"
},
"autoload": {
"psr-4": {
"ShuvroRoy\\NovaDynamicViews\\": "src/"
}
},
"extra": {
"laravel": {
"providers": [
"ShuvroRoy\\NovaDynamicViews\\ToolServiceProvider"
]
}
},
"config": {
"sort-packages": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
Empty file added dist/css/tool.css
Empty file.
2 changes: 2 additions & 0 deletions dist/js/tool.js

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions dist/js/tool.js.LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <http://feross.org>
* @license MIT
*/

/*!
* vuex v4.1.0
* (c) 2022 Evan You
* @license MIT
*/

/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */

/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
3 changes: 3 additions & 0 deletions dist/mix-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"/js/tool.js": "/js/tool.js"
}
24 changes: 24 additions & 0 deletions nova.mix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const mix = require('laravel-mix')

class NovaExtension {
name() {
return 'nova-extension'
}

register(name) {
this.name = name
}

webpackConfig(webpackConfig) {
webpackConfig.externals = {
vue: 'Vue',
'laravel-nova': 'LaravelNova'
}

webpackConfig.output = {
uniqueName: this.name,
}
}
}

mix.extend('nova', new NovaExtension())
25 changes: 25 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production",
"nova:install": "npm --prefix='../../vendor/laravel/nova' ci"
},
"devDependencies": {
"@vue/compiler-sfc": "^3.2.22",
"laravel-mix": "^6.0.41",
"lodash": "^4.17.21",
"vue-loader": "^16.8.3"
},
"dependencies": {
"form-backend-validation": "^2.3.3",
"@inertiajs/inertia": "^0.11.0",
"vue": "^3.2.47",
"vuex": "^4.0.2"
}
}
Loading

0 comments on commit 7ab93e1

Please sign in to comment.