Marmelab Blog

Ng-admin 0.6: Adding Support for Custom Types

ng-admin 0.6, released today, adds a couple of backwards compatible features, including a major change to the Configuration API: Factories.

Up to now, you used to add fields to entities by directly instanciating Field objects:

app.config(function (NgAdminConfigurationProvider, Application, Entity, Field) {
    var admin = new Application('my admin');
    var post = new Entity('posts');
    post.listView().fields([
        new Field('title'),
        new Field('published_at').type('date'),
        new Field('body').type('wysiwyg')
    ]);
}

Starting with 0.6, you have to use the factory functions provided by NgAdminConfigurationProvider:

app.config(function (NgAdminConfigurationProvider) {
    var nga = NgAdminConfigurationProvider;
    var admin = nga.application('my admin');
    var post = nga.entity('posts');
    post.listView().fields([
        nga.field('title'),
        nga.field('published_at', 'date'),
        nga.field('body', 'wysiwyg')
    ]);
}

nga.field() takes two parameters (name and type); calling .type() on an existing field isn't supported anymore.

And references are fields, too. Instead of new Reference(), new ReferenceMany(), and new ReferencedList(), use nga.field(name, type) with the type reference, reference_many, and referenced_list:

// replace
post.listView().fields([
    new ReferenceMany('tags')
        .targetEntity(tag)
        .targetField(nga.field('name'))
]);
comment.listView().fields([
    new Reference('post_id')
        .label('Post')
        .targetEntity(post)
        .targetField(nga.field('title').map(truncate))
])

// by
post.listView().fields([
    nga.field('tags', 'reference_many')
        .targetEntity(tag)
        .targetField(nga.field('name'))
]);
comment.listView().fields([
    nga.field('post_id', 'reference')
        .label('Post')
        .targetEntity(post)
        .targetField(nga.field('title').map(truncate))
])

The documentation and demo were updated to reflect this change.

Usage of the old configuration API (with direct calls to new Field(), new Reference(), new ReferenceMany(), and new ReferencedList()) is deprecated. Support for this old syntax will be removed in 0.7.

This change allows you to override the way a given field is rendered, and even to create new field types.

In addition, ng-admin 0.6 allows to filter Reference results:

nga.field('post_id', 'reference')
   .targetEntity(nga.entity('post'))
   .targetField(nga.field('title', 'string')))
   .filters({ 'is_published': true })

There are many other changes listed in the Changelog.