Advertisement
Guest User

React.js mutate style

a guest
Oct 23rd, 2015
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2.  
  3. require("./range_field.less");
  4.  
  5. var React = require("react");
  6. var ReactDom = require("react-dom");
  7. var $ = require("jquery");
  8.  
  9. class RangeField extends React.Component{
  10.     constructor(props){
  11.         super();
  12.  
  13.         this.drag_a_start = this.drag_a_start.bind(this);
  14.         this.drag_b_start = this.drag_b_start.bind(this);
  15.         this.drag_a_move = this.drag_a_move.bind(this);
  16.         this.drag_b_move = this.drag_b_move.bind(this);
  17.         this.drag_a_end = this.drag_a_end.bind(this);
  18.         this.drag_b_end = this.drag_b_end.bind(this);
  19.  
  20.         this.state = {
  21.              "min":0,
  22.              "value_a":props.valueA | 0,
  23.              "max":2000,
  24.              "value_b":props.valueB | 0,
  25.              "size":0
  26.             }
  27.     }
  28.  
  29.     componentWillMount(){
  30.         var state = {};
  31.         if (this.props.min){
  32.             state.min = this.props.min|0;
  33.         }
  34.         if (this.props.valueA){
  35.             state.value_a = this.props.valueA|0;
  36.         }
  37.         if (this.props.max){
  38.             state.max = this.props.max|0;
  39.         }
  40.         if (this.props.valueB){
  41.             state.value_b = this.props.valueB|0;
  42.         }
  43.         this.setState(state);
  44.     }
  45.  
  46.     componentDidMount(){
  47.         var st = {};
  48.         var size = this.refs.line.offsetWidth;
  49.         st.size = size;
  50.         this.setState(st);
  51.  
  52.         $(this.refs.span_a).on("mousedown", this.drag_a_start);
  53.         $(this.refs.span_b).on("mousedown", this.drag_b_start);
  54.     }
  55.  
  56.     drag_a_start(e){
  57.         this.move_a_handler = this.drag_a_move;
  58.         this.up_a_handler = this.drag_a_end;
  59.  
  60.         $(document).on("mousemove",this.move_a_handler);
  61.         $(document).on("mouseup",this.up_a_handler);
  62.  
  63.         this.start_x = e.clientX;
  64.         this.old_val = this.state.value_a;
  65.         if (this.old_val == -1){
  66.             this.old_val = 0;
  67.         }
  68.     }
  69.  
  70.     drag_b_start(e){
  71.         this.move_b_handler = this.drag_b_move;
  72.         this.up_b_handler = this.drag_b_end;
  73.  
  74.         $(document).on("mousemove",this.move_b_handler);
  75.         $(document).on("mouseup",this.up_b_handler);
  76.  
  77.         this.start_x = e.clientX;
  78.         this.old_val = this.state.value_b;
  79.         if (this.old_val == -1){
  80.             this.old_val = this.props.max|0;
  81.         }
  82.  
  83.     }
  84.  
  85.     drag_a_move(e){
  86.         var step = (this.props.max - this.props.min) / this.state.size ;
  87.         var value = this.old_val + (e.clientX - this.start_x)* step;
  88.         if (value < this.props.min){
  89.             value = this.props.min;
  90.         }
  91.         if (value > this.state.value_b){
  92.             value = this.props.min;
  93.         }
  94.         value = value | 0;
  95.         var st = {value_a:  value };
  96.         this.setState(st);
  97.     }
  98.  
  99.     drag_b_move(e){
  100.         var step = (this.props.max - this.props.min) / this.state.size ;
  101.         var value = this.old_val | 0;
  102.         value += (e.clientX - this.start_x)* step;
  103.         if (value < this.state.value_a){
  104.             value = this.props.max;
  105.         }
  106.         if (value > this.props.max){
  107.             value = this.props.max;
  108.         }
  109.         value = value | 0;
  110.         var st = {value_b:  value };
  111.         this.setState(st);
  112.     }
  113.  
  114.     drag_a_end(e){
  115.         $(document).off("mousemove",this.move_a_handler);
  116.         $(document).off("mouseup",this.up_a_handler);
  117.     }
  118.  
  119.     drag_b_end(e){
  120.         $(document).off("mousemove",this.move_b_handler);
  121.         $(document).off("mouseup",this.up_b_handler);
  122.     }
  123.  
  124.     render(){
  125.         var size = this.state.size;
  126.  
  127.         var start = 10;
  128.         var end = 120;
  129.  
  130.         if (this.state.value_a==-1){
  131.             start = 0;
  132.         }else{
  133.             start = size/(this.props.max-this.props.min)*this.state.value_a;
  134.         }
  135.  
  136.         if (this.state.value_b==-1){
  137.             end = size;
  138.         }else{
  139.             end = size/(this.props.max-this.props.min)*this.state.value_b;
  140.         }
  141.  
  142.  
  143.         var handler_a_style = {
  144.             cursor: "pointer",
  145.             left: start
  146.         };
  147.  
  148.         var handler_b_style = {
  149.             cursor: "pointer",
  150.             left: end
  151.         };
  152.  
  153.  
  154.         var handler_b = <span className="rangefield__handler right" style={handler_b_style} ref="span_b"></span>
  155.  
  156.         var range_style = {
  157.             left : start,
  158.             width : end-start
  159.         };
  160.  
  161.         var inp_style = {display: "none"};
  162.  
  163.         var val_a_text = this.props.min;
  164.         var val_b_text = this.props.max;
  165.  
  166.         if (this.state.value_a > 0){
  167.             val_a_text = this.state.value_a;
  168.         }
  169.         if (this.state.value_b > 0){
  170.             val_b_text = this.state.value_b;
  171.         }
  172.         var name_a = this.props.nameA || "cost_min";
  173.         var name_b = this.props.nameB || "cost_max";
  174.  
  175.         return (
  176.             <div className="rangefield" ref="line">
  177.                 <div className="rangefield__value">{val_a_text}-{val_b_text}</div>
  178.                 <div className="rangefield__area" style={range_style} ></div>
  179.                 <span className="rangefield__handler left" style={handler_a_style} ref="span_a"></span>
  180.                 {handler_b}
  181.                 <input type="text" name={name_a} value={this.state.value_a} style={inp_style} />
  182.                 <input type="text" name={name_b} value={this.state.value_b} style={inp_style} />
  183.             </div>
  184.         );
  185.     }
  186. }
  187.  
  188. module.exports = RangeField;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement