source: Dev/trunk/src/client/dojox/form/Rating.js @ 529

Last change on this file since 529 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 3.8 KB
Line 
1define([
2        "dojo/_base/declare",
3        "dojo/_base/lang",
4        "dojo/dom-attr",
5        "dojo/dom-class",
6        "dojo/mouse",
7        "dojo/on",
8        "dojo/string",
9        "dojo/query",
10        "dijit/form/_FormWidget"
11], function(declare, lang, domAttr, domClass, mouse, on, string, query, FormWidget){
12
13
14        return declare("dojox.form.Rating", FormWidget, {
15                // summary:
16                //              A widget for rating using stars.
17
18                /*=====
19                // required: Boolean
20                //              TODO: Can be true or false, default is false.
21                required: false,
22                =====*/
23
24                templateString: null,
25
26                // numStars: Integer|Float
27                //              The number of stars to show, default is 3.
28                numStars: 3,
29
30                // value: Integer|Float
31                //              The current value of the Rating
32                value: 0,
33
34                buildRendering: function(/*Object*/ params){
35                        // summary:
36                        //              Build the templateString. The number of stars is given by this.numStars,
37                        //              which is normally an attribute to the widget node.
38
39                        // The hidden value node is attached as "focusNode" because tabIndex, id, etc. are getting mapped there.
40                        var tpl = '<div dojoAttachPoint="domNode" class="dojoxRating dijitInline">' +
41                                '<input type="hidden" value="0" dojoAttachPoint="focusNode" /><ul data-dojo-attach-point="list">${stars}</ul>' +
42                                '</div>';
43                        // The value-attribute is used to "read" the value for processing in the widget class
44                        var starTpl = '<li class="dojoxRatingStar dijitInline" value="${value}"></li>';
45                        var rendered = "";
46                        for(var i = 0; i < this.numStars; i++){
47                                rendered += string.substitute(starTpl, {value:i + 1});
48                        }
49                        this.templateString = string.substitute(tpl, {stars:rendered});
50
51                        this.inherited(arguments);
52                },
53
54                postCreate: function(){
55                        this.inherited(arguments);
56                        this._renderStars(this.value);
57                        this.own(
58                                // Fire when mouse is moved over one of the stars.
59                                on(this.list, on.selector(".dojoxRatingStar", "mouseover"), lang.hitch(this, "_onMouse")),
60                                on(this.list, on.selector(".dojoxRatingStar", "click"), lang.hitch(this, "onStarClick")),
61                                on(this.list, mouse.leave, lang.hitch(this, function(){
62                                        // go from hover display back to dormant display
63                                        this._renderStars(this.value);
64                                }))
65                        );
66                },
67
68                _onMouse: function(evt){
69                        // summary:
70                        //              Called when mouse is moved over one of the stars
71                        var hoverValue = +domAttr.get(evt.target, "value");
72                        this._renderStars(hoverValue, true);
73                        this.onMouseOver(evt, hoverValue);
74                },
75
76                _renderStars: function(value, hover){
77                        // summary:
78                        //              Render the stars depending on the value.
79                        query(".dojoxRatingStar", this.domNode).forEach(function(star, i){
80                                if(i + 1 > value){
81                                        domClass.remove(star, "dojoxRatingStarHover");
82                                        domClass.remove(star, "dojoxRatingStarChecked");
83                                }else{
84                                        domClass.remove(star, "dojoxRatingStar" + (hover ? "Checked" : "Hover"));
85                                        domClass.add(star, "dojoxRatingStar" + (hover ? "Hover" : "Checked"));
86                                }
87                        });
88                },
89
90                onStarClick: function(/*Event*/ evt){
91                        // summary:
92                        //              Connect on this method to get noticed when a star was clicked.
93                        // example:
94                        //      |       connect(widget, "onStarClick", function(event){ ... })
95                        var newVal = +domAttr.get(evt.target, "value");
96                        this.setAttribute("value", newVal == this.value ? 0 : newVal);
97                        this._renderStars(this.value);
98                        this.onChange(this.value); // Do I have to call this by hand?
99                },
100
101                onMouseOver: function(/*=====evt, value=====*/ ){
102                        // summary:
103                        //              Connect here, the value is passed to this function as the second parameter!
104                },
105
106                setAttribute: function(/*String*/ key, /*Number*/ value){
107                        // summary:
108                        //              Deprecated.   Use set("value", ...) instead.
109                        this.set(key, value);
110                },
111
112                _setValueAttr: function(val){
113                        this.focusNode.value = val;             // reflect the value in our hidden field, for form submission
114                        this._set("value", val);
115                        this._renderStars(val);
116                        this.onChange(val); // Do I really have to call this by hand? :-(
117                }
118        });
119});
Note: See TracBrowser for help on using the repository browser.