dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #28548
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 14264: new app tracker-capture, WIP
------------------------------------------------------------
revno: 14264
committer: Abyot Asalefew Gizaw abyota@xxxxxxxxx
branch nick: dhis2
timestamp: Mon 2014-03-17 16:59:31 +0100
message:
new app tracker-capture, WIP
added:
dhis-2/dhis-web/dhis-web-tracker-capture/
dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml
dhis-2/dhis-web/dhis-web-tracker-capture/src/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img/icons/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js
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/tracker-capture.js
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/
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/tracker-capture-appcache
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html
dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html
modified:
dhis-2/dhis-web/pom.xml
--
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
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml'
--- dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml 2014-03-17 15:59:31 +0000
@@ -0,0 +1,66 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-web</artifactId>
+ <version>2.15-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>dhis-web-tracker-capture</artifactId>
+ <packaging>war</packaging>
+ <name>DHIS Web Tracker Capture</name>
+
+ <build>
+ <finalName>dhis-web-tracker-capture</finalName>
+ </build>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+
+ <!-- DHIS -->
+
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-web-commons</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-web-commons-resources</artifactId>
+ <type>war</type>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-web-api</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-service-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-service-tracker</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hisp.dhis</groupId>
+ <artifactId>dhis-service-eventreporting</artifactId>
+ </dependency>
+
+ </dependencies>
+
+ <properties>
+ <rootDir>../../</rootDir>
+ </properties>
+</project>
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml 2014-03-17 15:59:31 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE struts PUBLIC
+"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+"http://struts.apache.org/dtds/struts-2.0.dtd">
+<struts>
+
+ <include file="dhis-web-commons.xml" />
+
+ <package name="dhis-web-tracker-capture" extends="dhis-web-commons" namespace="/dhis-web-tracker-capture">
+
+ <action name="index" class="org.hisp.dhis.commons.action.NoAction">
+ <result name="success" type="redirect">index.html</result>
+ </action>
+
+ </package>
+</struts>
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties 2014-03-17 15:59:31 +0000
@@ -0,0 +1,3 @@
+resource.loader = dev
+dev.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
+dev.resource.loader.path = src/main/webapp,../dhis-web-commons-resources/src/main/webapp
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml 2014-03-17 15:59:31 +0000
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+ <display-name>DHIS Web Tracker Capture</display-name>
+
+ <context-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>classpath*:/META-INF/dhis/beans.xml</param-value>
+ </context-param>
+ <context-param>
+ <param-name>automaticAccessType</param-name>
+ <param-value>ghostAdmin</param-value>
+ </context-param>
+
+ <filter>
+ <filter-name>RedirectFilter</filter-name>
+ <filter-class>org.hisp.dhis.servlet.filter.HttpRedirectFilter</filter-class>
+ <init-param>
+ <param-name>redirectPath</param-name>
+ <param-value>dhis-web-tracker-capture/index.action</param-value>
+ </init-param>
+ </filter>
+ <filter>
+ <filter-name>OpenSessionInViewFilter</filter-name>
+ <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
+ </filter>
+ <filter>
+ <filter-name>springSecurityFilterChain</filter-name>
+ <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+ </filter>
+ <filter>
+ <filter-name>Struts</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
+ </filter>
+ <filter>
+ <filter-name>encoding-filter</filter-name>
+ <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+ <init-param>
+ <param-name>encoding</param-name>
+ <param-value>UTF-8</param-value>
+ </init-param>
+ <init-param>
+ <param-name>forceEncoding</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>encoding-filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>RedirectFilter</filter-name>
+ <url-pattern>/</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>OpenSessionInViewFilter</filter-name>
+ <url-pattern>*.action</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>OpenSessionInViewFilter</filter-name>
+ <url-pattern>/api/*</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>springSecurityFilterChain</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <filter-mapping>
+ <filter-name>Struts</filter-name>
+ <url-pattern>*.action</url-pattern>
+ </filter-mapping>
+
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+ <listener>
+ <listener-class>org.hisp.dhis.system.startup.StartupListener</listener-class>
+ </listener>
+
+ <!-- Web API -->
+
+ <servlet>
+ <servlet-name>webapiServlet</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ <init-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>classpath*:/META-INF/dhis/servlet.xml</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>webapiServlet</servlet-name>
+ <url-pattern>/api</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>webapiServlet</servlet-name>
+ <url-pattern>/api/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json 2014-03-17 15:59:31 +0000
@@ -0,0 +1,42 @@
+{
+ "tracked_entity_management": "Tracked Entity Management",
+ "registering_unit": "Registering unit",
+ "program": "Program",
+ "please_select": "[Please Select]",
+ "not_selected": "Not Selected",
+ "view_all": "[View All]",
+ "list_all_entities": "List All Entities",
+ "list": "List",
+ "search": "Search",
+ "search_for": "Search for",
+ "registered_entities": "Registered Entities",
+ "empty_entity_list": "There are no reigstered entities",
+ "empty": "Empty",
+ "total_number_of_pages": "No. of pages",
+ "rows_per_page": "No. of rows per page",
+ "jump_to_page": "Jump to page",
+ "page": "Page ",
+ "first": "First",
+ "previous": "Previous",
+ "next": "Next",
+ "last": "Last",
+ "dashboard": "Go to Dashboard",
+ "edit": "Edit Entity",
+ "association": "Manage Associations",
+ "change_location": "Manage Location",
+ "details_history": "Details/History",
+ "remove": "Remove",
+ "entity": "Entity",
+ "add_new": "Add new",
+ "close_search": "Close search",
+ "search_attributes": "Search attributes",
+ "search_for_dashboard": "Search for dashboard items",
+ "dashboard": "Dashboard",
+ "home": "Home",
+ "back": "Back",
+ "profile": "Profile",
+ "enrollment": "Enrollment",
+ "notes": "Notes",
+ "dataentry": "Data Entry",
+ "current_selections": "Current selections"
+}
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img/icons'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html ng-app='trackerCapture'>
+ <head>
+ <title>Tracker Capture</title>
+
+ <meta name="description" content="DHIS 2">
+ <meta name="keywords" content="DHIS 2">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/jQuery/jquery.min.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/jQuery/ui/jquery-ui-1.9.1.custom.min.js"></script>
+ <link rel="stylesheet" type="text/css" href="../dhis-web-commons/javascripts/jQuery/ui/css/redmond/jquery-ui-1.9.1.custom.css">
+
+ <script type="text/javascript" src="../dhis-web-commons/bootstrap/js/bootstrap.min.js"></script>
+
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-resource.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-route.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-cookies.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-animate.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/ui-bootstrap-tpls-0.10.0.js"></script>
+
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/moment/moment-with-langs.min.js"></script>
+
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/underscore.min.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.util.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/commons.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/commons.ajax.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/lists.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/periodType.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/date.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/json2.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/validationRules.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.array.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.select.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.comparator.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.availability.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.trigger.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.sharing.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.validation.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.ss.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.ls.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.idb.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.memory.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js"></script>
+ <!--<script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.appcache.js"></script>-->
+
+
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angularLocalStorage.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angular-translate.min.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-static-files.min.js"></script>
+ <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-url.min.js"></script>
+
+ <script type="text/javascript" src="scripts/app.js"></script>
+ <script type="text/javascript" src="scripts/services.js"></script>
+ <script type="text/javascript" src="scripts/filters.js"></script>
+ <script type="text/javascript" src="scripts/directives.js"></script>
+ <script type="text/javascript" src="scripts/controllers.js"></script>
+
+ <link type="text/css" rel="stylesheet" href="../dhis-web-commons/font-awesome/css/font-awesome.min.css"/>
+ <link type="text/css" rel="stylesheet" media="screen,print" href="../dhis-web-commons/css/light_blue/light_blue.css"/>
+ <link type="text/css" rel="stylesheet" media="screen,print" href="../dhis-web-commons/css/widgets.css"/>
+
+ <link type="text/css" rel="stylesheet" href="styles/style.css">
+
+ </head>
+ <body>
+ <div id="header" ng-controller="HeaderController">
+ <div class="container-heading">
+ <img ng-click="home()" id="headerBanner" src="../dhis-web-commons/css/light_blue/logo_banner.png" style="cursor:pointer" title="{{'dhis2_home'| translate}}">
+ </div>
+ <div id="headerMessage" class="bold"></div>
+ </div>
+
+ <div data-ng-view=''></div>
+ </body>
+</html>
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp 2014-03-17 15:59:31 +0000
@@ -0,0 +1,21 @@
+{
+ "version": "0.1",
+ "name": "Tracker Capture",
+ "description": "Tracker Capture App",
+ "launch_path": "index.html",
+ "icons": {
+ "16": "/img/icons/mortar-16.png",
+ "48": "/img/icons/mortar-48.png",
+ "128": "/img/icons/mortar-128.png"
+ },
+ "developer": {
+ "name": "HISP",
+ "url": "http://dhis2.org"
+ },
+ "default_locale": "en",
+ "activities": {
+ "dhis": {
+ "href": "../.."
+ }
+ }
+}
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,20 @@
+angular.module("pascalprecht.translate")
+ .factory("$translateStaticFilesLoader", ["$q", "$http", function(a, b) {
+ return function(c) {
+ if (!c || !c.prefix || !c.suffix)
+ throw new Error(
+ "Couldn't load static files, no prefix or suffix specified!");
+ var d = a.defer();
+ return b(
+ {
+ url : [ c.prefix, c.key, c.suffix ]
+ .join(""),
+ method : "GET",
+ params : ""
+ }).success(function(a) {
+ d.resolve(a)
+ }).error(function() {
+ d.reject(c.key)
+ }), d.promise
+ }
+} ]);
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,26 @@
+angular
+ .module("pascalprecht.translate")
+ .factory(
+ "$translateUrlLoader",
+ [
+ "$q",
+ "$http",
+ function(a, b) {
+ return function(c) {
+ if (!c || !c.url)
+ throw new Error(
+ "Couldn't use urlLoader since no url is given!");
+ var d = a.defer();
+ return b({
+ url : c.url,
+ params : {
+ lang : c.key
+ },
+ method : "GET"
+ }).success(function(a) {
+ d.resolve(a)
+ }).error(function() {
+ d.reject(c.key)
+ }), d.promise
+ }
+ } ]);
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,1 @@
+angular.module("pascalprecht.translate",["ng"]).run(["$translate",function(a){var b=a.storageKey(),c=a.storage();c?c.get(b)?a.uses(c.get(b)):angular.isString(a.preferredLanguage())?a.uses(a.preferredLanguage()):c.set(b,a.uses()):angular.isString(a.preferredLanguage())&&a.uses(a.preferredLanguage())}]),angular.module("pascalprecht.translate").provider("$translate",["$STORAGE_KEY",function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n={},o=a,p=[],q=".",r=function(a,b){if(!a&&!b)return n;if(a&&!b){if(angular.isString(a))return n[a];angular.extend(n,s(a))}else angular.isObject(n[a])||(n[a]={}),angular.extend(n[a],s(b));return this},s=function(a,b,c,d){var e,f,g;b||(b=[]),c||(c={});for(e in a)a.hasOwnProperty(e)&&(g=a[e],angular.isObject(g)?s(g,b.concat(e),c,e):(f=b.length?""+b.join(q)+q+e:e,b.length&&e===d&&(keyWithShortPath=""+b.join(q),c[keyWithShortPath]="@:"+f),c[f]=g));return c};this.translations=r,this.addInterpolation=function(a){return p.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return i=a,this},this.preferredLanguage=function(a){return a?(b=a,this):b},this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(l=a,this):l},this.translationNotFoundIndicatorRight=function(a){return a?(m=a,this):m},this.fallbackLanguage=function(a){return a?(("string"==typeof a||angular.isArray(a))&&(c=a),this):c},this.uses=function(a){if(a){if(!n[a]&&!j)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return d=a,this}return d};var t=function(a){return a?(o=a,void 0):g?g+o:o};this.storageKey=t,this.useUrlLoader=function(a){return this.useLoader("$translateUrlLoader",{url:a})},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return j=a,k=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return f=a,this},this.storagePrefix=function(a){return a?(g=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return h=a,this},this.$get=["$log","$injector","$rootScope","$q",function(a,g,o,q){var s,u=g.get(i||"$translateDefaultInterpolation"),v=!1,w={},x=function(a){if(!a)throw"No language key specified for loading.";var b=q.defer();return o.$broadcast("$translateLoadingStart"),v=!0,g.get(j)(angular.extend(k,{key:a})).then(function(c){o.$broadcast("$translateLoadingSuccess");var d={};angular.isArray(c)?angular.forEach(c,function(a){angular.extend(d,a)}):angular.extend(d,c),v=!1,b.resolve({key:a,table:d}),o.$broadcast("$translateLoadingEnd")},function(a){o.$broadcast("$translateLoadingError"),b.reject(a),o.$broadcast("$translateLoadingEnd")}),b.promise};if(f&&(s=g.get(f),!s.get||!s.set))throw new Error("Couldn't use storage '"+f+"', missing get() or set() method!");p.length>0&&angular.forEach(p,function(a){var c=g.get(a);c.setLocale(b||d),w[c.getInterpolationIdentifier()]=c});var y=function(a){if(a&&c){if(angular.isArray(c)){for(var b=c.length,e=0;b>e;e++)if(d===n[c[e]])return!1;return!0}return a!==c}return!1},z=function(a,b,e){var f=d?n[d]:n,i=e?w[e]:u;if(f&&f.hasOwnProperty(a))return angular.isString(f[a])&&"@:"===f[a].substr(0,2)?z(f[a].substr(2),b,e):i.interpolate(f[a],b);h&&!v&&g.get(h)(a,d);var j;if(d&&c&&y(d)){"string"==typeof c?(j=[],j.push(c)):j=c;for(var k=j.length,o=0;k>o;o++)if(d!==n[j[o]]){var p=n[j[o]][a];if(p){var q;return i.setLocale(j[o]),q=i.interpolate(p,b),i.setLocale(d),q}}}return l&&(a=[l,a].join(" ")),m&&(a=[a,m].join(" ")),a};if(z.preferredLanguage=function(){return b},z.fallbackLanguage=function(){return c},z.proposedLanguage=function(){return e},z.storage=function(){return s},z.uses=function(a){function b(a){d=a,o.$broadcast("$translateChangeSuccess"),f&&s.set(z.storageKey(),d),u.setLocale(d),angular.forEach(w,function(a,b){w[b].setLocale(d)}),c.resolve(a),o.$broadcast("$translateChangeEnd")}if(!a)return d;var c=q.defer();return o.$broadcast("$translateChangeStart"),!n[a]&&j?(e=a,x(a).then(function(a){e=void 0,r(a.key,a.table),b(a.key)},function(a){e=void 0,o.$broadcast("$translateChangeError"),c.reject(a),o.$broadcast("$translateChangeEnd")})):b(a),c.promise},z.storageKey=function(){return t()},z.refresh=function(a){function b(){f.resolve(),o.$broadcast("$translateRefreshEnd")}function e(){f.reject(),o.$broadcast("$translateRefreshEnd")}if(!j)throw new Error("Couldn't refresh translation table, no loader registered!");var f=q.defer();if(a)if(n.hasOwnProperty(a)){o.$broadcast("$translateRefreshStart");var g=x(a);a===d?g.then(function(c){n[a]=c.table,z.uses(d),b()},function(){o.$broadcast("$translateChangeError"),e()}):g.then(function(c){n[a]=c.table,b()},e)}else f.reject();else{o.$broadcast("$translateRefreshStart");var h=[];if(c)if("string"==typeof c)h.push(x(c));else for(var i=c.length,k=0;i>k;k++)h.push(x(c[k]));d&&h.push(x(d)),h.length>0?q.all(h).then(function(a){for(var c in n)n.hasOwnProperty(c)&&delete n[c];for(var e=0,f=a.length;f>e;e++)r(a[e].key,a[e].table);d&&z.uses(d),b()},function(a){a===d&&o.$broadcast("$translateChangeError"),e()}):b()}return f.promise},j&&(angular.equals(n,{})&&z.uses(z.uses()),c))if("string"!=typeof c||n[c])for(var A=c.length,B=0;A>B;B++)n[c[B]]||x(c[B]);else x(c);return z}]}]),angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",["$interpolate",function(a){var b,c={},d="default";return c.setLocale=function(a){b=a},c.getInterpolationIdentifier=function(){return d},c.interpolate=function(b,c){return a(b)(c)},c}]),angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",["$filter","$interpolate","$parse",function(a,b,c){var d=a("translate");return{restrict:"AE",scope:!0,link:function(a,e,f){f.translateInterpolation&&(a.interpolation=f.translateInterpolation),f.$observe("translate",function(c){a.translationId=angular.equals(c,"")||void 0===c?b(e.text().replace(/^\s+|\s+$/g,""))(a.$parent):c}),f.$observe("translateValues",function(b){b&&a.$parent.$watch(function(){a.interpolateParams=c(b)(a.$parent)})}),a.$on("$translateChangeSuccess",function(){e.html(d(a.translationId,a.interpolateParams,a.interpolation))}),a.$watch("[translationId, interpolateParams]",function(){a.translationId&&e.html(d(a.translationId,a.interpolateParams,a.interpolation))},!0)}}}]),angular.module("pascalprecht.translate").filter("translate",["$parse","$translate",function(a,b){return function(c,d,e){return angular.isObject(d)||(d=a(d)()),b(c,d,e)}}]);
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,159 @@
+angular.module('angularLocalStorage', ['ngCookies']).factory('storage', ['$parse', '$cookieStore', '$window', '$log', function ($parse, $cookieStore, $window, $log) {
+ /**
+ * Global Vars
+ */
+ var storage = (typeof $window.localStorage === 'undefined') ? undefined : $window.localStorage;
+ var supported = !(typeof storage === 'undefined');
+
+ var privateMethods = {
+ /**
+ * Pass any type of a string from the localStorage to be parsed so it returns a usable version (like an Object)
+ * @param res - a string that will be parsed for type
+ * @returns {*} - whatever the real type of stored value was
+ */
+ parseValue: function (res) {
+ var val;
+ try {
+ val = angular.fromJson(res);
+ if (typeof val === 'undefined') {
+ val = res;
+ }
+ if (val === 'true') {
+ val = true;
+ }
+ if (val === 'false') {
+ val = false;
+ }
+ if ($window.parseFloat(val) === val && !angular.isObject(val)) {
+ val = $window.parseFloat(val);
+ }
+ } catch (e) {
+ val = res;
+ }
+ return val;
+ }
+ };
+
+ var publicMethods = {
+ /**
+ * Set - let's you set a new localStorage key pair set
+ * @param key - a string that will be used as the accessor for the pair
+ * @param value - the value of the localStorage item
+ * @returns {*} - will return whatever it is you've stored in the local storage
+ */
+ set: function (key, value) {
+ if (!supported) {
+ try {
+ $cookieStore.put(key, value);
+ return value;
+ } catch(e) {
+ $log.log('Local Storage not supported, make sure you have angular-cookies enabled.');
+ }
+ }
+ var saver = angular.toJson(value);
+ storage.setItem(key, saver);
+ return privateMethods.parseValue(saver);
+ },
+
+ /**
+ * Get - let's you get the value of any pair you've stored
+ * @param key - the string that you set as accessor for the pair
+ * @returns {*} - Object,String,Float,Boolean depending on what you stored
+ */
+ get: function (key) {
+ if (!supported) {
+ try {
+ return privateMethods.parseValue($.cookie(key));
+ } catch (e) {
+ return null;
+ }
+ }
+ var item = storage.getItem(key);
+ return privateMethods.parseValue(item);
+ },
+
+ /**
+ * Remove - let's you nuke a value from localStorage
+ * @param key - the accessor value
+ * @returns {boolean} - if everything went as planned
+ */
+ remove: function (key) {
+ if (!supported) {
+ try {
+ $cookieStore.remove(key);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ storage.removeItem(key);
+ return true;
+ },
+
+ /**
+ * Bind - let's you directly bind a localStorage value to a $scope variable
+ * @param {Angular $scope} $scope - the current scope you want the variable available in
+ * @param {String} key - the name of the variable you are binding
+ * @param {Object} opts - (optional) custom options like default value or unique store name
+ * Here are the available options you can set:
+ * * defaultValue: the default value
+ * * storeName: add a custom store key value instead of using the scope variable name
+ * @returns {*} - returns whatever the stored value is
+ */
+ bind: function ($scope, key, opts) {
+ var defaultOpts = {
+ defaultValue: '',
+ storeName: ''
+ };
+ // Backwards compatibility with old defaultValue string
+ if (angular.isString(opts)) {
+ opts = angular.extend({},defaultOpts,{defaultValue:opts});
+ } else {
+ // If no defined options we use defaults otherwise extend defaults
+ opts = (angular.isUndefined(opts)) ? defaultOpts : angular.extend(defaultOpts,opts);
+ }
+
+ // Set the storeName key for the localStorage entry
+ // use user defined in specified
+ var storeName = opts.storeName || key;
+
+ // If a value doesn't already exist store it as is
+ if (!publicMethods.get(storeName)) {
+ publicMethods.set(storeName, opts.defaultValue);
+ }
+
+ // If it does exist assign it to the $scope value
+ $parse(key).assign($scope, publicMethods.get(storeName));
+
+ // Register a listener for changes on the $scope value
+ // to update the localStorage value
+ $scope.$watch(key, function (val) {
+ if (angular.isDefined(val)) {
+ publicMethods.set(storeName, val);
+ }
+ }, true);
+
+ return publicMethods.get(storeName);
+ },
+ /**
+ * Unbind - let's you unbind a variable from localStorage while removing the value from both
+ * the localStorage and the local variable and sets it to null
+ * @param $scope - the scope the variable was initially set in
+ * @param key - the name of the variable you are unbinding
+ * @param storeName - (optional) if you used a custom storeName you will have to specify it here as well
+ */
+ unbind: function($scope,key,storeName) {
+ storeName = storeName || key;
+ $parse(key).assign($scope, null);
+ $scope.$watch(key, function () { });
+ publicMethods.remove(storeName);
+ },
+ /**
+ * Clear All - let's you clear out ALL localStorage variables, use this carefully!
+ */
+ clearAll: function() {
+ storage.clear();
+ }
+ };
+ return publicMethods;
+}]);
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,40 @@
+'use strict';
+
+/* App Module */
+
+var trackerCapture = angular.module('trackerCapture',
+ ['ui.bootstrap',
+ 'ngRoute',
+ 'ngCookies',
+ 'trackerCaptureServices',
+ 'trackerCaptureFilters',
+ 'trackerCaptureDirectives',
+ 'trackerCaptureControllers',
+ 'angularLocalStorage',
+ 'pascalprecht.translate'])
+
+.value('DHIS2URL', '../..')
+
+.config(function($httpProvider, $routeProvider, $translateProvider) {
+
+ $httpProvider.defaults.useXDomain = true;
+ delete $httpProvider.defaults.headers.common['X-Requested-With'];
+
+ $routeProvider.when('/', {
+ templateUrl:'views/selection.html',
+ controller: 'SelectionController'
+ }).when('/dashboard',{
+ templateUrl:'views/dashboard.html',
+ controller: 'DashboardController'
+ }).otherwise({
+ redirectTo : '/'
+ });
+
+ $translateProvider.useStaticFilesLoader({
+ prefix: 'i18n/',
+ suffix: '.json'
+ });
+
+ $translateProvider.preferredLanguage('en');
+
+});
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,309 @@
+'use strict';
+
+/* Controllers */
+var trackerCaptureControllers = angular.module('trackerCaptureControllers', [])
+
+//Controller for settings page
+.controller('SelectionController',
+ function($scope,
+ $location,
+ Paginator,
+ TranslationService,
+ SelectedEntity,
+ storage,
+ AttributesFactory,
+ TrackedEntityService) {
+
+ //Selection
+ $scope.selectedOrgUnit = '';
+ $scope.selectedProgram = '';
+
+ //Filtering
+ $scope.reverse = false;
+ $scope.filterText = {};
+ $scope.currentFilter;
+
+ //Paging
+ $scope.rowsPerPage = 50;
+ $scope.currentPage = Paginator.getPage() + 1;
+
+ //Searching
+ $scope.showSearchDiv = false;
+ $scope.searchField = {title: 'search', isOpen: false};
+
+ //watch for selection of org unit from tree
+ $scope.$watch('selectedOrgUnit', function() {
+
+ if( angular.isObject($scope.selectedOrgUnit)){
+
+ $scope.trackedEntityList = [];
+
+ //apply translation - by now user's profile is fetched from server.
+ TranslationService.translate();
+ $scope.attributes = storage.get('ATTRIBUTES');
+
+ var programs = storage.get('PROGRAMS');
+ if( programs ){
+ $scope.loadPrograms($scope.selectedOrgUnit);
+ }
+ }
+ });
+
+ //load programs associated with the selected org unit.
+ $scope.loadPrograms = function(orgUnit) {
+
+ $scope.selectedOrgUnit = orgUnit;
+ $scope.selectedProgram = null;
+ $scope.trackedEntityList = [];
+
+ if (angular.isObject($scope.selectedOrgUnit)) {
+
+ $scope.programs = [];
+
+ var programs = storage.get('PROGRAMS');
+
+ if( programs ){
+ for(var i=0; i<programs.length; i++){
+ var program = storage.get(programs[i].id);
+ if(program.organisationUnits.hasOwnProperty(orgUnit.id)){
+ $scope.programs.push(program);
+ }
+ }
+ }
+ }
+ };
+
+ //get events for the selected program (and org unit)
+ $scope.loadTrackedEntities = function(){
+
+ $scope.searchField.isOpen = false;
+
+ $scope.trackedEntityList = [];
+
+ $scope.gridColumns = AttributesFactory.getForListing();
+
+ //generate grid column for the selected program
+ angular.forEach($scope.gridColumns, function(gridColumn){
+ gridColumn.showFilter = false;
+ gridColumn.hide = false;
+ if(gridColumn.type === 'date'){
+ $scope.filterText[gridColumn.id]= {start: '', end: ''};
+ }
+ });
+
+ if( angular.isObject($scope.selectedProgram)){
+
+ //Load entities for the selected program and orgunit
+ TrackedEntityService.getByOrgUnitAndProgram($scope.selectedOrgUnit.id, $scope.selectedProgram.id).then(function(data){
+ $scope.trackedEntityList = data;
+ console.log('the entities are: ', $scope.trackedEntityList);
+ });
+ }
+ else{
+
+ //Load entities for the selected orgunit
+ TrackedEntityService.getByOrgUnit($scope.selectedOrgUnit.id).then(function(data){
+ $scope.trackedEntityList = data;
+ console.log('the entities are: ', $scope.trackedEntityList);
+ });
+ }
+ };
+
+ $scope.clearEntities = function(){
+ $scope.trackedEntityList = [];
+ };
+
+ $scope.showRegistration = function(){
+
+ };
+
+ $scope.showSearch = function(){
+ $scope.showSearchDiv = !$scope.showSearchDiv;
+ $scope.searchField.isOpen = true;
+ };
+
+ $scope.closeSearch = function(){
+ $scope.showSearchDiv = !$scope.showSearchDiv;
+ };
+
+ $scope.sortGrid = function(gridHeader){
+
+ if ($scope.sortHeader === gridHeader.id){
+ $scope.reverse = !$scope.reverse;
+ return;
+ }
+
+ $scope.sortHeader = gridHeader.id;
+ $scope.reverse = false;
+ };
+
+ $scope.filterInGrid = function(gridColumn){
+
+ $scope.currentFilter = gridColumn;
+ for(var i=0; i<$scope.gridColumns.length; i++){
+
+ //toggle the selected grid column's filter
+ if($scope.gridColumns[i].id === gridColumn.id){
+ $scope.gridColumns[i].showFilter = !$scope.gridColumns[i].showFilter;
+ }
+ else{
+ $scope.gridColumns[i].showFilter = false;
+ }
+ }
+ };
+
+ $scope.showDashboard = function(currentEntity){
+ SelectedEntity.setSelectedEntity(currentEntity);
+ storage.set('SELECTED_OU', $scope.selectedOrgUnit);
+ $location.path('/dashboard').search({selectedEntityId: currentEntity.person, selectedProgramId: $scope.selectedProgram ? $scope.selectedProgram.id : null});
+ };
+
+ $scope.search = function(){
+ console.log('the search is: ', $scope.attributes);
+ };
+
+ $scope.getHelpContent = function(){
+ console.log('I will get help content');
+ };
+})
+
+//Controller for dashboard
+.controller('DashboardController',
+ function($scope,
+ $location,
+ storage,
+ EnrollmentService,
+ TrackedEntityService,
+ TranslationService) {
+
+ //do translation of the dashboard page
+ TranslationService.translate();
+
+ //dashboard contents
+ $scope.profile = {title: 'profile', isOpen: true};
+ $scope.enrollment = {title: 'enrollment', isOpen: true};
+ $scope.notes = {title: 'notes', isOpen: true};
+ $scope.dataEntry = {title: 'dataentry', isOpen: true};
+ $scope.selected = {title: 'current_selections', isOpen: true, selections: []};
+
+ //attributes for profile
+ $scope.attributes = {};
+ angular.forEach(storage.get('ATTRIBUTES'), function(attribute){
+ $scope.attributes[attribute.id] = attribute;
+ });
+
+ //selections
+ $scope.selectedEntityId = ($location.search()).selectedEntityId;
+ $scope.selectedProgramId = ($location.search()).selectedProgramId;
+
+ $scope.selectedOrgUnit = storage.get('SELECTED_OU');
+
+ $scope.selectedProgram = null;
+
+ if($scope.selectedProgramId){
+ $scope.selectedProgram = storage.get($scope.selectedProgramId);
+ }
+
+ //programs for enrollment
+ $scope.programs = [];
+ var programs = storage.get('PROGRAMS');
+ if( programs ){
+ for(var i=0; i<programs.length; i++){
+ var program = storage.get(programs[i].id);
+ if($scope.selectedProgramId == programs[i].id){
+ $scope.selectedProgram = program;
+ }
+ if(program.organisationUnits.hasOwnProperty($scope.selectedOrgUnit.id)){
+ $scope.programs.push(program);
+ }
+ }
+ }
+
+ if( $scope.selectedEntityId ){
+
+ //Fetch the selected entity
+ TrackedEntityService.get($scope.selectedEntityId).then(function(data){
+ $scope.selectedEntity = data;
+ console.log('the entity is: ', $scope.selectedEntity);
+ });
+
+ EnrollmentService.get($scope.selectedEntityId).then(function(data){
+ console.log('enrollment: ', data);
+ });
+ }
+
+ $scope.selected.selections.push({title: 'registering_unit', value: $scope.selectedOrgUnit ? $scope.selectedOrgUnit.name : 'not_selected'});
+ $scope.selected.selections.push({title: 'program', value: $scope.selectedProgram ? $scope.selectedProgram.name : 'not_selected'});
+
+ $scope.back = function(){
+ $location.path('/');
+ };
+
+ $scope.displayEnrollment = false;
+ $scope.showEnrollment = function(){
+ $scope.displayEnrollment = true;
+ };
+
+})
+
+//Controller for the enrollment section
+.controller('EnrollmentController',
+ function($scope,
+ storage,
+ TranslationService) {
+
+ TranslationService.translate();
+
+ $scope.attributes = storage.get('ATTRIBUTES');
+
+})
+
+//Controller for the notes section
+.controller('NotesController',
+ function($scope,
+ storage,
+ TranslationService) {
+
+ TranslationService.translate();
+
+ $scope.attributes = storage.get('ATTRIBUTES');
+
+})
+
+//Controller for the notes section
+.controller('NotesController',
+ function($scope,
+ storage,
+ TranslationService) {
+
+ TranslationService.translate();
+
+ $scope.attributes = storage.get('ATTRIBUTES');
+
+})
+
+//Controller for the data entry section
+.controller('DataEntryController',
+ function($scope,
+ storage,
+ TranslationService) {
+
+ TranslationService.translate();
+
+ $scope.attributes = storage.get('ATTRIBUTES');
+
+})
+
+//Controller for the header section
+.controller('HeaderController',
+ function($scope,
+ DHIS2URL,
+ TranslationService) {
+
+ TranslationService.translate();
+
+ $scope.home = function(){
+ window.location = DHIS2URL;
+ };
+
+});
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,207 @@
+'use strict';
+
+/* Directives */
+
+var trackerCaptureDirectives = angular.module('trackerCaptureDirectives', [])
+
+.directive('inputValidator', function() {
+
+ return {
+ require: 'ngModel',
+ link: function (scope, element, attrs, ctrl) {
+
+ ctrl.$parsers.push(function (value) {
+ return parseFloat(value || '');
+ });
+ }
+ };
+})
+
+.directive('selectedOrgUnit', function($timeout) {
+
+ return {
+ restrict: 'A',
+ link: function(scope, element, attrs){
+
+ //when tree has loaded, get selected orgunit - if there is any - and inform angular
+ $(function() {
+
+ var adapters = [];
+ var partial_adapters = [];
+
+ if( dhis2.ou.memoryOnly ) {
+ adapters = [ dhis2.storage.InMemoryAdapter ];
+ partial_adapters = [ dhis2.storage.InMemoryAdapter ];
+ } else {
+ adapters = [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomLocalStorageAdapter, dhis2.storage.InMemoryAdapter ];
+ partial_adapters = [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter ];
+ }
+
+ dhis2.ou.store = new dhis2.storage.Store({
+ name: OU_STORE_NAME,
+ objectStores: [
+ {
+ name: OU_KEY,
+ adapters: adapters
+ },
+ {
+ name: OU_PARTIAL_KEY,
+ adapters: partial_adapters
+ }
+ ]
+ });
+
+ dhis2.ou.store.open().done( function() {
+ selection.load();
+ $( "#orgUnitTree" ).one( "ouwtLoaded", function() {
+ var selected = selection.getSelected()[0];
+ selection.getOrganisationUnit(selected).done(function(data){
+ if( data ){
+ scope.selectedOrgUnit = {id: selected, name: data[selected].n};
+ scope.$apply();
+ }
+ });
+ } );
+
+ });
+ });
+
+ //listen to user selection, and inform angular
+ selection.setListenerFunction( organisationUnitSelected );
+ selection.responseReceived();
+
+ function organisationUnitSelected( orgUnits, orgUnitNames ) {
+ scope.selectedOrgUnit = {id: orgUnits[0], name: orgUnitNames[0]};
+ scope.$apply();
+ }
+ }
+ };
+})
+
+.directive('dhisContextMenu', function(ContextMenuSelectedItem) {
+
+ return {
+ restrict: 'A',
+ link: function(scope, element, attrs){
+ var contextMenu = $("#contextMenu");
+
+ element.click(function (e) {
+ var selectedItem = $.parseJSON(attrs.selectedItem);
+ ContextMenuSelectedItem.setSelectedItem(selectedItem);
+
+ var menuHeight = contextMenu.height();
+ var menuWidth = contextMenu.width();
+ var winHeight = $(window).height();
+ var winWidth = $(window).width();
+
+ var pageX = e.pageX;
+ var pageY = e.pageY;
+
+ contextMenu.show();
+
+ if( (menuWidth + pageX) > winWidth ) {
+ pageX -= menuWidth;
+ }
+
+ if( (menuHeight + pageY) > winHeight ) {
+ pageY -= menuHeight;
+
+ if( pageY < 0 ) {
+ pageY = e.pageY;
+ }
+ }
+
+ contextMenu.css({
+ left: pageX,
+ top: pageY
+ });
+
+ return false;
+ });
+
+ contextMenu.on("click", "a", function () {
+ contextMenu.hide();
+ });
+
+ $(document).click(function () {
+ contextMenu.hide();
+ });
+ }
+ };
+})
+
+.directive('ngDate', function($filter) {
+ return {
+ restrict: 'A',
+ require: 'ngModel',
+ link: function(scope, element, attrs, ctrl) {
+ element.datepicker({
+ changeYear: true,
+ changeMonth: true,
+ dateFormat: 'yy-mm-dd',
+ onSelect: function(date) {
+ //scope.date = date;
+ ctrl.$setViewValue(date);
+ $(this).change();
+ scope.$apply();
+ }
+ })
+ .change(function() {
+ //var rawDate = $filter('date')(this.value, 'yyyy-MM-dd');
+ var rawDate = this.value;
+ var convertedDate = moment(this.value, 'YYYY-MM-DD')._d;
+ convertedDate = $filter('date')(convertedDate, 'yyyy-MM-dd');
+
+ if(rawDate != convertedDate){
+ scope.invalidDate = true;
+ ctrl.$setViewValue(this.value);
+ ctrl.$setValidity('foo', false);
+ scope.$apply();
+ }
+ else{
+ scope.invalidDate = false;
+ ctrl.$setViewValue(this.value);
+ ctrl.$setValidity('foo', true);
+ scope.$apply();
+ }
+ });
+ }
+ };
+})
+
+.directive('blurOrChange', function() {
+
+ return function( scope, elem, attrs) {
+ elem.datepicker({
+ onSelect: function() {
+ scope.$apply(attrs.blurOrChange);
+ $(this).change();
+ }
+ }).change(function() {
+ scope.$apply(attrs.blurOrChange);
+ });
+ };
+})
+
+.directive('typeaheadOpenOnFocus', function () {
+ return {
+ require: ['typeahead', 'ngModel'],
+ link: function (scope, element, attr, ctrls) {
+ element.bind('focus', function () {
+ ctrls[0].getMatchesAsync(ctrls[1].$viewValue);
+ //scope.$apply();
+ });
+ }
+ };
+})
+
+.directive('paginator', function factory() {
+ return {
+ restrict: 'E',
+ controller: function ($scope, Paginator) {
+ $scope.paginator = Paginator;
+ },
+ templateUrl: 'views/pagination.html'
+ };
+});
+
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,87 @@
+'use strict';
+
+/* Filters */
+
+var trackerCaptureFilters = angular.module('trackerCaptureFilters', [])
+
+.filter('gridFilter', function(){
+
+ return function(data, filterText, currentFilter){
+
+ if(!data ){
+ return;
+ }
+
+ if(!filterText){
+ return data;
+ }
+ else{
+
+ var keys = [];
+ var filteredData = data;
+
+ for(var key in filterText){
+ keys.push(key);
+
+ for(var i=0; i<filteredData.length; i++){
+
+ var val = filteredData[i][key];
+
+ if( currentFilter.type === 'date'){
+
+ if( filterText[key].start || filterText[key].end){
+ var start = moment(filterText[key].start, 'YYYY-MM-DD');
+ var end = moment(filterText[key].end, 'YYYY-MM-DD');
+ var date = moment(val, 'YYYY-MM-DD');
+
+ if( ( Date.parse(date) > Date.parse(end) ) || (Date.parse(date) < Date.parse(start)) ){
+ filteredData.splice(i,1);
+ i--;
+ }
+ }
+
+ }
+ else{
+ if( currentFilter.type === 'int'){
+ val = val.toString();
+ }
+
+ val = val.toLowerCase();
+ if( val.indexOf(filterText[key].toLowerCase()) === -1 ){
+ filteredData.splice(i,1);
+ i--;
+ }
+ }
+
+ }
+ }
+ return filteredData;
+ }
+ };
+})
+
+.filter('paginate', function(Paginator) {
+ return function(input, rowsPerPage) {
+ if (!input) {
+ return input;
+ }
+
+ if (rowsPerPage) {
+ Paginator.rowsPerPage = rowsPerPage;
+ }
+
+ Paginator.itemCount = input.length;
+
+ return input.slice(parseInt(Paginator.page * Paginator.rowsPerPage), parseInt((Paginator.page + 1) * Paginator.rowsPerPage + 1) - 1);
+ };
+})
+
+.filter('forLoop', function() {
+ return function(input, start, end) {
+ input = new Array(end - start);
+ for (var i = 0; start < end; start++, i++) {
+ input[i] = start;
+ }
+ return input;
+ };
+});
\ No newline at end of file
=== added 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 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,506 @@
+'use strict';
+
+/* Services */
+
+var trackerCaptureServices = angular.module('trackerCaptureServices', ['ngResource'])
+
+/* factory for loading logged in user profiles from DHIS2 */
+.factory('CurrentUserProfile', function($http) {
+
+ var profile, promise;
+ return {
+ get: function() {
+ if( !promise ){
+ promise = $http.get( '../api/me/profile').then(function(response){
+ profile = response.data;
+ return profile;
+ });
+ }
+ return promise;
+ }
+ };
+})
+
+/* Factory to fetch programs */
+.factory('ProgramFactory', function($http) {
+
+ var programUid, programPromise;
+ var programs, programsPromise;
+ var program;
+ return {
+
+ get: function(uid){
+ if( programUid !== uid ){
+ programPromise = $http.get( '../api/programs/' + uid + '.json?viewClass=detailed&paging=false').then(function(response){
+ programUid = response.data.id;
+ program = response.data;
+ return program;
+ });
+ }
+ return programPromise;
+ },
+
+ getMine: function(type){
+ if( !programsPromise ){
+ programsPromise = $http.get( '../api/me/programs?includeDescendants=true&type='+type).then(function(response){
+ programs = response.data;
+ return programs;
+ });
+ }
+ return programsPromise;
+ },
+
+ getEventProgramsByOrgUnit: function(orgUnit, type){
+
+ var promise = $http.get( '../api/programs.json?orgUnit=' + orgUnit + '&type=' + type ).then(function(response){
+ programs = response.data;
+ return programs;
+ });
+ return promise;
+ }
+ };
+})
+
+/* Factory to fetch programStages */
+.factory('ProgramStageFactory', function($http, storage) {
+
+ var programStage, promise;
+ return {
+ get: function(uid){
+ if( programStage !== uid ){
+ promise = $http.get( '../api/programStages/' + uid + '.json?viewClass=detailed&paging=false').then(function(response){
+ programStage = response.data.id;
+
+ //store locally - might need them for event data values
+ angular.forEach(response.data.programStageDataElements, function(prStDe){
+ storage.set(prStDe.dataElement.id, prStDe);
+ });
+
+ return response.data;
+ });
+ }
+ return promise;
+ }
+ };
+})
+
+/* Service to deal with enrollment */
+.service('EnrollmentService', function($http) {
+
+ return {
+ get: function( entity ){
+ var promise = $http.get( '../api/enrollments?person=' + entity ).then(function(response){
+ return response.data;
+ });
+ return promise;
+ },
+ enroll: function( enrollment ){
+ var promise = $http.post( '../api/enrollments', enrollment ).then(function(response){
+ return response.data;
+ });
+ return promise;
+ }
+ };
+})
+
+/* Service for getting tracked entity instances */
+.factory('TrackedEntityService', function($http, AttributesFactory) {
+
+ var promise;
+ return {
+
+ get: function(entityUid) {
+ promise = $http.get( '../api/trackedEntityInstances/' + entityUid ).then(function(response){
+ return response.data;
+ });
+ return promise;
+ },
+ getByOrgUnitAndProgram: function(orgUnitUid, programUid) {
+ promise = $http.get( '../api/trackedEntityInstances.json?orgUnit=' + orgUnitUid + '&program=' + programUid ).then(function(response){
+
+ var trackedEntityList = response.data.personList;
+
+ trackedEntityList = entityFormatter(trackedEntityList, AttributesFactory.getForListing());
+
+ return trackedEntityList;
+ });
+ return promise;
+ },
+ getByOrgUnit: function(orgUnitUid) {
+ promise = $http.get( '../api/trackedEntityInstances.json?orgUnit=' + orgUnitUid ).then(function(response){
+
+ var trackedEntityList = response.data.personList;
+
+ trackedEntityList = entityFormatter(trackedEntityList, AttributesFactory.getForListing());
+
+ return trackedEntityList;
+ });
+ return promise;
+ }
+ };
+
+})
+
+/* Factory for getting tracked entity attributes */
+.factory('AttributesFactory', function(storage) {
+
+ return {
+ getAll: function(){
+
+ var attributes = storage.get('ATTRIBUTES');
+
+ if(attributes){
+ return attributes;
+ }
+ return;
+ },
+ getForListing: function(){
+
+ var attributes = [];
+
+ angular.forEach(this.getAll(), function(attribute) {
+ if (attribute.displayInListNoProgram) {
+ attributes.push(attribute);
+ }
+ });
+
+ return attributes;
+ }
+ };
+})
+
+
+/* factory for handling events */
+.factory('DHIS2EventFactory', function($http) {
+
+ return {
+
+ getByPerson: function(person, orgUnit, program){
+ var promise = $http.get( '../api/events.json?' + 'person=' + person + '&orgUnit=' + orgUnit + '&program=' + program + '&paging=false').then(function(response){
+ return response.data.eventList;
+ });
+ return promise;
+ },
+
+ getByStage: function(orgUnit, programStage){
+ var promise = $http.get( '../api/events.json?' + 'orgUnit=' + orgUnit + '&programStage=' + programStage + '&paging=false')
+ .then(function(response){
+
+ return response.data.eventList;
+
+ }, function(){
+
+ return dhis2.ec.storageManager.getEvents(orgUnit, programStage);
+
+ });
+
+ return promise;
+ },
+
+ get: function(eventUid){
+
+ var promise = $http.get( '../api/events/' + eventUid + '.json').then(function(response){
+ return response.data;
+
+ }, function(){
+ return dhis2.ec.storageManager.getEvent(eventUid);
+ });
+ return promise;
+ },
+
+ create: function(dhis2Event){
+
+ var e = angular.copy(dhis2Event);
+ dhis2.ec.storageManager.saveEvent(e);
+
+ var promise = $http.post( '../api/events.json', dhis2Event).then(function(response){
+ dhis2.ec.storageManager.clearEvent(e);
+ return response.data;
+ }, function(){
+ return {importSummaries: [{status: 'SUCCESS', reference: e.event}]};
+ });
+ return promise;
+ },
+
+ delete: function(dhis2Event){
+ dhis2.ec.storageManager.clearEvent(dhis2Event);
+ var promise = $http.delete( '../api/events/' + dhis2Event.event).then(function(response){
+ return response.data;
+ }, function(){
+ });
+ return promise;
+ },
+
+ update: function(dhis2Event){
+ dhis2.ec.storageManager.saveEvent(dhis2Event);
+ var promise = $http.put( '../api/events/' + dhis2Event.event, dhis2Event).then(function(response){
+ dhis2.ec.storageManager.clearEvent(dhis2Event);
+ return response.data;
+ });
+ return promise;
+ },
+
+ updateForSingleValue: function(singleValue, fullValue){
+
+ dhis2.ec.storageManager.saveEvent(fullValue);
+
+ var promise = $http.put( '../api/events/' + singleValue.event + '/' + singleValue.dataValues[0].dataElement, singleValue ).then(function(response){
+ dhis2.ec.storageManager.clearEvent(fullValue);
+ return response.data;
+ }, function(){
+ });
+ return promise;
+ }
+ };
+})
+
+/* Modal service for user interaction */
+.service('ModalService', ['$modal', function($modal) {
+
+ var modalDefaults = {
+ backdrop: true,
+ keyboard: true,
+ modalFade: true,
+ templateUrl: 'views/modal.html'
+ };
+
+ var modalOptions = {
+ closeButtonText: 'Close',
+ actionButtonText: 'OK',
+ headerText: 'Proceed?',
+ bodyText: 'Perform this action?'
+ };
+
+ this.showModal = function(customModalDefaults, customModalOptions) {
+ if (!customModalDefaults)
+ customModalDefaults = {};
+ customModalDefaults.backdrop = 'static';
+ return this.show(customModalDefaults, customModalOptions);
+ };
+
+ this.show = function(customModalDefaults, customModalOptions) {
+ //Create temp objects to work with since we're in a singleton service
+ var tempModalDefaults = {};
+ var tempModalOptions = {};
+
+ //Map angular-ui modal custom defaults to modal defaults defined in service
+ angular.extend(tempModalDefaults, modalDefaults, customModalDefaults);
+
+ //Map modal.html $scope custom properties to defaults defined in service
+ angular.extend(tempModalOptions, modalOptions, customModalOptions);
+
+ if (!tempModalDefaults.controller) {
+ tempModalDefaults.controller = function($scope, $modalInstance) {
+ $scope.modalOptions = tempModalOptions;
+ $scope.modalOptions.ok = function(result) {
+ $modalInstance.close(result);
+ };
+ $scope.modalOptions.close = function(result) {
+ $modalInstance.dismiss('cancel');
+ };
+ };
+ }
+
+ return $modal.open(tempModalDefaults).result;
+ };
+
+ }])
+
+/* Dialog service for user interaction */
+.service('DialogService', ['$modal', function($modal) {
+
+ var dialogDefaults = {
+ backdrop: true,
+ keyboard: true,
+ backdropClick: true,
+ modalFade: true,
+ templateUrl: 'views/dialog.html'
+ };
+
+ var dialogOptions = {
+ closeButtonText: 'close',
+ actionButtonText: 'ok',
+ headerText: 'dhis2_tracker',
+ bodyText: 'Perform this action?'
+ };
+
+ this.showDialog = function(customDialogDefaults, customDialogOptions) {
+ if (!customDialogDefaults)
+ customDialogDefaults = {};
+ customDialogDefaults.backdropClick = false;
+ return this.show(customDialogDefaults, customDialogOptions);
+ };
+
+ this.show = function(customDialogDefaults, customDialogOptions) {
+ //Create temp objects to work with since we're in a singleton service
+ var tempDialogDefaults = {};
+ var tempDialogOptions = {};
+
+ //Map angular-ui modal custom defaults to modal defaults defined in service
+ angular.extend(tempDialogDefaults, dialogDefaults, customDialogDefaults);
+
+ //Map modal.html $scope custom properties to defaults defined in service
+ angular.extend(tempDialogOptions, dialogOptions, customDialogOptions);
+
+ if (!tempDialogDefaults.controller) {
+ tempDialogDefaults.controller = function($scope, $modalInstance) {
+ $scope.dialogOptions = tempDialogOptions;
+ $scope.dialogOptions.ok = function(result) {
+ $modalInstance.close(result);
+ };
+ };
+ }
+
+ return $modal.open(tempDialogDefaults).result;
+ };
+
+ }])
+
+/* current item selected from grid */
+.service('SelectedEntity', function(){
+ this.selectedEntity = '';
+
+ this.setSelectedEntity = function(selectedEntity){
+ this.selectedEntity = selectedEntity;
+ };
+
+ this.getSelectedEntity = function(){
+ return this.selectedEntity;
+ };
+})
+
+/* Translation service - gets logged in user profile for the server,
+ * and apply user's locale to translation
+ */
+.service('TranslationService', function($translate, storage){
+
+ this.translate = function(){
+ var profile = storage.get('USER_PROFILE');
+ if( profile ){
+ $translate.uses(profile.settings.keyUiLocale);
+ }
+ };
+})
+
+/* Pagination service */
+.service('Paginator', function () {
+ this.page = 0;
+ this.rowsPerPage = 50;
+ this.itemCount = 0;
+ this.limitPerPage = 5;
+
+ this.setPage = function (page) {
+ if (page > this.pageCount()) {
+ return;
+ }
+
+ this.page = page;
+ };
+
+ this.getPage = function(){
+ return this.page;
+ };
+
+ this.getRowsPerPage = function(){
+ return this.rowsPerPage;
+ };
+
+ this.nextPage = function () {
+ if (this.isLastPage()) {
+ return;
+ }
+
+ this.page++;
+ };
+
+ this.perviousPage = function () {
+ if (this.isFirstPage()) {
+ return;
+ }
+
+ this.page--;
+ };
+
+ this.firstPage = function () {
+ this.page = 0;
+ };
+
+ this.lastPage = function () {
+ this.page = this.pageCount() - 1;
+ };
+
+ this.isFirstPage = function () {
+ return this.page == 0;
+ };
+
+ this.isLastPage = function () {
+ return this.page == this.pageCount() - 1;
+ };
+
+ this.pageCount = function () {
+ var count = Math.ceil(parseInt(this.itemCount, 10) / parseInt(this.rowsPerPage, 10));
+ if (count === 1) { this.page = 0; } return count;
+ };
+
+ this.lowerLimit = function() {
+ var pageCountLimitPerPageDiff = this.pageCount() - this.limitPerPage;
+
+ if (pageCountLimitPerPageDiff < 0) {
+ return 0;
+ }
+
+ if (this.page > pageCountLimitPerPageDiff + 1) {
+ return pageCountLimitPerPageDiff;
+ }
+
+ var low = this.page - (Math.ceil(this.limitPerPage/2) - 1);
+
+ return Math.max(low, 0);
+ };
+})
+
+/*this is just a hack - there should be better way */
+.service('ValidDate', function(){
+ var dateValidation;
+ return {
+ get: function(dt) {
+ dateValidation = dt;
+ },
+ set: function() {
+ return dateValidation;
+ }
+ };
+
+});
+
+/*
+* Helper functions
+*/
+//This is is to have consistent display of entities and attributes
+//as every entity might not have value for every attribute.
+function entityFormatter(entityList, attributesForListing){
+
+ angular.forEach(entityList, function(trackedEntity){
+
+ //assume every entity has value for each attribute
+ //initially all are empty
+ angular.forEach(attributesForListing, function(attribute){
+
+ var loop = true;
+ var att = angular.copy(attribute);
+ att.value = '';
+
+ for(var i=0; i<trackedEntity.attributes.length && loop; i++){
+ if(trackedEntity.attributes[i].attribute == attribute.id){
+ att.value = trackedEntity.attributes[i].value;
+ loop = false;
+ }
+ }
+
+ trackedEntity[att.id] = att.value;
+
+ });
+ });
+
+ return entityList;
+}
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js 2014-03-17 15:59:31 +0000
@@ -0,0 +1,552 @@
+
+dhis2.util.namespace('dhis2.tc');
+
+// whether current user has any organisation units
+dhis2.tc.emptyOrganisationUnits = false;
+
+// Instance of the StorageManager
+dhis2.tc.storageManager = new StorageManager();
+
+var DAO = DAO || {};
+
+var i18n_no_orgunits = 'No organisation unit attached to current user, no data entry possible';
+var i18n_offline_notification = 'You are offline, data will be stored locally';
+var i18n_online_notification = 'You are online';
+var i18n_need_to_sync_notification = 'There is data stored locally, please upload to server';
+var i18n_sync_now = 'Upload';
+var i18n_sync_success = 'Upload to server was successful';
+var i18n_sync_failed = 'Upload to server failed, please try again later';
+var i18n_uploading_data_notification = 'Uploading locally stored data to the server';
+
+var PROGRAMS_METADATA = 'PROGRAMS';
+
+var EVENT_VALUES = 'EVENTVALUES';
+
+DAO.store = new dhis2.storage.Store({
+ name: 'dhis2',
+ adapters: [dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter],
+ objectStores: ['optionSets']
+});
+
+(function($) {
+ $.safeEach = function(arr, fn)
+ {
+ if (arr)
+ {
+ $.each(arr, fn);
+ }
+ };
+})(jQuery);
+
+
+/**
+ * Page init. The order of events is:
+ *
+ * 1. Load ouwt 2. Load meta-data (and notify ouwt) 3. Check and potentially
+ * download updated forms from server
+ */
+$(document).ready(function()
+{
+ $.ajaxSetup({
+ type: 'POST',
+ cache: false
+ });
+
+ $('#loaderSpan').show();
+
+ $('#orgUnitTree').one('ouwtLoaded', function()
+ {
+ var def = $.Deferred();
+ var promise = def.promise();
+
+ promise = promise.then( getUserProfile );
+ promise = promise.then( getAttributes );
+ promise = promise.then( getMetaPrograms );
+ promise = promise.then( getPrograms );
+ promise = promise.then( getProgramStages );
+ promise.done( function() {
+ selection.responseReceived();
+ });
+
+ def.resolve();
+
+ });
+
+ $(document).bind('dhis2.online', function(event, loggedIn)
+ {
+ if (loggedIn)
+ {
+ if (dhis2.tc.storageManager.hasLocalData())
+ {
+ var message = i18n_need_to_sync_notification
+ + ' <button id="sync_button" type="button">' + i18n_sync_now + '</button>';
+
+ setHeaderMessage(message);
+
+ $('#sync_button').bind('click', uploadLocalData);
+ }
+ else
+ {
+ if (dhis2.tc.emptyOrganisationUnits) {
+ setHeaderMessage(i18n_no_orgunits);
+ }
+ else {
+ setHeaderDelayMessage(i18n_online_notification);
+ }
+ }
+ }
+ else
+ {
+ var form = [
+ '<form style="display:inline;">',
+ '<label for="username">Username</label>',
+ '<input name="username" id="username" type="text" style="width: 70px; margin-left: 10px; margin-right: 10px" size="10"/>',
+ '<label for="password">Password</label>',
+ '<input name="password" id="password" type="password" style="width: 70px; margin-left: 10px; margin-right: 10px" size="10"/>',
+ '<button id="login_button" type="button">Login</button>',
+ '</form>'
+ ].join('');
+
+ setHeaderMessage(form);
+ ajax_login();
+ }
+ });
+
+ $(document).bind('dhis2.offline', function()
+ {
+ if (dhis2.tc.emptyOrganisationUnits) {
+ setHeaderMessage(i18n_no_orgunits);
+ }
+ else {
+ setHeaderMessage(i18n_offline_notification);
+ selection.responseReceived(); //notify angular
+ }
+ });
+
+ //dhis2.availability.startAvailabilityCheck();
+
+});
+
+function ajax_login()
+{
+ $('#login_button').bind('click', function()
+ {
+ var username = $('#username').val();
+ var password = $('#password').val();
+
+ $.post('../dhis-web-commons-security/login.action', {
+ 'j_username': username,
+ 'j_password': password
+ }).success(function()
+ {
+ var ret = dhis2.availability.syncCheckAvailability();
+
+ if (!ret)
+ {
+ alert(i18n_ajax_login_failed);
+ }
+ });
+ });
+}
+
+
+function getUserProfile()
+{
+ var def = $.Deferred();
+
+ $.ajax({
+ url: '../api/me/profile',
+ type: 'GET'
+ }).done( function(response) {
+ localStorage['USER_PROFILE'] = JSON.stringify(response);
+ def.resolve();
+ });
+
+ return def.promise();
+}
+
+
+function getMetaPrograms()
+{
+ var PROGRAMS_METADATA = 'PROGRAMS';
+ var def = $.Deferred();
+
+ $.ajax({
+ url: '../api/programs.json',
+ type: 'GET',
+ data:'type=1'
+ }).done( function(response) {
+ localStorage[PROGRAMS_METADATA] = JSON.stringify(response.programs);
+ def.resolve( response.programs );
+ });
+
+ return def.promise();
+}
+
+function getPrograms( programs )
+{
+ if( !programs ){
+ return;
+ }
+
+ var def = $.Deferred();
+ var promise = def.promise();
+
+ _.each( _.values( programs ), function ( program ) {
+ promise = promise.then( getProgram( program.href ) );
+ });
+
+ promise = promise.then(function() {
+ return $.Deferred().resolve( programs );
+ });
+
+ def.resolve( programs );
+
+ return promise;
+}
+
+function getProgram( url )
+{
+
+ return function() {
+ return $.ajax( {
+ url: url,
+ type: 'GET'
+ }).done( function( program ){
+
+ var ou = {};
+ _.each(_.values( program.organisationUnits), function(o){
+ ou[o.id] = o.name;
+ });
+
+ program.organisationUnits = ou;
+
+ var ur = {};
+ _.each(_.values( program.userRoles), function(u){
+ ur[u.id] = u.name;
+ });
+
+ program.userRoles = ur;
+
+ localStorage[program.id] = JSON.stringify(program);
+ });
+ };
+}
+
+function getProgramStages( programs )
+{
+ if( !programs ){
+ return;
+ }
+
+ var def = $.Deferred();
+ var promise = def.promise();
+
+ _.each( _.values( programs ), function ( program ) {
+ program = JSON.parse( localStorage[program.id] );
+ _.each( _.values( program.programStages ), function( programStage ) {
+ promise = promise.then( getProgramStage( programStage.href ) );
+ });
+ });
+
+ promise = promise.then(function() {
+ return def.resolve();
+ });
+
+ def.resolve();
+
+ return promise;
+}
+
+function getProgramStage( url )
+{
+ return function() {
+ return $.ajax( {
+ url: url,
+ type: 'GET'
+ }).done( function( programStage ){
+ localStorage[programStage.id] = JSON.stringify(programStage);
+ });
+ };
+}
+
+function getAttributes()
+{
+ var def = $.Deferred();
+
+ $.ajax({
+ url: '../api/trackedEntityAttributes.json?viewClass=detailed&paging=false',
+ type: 'GET'
+ }).done( function(response) {
+ localStorage['ATTRIBUTES'] = JSON.stringify(response.trackedEntityAttributes);
+ def.resolve();
+ });
+
+ return def.promise();
+}
+
+function uploadLocalData()
+{
+ if ( !dhis2.tc.storageManager.hasLocalData() )
+ {
+ return;
+ }
+
+ setHeaderWaitMessage( i18n_uploading_data_notification );
+
+ var events = dhis2.tc.storageManager.getEventsAsArray();
+
+ _.each( _.values( events ), function( event ) {
+
+ if( event.hasOwnProperty('src')){
+ if( event.src == 'local'){
+ delete event.event;
+ }
+
+ delete event.src;
+ }
+ });
+
+ events = {eventList: events};
+
+ //jackson insists for valid json, where properties are bounded with ""
+ events = JSON.stringify(events);
+
+ $.ajax( {
+ url: '../api/events.json',
+ type: 'POST',
+ data: events,
+ contentType: 'application/json',
+ success: function()
+ {
+ dhis2.tc.storageManager.clear();
+ log( 'Successfully uploaded local events' );
+ setHeaderDelayMessage( i18n_sync_success );
+ selection.responseReceived(); //notify angular
+ },
+ error: function( xhr )
+ {
+ if ( 409 == xhr.status ) // Invalid event
+ {
+ // there is something wrong with the data - ignore for now.
+
+ dhis2.tc.storageManager.clear();
+ }
+ else // Connection lost during upload
+ {
+ var message = i18n_sync_failed
+ + ' <button id="sync_button" type="button">' + i18n_sync_now + '</button>';
+
+ setHeaderMessage( message );
+ $( '#sync_button' ).bind( 'click', uploadLocalData );
+ }
+ }
+ } );
+}
+
+// -----------------------------------------------------------------------------
+// StorageManager
+// -----------------------------------------------------------------------------
+
+/**
+ * This object provides utility methods for localStorage and manages data entry
+ * forms and data values.
+ */
+function StorageManager()
+{
+ var MAX_SIZE = new Number(2600000);
+
+ /**
+ * Returns the total number of characters currently in the local storage.
+ *
+ * @return number of characters.
+ */
+ this.totalSize = function()
+ {
+ var totalSize = new Number();
+
+ for (var i = 0; i < localStorage.length; i++)
+ {
+ var value = localStorage.key(i);
+
+ if (value)
+ {
+ totalSize += value.length;
+ }
+ }
+
+ return totalSize;
+ };
+
+ /**
+ * Return the remaining capacity of the local storage in characters, ie. the
+ * maximum size minus the current size.
+ */
+ this.remainingStorage = function()
+ {
+ return MAX_SIZE - this.totalSize();
+ };
+
+ /**
+ * Clears stored events.
+ */
+ this.clear = function ()
+ {
+ localStorage.removeItem(EVENT_VALUES);
+ };
+
+ /**
+ * Saves an event
+ *
+ * @param event The event in json format.
+ */
+ this.saveEvent = function(event)
+ {
+ //var newEvent = event;
+
+ if( !event.hasOwnProperty('src') )
+ {
+ if( !event.event){
+ event.event = this.generatePseudoUid();
+ event.src = 'local';
+ }
+ }
+
+ var events = {};
+
+ if (localStorage[EVENT_VALUES] != null)
+ {
+ events = JSON.parse(localStorage[EVENT_VALUES]);
+ }
+
+ events[event.event] = event;
+
+ try
+ {
+ localStorage[EVENT_VALUES] = JSON.stringify(events);
+
+ log('Successfully stored event - locally');
+ }
+ catch (e)
+ {
+ log('Max local storage quota reached, not storing data value locally');
+ }
+ };
+
+ /**
+ * Gets the value for the event with the given arguments, or null if it
+ * does not exist.
+ *
+ * @param id the event identifier.
+ *
+ */
+ this.getEvent = function(id)
+ {
+ if (localStorage[EVENT_VALUES] != null)
+ {
+ var events = JSON.parse(localStorage[EVENT_VALUES]);
+
+ return events[id];
+ }
+
+ return null;
+ };
+
+ /**
+ * Removes the given event from localStorage.
+ *
+ * @param event and identifiers in json format.
+ */
+ this.clearEvent = function(event)
+ {
+ var events = this.getAllEvents();
+
+ if (events != null && events[event.event] != null)
+ {
+ delete events[event.event];
+ localStorage[EVENT_VALUES] = JSON.stringify(events);
+ }
+ };
+
+ /**
+ * Returns events matching the arguments provided
+ *
+ * @param orgUnit
+ * @param programStage
+ *
+ * @return a JSON associative array.
+ */
+ this.getEvents = function(orgUnit, programStage)
+ {
+ var events = this.getEventsAsArray();
+ var match = [];
+ for( var i=0; i<events.length; i++){
+ if(events[i].orgUnit == orgUnit && events[i].programStage == programStage ){
+ match.push(events[i]);
+ }
+ }
+
+ return match;
+ };
+
+ /**
+ *
+ * @return a JSON associative array.
+ */
+ this.getAllEvents = function()
+ {
+ return localStorage[EVENT_VALUES] != null ? JSON.parse( localStorage[EVENT_VALUES] ) : null;
+ };
+
+ /**
+ * Returns all event objects in an array. Returns an empty array if no
+ * event exist. Items in array are guaranteed not to be undefined.
+ */
+ this.getEventsAsArray = function()
+ {
+ var values = new Array();
+ var events = this.getAllEvents();
+
+ if (undefined == events)
+ {
+ return values;
+ }
+
+ for (i in events)
+ {
+ if (events.hasOwnProperty(i) && undefined !== events[i])
+ {
+ values.push(events[i]);
+ }
+ }
+
+ return values;
+ };
+
+ /**
+ * Indicates whether there exists data values or complete data set
+ * registrations in the local storage.
+ *
+ * @return true if local data exists, false otherwise.
+ */
+ this.hasLocalData = function()
+ {
+ var events = this.getAllEvents();
+
+ if (events == null)
+ {
+ return false;
+ }
+ if (Object.keys(events).length < 1)
+ {
+ return false;
+ }
+
+ return true;
+ };
+
+ this.generatePseudoUid = function ()
+ {
+ return Math.random().toString(36).substr(2, 11);
+ };
+}
\ No newline at end of file
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles'
=== added 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 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css 2014-03-17 15:59:31 +0000
@@ -0,0 +1,1353 @@
+/*----------------------------------------------------------------------------*/
+/* Form
+/*----------------------------------------------------------------------------*/
+
+input[type="button"], input[type="submit"]
+{
+ width: 130px;
+}
+
+input.tiny-button[type="button"]
+{
+ width: 20px;
+ height: 20px;
+}
+
+input.small-button[type="button"]
+{
+ width: 30px;
+ height: 30px;
+}
+
+input.normal-button[type="button"] , input.normal-button[type="submit"]
+{
+ width: 60px;
+}
+
+input.large-button[type="button"]
+{
+ width: 130px;
+}
+
+select.search-field
+{
+ width: 180px;
+}
+
+input[type="text"]
+{
+ width: 260px;
+}
+
+input.option
+{
+ width: 240px;
+}
+
+select
+{
+ width: 264px;
+}
+
+textarea
+{
+ width: 264px;
+}
+
+.button-list
+{
+ text-align:right;
+ padding-bottom:10px;
+ width:100%;
+}
+
+.incomplete-record
+{
+ color: black;
+ font-size: 21px;
+ font-weight: bold;
+}
+
+.img-button
+{
+ width:20px;
+ cursor:pointer;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Table
+/*----------------------------------------------------------------------------*/
+
+table
+{
+ font-size: 13px;
+ line-height: 18px;
+ margin-bottom: 10px;
+}
+
+.heading-column
+{
+ width: 400px;
+}
+
+td.input-column
+{
+ padding-left: 5px;
+ padding-right: 1px;
+}
+
+td.error {
+ padding-left: 1em;
+}
+
+table.information, td.information
+{
+ border:1px solid #808080;
+ vertical-align:top;
+ padding:10px;
+}
+
+.text-column
+{
+ padding-left: 5px;
+ padding-right: 6px;
+ text-align: left;
+}
+
+.errorCell
+{
+ background-color: #FFCFCF
+}
+
+.search
+{
+ position: relative;
+ border: 1px solid #a4d2a3;
+ background-color: #d5efd5;
+ padding-top: 10px;
+ padding-right: 20px;
+ padding-bottom: 5px;
+ padding-left: 20px;
+ margin-bottom: 15px;
+ border-radius: 3px;
+ max-width: 570px;
+}
+
+#minimized-advanced-search
+{
+ position: relative;
+ border: 1px solid #a4d2a3;
+ background-color: #d5efd5;
+ padding-top: 10px;
+ padding-right: 20px;
+ padding-bottom: 5px;
+ padding-left: 20px;
+ margin-bottom: 15px;
+ border-radius: 3px;
+}
+
+.green-background
+{
+ position: relative;
+ border: 1px solid #a4d2a3;
+ background-color: #d5efd5;
+ padding-top: 10px;
+ padding-right: 20px;
+ padding-bottom: 5px;
+ padding-left: 20px;
+ margin-bottom: 15px;
+ border-radius: 3px;
+}
+
+.searchInput
+{
+ width: 240px;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Button list
+/*----------------------------------------------------------------------------*/
+
+.buttons
+{
+ text-align:right;
+ padding-bottom:10px;
+ width:100%;
+}
+
+div.actions
+{
+ float: right;
+ width: 140px;
+ text-align: right;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Data entry form */
+/*----------------------------------------------------------------------------*/
+
+.entryScreen
+{
+ margin-bottom: 20px;
+ width: 100%;
+ font-size: 13px;
+ line-height: 18px;
+}
+
+input.criteria
+{
+ width: 130px;
+ margin-right: 5px;
+}
+
+input.move-button
+{
+ width: 20px;
+ height: 60px;
+ border-color: #bbbbbb;
+ cursor: pointer;
+ border: 1px solid #aaa;
+ margin: 0px;
+}
+
+input.optionset[type="text"]
+{
+ width:240px;
+}
+
+input.datefield[type="text"]
+{
+ width:240px;
+}
+
+div.provided-elsewhere
+{
+ width:20px;
+ height:20px;
+}
+
+.ui-button
+{
+ max-height: 100px;
+}
+
+.ui-autocomplete
+{
+ max-height: 100px;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.hidden
+{
+ display: none;
+}
+
+.colorHelpTable td
+{
+ height: 32px;
+}
+
+/* --------------------------------------------------------------
+// Dashboard
+// -------------------------------------------------------------- */
+
+div.dashboard-area
+{
+ list-style: none inside;
+ margin: 50px 50px;
+ margin: 0;
+ padding: 0;
+}
+
+p.header
+{
+ background-color:#CBDDEB;
+ background-repeat:repeat-x;
+ border:1px solid #C8DBEA;
+ color:#39547D;
+ padding:6px;
+ margin:0px;
+ font-family: LiberationSansBold,arial;
+}
+
+table.link-area
+{
+ border:1px solid #d0d0d0;
+ padding-top:1px;
+ padding-right:1px;
+ padding-left:1px;
+ padding-bottom:0px;
+ height:120px;
+ overflow:hidden;
+ align:bottom;
+}
+
+div.link-area
+{
+ display:inline-block;
+ border:1px solid #d0d0d0;
+ padding-top:1px;
+ padding-right:1px;
+ padding-left:1px;
+ padding-bottom:0px;
+ height:172px;
+
+ overflow:hidden;
+}
+
+.contentProviderTable
+{
+ height: 140px;
+ overflow-y: auto;
+ overflow-x:hidden;
+}
+
+.contentProviderTable table
+{
+ width:100%;
+}
+
+.contentProviderTable td
+{
+ padding-top:3px;
+ padding-bottom:3px;
+ border-bottom:1px solid #cad5e5;
+}
+
+div.event-dashboard
+{
+ width:900px;
+ border:1px solid #d0d0d0;
+ position:relative;
+ top: 47px;
+}
+
+div.link-area-active
+{
+ width:900px;
+ border:10px solid #d0d0d0;
+ position:relative;
+ top: 47px;
+}
+
+div.event-flow-dashboard
+{
+ width:900px;
+ height:140px;
+ overflow-x:auto;
+ overflow-y:hidden;
+}
+
+#subMenu
+{
+ position:absolute;
+}
+
+#subMenu ul
+{
+ list-style-type:none;
+ margin: 0;
+}
+
+#subMenu li
+{
+ float:left;
+}
+
+#subMenu a
+{
+ padding: 6px 12px;
+ height: 25px;
+ border: 1px solid #aaa;
+ border-radius: 3px;
+ margin-right: 4px;
+ font-family: LiberationSansBold, arial;
+ font-size: 13px;
+ color: #606060;
+ background-color: #f3f3f3;
+}
+
+#subMenu a:hover
+{
+ text-decoration: none;
+ background-color: #f8f8f8;
+}
+
+.tooltip
+{
+ border-bottom: dashed 1px #aaa;
+ text-decoration: none;
+ cursor: help;
+ text-align: left;
+}
+
+.tooltip-target {
+ width: 250px;
+ top: 29px;
+ left: 764px;
+ display: none;
+ padding: 10px;
+ background: #ffffff;
+ position: absolute;
+ display: none;
+ float: left;
+ -webkit-border-radius: 7px;
+ -moz-border-radius: 7px;
+ border-radius: 7px;
+ border: solid 1px #ddd;
+ z-index:1001;
+}
+
+.comment-table
+{
+ width:320px;
+ overflow-y: auto;
+ overflow-x:hidden;
+}
+
+.comment-table td
+{
+ padding-top:3px;
+ padding-bottom:3px;
+ border-bottom:1px solid #cad5e5;
+}
+
+/* --------------------------------------------------------------
+// program-stage-instances
+// -------------------------------------------------------------- */
+
+.stage-container
+{
+ width:100%;
+ height:100px;
+}
+
+.stage-flow
+{
+ height:100px;
+ overflow-x:hidden;
+ overflow-y:hidden;
+}
+
+.table-flow
+{
+ height:100px;
+ overflow-x:hidden;
+ overflow-y:hidden;
+}
+
+.arrow-left {
+ width:0;
+ height:0;
+ border-top:45px solid transparent;
+ border-bottom:45px solid transparent;
+ border-right:30px solid #d0d0d0;
+ cursor:pointer;
+}
+
+.arrow-right {
+ width:0;
+ height:0;
+ border-top:45px solid transparent;
+ border-bottom:45px solid transparent;
+ border-left:30px solid #d0d0d0;
+ cursor:pointer;
+}
+
+div.orgunit-object
+{
+ margin-left: 5px;
+ width: 120px;
+}
+
+input.stage-object[type="button"]
+{
+ width: 135px;
+ height: 60px;
+ cursor: pointer;
+ opacity: 1.0;
+ border: 2px solid;
+ margin: 5px;
+ white-space: normal;
+}
+
+input.stage-object[type="button"]:hover
+{
+ border: 5px solid;
+}
+
+input.stage-object-selected[type="button"]
+{
+ border: 5px solid;
+}
+
+input.stage-scheduled[type="button"]
+{
+ border: 5px solid;
+}
+
+input.patient-object[type="button"]
+{
+ width: 130px;
+ height: 60px;
+ border-color: #bbbbbb;
+ background-color: #ddd;
+ cursor: pointer;
+ border: 1px solid #aaa;
+ margin: 5px;
+ border-radius: 2px;
+}
+
+div.dashboard-history
+{
+ z-index:100;
+ width:300px;
+ height:200px;
+ position:absolute;
+ left:650px;
+ top:115px;
+ background-color:#ffffff;
+ border:1px solid #d0d0d0;
+ padding-top:1px;
+ padding-right:1px;
+ padding-left:1px;
+ padding-bottom:1px;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Program tracking
+/*----------------------------------------------------------------------------*/
+
+div.link-area-tracking
+{
+ display:inline-block;
+ border:1px solid #d0d0d0;
+ padding-top:1px;
+ padding-right:1px;
+ padding-left:1px;
+ padding-bottom:0px;
+ height:200px;
+ width:60%;
+ overflow:hidden;
+}
+
+.gridTable th, .gridTable td {
+ line-height: 200%;
+}
+
+/* Treepanel contextmenu */
+#treepanel-contextmenu {
+ border-radius: 2px;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #aaa;
+}
+
+
+/* --------------------------------------------------------------
+// Capture Coordinates
+// -------------------------------------------------------------- */
+
+.coordinates1{
+ width: 110px;
+ white-space: normal;
+}
+
+.coordinates2{
+ width: 150px;
+}
+
+
+.commentHeader
+{
+ color: #606060;
+ font-size: 17px;
+ padding: 5px 0;
+}
+
+
+/* --------------------------------------------------------------
+// App - specific (might change this if Lars is not happy
+// -------------------------------------------------------------- */
+
+.container-heading {
+ color: white;
+ padding: 12px;
+}
+
+.container-1-4 {
+ width: 25%;
+ float: left;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.container-1-2 {
+ width: 50%;
+ float: left;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.container-1-1 {
+ width: 100%;
+ float: left;
+ margin-top: 1em;
+}
+
+div.paging a.active
+{
+ text-decoration: none;
+ color: #000;
+ cursor: default;
+}
+
+.input-error {
+ background-color: #ff6600;
+}
+
+.input-success {
+ background-color: #b9ffb9;
+}
+
+.red {
+ color: red;
+}
+
+.right {
+ float: right !important;
+}
+
+.black {
+ color: black;
+}
+
+.bold {
+ font-weight: bold;
+}
+
+.white {
+ color: white;
+}
+
+.anchor-color {
+ color: #276696;
+}
+
+.inline-div {
+ display: inline-block;
+ margin-right: 5px;
+ float: left;
+}
+
+.bordered-div
+{
+ border: 1px solid #c2c2c2;
+ border-radius: 10px;
+ padding: 5px 10px;
+ margin-bottom: 20px;
+}
+
+
+.nav, .pagination, .carousel, .panel-title a {
+ cursor: pointer;
+ text-decoration: none;
+}
+
+input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+input[type=date]::-webkit-inner-spin-button, input[type=date]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+.max-column-width {
+ max-width:200px !important;
+ word-wrap:break-word;
+}
+
+.table-borderless {
+ width: 100%;
+}
+
+.table-borderless>thead>tr>th,
+.table-borderless>tbody>tr>th,
+.table-borderless>tfoot>tr>th,
+.table-borderless>thead>tr>td,
+.table-borderless>tbody>tr>td,
+.table-borderless>tfoot>tr>td {
+ border-top: none;
+ //background-color: #ebf0f6;
+ padding-right: 8px;
+}
+
+.dhis2-table>thead>tr>th,
+.dhis2-table>tbody>tr>th,
+.dhis2-table>tfoot>tr>th,
+.dhis2-table>thead>tr>td,
+.dhis2-table>tbody>tr>td,
+.dhis2-table>tfoot>tr>td {
+ border-top: none;
+ background-color: #ebf0f6;
+}
+
+.dhis2-table-striped-border tr th {
+ border: 1px solid #cad5e5;
+}
+
+.dhis2-table-striped-border tr td {
+ border: 1px solid #cad5e5;
+}
+
+.dhis2-table-striped-border > tbody > tr:nth-child(odd)> td, .dhis2-table-striped > tbody > tr:nth-child(odd)> th {
+ background-color: #ebf0f6
+}
+
+.dhis2-table-striped>thead>tr,
+.dhis2-table-striped>tbody>tr,
+.dhis2-table-striped>tfoot>tr,
+.dhis2-table-striped>thead>tr,
+.dhis2-table-striped>tbody>tr,
+.dhis2-table-striped>tfoot>tr {
+ border-bottom: 1px solid #cad5e5;
+ //border: none;
+}
+
+.dhis2-table-striped > tbody > tr:nth-child(odd)> td, .dhis2-table-striped > tbody > tr:nth-child(odd)> th {
+ background-color: #ebf0f6
+}
+
+.dhis2-list-table-striped {
+ width: 100%;
+ border: 1px solid #c2c2c2;
+ padding: 5px 10px;
+}
+
+.dhis2-list-table-striped>thead>tr,
+.dhis2-list-table-striped>tbody>tr,
+.dhis2-list-table-striped>tfoot>tr,
+.dhis2-list-table-striped>thead>tr,
+.dhis2-list-table-striped>tbody>tr,
+.dhis2-list-table-striped>tfoot>tr {
+ border: none;
+}
+
+.dhis2-list-table-striped > tbody > tr:nth-child(odd)> td, .dhis2-table-striped > tbody > tr:nth-child(odd)> th {
+ background-color: #ebf0f6
+}
+
+.dhis2-table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th {
+ background-color: #dfe9f4;
+}
+
+#contextMenu {
+ position: absolute;
+ display:none;
+}
+
+.filter-with-content {
+ float: right !important;
+ color: red;
+}
+
+.filter-without-content {
+ float: right !important;
+ color: black;
+}
+
+.bold {
+ font-weight: bold;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Bootstrap modal style
+/*----------------------------------------------------------------------------*/
+.modal-open {
+ overflow: hidden
+}
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ display: none;
+ overflow: auto;
+ overflow-y: scroll
+}
+.modal.fade .modal-dialog {
+ -webkit-transform: translate(0,-25%);
+ -ms-transform: translate(0,-25%);
+ transform: translate(0,-25%);
+ -webkit-transition: -webkit-transform .3s ease-out;
+ -moz-transition: -moz-transform .3s ease-out;
+ -o-transition: -o-transform .3s ease-out;
+ transition: transform .3s ease-out
+}
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0,0);
+ -ms-transform: translate(0,0);
+ transform: translate(0,0)
+}
+.modal-dialog {
+ position: relative;
+ z-index: 1050;
+ width: auto;
+ padding: 10px;
+ margin-right: auto;
+ margin-left: auto
+}
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ border: 1px solid #999;
+ border: 1px solid rgba(0,0,0,0.2);
+ border-radius: 6px;
+ outline: 0;
+ -webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5);
+ box-shadow: 0 3px 9px rgba(0,0,0,0.5);
+ background-clip: padding-box
+}
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+ background-color: #000
+}
+.modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0)
+}
+.modal-backdrop.in {
+ opacity: .5;
+ filter: alpha(opacity=50)
+}
+.modal-header {
+ min-height: 16.428571429px;
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5
+}
+.modal-header .close {
+ margin-top: -2px
+}
+.modal-title {
+ margin: 0;
+ line-height: 1.428571429
+}
+.modal-body {
+ position: relative;
+ padding: 20px
+}
+.modal-footer {
+ padding: 19px 20px 20px;
+ margin-top: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5
+}
+.modal-footer:before, .modal-footer:after {
+ display: table;
+ content: " "
+}
+.modal-footer:after {
+ clear: both
+}
+.modal-footer:before, .modal-footer:after {
+ display: table;
+ content: " "
+}
+.modal-footer:after {
+ clear: both
+}
+.modal-footer .btn+ .btn {
+ margin-bottom: 0;
+ margin-left: 5px
+}
+.modal-footer .btn-group .btn+ .btn {
+ margin-left: -1px
+}
+.modal-footer .btn-block+ .btn-block {
+ margin-left: 0
+}
+@media screen and (min-width: 768px) {
+ .modal-dialog {
+ width: 600px;
+ padding-top: 30px;
+ padding-bottom: 30px
+ }
+ .modal-content {
+ -webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.5);
+ box-shadow: 0 5px 15px rgba(0,0,0,0.5)
+ }
+}
+
+.container {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto
+}
+.container:before, .container:after {
+ display: table;
+ content: " "
+}
+.container:after {
+ clear: both
+}
+.container:before, .container:after {
+ display: table;
+ content: " "
+}
+.container:after {
+ clear: both
+}
+@media (min-width: 768px) {
+ .container {
+ width: 750px
+ } z-index: 1051;
+}
+@media (min-width: 992px) {
+ .container {
+ width: 970px
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px
+ }
+}
+.container > .navbar-header, .container > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px
+}
+@media (min-width: 768px) {
+ .container > .navbar-header, .container > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar > .container .navbar-brand {
+ margin-left: -15px
+ }
+}
+
+.container .jumbotron {
+ border-radius: 6px
+}
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px
+ }
+ .container .jumbotron {
+ padding-right: 60px;
+ padding-left: 60px
+ }
+ .jumbotron h1 {
+ font-size: 63px
+ }
+}
+
+.dropdown {
+ position: relative
+}
+.dropdown-toggle:focus {
+ outline: 0
+}
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ font-size: 14px;
+ list-style: none;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0,0,0,0.15);
+ border-radius: 4px;
+ -webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175);
+ box-shadow: 0 6px 12px rgba(0,0,0,0.175);
+ background-clip: padding-box
+}
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto
+}
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5
+}
+
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+ color: #333;
+ white-space: nowrap
+}
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
+ color: #262626;
+ text-decoration: none;
+ background-color: #f5f5f5
+}
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ background-color: #428bca;
+ outline: 0
+}
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+ color: #999
+}
+.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false)
+}
+.open > .dropdown-menu {
+ display: block
+}
+
+/*----------------------------------------------------------------------------*/
+/* Bootstrap panel style
+/*----------------------------------------------------------------------------*/
+
+.panel {
+ font-family: LiberationSansRegular, arial, sans-serif !important;
+ font-size: 9pt !important;
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+
+ -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);
+ box-shadow: 0 1px 1px rgba(0,0,0,0.05)
+}
+.panel-body {
+ padding: 10px
+}
+.panel-body:before, .panel-body:after {
+ display: table;
+ content: " "
+}
+.panel-body:after {
+ clear: both
+}
+.panel-body:before, .panel-body:after {
+ display: table;
+ content: " "
+}
+.panel-body:after {
+ clear: both
+}
+.panel > .list-group {
+ margin-bottom: 0
+}
+.panel > .list-group .list-group-item {
+ border-width: 1px 0
+}
+.panel > .list-group .list-group-item:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0
+}
+.panel > .list-group .list-group-item:last-child {
+ border-bottom: 0
+}
+.panel-heading+ .list-group .list-group-item:first-child {
+ border-top-width: 0
+}
+.panel > .table, .panel > .table-responsive {
+ margin-bottom: 0
+}
+.panel > .panel-body+ .table, .panel > .panel-body+ .table-responsive {
+ border-top: 1px solid #ddd
+}
+.panel > .table-bordered, .panel > .table-responsive > .table-bordered {
+ border: 0
+}
+.panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0
+}
+.panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0
+}
+.panel > .table-bordered > thead > tr:last-child > th, .panel > .table-responsive > .table-bordered > thead > tr:last-child > th, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .panel > .table-bordered > thead > tr:last-child > td, .panel > .table-responsive > .table-bordered > thead > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0
+}
+.panel-heading {
+ font-family: LiberationSansRegular, arial, sans-serif !important;
+ font-size: 9pt !important;
+ padding: 5px 10px;
+ border-bottom: 1px solid transparent;
+
+}
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit
+}
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-family: LiberationSansRegular, arial, sans-serif !important;
+ font-size: 9pt !important;
+}
+.panel-title > a {
+ color: #000;
+}
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+
+}
+.panel-group .panel {
+ margin-bottom: 0;
+ overflow: hidden;
+
+}
+.panel-group .panel+ .panel {
+ margin-top: 5px
+}
+.panel-group .panel-heading {
+ border-bottom: 0
+}
+.panel-group .panel-heading+ .panel-collapse .panel-body {
+ border-top: 1px solid #ddd
+}
+.panel-group .panel-footer {
+ border-top: 0
+}
+.panel-group .panel-footer+ .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd
+}
+.panel-default {
+ border-color: #ddd
+}
+.panel-default > .panel-heading {
+ color: #333;
+ background-color: #f5f5f5;
+ border-color: #ddd
+}
+.panel-default > .panel-heading+ .panel-collapse .panel-body {
+ border-top-color: #ddd
+}
+.panel-default > .panel-heading > .dropdown .caret {
+ border-color: #333 transparent
+}
+.panel-default > .panel-footer+ .panel-collapse .panel-body {
+ border-bottom-color: #ddd
+}
+.panel-primary {
+ border-color: #428bca
+}
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #428bca;
+ border-color: #428bca
+}
+.panel-primary > .panel-heading+ .panel-collapse .panel-body {
+ border-top-color: #428bca
+}
+.panel-primary > .panel-heading > .dropdown .caret {
+ border-color: #fff transparent
+}
+.panel-primary > .panel-footer+ .panel-collapse .panel-body {
+ border-bottom-color: #428bca
+}
+.panel-success {
+ border-color: #d6e9c6
+}
+.panel-success > .panel-heading {
+ color: #468847;
+ background-color: #dff0d8;
+ border-color: #d6e9c6
+}
+.panel-success > .panel-heading+ .panel-collapse .panel-body {
+ border-top-color: #d6e9c6
+}
+.panel-success > .panel-heading > .dropdown .caret {
+ border-color: #468847 transparent
+}
+.panel-success > .panel-footer+ .panel-collapse .panel-body {
+ border-bottom-color: #d6e9c6
+}
+.panel-warning {
+ border-color: #faebcc
+}
+.panel-warning > .panel-heading {
+ color: #c09853;
+ background-color: #fcf8e3;
+ border-color: #faebcc
+}
+.panel-warning > .panel-heading+ .panel-collapse .panel-body {
+ border-top-color: #faebcc
+}
+.panel-warning > .panel-heading > .dropdown .caret {
+ border-color: #c09853 transparent
+}
+.panel-warning > .panel-footer+ .panel-collapse .panel-body {
+ border-bottom-color: #faebcc
+}
+.panel-danger {
+ border-color: #ebccd1
+}
+.panel-danger > .panel-heading {
+ color: #b94a48;
+ background-color: #f2dede;
+ border-color: #ebccd1
+}
+.panel-danger > .panel-heading+ .panel-collapse .panel-body {
+ border-top-color: #ebccd1
+}
+.panel-danger > .panel-heading > .dropdown .caret {
+ border-color: #b94a48 transparent
+}
+.panel-danger > .panel-footer+ .panel-collapse .panel-body {
+ border-bottom-color: #ebccd1
+}
+.panel-info {
+ border-color: #bce8f1
+}
+.panel-info > .panel-heading {
+ color: #3a87ad;
+ background-color: #d9edf7;
+ border-color: #bce8f1
+}
+.panel-info > .panel-heading+ .panel-collapse .panel-body {
+ border-top-color: #bce8f1
+}
+.panel-info > .panel-heading > .dropdown .caret {
+ border-color: #3a87ad transparent
+}
+.panel-info > .panel-footer+ .panel-collapse .panel-body {
+ border-bottom-color: #bce8f1
+}
+
+.contextMenuItems .divider {
+ height: 1px;
+ margin: 5px 0;
+ overflow: hidden;
+ background-color: #e5e5e5
+}
+
+/*----------------------------------------------------------------------------*/
+/* Tracked entity
+/*----------------------------------------------------------------------------*/
+
+.container-1-1 {
+ width: 100%;
+ float: left;
+ margin-top: 50px;
+ padding: 5px;
+}
+
+.container-1-2 {
+ width: 50%;
+ float: left;
+ position: relative;
+}
+
+.container-2-3 {
+ width: 75%;
+ float: left;
+ position: relative;
+}
+
+.container-1-4 {
+ width: 25%;
+ float: left;
+ position: relative;
+}
+
+.separator {
+ margin-bottom: 10px;
+}
+
+.dashboard-container {
+ margin-top: 50px;
+ padding-left: 5px;
+ position: relative;
+}
+
+.dashboard-element-container {
+ max-height: 250px !important;
+}
+
+.list-element {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ margin-left: -16px;
+ margin-right: -16px;
+}
+
+.list-element:first-child {
+ margin-top: -15px;
+ border-top: none;
+}
+
+.list-element:last-child {
+ margin-bottom: -15px;
+ border-bottom: none;
+}
+
+.list-title
+{
+ font-size: 12pt;
+ font-weight: normal;
+ color: #606060;
+}
+
+.horizonal-spacing{
+ margin-left: 20px;
+}
+
+.vertial-spacing{
+ margin-top: 10px;
+}
+
+/*
+*
+*/
+.panel-heading {
+ padding: 10px 10px;
+}
+
+.panel-body {
+ padding: 15px
+}
+.panel-body:before, .panel-body:after {
+ display: table;
+ content: " "
+}
+.panel-body:after {
+ clear: both
+}
+.panel-body:before, .panel-body:after {
+ display: table;
+ content: " "
+}
+.panel-body:after {
+ clear: both
+}
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache 2014-03-17 15:59:31 +0000
@@ -0,0 +1,91 @@
+CACHE MANIFEST
+
+CACHE:
+../dhis-web-commons/javascripts/jquery/js/jquery-1.8.3.js
+../dhis-web-commons/javascripts/jquery/js/jquery-ui-1.9.2.custom.js
+../dhis-web-commons/javascripts/jquery/css/ui-lightness/jquery-ui-1.9.2.custom.css
+
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.eot
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.woff
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.ttf
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.svg
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.eot
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.woff
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.ttf
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.svg
+
+../dhis-web-commons/font-awesome/css/font-awesome.min.css
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.eot
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.svg
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.ttf
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.woff
+../dhis-web-commons/font-awesome/fonts/FontAwesome.otf
+
+../dhis-web-commons/css/light_blue/light_blue.css
+../dhis-web-commons/css/widgets.css
+styles/style.css
+
+../dhis-web-commons/javascripts/bootstrap/js/bootstrap.min.js
+
+../dhis-web-commons/javascripts/angular/angular.js
+../dhis-web-commons/javascripts/angular/angular-resource.js
+../dhis-web-commons/javascripts/angular/angular-route.js
+../dhis-web-commons/javascripts/angular/angular-cookies.js
+../dhis-web-commons/javascripts/angular/angular-animate.js
+../dhis-web-commons/javascripts/angular/ui-bootstrap-tpls-0.10.0.js
+
+../dhis-web-commons/javascripts/angular/plugins/angularLocalStorage.js
+../dhis-web-commons/javascripts/angular/plugins/angular-translate.min.js
+../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-static-files.min.js
+../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-url.min.js
+
+../dhis-web-commons/javascripts/moment/moment-with-langs.min.js
+
+../dhis-web-commons/css/light_blue/logo_banner.png
+../images/ajax-loader-bar.gif
+../images/colapse.png
+../images/expand.png
+../images/transparent.gif
+../images/treeview-gray-line.gif
+
+../dhis-web-commons/javascripts/underscore.min.js
+../dhis-web-commons/javascripts/dhis2/dhis2.util.js
+../dhis-web-commons/javascripts/commons.js
+../dhis-web-commons/javascripts/commons.ajax.js
+../dhis-web-commons/javascripts/lists.js
+../dhis-web-commons/javascripts/periodType.js
+../dhis-web-commons/javascripts/date.js
+../dhis-web-commons/javascripts/json2.js
+../dhis-web-commons/javascripts/validationRules.js
+../dhis-web-commons/javascripts/dhis2/dhis2.array.js
+../dhis-web-commons/javascripts/dhis2/dhis2.select.js
+../dhis-web-commons/javascripts/dhis2/dhis2.comparator.js
+../dhis-web-commons/javascripts/dhis2/dhis2.availability.js
+../dhis-web-commons/javascripts/dhis2/dhis2.trigger.js
+../dhis-web-commons/javascripts/dhis2/dhis2.sharing.js
+../dhis-web-commons/javascripts/dhis2/dhis2.validation.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.ss.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.ls.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.idb.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.memory.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.js
+../dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js
+../dhis-web-commons/javascripts/dhis2/dhis2.appcache.js
+../dhis-web-commons/ouwt/ouwt.js
+
+scripts/event-capture.js
+scripts/app.js
+scripts/services.js
+scripts/directives.js
+scripts/controllers.js
+scripts/filters.js
+
+
+views/pagination.html
+views/modal.html
+views/dialog.html
+
+i18n/en.json
+
+NETWORK:
+*
\ No newline at end of file
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,129 @@
+<link rel="stylesheet" type="text/css" href="lib/bootstrap/css/bootstrap.min.css">
+
+<div class="container-1-1">
+
+ <div class="col-xs-12">
+ <div class="btn-toolbar" role="toolbar">
+ <button type="button" class="btn btn-default" ng-click="back()">{{'back'| translate}}</button>
+ <span class="horizonal-spacing">
+ <input type="text" placeholder="{{'search_for_dashboard'| translate}}" />
+ <button type="button" class="btn btn-default" ng-click="searchDashboard()">{{'search'| translate}}</button>
+ </span>
+
+ <!--<button type="button" class="btn btn-default" ng-click="remove()">{{'remove'| translate }} {{selectedProgram.trackedEntity.name|| 'entity' | translate}}</button>-->
+ </div>
+ </div>
+
+ <div class='clearfix separator'></div>
+
+ <div class='col-xs-12'>
+ <div class="row">
+ <div class="col-sm-3 col-md-3">
+ <accordion>
+ <accordion-group is-open="{{selected.isOpen}}">
+ <accordion-heading>
+ <span class="list-title">{{selected.title| translate}}</span>
+ </accordion-heading>
+ <div class="list-element-container">
+ <div class="list-element" ng-repeat="selection in selected.selections">
+ {{selection.title| translate}}
+ <span class="right">
+ {{selection.value| translate}}
+ </span>
+ </div>
+ </div>
+ </accordion-group>
+ </accordion>
+ </div>
+ <div class="col-sm-3 col-md-3">
+ <accordion>
+ <accordion-group is-open="{{profile.isOpen}}">
+ <accordion-heading>
+ <span class="list-title"> {{selectedProgram.trackedEntity.name|| 'entity' | translate}} {{profile.title| translate}}</span>
+ </accordion-heading>
+ <div>
+ <div class="list-element" ng-repeat="attribute in selectedEntity.attributes">
+ {{attribute.displayName}}
+ <div class="right">
+ <div ng-switch="attribute.type">
+ <div ng-switch-when="date">
+ <input type="text" ng-date ng-model="attribute.value" value="attribute.value | date:'yyyy-MM-dd"/>
+ </div>
+ <div ng-switch-when="trueOnly">
+ <input type="checkbox" ng-model="attribute.value" />
+ </div>
+ <div ng-switch-when="bool">
+ <select ng-model="attribute.value" />
+ <option value="">{{'please_select'| translate}}</option>
+ <option value="0">{{'no'| translate}}</option>
+ <option value="1">{{'yes'| translate}}</option>
+ </select>
+ </div>
+ <div ng-switch-when="combo">
+ <input type="text"
+ ng-model="attribute.value"
+ typeahead="option.name for option in attributes[attribute.attribute].personAttributeOptions | filter:$viewValue | limitTo:20"
+ typeahead-open-on-focus
+ />
+ </div>
+ <div ng-switch-when="number">
+ <input type="number" ng-model="attribute.value" />
+ </div>
+ <div ng-switch-default>
+ <input type="text" ng-model="attribute.value" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </accordion-group>
+ </accordion>
+ </div>
+ <div class="col-sm-3 col-md-3">
+ <accordion>
+ <accordion-group is-open="{{enrollment.isOpen}}">
+ <accordion-heading>
+ <span class="list-title">{{enrollment.title| translate}}</span>
+ </accordion-heading>
+ <div class="list-element-container">
+ <div class="list-element">
+ {{'program'| translate}}
+ <span class="right">
+ <select ng-model="selectedProgram"
+ ng-options="program as program.name for program in programs | orderBy: 'name'"
+ ng-change="showEnrollment()">
+ <option value="">{{'please_select'| translate}}</option>
+ </select>
+ </span>
+ </div>
+ </div>
+ </accordion-group>
+ </accordion>
+ </div>
+ <div class="col-sm-3 col-md-3">
+ <accordion>
+ <accordion-group is-open="{{notes.isOpen}}">
+ <accordion-heading>
+ <span class="list-title">{{notes.title| translate}}</span>
+ </accordion-heading>
+ This is notes.
+ </accordion-group>
+ </accordion>
+ </div>
+ </div>
+ </div>
+
+ <div class='separator'></div>
+
+ <div class="col-xs-12">
+ <accordion>
+ <accordion-group is-open="{{dataEntry.isOpen}}">
+ <accordion-heading>
+ <span class="list-title">{{dataEntry.title| translate}}</span>
+ </accordion-heading>
+ This is data entry.
+ </accordion-group>
+ </accordion>
+ </div>
+
+</div>
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,10 @@
+<div class="modal-header">
+ <h2>{{dialogOptions.headerText| translate}}</h2>
+</div>
+<div class="modal-body">
+ <p>{{dialogOptions.bodyText| translate}}</p>
+</div>
+
+<div class="modal-footer">
+ <button class="big-button grey" data-ng-click="dialogOptions.ok();">{{dialogOptions.closeButtonText| translate}}</button>
+</div>
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,10 @@
+<div class="modal-header">
+ <h3>{{modalOptions.headerText | translate}}</h3>
+</div>
+<div class="modal-body">
+ <p>{{modalOptions.bodyText | translate}}</p>
+</div>
+<div class="modal-footer">
+ <button data-ng-click="modalOptions.close()">{{modalOptions.closeButtonText | translate}}</button>
+ <button data-ng-click="modalOptions.ok();">{{modalOptions.actionButtonText | translate}}</button>
+</div>
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,53 @@
+<div class="paging-container">
+ <table style="background-color: #ebf0f6;" width='100%'>
+ <tr>
+ <td>
+ {{'total_number_of_pages'| translate}}: {{paginator.pageCount()}}
+ </td>
+ <td>
+ <span>{{'rows_per_page'| translate}}:</span> <input type="text" style="width:50px;" ng-model="rowsPerPage">
+ </td>
+ <td>
+ <span>{{'jump_to_page'| translate}}:</span> <input type="text" style="width:50px;" ng-model="currentPage" value="{{paginator.page + 1}}" ng-blur="jumpToPage(currentPage)">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3"><hr/></td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <div class="paging">
+ <span ng-show="(paginator.getPage() + 1) > 1">
+ <a href ng-click="paginator.firstPage()" title="{{'first'| translate}}">
+ ««
+ </a>
+ <a href ng-click="paginator.perviousPage()" title="{{'previous'| translate}}">
+ «
+ </a>
+ </span>
+ <span ng-hide="(paginator.getPage() + 1) > 1">
+ <span title="{{'first'| translate}}">««</span>
+ <span title="{{'previous'| translate}}">«</span>
+ </span>
+ <a href ng-click="paginator.setPage(i)" title="{{'page'| translate}} {{i + 1}}" ng-repeat="i in []| forLoop:paginator.lowerLimit():paginator.pageCount() | limitTo : paginator.limitPerPage" ng-class="paginator.getPage() == i && 'active'">
+ {{i + 1}}
+ </a>
+
+ <span ng-show="(paginator.getPage() + 1) < paginator.pageCount()">
+ <a href ng-click="paginator.nextPage()" title="{{'next'| translate}}" >
+ »
+ </a>
+ <a href ng-click="paginator.lastPage()" title="{{'last'| translate}}">
+ »»
+ </a>
+ </span>
+ <span ng-hide="(paginator.getPage() + 1) < paginator.pageCount()">
+ <span class="next" title="{{'next'| translate}}">» </span>
+ <span class="last" title="{{'last'| translate}}">»»</span>
+ </span>
+
+ </div>
+ </td>
+ </tr>
+ </table>
+</div>
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,48 @@
+<accordion>
+ <accordion-group is-open="searchField.isOpen">
+ <accordion-heading>
+ {{searchField.label| translate}}
+ <span class="right">
+ <a href ng-click="closeSearch()" title="{{'close'| translate}}"><span class="black"><i class="fa fa-times"></i></span></a>
+ </span>
+ </accordion-heading>
+ <table>
+ <tr ng-repeat="attribute in attributes">
+ <td>
+ {{attribute.name}}
+ </td>
+ <td>
+ <div ng-switch="attribute.valueType">
+ <div ng-switch-when="date">
+ <input type="text" ng-date ng-model="attribute.value" />
+ </div>
+ <div ng-switch-when="trueOnly">
+ <input type="checkbox" ng-model="attribute.value" />
+ </div>
+ <div ng-switch-when="bool">
+ <select ng-model="attribute.value" />
+ <option value="">{{'please_select'| translate}}</option>
+ <option value="0">{{'no'| translate}}</option>
+ <option value="1">{{'yes'| translate}}</option>
+ </select>
+ </div>
+ <div ng-switch-when="combo">
+ <input type="text"
+ ng-model="attribute.value"
+ typeahead="option.name for option in attribute.personAttributeOptions | filter:$viewValue | limitTo:20"
+ typeahead-open-on-focus
+ />
+ </div>
+ <div ng-switch-when="number">
+ <input type="number" ng-model="attribute.value" />
+ </div>
+ <div ng-switch-default>
+ <input type="text" ng-model="attribute.value" />
+ </div>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <button ng-click="search()">{{'search'| translate}}</button>
+ </accordion-group>
+</accordion>
\ No newline at end of file
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html 2014-03-17 15:59:31 +0000
@@ -0,0 +1,204 @@
+<script src="../dhis-web-commons/ouwt/ouwt.js"></script>
+<script src="scripts/tracker-capture.js"></script>
+
+<div id="leftBar">
+ <br/>
+ <br/>
+ <div id="orgUnitTree">
+ <ul>
+ </ul>
+ </div>
+ <img id="ouwt_loader" src="../images/ajax-loader-bar.gif"/>
+</div>
+<div class="page" id="mainPage">
+ <h1>
+ <span ng-show="!selectedProgram">
+ {{'search'| translate}} {{selectedProgram.trackedEntity.name}}
+ </span>
+ <span ng-show="selectedProgram">
+ {{'search_for'| translate}} {{selectedProgram.trackedEntity.name}}
+ </span>
+ <a href ng-click="getHelpContent()" title="{{'help'| translate}}"><i class="fa fa-question-circle"></i></a>
+ </h1>
+
+ <!-- selection begins-->
+ <div>
+ <table>
+ <tr>
+ <td><label>{{'registering_unit'| translate}}</label></td>
+ <td><input type="text" selected-org-unit ng-model="selectedOrgUnit.name" value="{{selectedOrgUnit.name|| 'please_select'| translate}}" disabled=""></td>
+ </tr>
+ <tr>
+ <td><label>{{'program'| translate}}<em title="{{'required'| translate}}" class="required">*</em></label></td>
+ <td>
+ <select id="programId"
+ name="programId"
+ ng-model="selectedProgram"
+ ng-options="program as program.name for program in programs | orderBy: 'name'"
+ ng-change="clearEntities()"
+ ng-disabled="!selectedOrgUnit">
+ <option value="">{{'view_all'| translate}}</option>
+ </select>
+ </td>
+ <td style='padding-left: 5px;'>
+ <button class="button"
+ ng-show="selectedOrgUnit"
+ ng-click="loadTrackedEntities()">
+ {{'list_all_entities'| translate}}
+ </button>
+ </td>
+ <td style='padding-left: 5px;'>
+ <button class="button"
+ ng-disabled="!selectedOrgUnit"
+ ng-click="showRegisteration()">
+ {{'add_new'| translate}}
+ </button>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <!-- selection ends -->
+
+ <!-- search begins -->
+ <div style="width: 30%;">
+ <accordion>
+ <accordion>
+ <accordion-group is-open="{{searchField.isOpen}}">
+ <accordion-heading>
+ {{searchField.title| translate}}
+ </accordion-heading>
+ <div>
+ <div class="list-element" ng-repeat="attribute in attributes">
+ {{attribute.name}}
+ <div class="right">
+ <div ng-switch="attribute.valueType">
+ <div ng-switch-when="date">
+ <input type="text" ng-date ng-model="attribute.value" />
+ </div>
+ <div ng-switch-when="trueOnly">
+ <input type="checkbox" ng-model="attribute.value" />
+ </div>
+ <div ng-switch-when="bool">
+ <select ng-model="attribute.value" />
+ <option value="">{{'please_select'| translate}}</option>
+ <option value="0">{{'no'| translate}}</option>
+ <option value="1">{{'yes'| translate}}</option>
+ </select>
+ </div>
+ <div ng-switch-when="combo">
+ <input type="text"
+ ng-model="attribute.value"
+ typeahead="option.name for option in attribute.personAttributeOptions | filter:$viewValue | limitTo:20"
+ typeahead-open-on-focus
+ />
+ </div>
+ <div ng-switch-when="number">
+ <input type="number" ng-model="attribute.value"/>
+ </div>
+ <div ng-switch-default>
+ <input type="text" ng-model="attribute.value" />
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="vertial-spacing">
+ <button ng-click="search()">{{'search'| translate}}</button>
+ </div>
+ </div>
+ </accordion-group>
+ </accordion>
+ </accordion>
+ </div>
+ <!-- search ends -->
+
+ <!-- entity grid begins -->
+ <div id="listDiv" ng-switch="trackedEntityList">
+ <div ng-switch-when=""></div>
+ <div ng-switch-default>
+ <h2>
+ {{selectedProgram.trackedEntity.name || 'entity' | translate}} {{'list'| translate}}
+ </h2>
+ <div ng-switch="trackedEntityList.length">
+ <div ng-switch-when="undefined">
+ <p>
+ {{'empty'| translate}} {{selectedProgram.trackedEntity.name || 'entity' | translate}} {{'list'| translate}}
+ </p>
+ </div>
+ <div ng-switch-when="0">
+ <p>
+ {{'empty'| translate}} {{selectedProgram.trackedEntity.name || 'entity' | translate}} {{'list'| translate}}
+ </p>
+ </div>
+ <div ng-switch-default>
+
+ <!-- entity begins -->
+ <table class="listTable dhis2-table-striped-border dhis2-table-hover">
+ <thead>
+ <tr>
+ <th ng-show="!gridColumn.hide"
+ class="max-column-width"
+ ng-repeat="gridColumn in gridColumns">
+
+ <!-- sort icon begins -->
+ <span ng-hide="gridColumn.showFilter" class="bold" ng-click="sortGrid(gridColumn)">
+ <i ng-show="sortHeader == gridColumn.id && !reverse" class="fa fa-sort-desc"></i>
+ <i ng-show="sortHeader == gridColumn.id && reverse" class="fa fa-sort-asc"></i>
+ {{gridColumn.name}}
+ </span>
+ <!-- sort icon ends -->
+
+ <!-- filter icon begins -->
+ <span class='pull-right'>
+ <span ng-show="gridColumn.type !== 'date'">
+ <a href ng-click="filterInGrid(gridColumn)" title="{{'filter'| translate}}"><span ng-class="{true: 'filter-without-content', false: 'filter-with-content'} [filterText[gridColumn.id] == undefined || filterText[gridColumn.id] == '']"><i class="fa fa-filter"></i></span></a>
+ </span>
+ <span ng-show="gridColumn.type === 'date'">
+ <a href ng-click="filterInGrid(gridColumn)" title="{{'filter'| translate}}"><span ng-class="{true: 'filter-without-content', false: 'filter-with-content'} [(filterText[gridColumn.id].start == 'undefined' || filterText[gridColumn.id].start == '') && (filterText[gridColumn.id].end == 'undefined' || filterText[gridColumn.id].end == '')]"><i class="fa fa-filter"></i></span></a>
+ </span>
+ </span>
+ <!-- filter icon ends -->
+
+ <!-- filter input field begins -->
+ <div ng-show="gridColumn.showFilter">
+ <span ng-show="gridColumn.type !== 'date'">
+ <input type="text" ng-model="filterText[gridColumn.id]" ng-blur="filterInGrid(gridColumn)">
+ </span>
+ <span ng-show="gridColumn.type === 'date'">
+ <input placeholder="{{'start_date'| translate}}" type="text" ng-model="filterText[gridColumn.id].start" data-ng-date readonly="readonly">
+ <span ng-hide="filterText[gridColumn.id].start == 'undefined' || filterText[gridColumn.id].start == ''">
+ <a href ng-click='removeStartFilterText(gridColumn.id)'><span class='black'><i class="fa fa-trash-o"></i></span></a>
+ </span>
+ <input placeholder="{{'end_date'| translate}}" type="text" ng-model="filterText[gridColumn.id].end" data-ng-date readonly="readonly">
+ <span ng-hide="filterText[gridColumn.id].end == 'undefined' || filterText[gridColumn.id].end == ''">
+ <a href ng-click='removeEndFilterText(gridColumn.id)'><span class='black'><i class="fa fa-trash-o"></i></span></a>
+ </span>
+ </span>
+ </div>
+ <!-- filter input field ends -->
+ </th>
+ </tr>
+ </thead>
+ <tbody id="list">
+ <tr ng-repeat="trackedEntity in trackedEntityList| paginate:rowsPerPage | orderBy:sortHeader:reverse | gridFilter:filterText:currentFilter"
+ ng-click="showDashboard(trackedEntity)">
+
+ <td class="max-column-width"
+ ng-repeat="gridColumn in gridColumns">
+ {{trackedEntity[gridColumn.id]}}
+ </td>
+
+ </tr>
+ </tbody>
+ </table>
+ <paginator></paginator>
+ <!-- entity ends -->
+ </div>
+ </div>
+ </div>
+
+ </div>
+ <!-- entity grid ends -->
+</div>
+
+
=== modified file 'dhis-2/dhis-web/pom.xml'
--- dhis-2/dhis-web/pom.xml 2014-03-02 03:01:49 +0000
+++ dhis-2/dhis-web/pom.xml 2014-03-17 15:59:31 +0000
@@ -25,10 +25,11 @@
<module>dhis-web-mapping</module>
<module>dhis-web-visualizer</module>
<module>dhis-web-pivot</module>
+ <module>dhis-web-event-capture</module>
<module>dhis-web-event-reports</module>
+ <module>dhis-web-tracker-capture</module>
<module>dhis-web-dashboard-integration</module>
- <module>dhis-web-caseentry</module>
- <module>dhis-web-event-capture</module>
+ <module>dhis-web-caseentry</module>
<module>dhis-web-light</module>
<module>dhis-web-mobile</module>
<module>dhis-web-sms</module>