ng-admin
ng-admin copied to clipboard
embedded_list reference fields do not work
I have an edit view with an embedded list field that has sub-fields of reference type and they do not work properly. There is no call to the rest api asking for the list in this example.
nga.field('editResultsId', 'embedded_list')
.label('Edit Results')
.targetFields([
nga.field('fileSystemId', 'reference')
.label('File System')
.targetEntity(file)
.targetField(nga.field('name'))
.validation({ required: true }),
Hi, which version of ng-admin are you using? This has been added to 0.9.
I'm using 0.9, just did a fresh pull too
For clarification, it's the fileSystem reference child on this embedded list entity that does not populate. is this a bug?
Ah ok, now I get it: it's the file dropdown that is empty, is that it? Then it's just not implemented yet.
Yes, that's the issue.
+1 would be very helpful indeed!
Just stumbled over the same problem with reference_many inside a embedded_list.
I am not sure this is the same problem. I am trying to reference a object with nested ids. Maybe someone can help?
Object with nested references:
{"user":
"id": 1,
"orders": [
{"order_id: 100},
{"order_id": 101}
]
}
The code below returns the following error
(state change error: e.targetField(...).name is not a function)
user.showView().fields([
nga.field('orders.id', 'reference_many')
.targetEntity(order)
.targetField('id')
]);
(BTW, great project! Having an admin tool that works against the backend-logic instead of directly to the DB is truly cool).
+1 seriously need! is there any workaround?
@NadavK I don't have a solution for the opened issue (which I also need solved). But your error is because you don't have targetField('id') in a field definition: targetField(nga.field('id')) I think.
+1 need it too, would be really great :)
Some notes from my duplicate over at #1145 (sorry, closed now!)
I can confirm this is still an issue in 1.0.0-alpha4
showViewdoes not perform any retrievals ofreferenceobjects for renderingcreationViewandeditionViewboth load listings and perform remote completion as expectededitionViewdoes not retrieve thereferenceobject for rendering. However if the object is returned in the listing of objects used to render the dropdown, this does work as expected.
I had a quick look at this today but wasn't able to make much progress - had to figure out how things hang together. Leaving some notes as @etdev was keen to look at this also.
Crud/routing.js creates a bunch of ui-router resolve definitions based on the model coming out of the admin-config library.
It looks like lib/Utils/ReferenceExtractor in admin-config is the culprit, it only looks at the top level object and doesn't traverse complex fields.
Took a quick stab at fixing this but I've run out of time to look at it this week and it doesn't work.
Here's the code so far, it's a recursive function to find all the reference fields during a call to getReferences.
let find_references = function(fields, recurse_func) {
let result = new Array();
fields.forEach(function(field, idx) {
if( field.type() === 'reference' || f.type() === 'reference_many' ) {
result.push(field);
} else if( field.type() === 'embedded_list' ) {
result.push( recurse_func( field.fields(), recurse_func ) );
}
});
return result;
};
let references = find_references(fields,find_references);
Cheers :)
Any news on this? I ran into the same issue...
Same problem.
It seems that the referenced entity is not requested according to the Network tab of chrome Developer tool.
WORKAROUND -- While waiting for the pull-request to be completed, I found an easy workaround. Just add the same reference field to your top level object (make it hidden, non-editable, not required). As long as you use the same object in .targetEntity() in both the top level and embedded, you will get a populated list. Below I just used an empty label and non-editable field, but you can use CSS to hide the field row as well.
`
var wtEntity = nga.entity('webapp_templates');
var embeddedFields = [
nga.field('webapp_template', 'reference')
.targetEntity(wtEntity)
.validation({required: true})
.targetField(nga.field('context_name'))
.detailLinkRoute('show'),
... //Other embedded fields
];
var parentFields = [
nga.field('webapps', 'embedded_list')
.targetFields(embeddedWebappsFields),
... //Other parent fields
nga.field('webapp_template', 'reference') //Workaround for reference in embedded list
.targetEntity(wtEntity) //Same entity object, not just another entity with the same name
.editable(false) //non-editable keeps the control from showing
.label('') //no label
.validation({required: false}) //not required so it won't error
.targetField(nga.field('context_name')), //not sure this is needed, but I left it
];
`
I found a further problem with reference fields. I followed jbrownD's instructions and they worked great. However I found if I have a bad reference (e.g I have web app templates 1,2,3 but I have a reference to template 4) I get empty lists for all the dropdown lists on my page (even the "good" ones) and I get a traceback: Error: undefined is not an object (evaluating 'e.values') http://localhost:3000/asset/ng-admin.min.js:15:14427 It's easily resolved by making sure there are no referential integrity issues in the data, but it's one thing to look out for
This just worked for me:
nga.field('products', 'embedded_list')
.label('Product in Discount')
.targetFields([
nga.field('product', 'reference')
.label('Product')
.targetEntity(admin.getEntity('products'))
.targetField(nga.field('name'))
.singleApiCall(ids => ({'_id': ids }))
.remoteComplete(true),
The singleApiCall can be ommited I think, because it's just for MongoDB.
I tried to fix it by this PR https://github.com/marmelab/admin-config/pull/75
is there any solution for this issue ??