Skip to content

Commit 4f17bf6

Browse files
author
Franz Wilding
committed
fix [AdminBundle] View filtering
1 parent 6cb094b commit 4f17bf6

File tree

12 files changed

+222
-148
lines changed

12 files changed

+222
-148
lines changed

config/unite/default/admin.graphql

+9-9
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ fragment intro on Query @dashboardAdminView(name: "Intro", icon: "home") {
77

88
fragment categories on DemoCategory @tableAdminView(titlePattern: "Category {{name}}", actions: {
99
create: true
10-
toggle_delete: false
11-
filter: false
12-
update: false
13-
delete: false
14-
translate: false
15-
revert: false
16-
recover: false
17-
permanent_delete: false
18-
user_invite: false
10+
toggle_delete: true
11+
filter: true
12+
update: true
13+
delete: true
14+
translate: true
15+
revert: true
16+
recover: true
17+
permanent_delete: true
18+
user_invite: true
1919
}) {
2020
name @adminField(inlineCreate: true)
2121
articles {

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/Checkbox.vue

+8-3
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616
1717
// static filter method
1818
filter(field, view, unite) {
19-
return {
19+
20+
// If this is an alias field
21+
if(field.id !== field.type) {
22+
return []
23+
}
24+
25+
return [{
2026
searchable: false,
2127
id: field.id,
2228
label: field.name.slice(0, 1).toUpperCase() + field.name.slice(1),
2329
operators: ['IS'],
24-
cast: 'BOOLEAN',
2530
input: CheckboxInput
26-
};
31+
}];
2732
},
2833
2934
components: {Icon}

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/Choice.vue

+21-3
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,38 @@
99
<script>
1010
import _abstract from "./_abstract";
1111
import SelectInput from "../../Views/Filter/Input/SelectInput";
12+
import TextInput from "../../Views/Filter/Input/TextInput";
1213
1314
export default {
1415
extends: _abstract,
1516
17+
// static abstract filter method
18+
filter(field, view, unite) {
19+
20+
// If this is an alias field
21+
if(field.id !== field.type) {
22+
return []
23+
}
24+
25+
return [{
26+
searchable: true,
27+
id: field.id,
28+
label: field.name.slice(0, 1).toUpperCase() + field.name.slice(1),
29+
operators: ['EQ', 'NEQ', 'CONTAINS', 'NCONTAINS'],
30+
input: TextInput
31+
}];
32+
},
33+
1634
// static filter method
1735
filter(field, view, unite) {
1836
1937
let enumType = unite.getRawType(field.returnType);
2038
2139
if(!enumType) {
22-
return false;
40+
return [];
2341
}
2442
25-
return {
43+
return [{
2644
searchable: false,
2745
id: field.id,
2846
label: field.name.slice(0, 1).toUpperCase() + field.name.slice(1),
@@ -33,7 +51,7 @@
3351
return {label: value.description, value: value.name}
3452
})
3553
},
36-
};
54+
}];
3755
},
3856
3957
methods: {

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/Float.vue

+9-5
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313
extends: _abstract,
1414
1515
// static filter method
16-
filter(field, view, unite) { return Object.assign(_abstract.filter(field, view, unite), {
17-
operators: ['EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'],
18-
cast: 'FLOAT',
19-
input: TextInput
20-
}); },
16+
filter(field, view, unite) {
17+
return _abstract.filter(field, view, unite).map((filter) => {
18+
return Object.assign(filter, {
19+
searchable: false,
20+
operators: ['EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'],
21+
input: TextInput
22+
})
23+
});
24+
},
2125
}
2226
</script>

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/Id.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
export default {
1212
extends: _abstract,
1313
14-
// static filter method
15-
filter(field, view, unite) { return _abstract.filter(field, view, unite); },
14+
// static filter method
15+
filter(field, view, unite) { return _abstract.filter(field, view, unite); },
1616
}
1717
</script>
1818
<style scoped lang="scss">

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/Integer.vue

+9-5
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313
extends: _abstract,
1414
1515
// static filter method
16-
filter(field, view, unite) { return Object.assign(_abstract.filter(field, view, unite), {
17-
operators: ['EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'],
18-
cast: 'INT',
19-
input: TextInput
20-
}); },
16+
filter(field, view, unite) {
17+
return _abstract.filter(field, view, unite).map((filter) => {
18+
return Object.assign(filter, {
19+
searchable: false,
20+
operators: ['EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'],
21+
input: TextInput
22+
})
23+
});
24+
},
2125
}
2226
</script>
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,96 @@
11
<template>
2-
<div>
3-
<div v-for="value in values">
4-
<template v-for="nestedField in nestedFields(value)">
5-
<component :is="$unite.getListFieldType(nestedField)" :field="nestedField" :row="value" />
6-
</template>
2+
<div>
3+
<div v-for="value in values">
4+
<template v-for="nestedField in nestedFields(value)">
5+
<component :is="$unite.getListFieldType(nestedField)" :field="nestedField" :row="value" />
6+
</template>
7+
</div>
78
</div>
8-
</div>
99
</template>
1010
<script>
11-
import _abstract from "./_abstract";
12-
import { getAdminViewByType } from "../../../plugins/unite";
11+
import _abstract from "./_abstract";
12+
import { getAdminViewByType } from "../../../plugins/unite";
13+
import CheckboxInput from "../../Views/Filter/Input/CheckboxInput";
1314
14-
export default {
15-
extends: _abstract,
16-
computed: {
17-
referencedView() {
18-
return getAdminViewByType(this.$unite, this.field.returnType);
19-
}
20-
},
21-
methods: {
22-
nestedFields(value) {
23-
return Object.keys(value).map((key) => {
24-
return key === '__typename' ? null : this.fieldComponent(key, value.__typename)
25-
}).filter((field) => { return !!field });
26-
},
27-
fallbackField(key) {
28-
let type = 'unknown';
15+
export default {
2916
30-
if(key === 'id') {
31-
type = 'id';
32-
}
17+
// static filter method
18+
filter(field, view, unite) {
3319
34-
return {
35-
type: type,
36-
id: key,
37-
};
38-
},
20+
// If this is an alias field
21+
if(field.id !== field.type) {
22+
return []
23+
}
3924
40-
referencedRowView(type) {
25+
let referencedView = getAdminViewByType(unite, field.returnType);
26+
let referencedFilterRules = [];
27+
referencedView.fields.forEach((field) => {
28+
if(field.fieldType !== 'reference' && field.fieldType !== 'embedded') {
29+
let component = unite.getListFieldType(field);
30+
if(component.filter) {
31+
referencedFilterRules = [...referencedFilterRules, ...component.filter(field, view, unite)];
32+
}
33+
}
34+
});
4135
42-
if(!this.referencedView) {
43-
return null;
44-
}
36+
return referencedFilterRules.map((rule) => {
37+
rule.path = rule.id;
38+
rule.id = field.id;
39+
rule.label = field.name.slice(0, 1).toUpperCase() + field.name.slice(1) + ' » ' + rule.label;
40+
return rule;
41+
});
42+
},
4543
46-
if(this.referencedView.category === 'union') {
47-
let views = this.referencedView.possibleViews.filter((view) => { return view.type === type; });
48-
return views.length > 0 ? views[0] : null;
49-
}
44+
extends: _abstract,
45+
computed: {
46+
referencedView() {
47+
return getAdminViewByType(this.$unite, this.field.returnType);
48+
}
49+
},
50+
methods: {
51+
nestedFields(value) {
52+
return Object.keys(value).map((key) => {
53+
return key === '__typename' ? null : this.fieldComponent(key, value.__typename)
54+
}).filter((field) => { return !!field });
55+
},
56+
fallbackField(key) {
57+
let type = 'unknown';
5058
51-
return this.referencedView;
52-
},
59+
if(key === 'id') {
60+
type = 'id';
61+
}
5362
54-
fieldComponent(key, type) {
63+
return {
64+
type: type,
65+
id: key,
66+
};
67+
},
5568
56-
if(!this.referencedView) {
57-
return this.fallbackField(key);
58-
}
59-
let referencedField = this.referencedRowView(type).fields.filter((field) => {
60-
return field.id === key;
61-
});
69+
referencedRowView(type) {
6270
63-
return referencedField.length > 0 ? referencedField[0] : this.fallbackField(key);
64-
}
65-
}
66-
}
71+
if(!this.referencedView) {
72+
return null;
73+
}
74+
75+
if(this.referencedView.category === 'union') {
76+
let views = this.referencedView.possibleViews.filter((view) => { return view.type === type; });
77+
return views.length > 0 ? views[0] : null;
78+
}
79+
80+
return this.referencedView;
81+
},
82+
83+
fieldComponent(key, type) {
84+
85+
if(!this.referencedView) {
86+
return this.fallbackField(key);
87+
}
88+
let referencedField = this.referencedRowView(type).fields.filter((field) => {
89+
return field.id === key;
90+
});
91+
92+
return referencedField.length > 0 ? referencedField[0] : this.fallbackField(key);
93+
}
94+
}
95+
}
6796
</script>

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/Sequence.vue

+9-5
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313
extends: _abstract,
1414
1515
// static filter method
16-
filter(field, view, unite) { return Object.assign(_abstract.filter(field, view, unite), {
17-
operators: ['EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'],
18-
cast: 'INT',
19-
input: TextInput
20-
}); },
16+
filter(field, view, unite) {
17+
return _abstract.filter(field, view, unite).map((filter) => {
18+
return Object.assign(filter, {
19+
searchable: false,
20+
operators: ['EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'],
21+
input: TextInput
22+
})
23+
});
24+
},
2125
}
2226
</script>

src/Bundle/AdminBundle/Resources/assets/vue/components/Fields/List/_abstract.vue

+8-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
77
// static abstract filter method
88
filter(field, view, unite) {
9-
return {
9+
10+
// If this is an alias field
11+
if(field.id !== field.type) {
12+
return []
13+
}
14+
15+
return [{
1016
searchable: true,
1117
id: field.id,
1218
label: field.name.slice(0, 1).toUpperCase() + field.name.slice(1),
1319
operators: ['EQ', 'NEQ', 'CONTAINS', 'NCONTAINS'],
1420
input: TextInput
15-
};
21+
}];
1622
},
1723
1824
props: {

0 commit comments

Comments
 (0)