In Frappe.js you can extend the document class for a particular DocType which we call controllers.

You can write event handlers in controllers, by declaring a .js file in the models/doctype/ folder along with the model file.

You must also bind the controller to the model file by the documentClass property.

Document Controller:

You can bind events to the controller that will be called when an action is completed on a document or its property.

The document controller represents a single record and is subclassed from the frappe.document.Document class.

const frappe = require('frappejs');

// extend the document and add event handlers
class ToDo extends frappe.document.Document {
    validate() {
        if (!this.status) {
            this.status = 'Open';

Controller Events:

Standard events on which you can bind handlers are:

  • beforeInsert
  • beforeUpdate
  • validate (called before any write)
  • afterInsert
  • afterUpdate (called after any write)
  • beforeSubmit
  • afterSubmit
  • beforeCancel
  • afterCancel
  • beforeDelete
  • afterDelete