Advertisement
Guest User

Untitled

a guest
Aug 25th, 2017
559
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Created by michal.mielczynski@w-b.pl on 2017-06-13.
  3.  */
  4.  
  5. import React, {Component} from 'react';
  6. import {autobind} from 'core-decorators';
  7. import {
  8.     Panel,
  9.     FormGroup,
  10.     FormControl,
  11.     HelpBlock,
  12.     Button,
  13.     ButtonGroup,
  14.     OverlayTrigger,
  15.     Tooltip,
  16.     Well,
  17.     Row,
  18.     Col,
  19.     Glyphicon,
  20.     Badge,
  21.     PanelGroup,
  22.     Modal
  23. } from 'react-bootstrap';
  24. import Select from 'react-select';
  25. import Spinner from 'react-spinner';
  26. import Alert from 'react-s-alert';
  27. import TrackerReact from 'meteor/ultimatejs:tracker-react';
  28. import i18n from 'meteor/universe:i18n';
  29. import {Customers, Concerns, Trades, Countries} from '/imports/lib/collections/collections-general';
  30. import {CustomerList} from './customer-list';
  31. import {isElementVisible} from '/imports/client/utils/util-is-element-visible';
  32. import {userNameFromId} from '/imports/lib/utils/util-username-from-id';
  33. import _ from 'lodash';
  34.  
  35. const T = i18n.createComponent();
  36.  
  37. const clearSearchFiltersToolTip = <Tooltip id={'1'}><T>tooltip.clearSearch</T></Tooltip>;
  38. const addFilterTooltip = <Tooltip id={'2'}><T>tooltip.addFilter</T></Tooltip>;
  39. const myCustomersTooltip = <Tooltip id={'5'}><T>tooltip.myCustomers</T></Tooltip>;
  40.  
  41. const ITEMS_PER_PAGE = Meteor.settings.public.customersPerPage || 10;
  42. const CUSTOMER_SORTING = Meteor.settings.public.sortingOptionsCustomer || {
  43.     name: 1
  44. };
  45. const MAX_PAGES = Meteor.settings.public.customersMaxPages || 20;
  46. const MAX_FILTER_NAME = Meteor.settings.public.maxFilterName || 10;
  47.  
  48. @autobind
  49. export class CustomerListWrapper extends TrackerReact(Component) {
  50.  
  51.     constructor(props) {
  52.         super(props);
  53.  
  54.         let customerFilter = {};
  55.         if (Session.get('customerFilter')) {
  56.             customerFilter = JSON.parse(Session.get('customerFilter'));
  57.         }
  58.  
  59.         let nameFilterValue = '';
  60.         if (Session.get('customerNameFilterValue')) {
  61.             nameFilterValue = JSON.parse(Session.get('customerNameFilterValue'));
  62.         }
  63.  
  64.         let ownerFilterValue = '';
  65.         if (Session.get('customerOwnerFilterValue')) {
  66.             ownerFilterValue = JSON.parse(Session.get('customerOwnerFilterValue'));
  67.         }
  68.  
  69.         let concernsValue = [];
  70.         if (Session.get('customerConcernFilterValue')) {
  71.             concernsValue = JSON.parse(Session.get('customerConcernFilterValue'));
  72.         }
  73.  
  74.         let tradesValue = [];
  75.         if (Session.get('customerTradeFilterValue')) {
  76.             tradesValue = JSON.parse(Session.get('customerTradeFilterValue'));
  77.         }
  78.  
  79.         let countriesValue = [];
  80.         if (Session.get('customerCountriesFilterValue')) {
  81.             countriesValue = JSON.parse(Session.get('customerCountriesFilterValue'));
  82.         }
  83.  
  84.         this.state = {
  85.             collectionsLoaded: false,
  86.             globalCustomerCount: 0,
  87.             pageCount: 1,
  88.             customerFilter,
  89.             nameFilterValue,
  90.             ownerFilterValue,
  91.             concernsValue,
  92.             tradesValue,
  93.             countriesValue,
  94.             bottomText: '',
  95.             filterNameModal: false,
  96.             filterRenameId: '',
  97.             filterRemoveModal: false,
  98.             filterRemoveId: '',
  99.             newFilterName: ''
  100.         };
  101.  
  102.         this.subscriptions = {
  103.             customers: Meteor.subscribe('customers', this.subscriptionsUpdated),
  104.             users: Meteor.subscribe('user-names', this.subscriptionsUpdated),
  105.             countries: Meteor.subscribe('countries', this.subscriptionsUpdated),
  106.             trades: Meteor.subscribe('trades', this.subscriptionsUpdated),
  107.             concerns: Meteor.subscribe('concerns', this.subscriptionsUpdated)
  108.         };
  109.     }
  110.  
  111.     componentDidMount() {
  112.         window.addEventListener('scroll', this.handleScrollEnd, false);
  113.         this.checkCustomerCount();
  114.     }
  115.  
  116.     componentWillUnmount() {
  117.         this.subscriptions.customers.stop();
  118.         this.subscriptions.users.stop();
  119.         this.subscriptions.countries.stop();
  120.         this.subscriptions.trades.stop();
  121.         this.subscriptions.concerns.stop();
  122.  
  123.         Session.set('customerFilter', JSON.stringify(this.state.customerFilter));
  124.         Session.set('customerNameFilterValue', JSON.stringify(this.state.nameFilterValue));
  125.         Session.set('customerOwnerFilterValue', JSON.stringify(this.state.ownerFilterValue));
  126.         Session.set('customerCountriesFilterValue', JSON.stringify(this.state.countriesValue));
  127.         Session.set('customerTradeFilterValue', JSON.stringify(this.state.tradesValue));
  128.         Session.set('customerConcernFilterValue', JSON.stringify(this.state.concernsValue));
  129.  
  130.         window.removeEventListener('scroll', this.handleScrollEnd);
  131.     }
  132.  
  133.     handleScrollEnd() {
  134.  
  135.         this.container = document.getElementById('feed');
  136.         if (this.container) {
  137.             if (isElementVisible(this.container)) {
  138.                 this.loadMore();
  139.             }
  140.         }
  141.         else {
  142.             console.log('no container');
  143.         }
  144.     }
  145.  
  146.     loadMore() {
  147.  
  148.         if (!this.listContainer) {
  149.             return
  150.         }
  151.  
  152.         let cC = Customers.find(this.state.customerFilter).count();
  153.  
  154.         if (this.state.globalCustomerCount > cC) {
  155.             this.setState({bottomText: i18n.__('word.loading')});
  156.         }
  157.         else {
  158.             this.setState({bottomText: i18n.__('word.noMoreMatches')});
  159.             return;
  160.         }
  161.  
  162.         if (this.state.pageCount >= MAX_PAGES) {
  163.             this.setState({bottomText: i18n.__('word.narrowDownCriteria')});
  164.         }
  165.         else if (this.state.collectionsLoaded) {
  166.             let pageCount = this.state.pageCount + 1;
  167.             this.setState({pageCount});
  168.             this.subscribeCustomers();
  169.         }
  170.     }
  171.  
  172.     subscribeCustomers() {
  173.         this.subscriptions.customers = Meteor.subscribe('customers', this.state.customerFilter, {
  174.             limit: ITEMS_PER_PAGE * this.state.pageCount,
  175.             sort: CUSTOMER_SORTING
  176.         }, this.subscriptionsUpdated);
  177.     }
  178.  
  179.     customers() {
  180.         return Customers.find(this.state.customerFilter, {
  181.             limit: ITEMS_PER_PAGE * this.state.pageCount,
  182.             sort: CUSTOMER_SORTING
  183.         }).fetch();
  184.     }
  185.  
  186.     countries() {
  187.         return Countries.find().fetch().map(country => {
  188.             country.name = i18n.__('countryNames.' + country.name);
  189.             return country;
  190.         });
  191.     }
  192.  
  193.     trades() {
  194.         return Trades.find().fetch();
  195.     }
  196.  
  197.     concerns() {
  198.         return Concerns.find().fetch();
  199.     }
  200.  
  201.     options(collection) {
  202.         const options = [];
  203.  
  204.         (collection.map((item) => {
  205.             options.push({label: item.name, value: item._id});
  206.         }));
  207.  
  208.         return options;
  209.     }
  210.  
  211.     /**
  212.      * check how many matching products are on remote database (might be more than in local minimongo)
  213.      */
  214.     checkCustomerCount() {
  215.         Meteor.call('customers.count', this.state.customerFilter, (err, count) => {
  216.             if (!err) {
  217.                 this.setState({globalCustomerCount: count});
  218.                 this.subscribeCustomers();
  219.             }
  220.         })
  221.     }
  222.  
  223.     handleSelectChange(key, values) {
  224.  
  225.         switch (key) {
  226.             case 'country':
  227.                 this.setState({countriesValue: values});
  228.                 break;
  229.             case 'trade':
  230.                 this.setState({tradesValue: values});
  231.                 break;
  232.             case 'concern':
  233.                 this.setState({concernsValue: values});
  234.                 break;
  235.             default:
  236.                 console.error('undefined key', key);
  237.                 break;
  238.         }
  239.  
  240.         let filter = this.state.customerFilter;
  241.         delete filter[key];
  242.  
  243.         if (values instanceof Array && values.length) {
  244.             let labels = [];
  245.             for (let i = 0; i < values.length; i++) {
  246.                 labels.push(values[i].value);
  247.             }
  248.             filter[key] = {$in: labels};
  249.         }
  250.  
  251.         this.setState({
  252.             customerFilter: filter,
  253.             bottomText: ''
  254.         });
  255.  
  256.         this.checkCustomerCount();
  257.     }
  258.  
  259.     handleNameFilterChange(e) {
  260.  
  261.         let value = '';
  262.  
  263.         if (e.target === undefined) {
  264.             value = e;
  265.         } else {
  266.             value = e.target.value;
  267.         }
  268.  
  269.         let filter = this.state.customerFilter;
  270.  
  271.         if (value) {
  272.             filter.name = {$regex: value}
  273.         }
  274.         else {
  275.             delete filter.name;
  276.         }
  277.  
  278.         this.setState({
  279.             nameFilterValue: value,
  280.             customerFilter: filter,
  281.             pageCount: 1,
  282.             bottomText: ''
  283.         });
  284.  
  285.         this.checkCustomerCount();
  286.  
  287.     }
  288.  
  289.     handleOwnerFilterChange(ownerFilterValue) {
  290.  
  291.         this.setState({
  292.             ownerFilterValue: ownerFilterValue
  293.         });
  294.  
  295.         Meteor.call('user.ids', ownerFilterValue, (err, result) => {
  296.  
  297.             if (err) {
  298.                 throw new Meteor.Error(err);
  299.             }
  300.  
  301.             let filter = this.state.customerFilter;
  302.  
  303.             if (ownerFilterValue && ownerFilterValue.length) {
  304.                 filter.owner = {$in: result};
  305.             }
  306.             else {
  307.                 delete filter.owner;
  308.             }
  309.  
  310.             this.setState({
  311.                 ownerFilterValue: ownerFilterValue,
  312.                 customerFilter: filter
  313.             });
  314.  
  315.         });
  316.  
  317.         this.checkCustomerCount();
  318.     }
  319.  
  320.     subscriptionsUpdated() {
  321.         this.setState({
  322.             collectionsLoaded: (
  323.                 this.subscriptions.customers.ready()
  324.                 && this.subscriptions.users.ready()
  325.                 && this.subscriptions.countries.ready()
  326.                 && this.subscriptions.trades.ready()
  327.                 && this.subscriptions.concerns.ready()
  328.             )
  329.         });
  330.     }
  331.  
  332.     buttonsCustomFilter() {
  333.  
  334.         return (
  335.             <ButtonGroup className='filter-button-group' justified>
  336.  
  337.                 <OverlayTrigger overlay={clearSearchFiltersToolTip} placement='bottom'>
  338.                     <ButtonGroup>
  339.                         <Button
  340.                             onClick={this.clearSearch}
  341.                         >
  342.                             <Glyphicon glyph='remove'/>
  343.                         </Button>
  344.                     </ButtonGroup>
  345.                 </OverlayTrigger>
  346.  
  347.                 <OverlayTrigger overlay={myCustomersTooltip} placement='bottom'>
  348.                     <ButtonGroup>
  349.                         <Button
  350.                             disabled={!Meteor.userId()}
  351.                             onClick={this.handleOwnerFilterChange.bind(this, userNameFromId(Meteor.userId()))}
  352.                         >
  353.                             <Glyphicon glyph='user'/>
  354.                         </Button>
  355.                     </ButtonGroup>
  356.                 </OverlayTrigger>
  357.  
  358.                 <OverlayTrigger overlay={addFilterTooltip} placement='bottom'>
  359.                     <ButtonGroup>
  360.                         <Button
  361.                             disabled={!Meteor.userId() || _.isEmpty(this.state.customerFilter)}
  362.                             onClick={this.saveCustomFilter}
  363.                         >
  364.                             <Glyphicon glyph='plus-sign'/>
  365.                         </Button>
  366.                     </ButtonGroup>
  367.                 </OverlayTrigger>
  368.  
  369.             </ButtonGroup>
  370.         )
  371.     }
  372.  
  373.     saveCustomFilter() {
  374.  
  375.         if (_.isEmpty(this.state.customerFilter)) {
  376.             Alert.error(i18n.__('alerts.filterEmpty'));
  377.             return
  378.         }
  379.  
  380.         let country = this.state.countriesValue;
  381.         if (_.isEmpty(country)) {
  382.             country = []
  383.         }
  384.  
  385.         let trade = this.state.tradesValue;
  386.         if (_.isEmpty(trade)) {
  387.             trade = []
  388.         }
  389.  
  390.         let concern = this.state.concernsValue;
  391.         if (_.isEmpty(concern)) {
  392.             concern = []
  393.         }
  394.  
  395.         let options = {
  396.             'owner': this.state.ownerFilterValue,
  397.             'name': this.state.nameFilterValue,
  398.             'concern': concern,
  399.             'trade': trade,
  400.             'country': country
  401.         };
  402.  
  403.         if (_.has(Meteor.user(), 'filters')) {
  404.             let userFilters = Meteor.user().filters.customer;
  405.  
  406.             for (let key in userFilters) {
  407.  
  408.                 let toCompare = userFilters[key].options;
  409.                 delete toCompare.filterName;
  410.  
  411.                 if (_.isEqual(toCompare, options)) {
  412.                     return Alert.error(i18n.__('alerts.filterExists'));
  413.                 }
  414.  
  415.             }
  416.         }
  417.  
  418.         Meteor.call('user-add-filter', Meteor.userId(), 'customer', options, (err) => {
  419.             if (err) {
  420.                 Alert.error(i18n.__(err.reason, err.details));
  421.             } else {
  422.                 Alert.success(i18n.__('alerts.filterAdded'));
  423.             }
  424.         });
  425.     }
  426.  
  427.     removeCustomFilter() {
  428.  
  429.         this.setState({
  430.             filterRemoveModal: false
  431.         });
  432.  
  433.         if (!Meteor.userId()) {
  434.             Alert.error(i18n.__('alerts.filterLogIn'));
  435.             return
  436.         }
  437.  
  438.         Meteor.call('user-remove-filter', Meteor.userId(), 'customer', this.state.filterRemoveId, (err) => {
  439.             if (err) {
  440.                 Alert.error(i18n.__(err.reason, err.details));
  441.             } else {
  442.                 Alert.success(i18n.__('alerts.filterRemoved'));
  443.             }
  444.         });
  445.     };
  446.  
  447.     useCustomFilter(options) {
  448.         this.handleNameFilterChange(options.name);
  449.         this.handleOwnerFilterChange(options.owner);
  450.         this.handleSelectChange('country', options.country);
  451.         this.handleSelectChange('trade', options.trade);
  452.         this.handleSelectChange('concern', options.concern);
  453.     }
  454.  
  455.     setNewFilterName(filterId, newName) {
  456.  
  457.         this.setState({
  458.             filterNameModal: false,
  459.             newFilterName: ''
  460.         });
  461.  
  462.         Meteor.call('user-edit-filter', Meteor.userId(), 'customer', filterId, newName, (err) => {
  463.             if (err) {
  464.                 Alert.error(i18n.__(err.reason, err.details));
  465.             } else {
  466.                 Alert.success(i18n.__('alerts.filterUpdated'));
  467.             }
  468.         })
  469.     }
  470.  
  471.     showDeleteModal() {
  472.         return (
  473.             <Modal show={this.state.filterRemoveModal} onHide={() => this.setState({filterRemoveModal: false})}>
  474.                 <Modal.Header closeButton>
  475.                     <Modal.Title><T>filters.modalRemove.title</T></Modal.Title>
  476.                 </Modal.Header>
  477.                 <Modal.Body>
  478.                     <p>
  479.                         <T>filters.modalRemove.confirm</T>
  480.                     </p>
  481.                 </Modal.Body>
  482.                 <Modal.Footer>
  483.                     <Button
  484.                         bsStyle='danger'
  485.                         onClick={this.removeCustomFilter.bind(this)}
  486.                     >
  487.                         <T>word.remove</T>
  488.                     </Button>
  489.                     <Button
  490.                         onClick={() => this.setState({filterRemoveModal: false})}
  491.                     >
  492.                         <T>word.cancel</T>
  493.                     </Button>
  494.                 </Modal.Footer>
  495.             </Modal>
  496.         )
  497.     }
  498.  
  499.     editFilterNameModal() {
  500.  
  501.         const hideDialog = () => {
  502.             this.setState({
  503.                 filterNameModal: false,
  504.                 newFilterName: ''
  505.             })
  506.         };
  507.  
  508.         return (
  509.             <Modal show={this.state.filterNameModal} onHide={hideDialog}>
  510.                 <Modal.Header closeButton>
  511.                     <Modal.Title><T>filters.modalEdit.title</T></Modal.Title>
  512.                 </Modal.Header>
  513.                 <Modal.Body>
  514.                     <p>
  515.                         <T>filters.modalEdit.confirm</T>
  516.                     </p>
  517.                     <FormGroup
  518.                         controlId='renameFilter'
  519.                         validationState={this.state.newFilterName.length > 10 ? 'warning' : 'success'}
  520.                     >
  521.                         <T _translateProps={['placeholder']}>
  522.                             <FormControl
  523.                                 type='text'
  524.                                 placeholder='filters.updateFilterName'
  525.                                 value={this.state.newFilterName}
  526.                                 onChange={(e) => this.setState({newFilterName: e.target.value})}
  527.                             />
  528.                         </T>
  529.                         <HelpBlock>
  530.                             {this.state.newFilterName.length > 10 ?
  531.                                 <T maxLength={MAX_FILTER_NAME}>filters.customFilters.nameToLong</T> :
  532.                                 <T maxLength={MAX_FILTER_NAME}>filters.customFilters.nameOk</T>
  533.                             }
  534.                         </HelpBlock>
  535.                     </FormGroup>
  536.                 </Modal.Body>
  537.                 <Modal.Footer>
  538.                     <Button
  539.                         disabled={!this.state.newFilterName || this.state.newFilterName.length > 10}
  540.                         bsStyle='primary'
  541.                         onClick={this.setNewFilterName.bind(this, this.state.filterRenameId, this.state.newFilterName)}
  542.                     >
  543.                         <T>word.save</T>
  544.                     </Button>
  545.                     <Button onClick={hideDialog}>
  546.                         <T>word.cancel</T>
  547.                     </Button>
  548.                 </Modal.Footer>
  549.             </Modal>
  550.         )
  551.     }
  552.  
  553.     customFilterComponent() {
  554.  
  555.         if (!Meteor.userId()) {
  556.             return
  557.         }
  558.  
  559.         let user = Meteor.users.findOne(Meteor.userId());
  560.  
  561.         if (!_.has(user, 'filters') || _.isEmpty(user.filters.customer)) {
  562.             return
  563.         }
  564.  
  565.         let userFilters = Object.values(user.filters.customer);
  566.  
  567.         return userFilters.map((filter) => {
  568.  
  569.             let headerFilter = (
  570.                 <span className="custom-panel-header">
  571.  
  572.                     {/*<OverlayTrigger overlay={useFilterTooltip} placement='top'>*/}
  573.                     <Button
  574.                         bsStyle='link'
  575.                         className="pull-left"
  576.                         bsSize='small'
  577.                         onClick={this.useCustomFilter.bind(this, filter.options)}
  578.                     >
  579.                             <Glyphicon className='custom-panel-btn' glyph='play'/>
  580.                         </Button>
  581.                     {/*</OverlayTrigger>*/}
  582.  
  583.                     {filter.options.filterName}
  584.  
  585.                     <ButtonGroup className="pull-right">
  586.  
  587.                         {/*<OverlayTrigger overlay={expandFilterTooltip} placement='top'>*/}
  588.                         <Button
  589.                             bsStyle='link'
  590.                             className='custom-panel-btn'
  591.                             bsSize='small'
  592.                         >
  593.                                 <Glyphicon glyph='chevron-down'/>
  594.                             </Button>
  595.                         {/*</OverlayTrigger>*/}
  596.  
  597.                         {/*<OverlayTrigger overlay={editNameTooltip} placement='top'>*/}
  598.                         <Button
  599.                             bsStyle='link'
  600.                             bsSize='small'
  601.                             className='custom-panel-btn'
  602.                             onClick={() => {
  603.                                 if (filter.options.filterName !== 'Unnamed') {
  604.                                     this.setState({
  605.                                         newFilterName: filter.options.filterName
  606.                                     })
  607.                                 }
  608.  
  609.                                 this.setState({
  610.                                     filterNameModal: true,
  611.                                     filterRenameId: _.findKey(user.filters.customer, filter)
  612.                                 })
  613.                             }}
  614.                         >
  615.                                 <Glyphicon glyph='edit'/>
  616.                             </Button>
  617.                         {/*</OverlayTrigger>*/}
  618.  
  619.                         {/*<OverlayTrigger overlay={removeFilterTooltip} placement='left'>*/}
  620.                         <Button
  621.                             bsStyle='link'
  622.                             bsSize='small'
  623.                             className='custom-panel-btn'
  624.                             onClick={() => {
  625.                                 this.setState({
  626.                                     filterRemoveModal: true,
  627.                                     filterRemoveId: _.findKey(user.filters.customer, filter)
  628.                                 })
  629.                             }}
  630.                         >
  631.                                 <Glyphicon glyph='trash'/>
  632.                             </Button>
  633.                         {/*</OverlayTrigger>*/}
  634.  
  635.                     </ButtonGroup>
  636.                 </span>
  637.             );
  638.  
  639.             const displayElement = (el, translation) => {
  640.  
  641.                 if (!el || !el.length) {
  642.                     return;
  643.                 }
  644.  
  645.                 if (typeof el === "string") {
  646.                     return (
  647.                         <div>
  648.                             <strong>{i18n.__('filters.customFilters.' + [translation])}</strong><br/>
  649.                             {el}
  650.                         </div>
  651.                     )
  652.                 }
  653.                 else {
  654.                     return (
  655.                         <div>
  656.                             <strong>{i18n.__('filters.customFilters.' + [translation])}</strong><br/>
  657.                             {el.map((i) => {
  658.                                 return i.label + ' ';
  659.                             })}
  660.                         </div>
  661.                     )
  662.                 }
  663.             };
  664.  
  665.             return (
  666.                 <Panel
  667.                     key={filter._id}
  668.                     header={headerFilter}
  669.                     eventKey={filter}
  670.                     className='text-center custom-panel'
  671.                 >
  672.                     <Row>
  673.                         <Col sm={12}>
  674.  
  675.                             {displayElement(filter.options.name, 'name')}
  676.                             {displayElement(filter.options.owner, 'owner')}
  677.                             {displayElement(filter.options.country, 'country')}
  678.                             {displayElement(filter.options.concern, 'concern')}
  679.                             {displayElement(filter.options.trade, 'trade')}
  680.  
  681.                         </Col>
  682.                     </Row>
  683.                 </Panel>
  684.             )
  685.         });
  686.     };
  687.  
  688.     clearSearch() {
  689.  
  690.         this.setState(
  691.             {
  692.                 customerFilter: {},
  693.                 nameFilterValue: '',
  694.                 ownerFilterValue: '',
  695.                 concernsValue: '',
  696.                 tradesValue: '',
  697.                 countriesValue: '',
  698.                 bottomText: ''
  699.             },
  700.             () => {
  701.                 this.checkCustomerCount()
  702.             }
  703.         );
  704.  
  705.     }
  706.  
  707.     filterPanel() {
  708.  
  709.         let header = (
  710.             <div className='text-center'>
  711.                 <Glyphicon glyph='filter'
  712.                            className={_.isEmpty(this.state.customerFilter) ? '' : 'active-filter-glyph'}/>
  713.                 <br/>
  714.                 <Badge
  715.                     className={_.isEmpty(this.state.customerFilter) ? '' : 'active-filter-badge'}>{this.state.globalCustomerCount}</Badge>
  716.             </div>
  717.         );
  718.  
  719.         return (
  720.  
  721.             <Panel className='filter-panel customers-filter'
  722.                    header={header}
  723.                    expanded={true}
  724.             >
  725.                 <T _translateProps={['placeholder']}>
  726.                     <FormControl
  727.                         type='text'
  728.                         placeholder='filters.name'
  729.                         value={this.state.nameFilterValue}
  730.                         onChange={this.handleNameFilterChange.bind(this)}
  731.                     />
  732.                 </T>
  733.  
  734.                 <T _translateProps={['placeholder']}>
  735.                     <FormControl
  736.                         type='text'
  737.                         placeholder='filters.owner'
  738.                         value={this.state.ownerFilterValue}
  739.                         onChange={e => {
  740.                             this.handleOwnerFilterChange(e.target.value)
  741.                         }}
  742.                     />
  743.                 </T>
  744.  
  745.                 <T _translateProps={['placeholder']}>
  746.                     <Select
  747.                         placeholder='filters.allCountries'
  748.                         value={this.state.countriesValue}
  749.                         options={this.options(this.countries())}
  750.                         multi
  751.                         onChange={this.handleSelectChange.bind(this, 'country')}
  752.                     />
  753.                 </T>
  754.  
  755.                 <T _translateProps={['placeholder']}>
  756.                     <Select
  757.                         placeholder='filters.allConcerns'
  758.                         value={this.state.concernsValue}
  759.                         options={this.options(this.concerns())}
  760.                         multi
  761.                         onChange={this.handleSelectChange.bind(this, 'concern')}
  762.                     />
  763.                 </T>
  764.  
  765.                 <T _translateProps={['placeholder']}>
  766.                     <Select
  767.                         placeholder='filters.allTrades'
  768.                         value={this.state.tradesValue}
  769.                         options={this.options(this.trades())}
  770.                         multi
  771.                         onChange={this.handleSelectChange.bind(this, 'trade')}
  772.                     />
  773.                 </T>
  774.  
  775.                 <ButtonGroup vertical block>
  776.                     <Button
  777.                         block
  778.                         bsStyle='info'
  779.                         href='/new_customer'
  780.                         disabled={!Meteor.userId()}
  781.                     >
  782.                         <T>componentCustomer.new</T>
  783.                     </Button>
  784.  
  785.                 </ButtonGroup>
  786.  
  787.                 {this.buttonsCustomFilter()}
  788.  
  789.                 <div className='scrollable'>
  790.                     <PanelGroup accordion>
  791.                         {this.customFilterComponent()}
  792.                     </PanelGroup>
  793.                 </div>
  794.  
  795.             </Panel>
  796.  
  797.         );
  798.     }
  799.  
  800.     render() {
  801.  
  802.         if (!this.state.collectionsLoaded) {
  803.             return <Spinner/>;
  804.         }
  805.  
  806.         return (
  807.             <div>
  808.                 {this.filterPanel()}
  809.                 {this.editFilterNameModal()}
  810.                 {this.showDeleteModal()}
  811.  
  812.  
  813.                 <CustomerList
  814.                     customers={this.customers()}
  815.                     ref={(ref) => this.listContainer = ref}
  816.                 />
  817.  
  818.                 <div id='feed'>
  819.                     <Well>
  820.                         <div className='text-center'>
  821.                             {this.state.bottomText}
  822.                         </div>
  823.                     </Well>
  824.                 </div>
  825.             </div>
  826.         )
  827.     }
  828. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement