javascriptangularjsng-admin

ng-admin does not recognize custom field view


I'm using ng-admin.
According to doc, I created a custom field.
ng-admin recognize the FooFiledType but it dosn't render the FoofieldView and use the original FieldView !

config module :

angular.module('admin', ['ng-admin']);

import FooField from './FooFieldType';

angular.module('admin')
  .config(['NgAdminConfigurationProvider', function (nga) {
    nga.registerFieldType('foo', FooField);
  }])
  .config(['FieldViewConfigurationProvider', function (fvp) {
    fvp.registerFieldView('foo', require('./FooFieldView'));
  }])
  ;
angular.module('admin').config(['NgAdminConfigurationProvider', function (nga) {
   var bar = nga.entity('bar');
   bar.creationView().fields([nga.field('foo','foo')]);
});

FooField.js :

import Field from 'admin-config/lib/Field/Field';
class FooField extends Field {
  constructor(name) {
    super(name);
  }
}
export default FooField;

FooFieldView.js :

export default {
  // displayed in listView and showView
  getReadWidget   : () => '<ma-number-column field="::field" value="::entry.values[field.name()]"></ma-number-column>',
  // displayed in listView and showView when isDetailLink is true
  getLinkWidget   : () => '<a ng-click="gotoDetail()">' + module.exports.getReadWidget() + '</a>',
  // displayed in the filter form in the listView
  getFilterWidget : () => '<ma-input-field type="number" field="::field" value="values[field.name()]"></ma-input-field>',
  // displayed in editionView and creationView
  getWriteWidget  : () => '<h1>testFoo</h1><ma-input-field type="number" field="::field" value="entry.values[field.name()]"></ma-input-field>'
};

Solution

  • Doc seems incomplete... but I've narrowed it down to a missing 'this._type' setting into the Field. You need to change FooField.js as follows:

    ....
    class FooField extends Field {
      constructor(name) {
        super(name);
        //THIS IS THE IMPORTANT PART:
        this._type = 'foo';
        //DOC DOESN'T SPEAK ABOUT
      }
    }
    ....
    

    When you define _type in the FooField class then the view according to type is called and therefore rendered. Else since we are inheriting from 'Field' the String view is rendered and it seems like nothing works...

    Doc really needs to get some update :)