Skip to content

Commit adeeb19

Browse files
authored
Laravel Nova 5 Support (#33)
1 parent b8732ae commit adeeb19

7 files changed

Lines changed: 1060 additions & 1026 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"license": "MIT",
1515
"require": {
1616
"php": ">=8.1",
17-
"laravel/nova": "^4.28.0"
17+
"laravel/nova": "^5.0"
1818
},
1919
"autoload": {
2020
"psr-4": {

dist/js/tool.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/js/tool.js.LICENSE.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
2+
13
/**!
24
* Sortable 1.14.0
35
* @author RubaXa <trash@rubaxa.org>

resources/js/components/ColumnToggler.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import isEqual from 'lodash/isEqual'
22
import cloneDeep from 'lodash/cloneDeep'
33

44
export function toList(state) {
5-
return state.filter(({ visible }) => visible).map(({ attribute }) => attribute)
5+
return state.filter(({visible}) => visible).map(({attribute}) => attribute)
66
}
77

88
export function encode(state) {
@@ -13,9 +13,9 @@ export function decode(state) {
1313
return state ? JSON.parse(decodeURIComponent(escape(atob(state)))) : null
1414
}
1515

16-
export function getStateFromLocalStorage(cacheKey) {
16+
export async function getStateFromLocalStorage(cacheKey) {
1717

18-
const value = localStorage.getItem(generateCacheKey(cacheKey))
18+
const value = localStorage.getItem(await generateCacheKey(cacheKey))
1919

2020
if (value === null) {
2121
return true
@@ -25,23 +25,24 @@ export function getStateFromLocalStorage(cacheKey) {
2525

2626
}
2727

28-
export function saveStateToLocalStorage(state, cacheKey) {
29-
localStorage.setItem(generateCacheKey(cacheKey), encode(state))
28+
export async function saveStateToLocalStorage(state, cacheKey) {
29+
localStorage.setItem(await generateCacheKey(cacheKey), encode(state))
3030
}
3131

32-
export function generateCacheKey(cacheKey) {
32+
33+
export async function generateCacheKey(cacheKey) {
3334
return [
3435
'column-toggler',
3536
cacheKey,
36-
Nova.$router.page.component,
37+
(await Nova.$router.decryptHistory()).props?.lens,
3738
Nova.config('column_toggler').enable_sorting,
3839
].join('/')
3940
}
4041

4142
export function registerMixin(component) {
4243

4344
if (component.computed.resourceRequestQueryString === undefined) {
44-
component = component.mixins.find(({ computed }) => typeof computed.resourceRequestQueryString === 'function')
45+
component = component.mixins.find(({computed}) => typeof computed.resourceRequestQueryString === 'function')
4546
}
4647

4748
const originalResourceRequestQueryString = component.computed.resourceRequestQueryString
@@ -53,19 +54,22 @@ export function registerMixin(component) {
5354
unmounted() {
5455
Nova.$off(this.columnTogglerEventKey, this.columnTogglerOnStateChange)
5556
},
57+
async beforeMount() {
58+
this.columnTogglerState = await getStateFromLocalStorage(this.resourceName)
59+
},
5660
data() {
5761
return {
58-
columnTogglerState: getStateFromLocalStorage(this.resourceName),
62+
columnTogglerState: true,
5963
}
6064
},
6165
methods: {
62-
columnTogglerOnStateChange(state) {
66+
async columnTogglerOnStateChange(state) {
6367

6468
const currentState = this.columnTogglerState
6569

6670
if (isEqual(state, currentState) === false) {
6771

68-
saveStateToLocalStorage(state, this.resourceName)
72+
await saveStateToLocalStorage(state, this.resourceName)
6973

7074
this.columnTogglerState = cloneDeep(state)
7175

@@ -79,14 +83,13 @@ export function registerMixin(component) {
7983
},
8084
computed: {
8185
columnTogglerEventKey() {
82-
return `column-toggler:state-changed:${ [ this.resourceName, this.lens, this.actionQueryString?.viaRelationship ].filter(Boolean).join('/') }`
86+
return `column-toggler:state-changed:${[this.resourceName, this.lens, this.actionQueryString?.viaRelationship].filter(Boolean).join('/')}`
8387
},
8488
columnTogglerEncodedColumns() {
8589

8690
if (typeof this.columnTogglerState === 'boolean') {
8791
return this.columnTogglerState
8892
}
89-
9093
const columns = toList(this.columnTogglerState)
9194

9295
if (columns.length === 0) {

resources/js/components/ColumnToggler.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,13 @@
143143
},
144144
},
145145
watch: {
146-
'tableToolbar.resources'(resources) {
146+
async 'tableToolbar.resources'(resources) {
147147
148148
const attributes = resources[ 0 ]?.columnToggler
149149
150150
if (attributes) {
151151
152-
let localStorageState = getStateFromLocalStorage(this.tableToolbar.resourceName)
153-
152+
let localStorageState = await getStateFromLocalStorage(this.tableToolbar.resourceName)
154153
if (localStorageState && this.isDifferentState(attributes, localStorageState)) {
155154
localStorageState = attributes
156155
}

resources/js/tool.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,35 @@
11
import ColumnToggler from './components/ColumnToggler.vue'
2-
import { registerMixin } from './components/ColumnToggler'
3-
import { createVNode, render } from 'vue'
2+
import {registerMixin} from './components/ColumnToggler'
3+
import {createVNode, render} from 'vue'
44

55
try {
66

7-
registerMixin(Nova.pages[ 'Nova.Lens' ].components[ 'ResourceLens' ])
7+
const page = Nova.pages['Nova.Lens']
8+
if (!page || typeof page.setup !== 'function') {
9+
throw new Error('Nova.Lens page or setup function not found');
10+
}
11+
12+
const originalSetup = page.setup;
813

9-
} catch {
14+
page.setup = (...args) => {
15+
const result = originalSetup(...args);
1016

11-
console.error('ColumnToggler: Unable to register mixin for Lens view')
17+
if (typeof result === 'function') {
18+
return (...renderArgs) => {
19+
const vnode = result(...renderArgs);
20+
if (vnode.type?.name === 'Lens') {
21+
registerMixin(vnode.type);
22+
}
23+
24+
return vnode;
25+
};
26+
}
27+
28+
console.warn('Setup did not return a render function');
29+
return result;
30+
};
31+
} catch (e) {
32+
console.error('ColumnToggler: Unable to register mixin for Lens view', e)
1233

1334
}
1435

@@ -17,7 +38,6 @@ Nova.booting(app => {
1738
const componentFn = app.component
1839

1940
app.component = function (name, component) {
20-
2141
if (name === 'ResourceIndex') {
2242
registerMixin(component)
2343
}
@@ -40,11 +60,11 @@ Nova.booting(app => {
4060
let target
4161

4262
if (relationship) {
43-
target = `[dusk="${ resourceName }-index-component"][data-relationship="${ relationship }"] div.h-9.ml-auto.flex.items-center.pr-2.md\\:pr-3 > div.hidden.md\\:flex.px-2`
63+
target = `[dusk="${resourceName}-index-component"][data-relationship="${relationship}"] div.h-9.ml-auto.flex.items-center.pr-2.md\\:pr-3 > div.hidden.md\\:flex.px-2`
4464
} else if (this.isLensView) {
45-
target = `[dusk="${ resourceName }-lens-component"] div.h-9.ml-auto.flex.items-center.pr-2.md\\:pr-3 > div.hidden.md\\:flex.px-2`
65+
target = `[dusk="${resourceName}-lens-component"] div.h-9.ml-auto.flex.items-center.pr-2.md\\:pr-3 > div.hidden.md\\:flex.px-2`
4666
} else {
47-
target = `[dusk="${ resourceName }-index-component"] div.h-9.ml-auto.flex.items-center.pr-2.md\\:pr-3 > div.hidden.md\\:flex.px-2`
67+
target = `[dusk="${resourceName}-index-component"] div.h-9.ml-auto.flex.items-center.pr-2.md\\:pr-3 > div.hidden.md\\:flex.px-2`
4868
}
4969

5070
const element = this._.vnode.el.querySelector(target)
@@ -53,7 +73,7 @@ Nova.booting(app => {
5373

5474
element.insertAdjacentElement('afterend', container)
5575

56-
const vnode = createVNode(ColumnToggler, { tableToolbar: this })
76+
const vnode = createVNode(ColumnToggler, {tableToolbar: this})
5777
vnode.appContext = app._context
5878

5979
render(vnode, container)

0 commit comments

Comments
 (0)