[IMP] move openerp.base.Widget to relevant section of the actual dogs (as a guide), remove old manual openerp.base.Widget APIDoc
bzr revid: xmo@openerp.com-20110812103643-2ew32jiqdsm71jqe
This commit is contained in:
parent
4e5f4bd565
commit
d6074e6619
|
@ -772,8 +772,8 @@ class View(openerpweb.Controller):
|
||||||
""" Parses an arbitrary string containing a domain, transforms it
|
""" Parses an arbitrary string containing a domain, transforms it
|
||||||
to either a literal domain or a :class:`openerpweb.nonliterals.Domain`
|
to either a literal domain or a :class:`openerpweb.nonliterals.Domain`
|
||||||
|
|
||||||
:param domain: the domain to parse, if the domain is not a string it is assumed to
|
:param domain: the domain to parse, if the domain is not a string it
|
||||||
be a literal domain and is returned as-is
|
is assumed to be a literal domain and is returned as-is
|
||||||
:param session: Current OpenERP session
|
:param session: Current OpenERP session
|
||||||
:type session: openerpweb.openerpweb.OpenERPSession
|
:type session: openerpweb.openerpweb.OpenERPSession
|
||||||
"""
|
"""
|
||||||
|
@ -789,8 +789,8 @@ class View(openerpweb.Controller):
|
||||||
""" Parses an arbitrary string containing a context, transforms it
|
""" Parses an arbitrary string containing a context, transforms it
|
||||||
to either a literal context or a :class:`openerpweb.nonliterals.Context`
|
to either a literal context or a :class:`openerpweb.nonliterals.Context`
|
||||||
|
|
||||||
:param context: the context to parse, if the context is not a string it is assumed to
|
:param context: the context to parse, if the context is not a string it
|
||||||
be a literal domain and is returned as-is
|
is assumed to be a literal domain and is returned as-is
|
||||||
:param session: Current OpenERP session
|
:param session: Current OpenERP session
|
||||||
:type session: openerpweb.openerpweb.OpenERPSession
|
:type session: openerpweb.openerpweb.OpenERPSession
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -373,59 +373,6 @@ openerp.base.SessionAware = openerp.base.Class.extend({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for all visual components. Provides a lot of functionalities helpful
|
|
||||||
* for the management of a part of the DOM.
|
|
||||||
*
|
|
||||||
* Widget handles:
|
|
||||||
* - Rendering with QWeb.
|
|
||||||
* - Life-cycle management and parenting (when a parent is destroyed, all its children are
|
|
||||||
* destroyed too).
|
|
||||||
* - Insertion in DOM.
|
|
||||||
*
|
|
||||||
* Widget also extends SessionAware for ease of use.
|
|
||||||
*
|
|
||||||
* Guide to create implementations of the Widget class:
|
|
||||||
* ==============================================
|
|
||||||
*
|
|
||||||
* Here is a sample child class:
|
|
||||||
*
|
|
||||||
* MyWidget = openerp.base.Widget.extend({
|
|
||||||
* // the name of the QWeb template to use for rendering
|
|
||||||
* template: "MyQWebTemplate",
|
|
||||||
* // identifier prefix, it is useful to put an obvious one for debugging
|
|
||||||
* identifier_prefix: 'my-id-prefix-',
|
|
||||||
*
|
|
||||||
* init: function(parent) {
|
|
||||||
* this._super(parent);
|
|
||||||
* // stuff that you want to init before the rendering
|
|
||||||
* },
|
|
||||||
* start: function() {
|
|
||||||
* this._super();
|
|
||||||
* // stuff you want to make after the rendering, `this.$element` holds a correct value
|
|
||||||
* this.$element.find(".my_button").click(/* an example of event binding * /);
|
|
||||||
*
|
|
||||||
* // if you have some asynchronous operations, it's a good idea to return
|
|
||||||
* // a promise in start()
|
|
||||||
* var promise = this.rpc(...);
|
|
||||||
* return promise;
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* Now this class can simply be used with the following syntax:
|
|
||||||
*
|
|
||||||
* var my_widget = new MyWidget(this);
|
|
||||||
* my_widget.appendTo($(".some-div"));
|
|
||||||
*
|
|
||||||
* With these two lines, the MyWidget instance was inited, rendered, it was inserted into the
|
|
||||||
* DOM inside the ".some-div" div and its events were binded.
|
|
||||||
*
|
|
||||||
* And of course, when you don't need that widget anymore, just do:
|
|
||||||
*
|
|
||||||
* my_widget.stop();
|
|
||||||
*
|
|
||||||
* That will kill the widget in a clean way and erase its content from the dom.
|
|
||||||
*/
|
|
||||||
openerp.base.Widget = openerp.base.SessionAware.extend({
|
openerp.base.Widget = openerp.base.SessionAware.extend({
|
||||||
/**
|
/**
|
||||||
* The name of the QWeb template that will be used for rendering. Must be
|
* The name of the QWeb template that will be used for rendering. Must be
|
||||||
|
|
|
@ -113,6 +113,98 @@ initializing the addon.
|
||||||
Creating new standard roles
|
Creating new standard roles
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
Widget
|
||||||
|
++++++
|
||||||
|
|
||||||
|
This is the base class for all visual components. It provides a number of
|
||||||
|
services for the management of a DOM subtree:
|
||||||
|
|
||||||
|
* Rendering with QWeb
|
||||||
|
|
||||||
|
* Parenting-child relations
|
||||||
|
|
||||||
|
* Life-cycle management (including facilitating children destruction when a
|
||||||
|
parent object is removed)
|
||||||
|
|
||||||
|
* DOM insertion, via jQuery-powered insertion methods. Insertion targets can
|
||||||
|
be anything the corresponding jQuery method accepts (generally selectors,
|
||||||
|
DOM nodes and jQuery objects):
|
||||||
|
|
||||||
|
:js:func:`~openerp.base.Widget.appendTo`
|
||||||
|
Renders the widget and inserts it as the last child of the target, uses
|
||||||
|
`.appendTo()`_
|
||||||
|
|
||||||
|
:js:func:`~openerp.base.Widget.prependTo`
|
||||||
|
Renders the widget and inserts it as the first child of the target, uses
|
||||||
|
`.prependTo()`_
|
||||||
|
|
||||||
|
:js:func:`~openerp.base.Widget.insertAfter`
|
||||||
|
Renders the widget and inserts it as the preceding sibling of the target,
|
||||||
|
uses `.insertAfter()`_
|
||||||
|
|
||||||
|
:js:func:`~openerp.base.Widget.insertBefore`
|
||||||
|
Renders the widget and inserts it as the following sibling of the target,
|
||||||
|
uses `.insertBefore()`_
|
||||||
|
|
||||||
|
:js:class:`~openerp.base.Widget` inherits from
|
||||||
|
:js:class:`~openerp.base.SessionAware`, so subclasses can easily access the
|
||||||
|
RPC layers.
|
||||||
|
|
||||||
|
Subclassing Widget
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
:js:class:`~openerp.base.Widget` is subclassed in the standard manner (via the
|
||||||
|
:js:func:`~openerp.base.Class.extend` method), and provides a number of
|
||||||
|
abstract properties and concrete methods (which you may or may not want to
|
||||||
|
override). Creating a subclass looks like this:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
var MyWidget = openerp.base.Widget.extend({
|
||||||
|
// QWeb template to use when rendering the object
|
||||||
|
template: "MyQWebTemplate",
|
||||||
|
// autogenerated id prefix, specificity helps when debugging
|
||||||
|
identifier_prefix: 'my-id-prefix-',
|
||||||
|
|
||||||
|
init: function(parent) {
|
||||||
|
this._super(parent);
|
||||||
|
// insert code to execute before rendering, for object
|
||||||
|
// initialization
|
||||||
|
},
|
||||||
|
start: function() {
|
||||||
|
this._super();
|
||||||
|
// post-rendering initialization code, at this point
|
||||||
|
// ``this.$element`` has been initialized
|
||||||
|
this.$element.find(".my_button").click(/* an example of event binding * /);
|
||||||
|
|
||||||
|
// if ``start`` is asynchronous, return a promise object so callers
|
||||||
|
// know when the object is done initializing
|
||||||
|
return this.rpc(/* … */)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
The new class can then be used in the following manner:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
// Create the instance
|
||||||
|
var my_widget = new MyWidget(this);
|
||||||
|
// Render and insert into DOM
|
||||||
|
my_widget.appendTo(".some-div");
|
||||||
|
|
||||||
|
After these two lines have executed (and any promise returned by ``appendTo``
|
||||||
|
has been resolved if needed), the widget is ready to be used.
|
||||||
|
|
||||||
|
If the widget is not needed anymore (because it's transient), simply terminate
|
||||||
|
it:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
my_widget.stop();
|
||||||
|
|
||||||
|
will unbind all DOM events, remove the widget's content from the DOM and
|
||||||
|
destroy all widget data.
|
||||||
|
|
||||||
Views
|
Views
|
||||||
+++++
|
+++++
|
||||||
|
|
||||||
|
@ -236,193 +328,6 @@ replace ``addons`` by the directory in which your own addon lives.
|
||||||
and run ``nosetests addons`` instead of the ``unit2`` command,
|
and run ``nosetests addons`` instead of the ``unit2`` command,
|
||||||
the result should be exactly the same.
|
the result should be exactly the same.
|
||||||
|
|
||||||
APIs
|
|
||||||
----
|
|
||||||
|
|
||||||
Javascript
|
|
||||||
++++++++++
|
|
||||||
|
|
||||||
.. js:class:: openerp.base.Widget(view, node)
|
|
||||||
|
|
||||||
:param openerp.base.Controller view: The view to which the widget belongs
|
|
||||||
:param Object node: the ``fields_view_get`` descriptor for the widget
|
|
||||||
|
|
||||||
.. js:attribute:: $element
|
|
||||||
|
|
||||||
The widget's root element as jQuery object
|
|
||||||
|
|
||||||
.. js:class:: openerp.base.DataSet(session, model)
|
|
||||||
|
|
||||||
:param openerp.base.Session session: the RPC session object
|
|
||||||
:param String model: the model managed by this dataset
|
|
||||||
|
|
||||||
The DataSet is the abstraction for a sequence of records stored in
|
|
||||||
database.
|
|
||||||
|
|
||||||
It provides interfaces for reading records based on search
|
|
||||||
criteria, and for selecting and fetching records based on
|
|
||||||
activated ids.
|
|
||||||
|
|
||||||
.. js:function:: fetch([offset][, limit])
|
|
||||||
|
|
||||||
:param Number offset: the index from which records should start
|
|
||||||
being returned (section)
|
|
||||||
:param Number limit: the maximum number of records to return
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Asynchronously fetches the records selected by the DataSet's
|
|
||||||
domain and context, in the provided sort order if any.
|
|
||||||
|
|
||||||
Only fetches the fields selected by the DataSet.
|
|
||||||
|
|
||||||
On success, triggers :js:func:`on_fetch`
|
|
||||||
|
|
||||||
.. js:function:: on_fetch(records, event)
|
|
||||||
|
|
||||||
:param Array records: an array of
|
|
||||||
:js:class:`openerp.base.DataRecord`
|
|
||||||
matching the DataSet's selection
|
|
||||||
:param event: a data holder letting the event handler fetch
|
|
||||||
meta-informations about the event.
|
|
||||||
:type event: OnFetchEvent
|
|
||||||
|
|
||||||
Fired after :js:func:`fetch` is done fetching the records
|
|
||||||
selected by the DataSet.
|
|
||||||
|
|
||||||
.. js:function:: active_ids
|
|
||||||
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Asynchronously fetches the active records for this DataSet.
|
|
||||||
|
|
||||||
On success, triggers :js:func:`on_active_ids`
|
|
||||||
|
|
||||||
.. js:function:: on_active_ids(records)
|
|
||||||
|
|
||||||
:param Array records: an array of
|
|
||||||
:js:class:`openerp.base.DataRecord`
|
|
||||||
matching the currently active ids
|
|
||||||
|
|
||||||
Fired after :js:func:`active_ids` fetched the records matching
|
|
||||||
the DataSet's active ids.
|
|
||||||
|
|
||||||
.. js:function:: active_id
|
|
||||||
|
|
||||||
:returns: the dataset instance in was called on
|
|
||||||
|
|
||||||
Asynchronously fetches the current active record.
|
|
||||||
|
|
||||||
On success, triggers :js:func:`on_active_id`
|
|
||||||
|
|
||||||
.. js:function:: on_active_id(record)
|
|
||||||
|
|
||||||
:param Object record: the record fetched by
|
|
||||||
:js:func:`active_id`, or ``null``
|
|
||||||
:type record: openerp.base.DataRecord
|
|
||||||
|
|
||||||
Fired after :js:func:`active_id` fetched the record matching
|
|
||||||
the dataset's active id
|
|
||||||
|
|
||||||
.. js:function:: set(options)
|
|
||||||
|
|
||||||
:param Object options: the options to set on the dataset
|
|
||||||
:type options: DataSetOptions
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Configures the data set by setting various properties on it
|
|
||||||
|
|
||||||
.. js:function:: prev
|
|
||||||
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Activates the id preceding the current one in the active ids
|
|
||||||
sequence of the dataset.
|
|
||||||
|
|
||||||
If the current active id is at the start of the sequence,
|
|
||||||
wraps back to the last id of the sequence.
|
|
||||||
|
|
||||||
.. js:function:: next
|
|
||||||
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Activates the id following the current one in the active ids
|
|
||||||
sequence.
|
|
||||||
|
|
||||||
If the current active id is the last of the sequence, wraps
|
|
||||||
back to the beginning of the active ids sequence.
|
|
||||||
|
|
||||||
.. js:function:: select(ids)
|
|
||||||
|
|
||||||
:param Array ids: the identifiers to activate on the dataset
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Activates all the ids specified in the dataset, resets the
|
|
||||||
current active id to be the first id of the new sequence.
|
|
||||||
|
|
||||||
The internal order will be the same as the ids list provided.
|
|
||||||
|
|
||||||
.. js:function:: get_active_ids
|
|
||||||
|
|
||||||
:returns: the list of current active ids for the dataset
|
|
||||||
|
|
||||||
.. js:function:: activate(id)
|
|
||||||
|
|
||||||
:param Number id: the id to activate
|
|
||||||
:returns: the dataset instance it was called on
|
|
||||||
|
|
||||||
Activates the id provided in the dataset. If no ids are
|
|
||||||
selected, selects the id in the dataset.
|
|
||||||
|
|
||||||
If ids are already selected and the provided id is not in that
|
|
||||||
selection, raises an error.
|
|
||||||
|
|
||||||
.. js:function:: get_active_id
|
|
||||||
|
|
||||||
:returns: the dataset's current active id
|
|
||||||
|
|
||||||
Ad-hoc objects and structural types
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
These objects are not associated with any specific class, they're
|
|
||||||
generally literal objects created on the spot. Names are merely
|
|
||||||
convenient ways to refer to them and their properties.
|
|
||||||
|
|
||||||
.. js:class:: OnFetchEvent
|
|
||||||
|
|
||||||
.. js:attribute:: context
|
|
||||||
|
|
||||||
The context used for the :js:func:`fetch` call (domain set on
|
|
||||||
the :js:class:`openerp.base.DataSet` when ``fetch`` was
|
|
||||||
called)
|
|
||||||
|
|
||||||
.. js:attribute:: domain
|
|
||||||
|
|
||||||
The domain used for the :js:func:`fetch` call
|
|
||||||
|
|
||||||
.. js:attribute:: limit
|
|
||||||
|
|
||||||
The limit with which the original :js:func:`fetch` call was
|
|
||||||
performed
|
|
||||||
|
|
||||||
.. js:attribute:: offset
|
|
||||||
|
|
||||||
The offset with which the original :js:func:`fetch` call was
|
|
||||||
performed
|
|
||||||
|
|
||||||
.. js:attribute:: sort
|
|
||||||
|
|
||||||
The sorting criteria active on the
|
|
||||||
:js:class:`openerp.base.DataSet` when :js:func:`fetch` was
|
|
||||||
called
|
|
||||||
|
|
||||||
.. js:class:: DataSetOptions
|
|
||||||
|
|
||||||
.. js:attribute:: context
|
|
||||||
|
|
||||||
.. js:attribute:: domain
|
|
||||||
|
|
||||||
.. js:attribute:: sort
|
|
||||||
|
|
||||||
Python
|
Python
|
||||||
++++++
|
++++++
|
||||||
|
|
||||||
|
@ -499,3 +404,15 @@ Python
|
||||||
|
|
||||||
.. _promise object:
|
.. _promise object:
|
||||||
http://api.jquery.com/deferred.promise/
|
http://api.jquery.com/deferred.promise/
|
||||||
|
|
||||||
|
.. _.appendTo():
|
||||||
|
http://api.jquery.com/appendTo/
|
||||||
|
|
||||||
|
.. _.prependTo():
|
||||||
|
http://api.jquery.com/prependTo/
|
||||||
|
|
||||||
|
.. _.insertAfter():
|
||||||
|
http://api.jquery.com/insertAfter/
|
||||||
|
|
||||||
|
.. _.insertBefore():
|
||||||
|
http://api.jquery.com/insertBefore/
|
||||||
|
|
|
@ -374,11 +374,13 @@ Deletion can be overridden by replacing the
|
||||||
calls :js:func:`~openerp.base.DataSet.unlink` in order to remove the records
|
calls :js:func:`~openerp.base.DataSet.unlink` in order to remove the records
|
||||||
entirely.
|
entirely.
|
||||||
|
|
||||||
.. note:: the list-wise deletion button (next to the record addition button)
|
.. note::
|
||||||
simply proxies to :js:func:`~openerp.base.ListView.do_delete` after
|
|
||||||
obtaining all selected record ids, but it is possible to override it
|
the list-wise deletion button (next to the record addition button)
|
||||||
alone by replacing
|
simply proxies to :js:func:`~openerp.base.ListView.do_delete` after
|
||||||
:js:func:`~openerp.base.ListView.do_delete_selected`.
|
obtaining all selected record ids, but it is possible to override it
|
||||||
|
alone by replacing
|
||||||
|
:js:func:`~openerp.base.ListView.do_delete_selected`.
|
||||||
|
|
||||||
Internal API Doc
|
Internal API Doc
|
||||||
----------------
|
----------------
|
||||||
|
|
Loading…
Reference in New Issue