Skip to content

Commit d5fc9a9

Browse files
author
phoenix
committed
feature -- ability to use package as field without relations, as example with package whitecube/nova-flexible-content
1 parent 12eab70 commit d5fc9a9

File tree

6 files changed

+87
-41
lines changed

6 files changed

+87
-41
lines changed

dist/js/field.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.

package-lock.json

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

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ Here are a few customization options
6464
- `->withAlwaysOpen(bool $alwaysOpen)` // - by default select is open, but you can change it behavior
6565
- `->withFlatten(bool $flatten)` // - by default flatten is enabled, but you can change it behavior
6666
- `->useSingleSelect()` // - ability for select only one value
67+
- `->useAsField()` // - ability to write result to field without relations
6768

6869

6970
### Authorization

resources/js/components/DetailField.vue

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,45 @@
44
<div v-for="(value, index) in field.value" :style="{
55
'marginTop': index === 0 ? '0' : '6px'
66
}">
7-
{{ value[field.labelKey] }}
7+
<template v-if="!field.useAsField">
8+
{{ value[field.labelKey] }}
9+
</template>
10+
<template v-else-if="items[value]">
11+
{{items[value][field.labelKey]}}
12+
</template>
813
</div>
914
</template>
1015
</panel-item>
1116
</template>
1217

1318
<script>
1419
export default {
15-
props: ['resourceName', 'resourceId', 'field']
20+
props: ['resourceName', 'resourceId', 'field'],
21+
mounted() {
22+
if(this.field.useAsField) {
23+
for( let item of this.field.options ) {
24+
this.treeFlatten(item);
25+
}
26+
}
27+
},
28+
data(){
29+
return {
30+
items : {}
31+
}
32+
},
33+
methods: {
34+
treeFlatten(node) {
35+
36+
this.$set(this.items, node[this.field.idKey], node);
37+
38+
let items = node[this.field.childrenKey];
39+
40+
if(Array.isArray(items) && items.length > 0 ) {
41+
for( let item of items ) {
42+
this.treeFlatten(item)
43+
}
44+
}
45+
}
46+
}
1647
}
1748
</script>

resources/js/components/FormField.vue

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -55,41 +55,47 @@ export default {
5555
},
5656
setInitialValue()
5757
{
58-
59-
let baseUrl = '/nova-vendor/nova-nested-tree-attach-many/';
60-
61-
if( this.resourceId )
58+
if(this.field.useAsField)
6259
{
63-
const url = [
64-
baseUrl + this.resourceName,
65-
this.resourceId,
66-
'attached',
67-
this.field.attribute,
68-
this.field.idKey
69-
];
70-
71-
Nova.request( url.join('/') )
72-
.then( ( data ) => {
73-
74-
if(!this.field.multiple)
75-
{
76-
this.selectedValues = data.data || undefined;
77-
}
78-
else
79-
{
80-
this.selectedValues = data.data || [];
81-
}
82-
} );
60+
this.selectedValues = this.field.value;
8361
}
8462
else
8563
{
86-
if(!this.field.multiple)
64+
let baseUrl = '/nova-vendor/nova-nested-tree-attach-many/';
65+
66+
if( this.resourceId )
8767
{
88-
this.selectedValues = undefined;
68+
const url = [
69+
baseUrl + this.resourceName,
70+
this.resourceId,
71+
'attached',
72+
this.field.attribute,
73+
this.field.idKey
74+
];
75+
76+
Nova.request( url.join('/') )
77+
.then( ( data ) => {
78+
79+
if(!this.field.multiple)
80+
{
81+
this.selectedValues = data.data || undefined;
82+
}
83+
else
84+
{
85+
this.selectedValues = data.data || [];
86+
}
87+
} );
8988
}
9089
else
9190
{
92-
this.selectedValues = [];
91+
if(!this.field.multiple)
92+
{
93+
this.selectedValues = undefined;
94+
}
95+
else
96+
{
97+
this.selectedValues = [];
98+
}
9399
}
94100
}
95101
},

src/NestedTreeAttachManyField.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,13 @@ public function __construct($name, $attribute = null, $resource = null)
3737
$this->manyToManyRelationship = $this->attribute;
3838

3939
$this->fillUsing(function($request, $model, $attribute, $requestAttribute) use($resource) {
40-
if(is_subclass_of($model, 'Illuminate\Database\Eloquent\Model')) {
40+
41+
if($this->meta['useAsField'] === true)
42+
{
43+
$model->{$attribute} = json_decode($request->{$attribute}, true);
44+
}
45+
else if(is_subclass_of($model, 'Illuminate\Database\Eloquent\Model'))
46+
{
4147
$model::saved(function($model) use($attribute, $request) {
4248

4349
$factory = App::make(RelationHandlerFactory::class);
@@ -65,7 +71,8 @@ public function __construct($name, $attribute = null, $resource = null)
6571
'disabled' => false,
6672
'rtl' => false,
6773
'maxHeight' => 500,
68-
'isActiveFalse' => false
74+
'isActiveFalse' => false,
75+
'useAsField' => false,
6976
]);
7077

7178
if(!App::make(NovaRequest::class)->isResourceIndexRequest()){
@@ -199,6 +206,15 @@ public function useSingleSelect(): NestedTreeAttachManyField
199206
return $this;
200207
}
201208

209+
public function useAsField(): NestedTreeAttachManyField
210+
{
211+
$this->withMeta([
212+
'useAsField' => true,
213+
]);
214+
215+
return $this;
216+
}
217+
202218
public function authorize(Request $request)
203219
{
204220
if(! $this->resourceClass::authorizable()) {

0 commit comments

Comments
 (0)