123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- if (!dojo._hasResource["dojox.wire.ml.Action"]) { // _hasResource checks added
- // by build. Do not use
- // _hasResource directly in
- // your code.
- dojo._hasResource["dojox.wire.ml.Action"] = true;
- dojo.provide("dojox.wire.ml.Action");
- dojo.provide("dojox.wire.ml.ActionFilter");
- dojo.require("dijit._Widget");
- dojo.require("dijit._Container");
- dojo.require("dojox.wire.Wire");
- dojo.require("dojox.wire.ml.util");
- dojo.declare("dojox.wire.ml.Action", [dijit._Widget, dijit._Container], {
- // summary:
- // A base widget to "run" a task on an event or a topic
- // description:
- // This widget represents a controller task to be run when an
- // event
- // (a function) or a topic is issued.
- // Sub-classes must implement _run() method to implement their
- // tasks.
- // 'trigger' specifies an event scope, an ID of a widget or an
- // DOM
- // element, or its property with the optional dotted notation.
- // If this widget has child ActionFilter widgets, their filter()
- // methods are called with the arguments to the event or the
- // topic.
- // If one of filter() methods returns false, run() won't be
- // invoked.
- // This widget also can serve as a composite task to run child
- // Actions on an event or a topic specified to this widget.
- // trigger:
- // An event scope
- // triggerEvent:
- // An event (function) name
- // triggerTopic:
- // A topic name
- trigger : "",
- triggerEvent : "",
- triggerTopic : "",
- postCreate : function() {
- // summary:
- // Call _connect()
- // description:
- // See _connect().
- this._connect();
- },
- _connect : function() {
- // summary:
- // Connect run() method to an event or a topic
- // description:
- // If 'triggerEvent' and 'trigger' are specified, connect()
- // is
- // used to set up run() to be called on the event.
- // If 'triggerTopic' is specified, subscribe() is used to
- // set up
- // run() to be called on the topic.
- if (this.triggerEvent) {
- if (this.trigger) {
- var scope = dojox.wire.ml._getValue(this.trigger);
- if (scope) {
- if (!scope[this.triggerEvent]) {
- // set a dummy function for an anonymous
- // object
- scope[this.triggerEvent] = function() {
- };
- }
- this._triggerHandle = dojo.connect(scope,
- this.triggerEvent, this, "run");
- }
- } else {
- var event = this.triggerEvent.toLowerCase();
- if (event == "onload") {
- var self = this;
- dojo.addOnLoad(function() {
- self._run.apply(self, arguments);
- });
- }
- }
- } else if (this.triggerTopic) {
- this._triggerHandle = dojo.subscribe(this.triggerTopic,
- this, "run");
- }
- },
- _disconnect : function() {
- // summary:
- // Disconnect run() method from an event or a topic
- // description:
- // If 'triggerEvent' and 'trigger' are specified,
- // disconnect() is
- // used to set up run() not to be called on the event.
- // If 'triggerTopic' is specified, unsubscribe() is used to
- // set up
- // run() not to be called on the topic.
- if (this._triggerHandle) {
- if (this.triggerTopic) {
- dojo.unsubscribe(this.triggerTopic,
- this._triggerHandle);
- } else {
- dojo.disconnect(this._triggerHandle);
- }
- }
- },
- run : function() {
- // summary:
- // Run a task
- // description:
- // This method calls filter() method of child ActionFilter
- // widgets.
- // If one of them returns false, this method returns.
- // Otherwise, _run() method is called.
- var children = this.getChildren();
- for (var i in children) {
- var child = children[i];
- if (child instanceof dojox.wire.ml.ActionFilter) {
- if (!child.filter.apply(child, arguments)) {
- return;
- }
- }
- }
- this._run.apply(this, arguments);
- },
- _run : function() {
- // summary:
- // Call run() methods of child Action widgets
- // description:
- // If this widget has child Action widgets, their run()
- // methods
- // are called.
- var children = this.getChildren();
- for (var i in children) {
- var child = children[i];
- if (child instanceof dojox.wire.ml.Action) {
- child.run.apply(child, arguments);
- }
- }
- },
- uninitialize : function() {
- // summary:
- // Over-ride of base widget unitialize function to do some
- // connection cleanup.
- this._disconnect();
- return true;
- }
- });
- dojo.declare("dojox.wire.ml.ActionFilter", dijit._Widget, {
- // summary:
- // A widget to define a filter for the parent Action to run
- // description:
- // This base class checks a required property specified with
- // 'required' attribute.
- // If 'message' is specified, the message is set to a property
- // specified with 'error'.
- // Subclasses may implement their own filter() method.
- // required:
- // A property required
- // requiredValue:
- // Optional. A specific value the property is required to have.
- // If this isn't provided
- // than any non-false/non-null value of the required propery
- // will cause this filter
- // to pass.
- // type:
- // Optional. A specific type to compare the values as (if
- // requiredValue is set)
- // Valid values for type are boolean, int, string. Default is
- // string.
- // message:
- // An error message to emit if the filter doesn't execute due to
- // property mismatch.
- // error:
- // A property to store an error due to property mismatch.
- required : "",
- requiredValue : "",
- type : "",
- message : "",
- error : "",
- filter : function() {
- // summary:
- // Check if a required property is specified. Also, if
- // provided, check to see
- // if the required property contains a specific value.
- // description:
- // If a value is undefined for a property, specified with
- // 'required', this method returns false.
- // If the value for a property is defined, but there isn't a
- // requiredValue for it
- // then any non-false value will cause the method to return
- // true.
- // if requiredValue is set, then filter compares that value
- // with the value from
- // the required property and returns true if and only if
- // they match.
- // The type option just allows for a way to convert the
- // required property values
- // into a proper form for comparison (boolean, number, etc).
- // If 'message' is specified, it is set to a proeprty
- // specified
- // with 'error' or shown with alert().
- // If 'required' starts with "arguments", a property of
- // the method arguments are checked.
- // returns:
- // True if a required property is specified (and if
- // requiredValue is specified,
- // that they match), otherwise false
- if (this.required === "") {
- return true; // Boolean
- } else {
- var value = dojox.wire.ml._getValue(this.required,
- arguments);
- if (this.requiredValue === "") {
- // Just see if there's a value, nothing to compare
- // it to.
- if (value) {
- return true; // Boolean
- }
- } else {
- // See if we need to type convert.
- var reqValue = this.requiredValue;
- if (this.type !== "") {
- var lType = this.type.toLowerCase();
- if (lType === "boolean") {
- if (reqValue.toLowerCase() === "false") {
- reqValue = false;
- } else {
- reqValue = true;
- }
- } else if (lType === "number") {
- reqValue = parseInt(reqValue, 10);
- }
- }
- if (value === reqValue) {
- return true; // boolean
- }
- }
- }
- if (this.message) {
- if (this.error) {
- dojox.wire.ml._setValue(this.error, this.message);
- } else {
- alert(this.message);
- }
- }
- return false; // Boolean
- }
- });
- }
|