Rough measurements search (WIP)
This commit is contained in:
		
							parent
							
								
									1976b49608
								
							
						
					
					
						commit
						c70dd933c5
					
				
					 8 changed files with 166 additions and 47 deletions
				
			
		| 
						 | 
					@ -1,5 +1,4 @@
 | 
				
			||||||
import DS from 'ember-data';
 | 
					import DS from 'ember-data';
 | 
				
			||||||
import Ember from 'ember';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default DS.Model.extend({
 | 
					export default DS.Model.extend({
 | 
				
			||||||
  strain: DS.belongsTo('strain', { async: true }),
 | 
					  strain: DS.belongsTo('strain', { async: true }),
 | 
				
			||||||
| 
						 | 
					@ -15,34 +14,28 @@ export default DS.Model.extend({
 | 
				
			||||||
  updatedAt: DS.attr('date'),
 | 
					  updatedAt: DS.attr('date'),
 | 
				
			||||||
  createdBy: DS.attr('number'),
 | 
					  createdBy: DS.attr('number'),
 | 
				
			||||||
  updatedBy: DS.attr('number'),
 | 
					  updatedBy: DS.attr('number'),
 | 
				
			||||||
  computedType: Ember.computed('textMeasurementType', 'txtValue', 'numValue', function() {
 | 
					  // computedType: Ember.computed('textMeasurementType', 'txtValue', 'numValue', function() {
 | 
				
			||||||
    if (this.get('textMeasurementType') && !this.get('txtValue') && !this.get('numValue')) {
 | 
					  //   if (this.get('textMeasurementType')) {
 | 
				
			||||||
      return 'Fixed-text';
 | 
					  //     return 'Fixed-text';
 | 
				
			||||||
    } else if (!this.get('textMeasurementType') && this.get('txtValue') && !this.get('numValue')) {
 | 
					  //   }
 | 
				
			||||||
      return 'Free-text';
 | 
					  //   if (this.get('txtValue')) {
 | 
				
			||||||
    } else if (!this.get('textMeasurementType') && !this.get('txtValue') && this.get('numValue')) {
 | 
					  //     return 'Free-text';
 | 
				
			||||||
      return 'Numerical';
 | 
					  //   }
 | 
				
			||||||
    } else {
 | 
					  //   if (this.get('numValue')) {
 | 
				
			||||||
      return "error";
 | 
					  //     return 'Numerical';
 | 
				
			||||||
 | 
					  //   }
 | 
				
			||||||
 | 
					  //   return "error";
 | 
				
			||||||
 | 
					  // }),
 | 
				
			||||||
 | 
					  value: function() {
 | 
				
			||||||
 | 
					    if (this.get('textMeasurementType')) {
 | 
				
			||||||
 | 
					      return this.get('textMeasurementType');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }),
 | 
					    if (this.get('txtValue')) {
 | 
				
			||||||
  computedValue: Ember.computed('textMeasurementType', 'txtValue', 'numValue', function() {
 | 
					      return this.get('txtValue');
 | 
				
			||||||
    var val;
 | 
					 | 
				
			||||||
    if (this.get('computedType') === 'Fixed-text') {
 | 
					 | 
				
			||||||
      val = this.get('textMeasurementType');
 | 
					 | 
				
			||||||
    } else if (this.get('computedType') === 'Free-text') {
 | 
					 | 
				
			||||||
      val = this.get('txtValue');
 | 
					 | 
				
			||||||
    } else if (this.get('computedType') === 'Numerical') {
 | 
					 | 
				
			||||||
      val = this.get('numValue');
 | 
					 | 
				
			||||||
      if (this.get('confidenceInterval')) {
 | 
					 | 
				
			||||||
        val = val + ' ± ' + this.get('confidenceInterval');
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      val = "error";
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (this.get('unitType')) {
 | 
					    if (this.get('numValue')) {
 | 
				
			||||||
      val = val + ' ' + this.get('unitType');
 | 
					      return this.get('numValue');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return val;
 | 
					    return "error";
 | 
				
			||||||
  })
 | 
					  }.property('textMeasurementType', 'txtValue', 'numValue'),
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ export default DS.Model.extend({
 | 
				
			||||||
  updatedBy: DS.attr('number'),
 | 
					  updatedBy: DS.attr('number'),
 | 
				
			||||||
  deletedBy: DS.attr('number'),
 | 
					  deletedBy: DS.attr('number'),
 | 
				
			||||||
  totalMeasurements: DS.attr('number'),
 | 
					  totalMeasurements: DS.attr('number'),
 | 
				
			||||||
  fullName: Ember.computed('speciesName', 'strainName', function() {
 | 
					  fullName: Ember.computed('species.speciesName', 'strainName', function() {
 | 
				
			||||||
    return this.get('speciesName') + ' (' + this.get('strainName') + ')';
 | 
					    return this.get('species.speciesName') + ' (strain ' + this.get('strainName') + ')';
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,9 @@
 | 
				
			||||||
<td>
 | 
					<td>
 | 
				
			||||||
  {{#link-to 'strains.show' data.strain.id}}
 | 
					  {{scientific-name strain=data.strain}}
 | 
				
			||||||
    {{scientific-name strain=data.strain}}
 | 
					 | 
				
			||||||
  {{/link-to}}
 | 
					 | 
				
			||||||
</td>
 | 
					</td>
 | 
				
			||||||
<td>
 | 
					<td>
 | 
				
			||||||
  {{data.characteristic.characteristicName}}
 | 
					  {{data.characteristic.characteristicName}}
 | 
				
			||||||
</td>
 | 
					</td>
 | 
				
			||||||
<td>
 | 
					<td>
 | 
				
			||||||
  {{{data.computedValue}}}
 | 
					  {{{data.value}}}
 | 
				
			||||||
</td>
 | 
					</td>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										32
									
								
								app/pods/components/measurement-search-table/component.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/pods/components/measurement-search-table/component.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					import Ember from 'ember';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Ember.Component.extend({
 | 
				
			||||||
 | 
					  isLoading: false,
 | 
				
			||||||
 | 
					  actions: {
 | 
				
			||||||
 | 
					    search: function() {
 | 
				
			||||||
 | 
					      this.set('isLoading', true);
 | 
				
			||||||
 | 
					      let strain = this.get('selectedStrain');
 | 
				
			||||||
 | 
					      let characteristic = this.get('selectedCharacteristic');
 | 
				
			||||||
 | 
					      if ((strain === 'all') && (characteristic === 'all')) {
 | 
				
			||||||
 | 
					        this.store.findAll('measurement').then((measurements)=>{
 | 
				
			||||||
 | 
					          this.set('measurements', measurements);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        this.set('isLoading', false);
 | 
				
			||||||
 | 
					        console.log(this.get('isLoading'));
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      let search = {};
 | 
				
			||||||
 | 
					      if (strain !== 'all') {
 | 
				
			||||||
 | 
					        search['strain'] = strain;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (characteristic !== 'all') {
 | 
				
			||||||
 | 
					        search['characteristic'] = characteristic;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this.store.find('measurement', search).then((measurements)=>{
 | 
				
			||||||
 | 
					        this.set('measurements', measurements);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      this.set('isLoading', false);
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										29
									
								
								app/pods/components/measurement-search-table/template.hbs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/pods/components/measurement-search-table/template.hbs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					<div class="grid-12 gutter-50">
 | 
				
			||||||
 | 
					  <div class="span-12">
 | 
				
			||||||
 | 
					    {{search-button isLoading=isLoading action='search'}}
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="grid-12 gutter-50">
 | 
				
			||||||
 | 
					  <div class="span-12">
 | 
				
			||||||
 | 
					    <h3>Total matching measurements: {{measurements.length}}</h3>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{#if isLoading}}
 | 
				
			||||||
 | 
					  {{loading-panel}}
 | 
				
			||||||
 | 
					{{else}}
 | 
				
			||||||
 | 
					  <table class="flakes-table">
 | 
				
			||||||
 | 
					    <thead>
 | 
				
			||||||
 | 
					      <tr>
 | 
				
			||||||
 | 
					        <th>Strain</th>
 | 
				
			||||||
 | 
					        <th>Characteristic</th>
 | 
				
			||||||
 | 
					        <th>Value</th>
 | 
				
			||||||
 | 
					      </tr>
 | 
				
			||||||
 | 
					    </thead>
 | 
				
			||||||
 | 
					    <tbody>
 | 
				
			||||||
 | 
					      {{#each measurements as |measurement|}}
 | 
				
			||||||
 | 
					        {{measurement-index-row data=measurement}}
 | 
				
			||||||
 | 
					      {{/each}}
 | 
				
			||||||
 | 
					    </tbody>
 | 
				
			||||||
 | 
					  </table>
 | 
				
			||||||
 | 
					{{/if}}
 | 
				
			||||||
| 
						 | 
					@ -4,18 +4,46 @@ import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixi
 | 
				
			||||||
export default Ember.Route.extend(AuthenticatedRouteMixin, {
 | 
					export default Ember.Route.extend(AuthenticatedRouteMixin, {
 | 
				
			||||||
  model: function() {
 | 
					  model: function() {
 | 
				
			||||||
    return Ember.RSVP.hash({
 | 
					    return Ember.RSVP.hash({
 | 
				
			||||||
      measurements: this.store.findAll('measurement'),
 | 
					      species: this.store.findAll('species'),
 | 
				
			||||||
      species: this.store.findAll('species')
 | 
					      strains: this.store.findAll('strain'),
 | 
				
			||||||
 | 
					      characteristics: this.store.findAll('characteristic'),
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  setupController: function(controller, models) {
 | 
					  setupController: function(controller, models) {
 | 
				
			||||||
    var tableAttrs = [
 | 
					    var tableAttrs = [
 | 
				
			||||||
      { name: 'Strain', attr: 'strain.strainName' },
 | 
					      { name: 'Strain', attr: 'strain.strainName' },
 | 
				
			||||||
      { name: 'Characteristic', attr: 'characteristic.CharacteristicName' },
 | 
					      { name: 'Characteristic', attr: 'characteristic.characteristicName' },
 | 
				
			||||||
      { name: 'Value', attr: 'computedValue'}
 | 
					      { name: 'Value', attr: 'computedValue'}
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    controller.set('model', models);
 | 
					 | 
				
			||||||
    controller.set('tableAttrs', tableAttrs);
 | 
					    controller.set('tableAttrs', tableAttrs);
 | 
				
			||||||
    controller.set('row', 'measurement-index-row');
 | 
					    controller.set('row', 'measurement-index-row');
 | 
				
			||||||
 | 
					    controller.set('measurements', []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Set up search parameters
 | 
				
			||||||
 | 
					    models.strains = models.strains.sortBy('fullName');
 | 
				
			||||||
 | 
					    let strains = models.strains.map((strain)=>{
 | 
				
			||||||
 | 
					      return Ember.Object.create({
 | 
				
			||||||
 | 
					        val: strain.get('id'),
 | 
				
			||||||
 | 
					        lab: strain.get('fullName'),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    strains.unshiftObjects(Ember.Object.create({
 | 
				
			||||||
 | 
					      val: 'all',
 | 
				
			||||||
 | 
					      lab: 'All Strains',
 | 
				
			||||||
 | 
					    }));
 | 
				
			||||||
 | 
					    controller.set('strains', strains);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    models.characteristics = models.characteristics.sortBy('characteristicName');
 | 
				
			||||||
 | 
					    let characteristics = models.characteristics.map((characteristic)=>{
 | 
				
			||||||
 | 
					      return Ember.Object.create({
 | 
				
			||||||
 | 
					        val: characteristic.get('id'),
 | 
				
			||||||
 | 
					        lab: characteristic.get('characteristicName'),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    characteristics.unshiftObjects(Ember.Object.create({
 | 
				
			||||||
 | 
					      val: 'all',
 | 
				
			||||||
 | 
					      lab: 'All Characteristics',
 | 
				
			||||||
 | 
					    }));
 | 
				
			||||||
 | 
					    controller.set('characteristics', characteristics);
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,31 @@
 | 
				
			||||||
<h2>{{genus-name}} Measurements</h2>
 | 
					<h2>{{genus-name}} Measurements</h2>
 | 
				
			||||||
<h3>Total measurements: {{model.length}}</h3>
 | 
					<div class="grid-12 gutter-50">
 | 
				
			||||||
 | 
					  <div class="span-4">
 | 
				
			||||||
 | 
					    Strains
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="span-8">
 | 
				
			||||||
 | 
					    {{
 | 
				
			||||||
 | 
					      view "select"
 | 
				
			||||||
 | 
					      content=strains
 | 
				
			||||||
 | 
					      optionValuePath="content.val"
 | 
				
			||||||
 | 
					      optionLabelPath="content.lab"
 | 
				
			||||||
 | 
					      value=selectedStrain
 | 
				
			||||||
 | 
					    }}
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<div class="grid-12 gutter-50">
 | 
				
			||||||
 | 
					  <div class="span-4">
 | 
				
			||||||
 | 
					    Characteristics
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <div class="span-8">
 | 
				
			||||||
 | 
					    {{
 | 
				
			||||||
 | 
					      view "select"
 | 
				
			||||||
 | 
					      content=characteristics
 | 
				
			||||||
 | 
					      optionValuePath="content.val"
 | 
				
			||||||
 | 
					      optionLabelPath="content.lab"
 | 
				
			||||||
 | 
					      value=selectedCharacteristic
 | 
				
			||||||
 | 
					    }}
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{
 | 
					{{measurement-search-table}}
 | 
				
			||||||
  view "select"
 | 
					 | 
				
			||||||
  content=model.species
 | 
					 | 
				
			||||||
  optionValuePath="content.id"
 | 
					 | 
				
			||||||
  optionLabelPath="content.speciesName"
 | 
					 | 
				
			||||||
}}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{{sortable-table content=model.measurements tableAttrs=tableAttrs row=row}}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					import { moduleForComponent, test } from 'ember-qunit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					moduleForComponent('measurement-search-table', 'Unit | Component | measurement search table', {
 | 
				
			||||||
 | 
					  // Specify the other units that are required for this test
 | 
				
			||||||
 | 
					  // needs: ['component:foo', 'helper:bar'],
 | 
				
			||||||
 | 
					  unit: true
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('it renders', function(assert) {
 | 
				
			||||||
 | 
					  assert.expect(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Creates the component instance
 | 
				
			||||||
 | 
					  var component = this.subject();
 | 
				
			||||||
 | 
					  assert.equal(component._state, 'preRender');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Renders the component to the page
 | 
				
			||||||
 | 
					  this.render();
 | 
				
			||||||
 | 
					  assert.equal(component._state, 'inDOM');
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
		Reference in a new issue