Form Widget API =============== Scripting Forms ---------------- Custom scripts can be written in forms by writing events in "Client Script" / "Client Script Core" in the DocType. Some conventions for writing client scripts * All functions should be written in the namespace `cur_frm.cscript`. This namespace is set aside for customized client scripts * `cur_frm` is the global variable that represents the Current Form that is open. See Examples Form Container Class -------------------- .. data:: _f Namespace for the Form Widget .. data:: _f.frm_con Global FrmContainer. There is only one instance of the Form Container .. function:: _f.get_value(dt, dn, fn) Returns the value of the field `fn` from DocType `dt` and name `dn` .. function:: _f.get_value(dt, dn, fn, v) Sets value `v` in the field `fn` of the give `dt` and `dn` * Will also set the record as __unsaved = 1 * Will refresh the display so that the record is set as "Changes are not saved" .. class:: _f.FrmContainer This is the object that contains all Forms. The Form Container contains the page header and Form toolbar that is refreshed whenever a new record is shown. .. attribute:: head Element representing the header of the form. .. attribute:: body Element represnting the page body .. method:: show_head() Show the head element .. method:: hide_head() Show the head element .. method:: add_frm(doctype, onload, opt_name) Called internally by :func:`loaddoc`. Adds a new Form of type `doctype` in the FrmContainer. Form Class ---------- .. class:: _f.Frm Each doctype has a Frm object. When records are loaded on the Frm object, fields inside the form are refreshed .. attribute:: doctype `doctype` of the current form .. attribute:: docname `name` of the current record .. attribute:: fields List of all `Field` objects in the form .. attribute:: fields_dict Dictionary of all `Field` objects in the form, identified by the `fieldname` or `label` (if no fieldname) exists .. attribute:: sections List of all sections known by section id (`sec_id`). (Id because Sections may not have headings / labels) .. attribute:: sections_by_label Dictionary of all sections by label. This can be used to switch to a particular section. Example:: cur_frm.set_section(cur_frm.sections_by_label['More Details'].sec_id); .. method:: show() Show the form .. method:: hide() Hide the form .. method:: sec_section(sec_id) Show the section identified by .. method:: refresh() Refresh the current form. It will * Check permission * If the record is changed, load the new record data * Run 'refresh' method * Refresh all fields * Show the form .. method:: refresh_fields() Will refresh all fields .. method:: refresh_dependancy() Will refresh hide / show based on 'depends_on' .. method:: save(save_action, call_back) Will save the current record (function called from the "Save" button) save_action can be `Save`, `Submit`, `Cancel` .. method:: print_doc() Show the `Print` dialog .. method:: email_doc() Shows the `Email` dialog .. method:: copy_doc() Copy the current record .. method:: reload_doc() Reload the current record from the server .. method:: amend_doc() Amend the current Cancelled record .. method:: check_required(dt, dn) Checks whether all mandatory fields are filled .. method:: runscript(scriptname, callingfield, onrefresh) Run a server-side script where Trigger is set as `Server`. The server method is identified by `scriptname` .. method:: runclientscript(caller, cdt, cdn) Run a client script identified by the calling fieldname `caller`. `cdt` and `cdn` are the id of the calling `DocType and `name` .. method:: set_tip(txt) Clear existing tips and set a new tip (contextual help) in the Form .. method:: append_tip(txt) Add another tip to the existing tips .. method:: clear_tip() Clear all tips Field Class ----------- .. class:: _f.Field() .. attribute:: df the `df` attribute represents the Field data. Standard Field properties are * fieldname * fieldtype * options * permlevel * description * reqd * hidden * search_index Example:: var field = cur_frm.fields_dict['first_name'] field.df.reqd = 1; field.refresh(); .. attribute:: wrapper Wrapping DIV Element .. attribute:: label_area HTML Element where the label of the field is printed .. attribute:: disp_area HTML Element where the value of the field is printed in "Read" mode .. attribute:: input_area HTML Element where the widget is placed in "Write" mode .. attribute:: comment_area HTML Element where the comment (description) is printed .. attribute:: parent_section If the `section_style` of the doctype is `Tray` or `Tabbed`, then this represents the SectionBreak object in which this field is. This is used to switch to the section in case of an error. .. method:: get_status() Retuns the whether the field has permission to `Read`, `Write` or `None` .. method:: set(v) Sets a value to the field. Value is set in `locals` and the widget .. method:: run_trigger() Runs any client / server triggers. Called `onchange` Grid Class ---------- .. class:: _f.FormGrid() The FromGrid Class inherits from the Grid class. The Grid class was designed to be a generic INPUT. * The metadata of the grid is defined by the `DocType` of the `Table` field. * Each column of the grid represents a field. * Each row of the grid represents a record **Grid Types** There are two type of Grids: #. Standard: Where fields can be edited within the cell #. Simple: Where fields are edited in a popup Dialog box. A Simple Grid can be created by setting the `default` property of the Table field to "Simple" When the user clicks on an editable Grid cell, it adds an `Field` object of that particular column to the cell so that the user can edit the values inside the cell. This `Field` object is known as the `template` The `template` can be accessed by the `get_field` method .. method:: get_field(fieldname) Returns the `template` (`Field` object) identified by `fieldname` .. method:: refresh() Refresh all data in the Grid Examples --------