← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 15966: tracker capture - relationship widget, WIP

 

------------------------------------------------------------
revno: 15966
committer: Abyot Asalefew Gizaw abyota@xxxxxxxxx
branch nick: dhis2
timestamp: Fri 2014-07-04 16:36:11 +0200
message:
  tracker capture - relationship widget, WIP
modified:
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration-controller.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/add-relationship.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/registration.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/relationship-controller.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/search.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/tei.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration-controller.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration-controller.js	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration-controller.js	2014-07-04 14:36:11 +0000
@@ -1,18 +1,21 @@
 trackerCapture.controller('RegistrationController', 
-        function($scope,
+        function($rootScope,
+                $scope,
                 $location,
+                $timeout,
                 AttributesFactory,
                 TEService,
                 TEIService,
                 EnrollmentService,
                 DialogService,
+                CurrentSelection,
+                DateUtils,
                 storage,
                 TranslationService) {
 
     //do translation of the registration page
     TranslationService.translate();   
-    
-    $scope.valueExists = false;
+
     $scope.selectedOrgUnit = storage.get('SELECTED_OU');
     $scope.enrollment = {enrollmentDate: '', incidentDate: ''};   
     
@@ -36,7 +39,7 @@
         }
     });    
     
-    $scope.registerEntity = function(showDashboard){
+    $scope.registerEntity = function(destination){
         
         //check for form validity
         $scope.outerForm.submitted = true;        
@@ -89,7 +92,7 @@
                                 dateOfIncident: $scope.enrollment.incidentDate
                             };
                     EnrollmentService.enroll(enrollment).then(function(data){
-                        if(data.status != 'SUCCESS'){
+                        if(data.status !== 'SUCCESS'){
                             //enrollment has failed
                             var dialogOptions = {
                                     headerText: 'enrollment_error',
@@ -111,18 +114,44 @@
                 return;
             }
             
-            //reset form
-            angular.forEach($scope.attributes, function(attribute){
-                attribute.value = ''; 
-            });
-            $scope.enrollment.enrollmentDate = '';
-            $scope.enrollment.incidentDate =  '';
-            $scope.outerForm.submitted = false; 
+            $timeout(function() { 
+                //reset form
+                angular.forEach($scope.attributes, function(attribute){
+                    delete attribute.value;                
+                });            
+
+                $scope.enrollment.enrollmentDate = '';
+                $scope.enrollment.incidentDate =  '';
+                $scope.outerForm.submitted = false; 
+
+
+                if(destination === 'DASHBOARD') {
+                    $location.path('/dashboard').search({tei: teiId,                                            
+                                            program: $scope.selectedProgram ? $scope.selectedProgram.id: null});
+                }            
+                else if(destination === 'RELATIONSHIP' ){
+                    $scope.tei.trackedEntityInstance = teiId;
+                    $scope.broadCastSelections();
+                }
+            }, 100);        
             
-            if(showDashboard){
-                $location.path('/dashboard').search({tei: teiId,                                            
-                                            program: $scope.selectedProgram ? $scope.selectedProgram.id: null});    
-            }            
-        });
+        });
+    };
+    
+    $scope.resetRelationshipSource = function(){
+        $scope.selectedRelationshipSource = '';        
+    };
+    
+    $scope.broadCastSelections = function(){
+        angular.forEach($scope.tei.attributes, function(att){
+            $scope.tei[att.attribute] = att.value;
+        });
+        
+        $scope.tei.orgUnitName = $scope.selectedOrgUnit.name;
+        $scope.tei.created = DateUtils.format(new Date());
+        CurrentSelection.setRelationshipInfo({tei: $scope.tei, src: $scope.selectedRelationshipSource});
+        $timeout(function() { 
+            $rootScope.$broadcast('relationship', {});
+        }, 100);
     };
 });
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration.html	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/registration/registration.html	2014-07-04 14:36:11 +0000
@@ -92,14 +92,13 @@
                 </table>
             </div>
             
-            
             <div ng-if="!valueExists  && outerForm.submitted">
                 <div class="alert alert-warning">{{'form_is_empty_fill_at_least_one'| translate}}</div> 
             </div>
             
             <div class="vertical-spacing">                
-                <button type="button" class="btn btn-primary" ng-click="registerEntity(true)">{{'save_and_continue'| translate}}</button>
-                <button type="button" class="btn btn-success small-horizonal-spacing" ng-click="registerEntity(false)">{{'save_and_add_new'| translate}}</button>
+                <button type="button" class="btn btn-primary" ng-click="registerEntity('DASHBOARD')">{{'save_and_continue'| translate}}</button>
+                <button type="button" class="btn btn-success small-horizonal-spacing" ng-click="registerEntity('SELF')">{{'save_and_add_new'| translate}}</button>
                 <button type="button" class="btn btn-default small-horizonal-spacing" ng-click="showRegistration()">{{'cancel'| translate}}</button>
             </div>
         </form>

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/add-relationship.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/add-relationship.html	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/add-relationship.html	2014-07-04 14:36:11 +0000
@@ -16,7 +16,7 @@
         <hr>
         <div class="row col-md-12">
             <div class="col-md-5">
-                <div class='align-center bold'>A ({{selectedRelationshipType.aIsToB}})</div>
+                <div class='align-center bold'>{{selectedRelationshipType.aIsToB}}</div>
                 <div class='relationship-container'>
                     <table class="table table-striped table-compact table-borderless">
                         <tr ng-repeat="attribute in selectedTei.attributes">
@@ -31,7 +31,7 @@
                 </div>
             </div>
             <div class="col-md-7">
-                <div class='align-center bold'>B ({{selectedRelationshipType.bIsToA}})</div>
+                <div class='align-center bold'>{{selectedRelationshipType.bIsToA}}</div>
                 <div class='relationship-container' ng-show="teiForRelationship">
                     <table class="table table-striped table-compact table-borderless">
                         <tr ng-repeat="gridColumn in gridColumns">
@@ -45,21 +45,19 @@
                     </table>
                 </div>
                 <div class='relationship-container' ng-show="!teiForRelationship">      
-                    <select ng-model="selectedRelationshipSource"
+                    <select ng-model="selectedRelationshipSource.value"
                             class="form-control"
                             ng-options="relationshipSource | translate for relationshipSource in relationshipSources">
                         <option value="">{{'please_select_source'| translate}}</option>
                     </select>
-                    <div class="input-group vertical-spacing" ng-if="selectedRelationshipSource === 'search_from_existing'">
+                    <div class="input-group vertical-spacing" ng-if="selectedRelationshipSource.value === 'search_from_existing'">
                         <input type="text" placeholder="{{'type_here_for_simple_search'| translate}}" ng-model="searchText.value" class="form-control expanded" ng-class="{true: 'invalid - input'} [!searchText && emptySearchText]" ng-focus="showHideSearch(true)">
                         <div class="input-group-btn">
                             <button class="btn btn-default without-border-radius trim" type="button" title="{{'advanced_search'| translate}}" ng-click="showHideSearch(false)"><i class="fa fa-caret-down"></i></button>
                             <button class="btn btn-primary trim" type="button" title="{{'search'| translate}}" ng-click="search(searchMode.freeText)"><i class="fa fa-search"></i></button>                            
                         </div>                
                     </div>
-                    <div ng-if="showSearchDiv && selectedRelationshipSource === 'search_from_existing'">
-                        <!--<form ng-include="'components/relationship/search.html'">                       
-                        </form>  -->
+                    <div ng-if="showSearchDiv && selectedRelationshipSource.value === 'search_from_existing'">
                         <div ng-include="'components/relationship/search.html'"></div>     
                         <span>&nbsp;</span>
                     </div>
@@ -77,9 +75,11 @@
                         </div>
                     </div>
                     <!--- Error display for search ends -->
-
-                    <div ng-if="selectedRelationshipSource === 'register_new'">
+                    
+                    <pre>source - {{selectedRelationshipSource.value}}</pre>
+                    <div ng-show="selectedRelationshipSource.value === 'register_new'">
                         <div ng-include="'components/relationship/registration.html'"></div>
+                        <span>&nbsp;</span>
                     </div>
                 </div>
             </div>

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/registration.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/registration.html	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/registration.html	2014-07-04 14:36:11 +0000
@@ -1,102 +1,110 @@
-<div ng-controller="RegistrationController">    
-
-        <form name="outerForm" novalidate>
-            
-            <div ng-if='!selectedProgram'>
-                <h3>{{'category' | translate}}</h3>
-                 <table class="table-borderless table-striped">
-                    <tr>
-                        <td>
-                            {{'entity_type' | translate}}
-                        </td>
-                        <td>
-                            <select class="form-control" ng-model="trackedEntities.selected" ng-options="trackedEntity.name for trackedEntity in trackedEntities.available | orderBy: 'name'">                                
-                            </select>                            
-                        </td>
-                    </tr>                   
-                </table>
-                <hr>
-            </div>
-            
-            <h3>{{'profile' | translate}}</h3>
-            <table class="table-borderless table-striped">
-                <tr ng-repeat="attribute in attributes">
-                    <td>
-                        {{attribute.name}}
-                    </td>
-                    <td>
-                        <ng-form name="innerForm">     
-                            <div ng-switch="attribute.valueType">
-                                <div ng-switch-when="date">
-                                    <input type="text" name="foo" class="form-control" ng-date ng-model="attribute.value" ng-required="attribute.mandatory" />
-                                    <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
-                                </div>
-                                <div ng-switch-when="trueOnly">
-                                    <input type="checkbox" name="foo" class="form-control" ng-model="attribute.value" ng-required="attribute.mandatory" />
-                                    <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
-                                </div>
-                                <div ng-switch-when="bool">
-                                    <select name="foo" ng-model="attribute.value" class="form-control" ng-required="attribute.mandatory">
-                                        <option value="">{{'please_select'| translate}}</option>                        
-                                        <option value="0">{{'no'| translate}}</option>
-                                        <option value="1">{{'yes'| translate}}</option>
-                                    </select>
-                                    <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
-                                </div>
-                                <div ng-switch-when="optionSet">
-                                    <input type="text"
-                                           name="foo"
-                                           class="form-control"
-                                           ng-model="attribute.value"                                                 
-                                           typeahead="option for option in attribute.optionSet.options | filter:$viewValue | limitTo:20" 
-                                           typeahead-open-on-focus
-                                           ng-required="attribute.mandatory"
-                                           />
-                                    <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
-                                </div>
-                                <div ng-switch-when="number">
-                                    <input type="number" name="foo" class="form-control" ng-model="attribute.value" ng-required="attribute.mandatory"/>
-                                    <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
-                                </div>
-                                <div ng-switch-default>
-                                    <input type="text" name="foo" class="form-control" ng-model="attribute.value" ng-required="attribute.mandatory"/>
-                                    <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
-                                </div>
-                            </div>
-                        </ng-form>
-                    </td>
-                </tr>                        
-            </table>
-            
-            <div ng-if='selectedProgram'>
-                <hr>
-                <h3>{{'enrollment' | translate}}</h3>
-                <table class="dhis2-list-table-striped dhis2-table-hover">
-                    <tr>
-                        <td>
-                            {{selectedProgram.dateOfEnrollmentDescription}}
-                        </td>
-                        <td>
-                            <input type="text" name="dateOfEnrollment" class="form-control" ng-date ng-model="enrollment.incidentDate" ng-required="true"/>
-                            <span ng-show="outerForm.submitted && outerForm.dateOfEnrollment.$invalid" class="error">{{'required'| translate}}</span>
-                        </td>
-                    </tr>     
-                    <tr ng-if="selectedProgram.displayIncidentDate">
-                        <td>
-                            {{selectedProgram.dateOfIncidentDescription}}
-                        </td>
-                        <td>
-                            <input type="text" class="form-control" ng-date ng-model="enrollment.enrollmentDate" />
-                        </td>
-                    </tr>
-                </table>
-            </div>
-            
-            <div class="vertical-spacing">                
-                <button type="button" class="btn btn-primary" ng-click="registerEntity(true)">{{'save_and_continue'| translate}}</button>
-                <button type="button" class="btn btn-success small-horizonal-spacing" ng-click="registerEntity(false)">{{'save_and_add_new'| translate}}</button>
-                <button type="button" class="btn btn-default small-horizonal-spacing" ng-click="closeRegistration()">{{'cancel'| translate}}</button>
-            </div>
-        </form>
-
+<div ng-controller="RelativeRegistrationController">    
+    <hr>
+    <form name="outerForm" novalidate>
+
+        <select ng-model="selectedProgramForRelative"
+                class="form-control"
+                ng-options="program as program.name for program in programs | orderBy: 'name'">
+            <option value="">{{'please_select_a_program'| translate}}</option>
+        </select>
+
+        <div ng-if='!selectedProgramForRelative'>
+            <h3>{{'category' | translate}}</h3>
+             <table class="table-borderless table-striped">
+                <tr>
+                    <td>
+                        {{'entity_type' | translate}}
+                    </td>
+                    <td>
+                        <select class="form-control" ng-model="trackedEntities.selected" ng-options="trackedEntity.name for trackedEntity in trackedEntities.available | orderBy: 'name'">                                
+                        </select>                            
+                    </td>
+                </tr>                   
+            </table>
+            <hr>
+        </div>
+
+        <h3>{{'profile' | translate}}</h3>
+        <table class="table-borderless table-striped">
+            <tr ng-repeat="attribute in attributes">
+                <td>
+                    {{attribute.name}}
+                </td>
+                <td>
+                    <ng-form name="innerForm">     
+                        <div ng-switch="attribute.valueType">
+                            <div ng-switch-when="date">
+                                <input type="text" name="foo" class="form-control" ng-date ng-model="attribute.value" ng-required="attribute.mandatory" />
+                                <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
+                            </div>
+                            <div ng-switch-when="trueOnly">
+                                <input type="checkbox" name="foo" class="form-control" ng-model="attribute.value" ng-required="attribute.mandatory" />
+                                <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
+                            </div>
+                            <div ng-switch-when="bool">
+                                <select name="foo" ng-model="attribute.value" class="form-control" ng-required="attribute.mandatory">
+                                    <option value="">{{'please_select'| translate}}</option>                        
+                                    <option value="0">{{'no'| translate}}</option>
+                                    <option value="1">{{'yes'| translate}}</option>
+                                </select>
+                                <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
+                            </div>
+                            <div ng-switch-when="optionSet">
+                                <input type="text"
+                                       name="foo"
+                                       class="form-control"
+                                       ng-model="attribute.value"                                                 
+                                       typeahead="option for option in attribute.optionSet.options | filter:$viewValue | limitTo:20" 
+                                       typeahead-open-on-focus
+                                       ng-required="attribute.mandatory"
+                                       />
+                                <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
+                            </div>
+                            <div ng-switch-when="number">
+                                <input type="number" name="foo" class="form-control" ng-model="attribute.value" ng-required="attribute.mandatory"/>
+                                <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
+                            </div>
+                            <div ng-switch-default>
+                                <input type="text" name="foo" class="form-control" ng-model="attribute.value" ng-required="attribute.mandatory"/>
+                                <span ng-show="outerForm.submitted && innerForm.foo.$invalid" class="error">{{'required'| translate}}</span>
+                            </div>
+                        </div>
+                    </ng-form>
+                </td>
+            </tr>                        
+        </table>
+
+        <div ng-if='selectedProgramForRelative'>
+            <hr>
+            <h3>{{'enrollment' | translate}}</h3>
+            <table class="dhis2-list-table-striped dhis2-table-hover">
+                <tr>
+                    <td>
+                        {{selectedProgramForRelative.dateOfEnrollmentDescription}}
+                    </td>
+                    <td>
+                        <input type="text" name="dateOfEnrollment" class="form-control" ng-date ng-model="enrollment.incidentDate" ng-required="true"/>
+                        <span ng-show="outerForm.submitted && outerForm.dateOfEnrollment.$invalid" class="error">{{'required'| translate}}</span>
+                    </td>
+                </tr>     
+                <tr ng-if="selectedProgramForRelative.displayIncidentDate">
+                    <td>
+                        {{selectedProgramForRelative.dateOfIncidentDescription}}
+                    </td>
+                    <td>
+                        <input type="text" class="form-control" ng-date ng-model="enrollment.enrollmentDate" />
+                    </td>
+                </tr>
+            </table>
+        </div>
+
+        <div ng-if="!valueExists  && outerForm.submitted">
+            <div class="alert alert-warning">{{'form_is_empty_fill_at_least_one'| translate}}</div> 
+        </div>
+
+        <div class="vertical-spacing">                
+            <button type="button" class="btn btn-primary" ng-click="registerEntity()">{{'register'| translate}}</button>
+            <button type="button" class="btn btn-default small-horizonal-spacing" ng-click="resetRelationshipSource()">{{'cancel'| translate}}</button>
+        </div>
+    </form>
 </div>
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/relationship-controller.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/relationship-controller.js	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/relationship-controller.js	2014-07-04 14:36:11 +0000
@@ -11,21 +11,17 @@
     
     RelationshipFactory.getAll().then(function(rels){
         $scope.relationshipTypes = rels;    
-    }); 
-    
+    });    
     
     //listen for the selected entity       
     $scope.$on('dashboard', function(event, args) { 
         $scope.selections = CurrentSelection.get();
         $scope.selectedTei = angular.copy($scope.selections.tei);
         $scope.trackedEntity = $scope.selections.te;
-        $scope.selectedProgram = $scope.selections.pr;   
-        $scope.selectedEnrollment = $scope.selections.enrollment;     
-
+        $scope.selectedEnrollment = $scope.selections.enrollment;
     });
     
-    $scope.showAddRelationship = function() {
-        
+    $scope.showAddRelationship = function() {        
         var modalInstance = $modal.open({
             templateUrl: 'components/relationship/add-relationship.html',
             controller: 'AddRelationshipController',
@@ -45,16 +41,17 @@
         modalInstance.result.then(function (relationships) {
             $scope.selectedTei.relationships = relationships;
         });
-    };   
-    
+    };    
 })
 
 //Controller for adding new relationship
 .controller('AddRelationshipController', 
     function($scope, 
+            CurrentSelection,
             OperatorFactory,
             AttributesFactory,
             EntityQueryFactory,
+            ProgramFactory,
             TEIService,
             TEIGridService,
             Paginator,
@@ -67,12 +64,55 @@
     $scope.relationshipTypes = relationshipTypes;
     $scope.selectedTei = selectedTei;
     $scope.relationshipSources = ['search_from_existing','register_new'];
+    $scope.selectedRelationshipSource = {};   
     
     //Selection
     $scope.selectedOrgUnit = storage.get('SELECTED_OU');
-    $scope.selectedProgram = selections.pr;
     $scope.selectedTei = selections.tei;
     
+    ProgramFactory.getAll().then(function(programs){
+        $scope.programs = [];
+        angular.forEach(programs, function(program){                            
+            if(program.organisationUnits.hasOwnProperty($scope.selectedOrgUnit.id)){                                
+                $scope.programs.push(program);
+            }
+        });
+
+        if(angular.isObject($scope.programs) && $scope.programs.length === 1){
+            $scope.selectedProgramForRelative = $scope.programs[0];
+            AttributesFactory.getByProgram($scope.selectedProgramForRelative).then(function(atts){
+                $scope.attributes = atts;
+                $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
+                $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
+            });
+        }   
+        else{
+            AttributesFactory.getWithoutProgram().then(function(atts){
+                $scope.attributes = atts;
+                $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
+                $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
+            });
+        }
+    });    
+    
+    //set attributes as per selected program
+    $scope.setAttributesForSearch = function(program){
+        $scope.selectedProgramForRelative = program;
+        if( angular.isObject($scope.selectedProgramForRelative)){
+            AttributesFactory.getByProgram($scope.selectedProgramForRelative).then(function(atts){
+                $scope.attributes = atts;
+                $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
+                $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
+            });
+        }
+        else{
+            AttributesFactory.getWithoutProgram().then(function(atts){
+                $scope.attributes = atts;
+                $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
+                $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
+            });
+        }
+    };
     
     $scope.ouModes = [{name: 'SELECTED'}, 
                     {name: 'CHILDREN'}, 
@@ -98,27 +138,14 @@
     $scope.trackedEntityList = null; 
     $scope.enrollment = {programStartDate: '', programEndDate: '', operator: $scope.defaultOperators[0]};
    
-    $scope.searchMode = { 
-                            listAll: 'LIST_ALL', 
-                            freeText: 'FREE_TEXT', 
-                            attributeBased: 'ATTRIBUTE_BASED'
-                        };
+    $scope.searchMode = {listAll: 'LIST_ALL', freeText: 'FREE_TEXT', attributeBased: 'ATTRIBUTE_BASED'};      
     
-    if($scope.selectedProgram){
-        AttributesFactory.getByProgram($scope.selectedProgram).then(function(atts){
-            $scope.attributes = atts; 
-            $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
-            $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
-        });           
-    }
-    else{
-        AttributesFactory.getWithoutProgram().then(function(atts){
-            $scope.attributes = atts;  
-            $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
-            $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
-        });
-    }
-   
+    //listen for selections
+    $scope.$on('relationship', function(event, args) { 
+        var relationshipInfo = CurrentSelection.getRelationshipInfo();
+        $scope.teiForRelationship = relationshipInfo.tei;
+    });
+
     $scope.search = function(mode){ 
         
         $scope.teiForRelationship = null;
@@ -135,12 +162,10 @@
         $scope.programUrl = null;
         $scope.attributeUrl = {url: null, hasValue: false};
         
-        $scope.selectedSearchMode = mode;
-        $scope.attributes = $scope.generateAttributeFilters($scope.attributes);
-        $scope.gridColumns = $scope.generateGridColumns($scope.attributes);
+        $scope.selectedSearchMode = mode;        
    
-        if($scope.selectedProgram){
-            $scope.programUrl = 'program=' + $scope.selectedProgram.id;
+        if($scope.selectedProgramForRelative){
+            $scope.programUrl = 'program=' + $scope.selectedProgramForRelative.id;
         }        
         
         //check search mode
@@ -160,7 +185,7 @@
             $scope.searchText.value = null;
             $scope.attributeUrl = EntityQueryFactory.getAttributesQuery($scope.attributes, $scope.enrollment);
             
-            if(!$scope.attributeUrl.hasValue && !$scope.selectedProgram){
+            if(!$scope.attributeUrl.hasValue && !$scope.selectedProgramForRelative){
                 $scope.emptySearchAttribute = true;
                 $scope.teiFetched = false;   
                 $scope.teiCount = null;
@@ -266,17 +291,183 @@
       $modalInstance.close('');
     };
     
-    $scope.closeRegistration = function(){
-        console.log('registration close');
-        $scope.selectedRelationshipSource = '';
-    };
-    
     $scope.assignRelationship = function(selectedTei){
-        $scope.teiForRelationship = selectedTei;     
-        console.log('selected is:  ', $scope.teiForRelationship);
+        $scope.teiForRelationship = selectedTei;
     };
     
     $scope.add = function(){       
         console.log('I will add new relationship');     
-    };    
+    };
+})
+
+.controller('RelativeRegistrationController', 
+        function($rootScope,
+                $scope,
+                $timeout,
+                AttributesFactory,
+                ProgramFactory,
+                TEService,
+                TEIService,
+                EnrollmentService,
+                DialogService,
+                CurrentSelection,
+                DateUtils,
+                storage,
+                TranslationService) {
+
+    //do translation of the registration page
+    TranslationService.translate();   
+
+    $scope.selectedOrgUnit = storage.get('SELECTED_OU');
+    $scope.enrollment = {enrollmentDate: '', incidentDate: ''};    
+    
+    ProgramFactory.getAll().then(function(programs){
+        $scope.programs = [];
+        angular.forEach(programs, function(program){                            
+            if(program.organisationUnits.hasOwnProperty($scope.selectedOrgUnit.id)){                                
+                $scope.programs.push(program);
+            }
+        });
+
+        if(angular.isObject($scope.programs) && $scope.programs.length === 1){
+            $scope.selectedProgramForRelative = $scope.programs[0];
+            AttributesFactory.getByProgram($scope.selectedProgramForRelative).then(function(atts){
+                $scope.attributes = atts;
+            });
+        }                
+    });
+    
+    //watch for selection of program
+    $scope.$watch('selectedProgramForRelative', function() {        
+        if( angular.isObject($scope.selectedProgramForRelative)){
+            AttributesFactory.getByProgram($scope.selectedProgramForRelative).then(function(atts){
+                $scope.attributes = atts;
+            });
+        }
+        else{
+            AttributesFactory.getWithoutProgram().then(function(atts){
+                $scope.attributes = atts;
+            });
+        }
+    }); 
+            
+    $scope.trackedEntities = {available: []};
+    TEService.getAll().then(function(entities){
+        $scope.trackedEntities.available = entities;   
+        $scope.trackedEntities.selected = $scope.trackedEntities.available[0];
+    });
+    
+    $scope.registerEntity = function(){
+        
+        //check for form validity
+        $scope.outerForm.submitted = true;        
+        if( $scope.outerForm.$invalid ){
+            return false;
+        }
+        
+        //form is valid, continue the registration
+        //get selected entity
+        var selectedTrackedEntity = $scope.trackedEntities.selected.id; 
+        if($scope.selectedProgramForRelative){
+            selectedTrackedEntity = $scope.selectedProgramForRelative.trackedEntity.id;
+        }
+        
+        //get tei attributes and their values
+        //but there could be a case where attributes are non-mandatory and
+        //registration form comes empty, in this case enforce at least one value
+        $scope.valueExists = false;
+        var registrationAttributes = [];    
+        angular.forEach($scope.attributes, function(attribute){
+            if(!angular.isUndefined(attribute.value)){
+                var att = {attribute: attribute.id, value: attribute.value};
+                registrationAttributes.push(att);
+                $scope.valueExists = true;
+            } 
+        });       
+        
+        if(!$scope.valueExists){
+            //registration form is empty
+            return false;
+        }
+        
+        //prepare tei model and do registration
+        $scope.tei = {trackedEntity: selectedTrackedEntity, orgUnit: $scope.selectedOrgUnit.id, attributes: registrationAttributes };   
+        var teiId = '';
+    
+        TEIService.register($scope.tei).then(function(tei){
+            
+            if(tei.status === 'SUCCESS'){
+                
+                teiId = tei.reference;
+                
+                //registration is successful and check for enrollment
+                if($scope.selectedProgramForRelative){    
+                    //enroll TEI
+                    var enrollment = {trackedEntityInstance: teiId,
+                                program: $scope.selectedProgramForRelative.id,
+                                status: 'ACTIVE',
+                                dateOfEnrollment: $scope.enrollment.enrollmentDate,
+                                dateOfIncident: $scope.enrollment.incidentDate
+                            };
+                    EnrollmentService.enroll(enrollment).then(function(data){
+                        if(data.status !== 'SUCCESS'){
+                            //enrollment has failed
+                            var dialogOptions = {
+                                    headerText: 'enrollment_error',
+                                    bodyText: data.description
+                                };
+                            DialogService.showDialog({}, dialogOptions);
+                            return;
+                        }
+                    });
+                }
+            }
+            else{
+                //registration has failed
+                var dialogOptions = {
+                        headerText: 'registration_error',
+                        bodyText: tei.description
+                    };
+                DialogService.showDialog({}, dialogOptions);
+                return;
+            }
+            
+            $timeout(function() { 
+                //reset form
+                angular.forEach($scope.attributes, function(attribute){
+                    delete attribute.value;                
+                });            
+
+                $scope.enrollment.enrollmentDate = '';
+                $scope.enrollment.incidentDate =  '';
+                $scope.outerForm.submitted = false; 
+                
+                $scope.tei.trackedEntityInstance = teiId;
+                $scope.broadCastSelections();
+                
+            }, 100);        
+            
+        });
+    };
+    
+    $scope.resetRelationshipSource = function(){       
+        $scope.selectedRelationshipSource.value = '';   
+    };
+    
+    $scope.broadCastSelections = function(){
+        if($scope.tei){
+            angular.forEach($scope.tei.attributes, function(att){
+                $scope.tei[att.attribute] = att.value;
+            });
+
+            $scope.tei.orgUnitName = $scope.selectedOrgUnit.name;
+            $scope.tei.created = DateUtils.format(new Date());
+            
+            CurrentSelection.setRelationshipInfo({tei: $scope.tei, src: $scope.selectedRelationshipSource});
+            
+            $timeout(function() { 
+                $rootScope.$broadcast('relationship', {});
+            }, 100);
+        }        
+    };
 });
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/search.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/search.html	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/search.html	2014-07-04 14:36:11 +0000
@@ -10,7 +10,20 @@
                     <label><input type="radio" ng-model="selectedOuMode.name" name="accessible" value="ACCESSIBLE"> {{'ACCESSIBLE'| translate}}</label>
                 </td>
             </tr>
-            <tr ng-if="selectedProgram">
+            <tr>
+                <td>
+                    {{'program' | translate}}
+                </td>
+                <td>
+                    <select ng-model="selectedProgramForRelative"
+                            class="form-control"
+                            ng-change='setAttributesForSearch(selectedProgramForRelative)'
+                            ng-options="program as program.name for program in programs | orderBy: 'name'">
+                        <option value="">{{'please_select_a_program'| translate}}</option>
+                    </select>
+                </td>
+            </tr>
+            <tr ng-if="selectedProgramForRelative">
                 <td>{{'enrollment_date'| translate}}</td>
                 <td>
                     <div class="dataelement-filter">

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/tei.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/tei.html	2014-07-04 10:10:13 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/components/relationship/tei.html	2014-07-04 14:36:11 +0000
@@ -23,7 +23,8 @@
                 </thead>
                 <tbody id="list">
                     <tr ng-repeat="trackedEntity in trackedEntityList.rows" 
-                        ng-click="assignRelationship(trackedEntity)">
+                        ng-click="assignRelationship(trackedEntity)"
+                        ng-show="trackedEntity.id !== selectedTei.trackedEntityInstance">
                         <td ng-show="gridColumn.show"                                            
                             ng-repeat="gridColumn in gridColumns">                                                
                             {{trackedEntity[gridColumn.id]}}                                                

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js	2014-07-03 11:30:22 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js	2014-07-04 14:36:11 +0000
@@ -506,7 +506,7 @@
 
 .service('EntityQueryFactory', function(OperatorFactory){  
     
-    this.getQueryForAttributes = function(attributes, enrollment){
+    this.getAttributesQuery = function(attributes, enrollment){
 
         var query = {url: null, hasValue: false};
         
@@ -716,6 +716,7 @@
 /* current selections */
 .service('CurrentSelection', function(){
     this.currentSelection = '';
+    this.relationshipInfo = '';
     
     this.set = function(currentSelection){  
         this.currentSelection = currentSelection;        
@@ -724,6 +725,14 @@
     this.get = function(){
         return this.currentSelection;
     };
+    
+    this.setRelationshipInfo = function(relationshipInfo){  
+        this.relationshipInfo = relationshipInfo;        
+    };
+    
+    this.getRelationshipInfo = function(){
+        return this.relationshipInfo;
+    };
 })
 
 /* Translation service - gets logged in user profile for the server, 

=== modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css	2014-07-03 12:40:31 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css	2014-07-04 14:36:11 +0000
@@ -752,7 +752,8 @@
 }
 @media screen and (min-width: 768px) {
     .modal-dialog {
-        width: 75%;
+        width: 100%;
+        height: 100%;
         padding-top: 30px;
         padding-bottom: 30px;
     }