Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
cd /usr/ui/medplat-ui

npm install --legacy-peer-deps
bower install
bower install --allow-root --config.interactive=false

cd /usr/web
mvn clean install -P docker -Dmaven.test.skip=true
Expand Down
59 changes: 59 additions & 0 deletions medplat-ui/app/ai-assistant/chat.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
(function () {
'use strict';
angular.module('imtecho.controllers')
.controller('ChatController', ChatController);

function ChatController($timeout, $translate) {
var chat = this;
chat.showChat = false;
chat.messages = [
{ text: "Hello! I am AI ANM, your assistant. How can I help you today?", sender: "ai", timestamp: new Date() }
];
chat.newMessage = "";

chat.toggleChat = function () {
chat.showChat = !chat.showChat;
if (chat.showChat) {
$timeout(scrollBottom, 100);
}
};

chat.sendMessage = function () {
if (!chat.newMessage.trim()) return;

chat.messages.push({
text: chat.newMessage,
sender: "user",
timestamp: new Date()
});

var userMsg = chat.newMessage;
chat.newMessage = "";
$timeout(scrollBottom, 100);

// Mock AI response
$timeout(function () {
var response = "I understand you're asking about: " + userMsg + ". I'm currently in testing mode, but I can help you report issues in the 'Manage' section.";
chat.messages.push({
text: response,
sender: "ai",
timestamp: new Date()
});
$timeout(scrollBottom, 100);
}, 1000);
};

chat.checkEnter = function (event) {
if (event.which === 13) {
chat.sendMessage();
}
};

function scrollBottom() {
var chatBox = document.getElementById('chat-messages');
if (chatBox) {
chatBox.scrollTop = chatBox.scrollHeight;
}
}
}
})();
142 changes: 142 additions & 0 deletions medplat-ui/app/ai-assistant/chat.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<div class="ai-assistant-fab" ng-click="chat.toggleChat()" ng-hide="chat.showChat">
<img src="img/fhs-icon.png" alt="AI ANM">
</div>

<div class="ai-assistant-container" ng-show="chat.showChat">
<div class="chat-header">
<h5>{{ 'CHAT.TITLE' | translate }} (AI ANM)</h5>
<button class="close-btn" ng-click="chat.toggleChat()">&times;</button>
</div>
<div class="chat-body" id="chat-messages">
<div ng-repeat="msg in chat.messages" class="message"
ng-class="{'user-msg': msg.sender === 'user', 'ai-msg': msg.sender === 'ai'}">
<div class="msg-content">{{ msg.text }}</div>
<div class="msg-time">{{ msg.timestamp | date:'shortTime' }}</div>
</div>
</div>
<div class="chat-footer">
<div class="input-group">
<input type="text" class="form-control" ng-model="chat.newMessage"
placeholder="{{ 'CHAT.PLACEHOLDER' | translate }}" ng-keypress="chat.checkEnter($event)">
<div class="input-group-append">
<button class="btn btn-primary" type="button" ng-click="chat.sendMessage()">
{{ 'CHAT.SEND' | translate }}
</button>
</div>
</div>
</div>
</div>

<style>
.ai-assistant-fab {
position: fixed;
bottom: 20px;
right: 20px;
width: 60px;
height: 60px;
border-radius: 50%;
background: #007bff;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
cursor: pointer;
z-index: 1050;
transition: transform 0.3s;
}

.ai-assistant-fab:hover {
transform: scale(1.1);
}

.ai-assistant-fab img {
width: 40px;
height: 40px;
}

.ai-assistant-container {
position: fixed;
bottom: 90px;
right: 20px;
width: 350px;
height: 500px;
background: white;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
z-index: 1050;
overflow: hidden;
}

.chat-header {
background: #007bff;
color: white;
padding: 10px 15px;
display: flex;
justify-content: space-between;
align-items: center;
}

.chat-header h5 {
margin: 0;
font-size: 1.1rem;
}

.close-btn {
background: none;
border: none;
color: white;
font-size: 1.5rem;
cursor: pointer;
}

.chat-body {
flex: 1;
padding: 15px;
overflow-y: auto;
background: #f8f9fa;
}

.message {
margin-bottom: 10px;
max-width: 80%;
}

.msg-content {
padding: 8px 12px;
border-radius: 15px;
font-size: 0.9rem;
position: relative;
}

.user-msg {
margin-left: auto;
text-align: right;
}

.user-msg .msg-content {
background: #007bff;
color: white;
border-bottom-right-radius: 0;
}

.ai-msg .msg-content {
background: white;
color: #333;
border: 1px solid #ddd;
border-bottom-left-radius: 0;
}

.msg-time {
font-size: 0.75rem;
color: #999;
margin-top: 2px;
}

.chat-footer {
padding: 10px;
border-top: 1px solid #ddd;
background: white;
}
</style>
11 changes: 10 additions & 1 deletion medplat-ui/app/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,18 @@
'ui.mask',
'daterangepicker',
'textAngular',
'pascalprecht.translate',
'config'
]);
as.config(function (AuthenticateServiceProvider, MaskProvider) {
as.config(function (AuthenticateServiceProvider, MaskProvider, $translateProvider) {
$translateProvider.useStaticFilesLoader({
prefix: 'app/languages/',
suffix: '.json'
});
$translateProvider.preferredLanguage('en');
$translateProvider.fallbackLanguage('en');
$translateProvider.useSanitizeValueStrategy('sanitizeParameters');

MaskProvider.setTemplate('<i class ="fa fa-cog fa-spin fa-2x"></i>');
AuthenticateServiceProvider.setClientDetails('imtecho-ui', 'imtecho-ui-secret');
});
Expand Down
11 changes: 10 additions & 1 deletion medplat-ui/app/common/controllers/layout.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,16 @@
angular.module('imtecho.controllers')
.controller('LayoutController', LayoutController);

function LayoutController($filter, $state, AuthenticateService, $uibModal, $interval, Mask, UserDAO, GeneralUtil) {
function LayoutController($filter, $state, AuthenticateService, $uibModal, $interval, Mask, UserDAO, GeneralUtil, $translate, NotificationService) {
var layout = this;
layout.currentState = $state;
layout.currentLang = $translate.use() || 'en';

layout.changeLanguage = function (langKey) {
$translate.use(langKey);
layout.currentLang = langKey;
};

function init() {
layout.userDetail;
layout.userObj = {};
Expand Down Expand Up @@ -230,5 +237,7 @@
};

init();
NotificationService.startSimulating();
}
LayoutController.$inject = ['$filter', '$state', 'AuthenticateService', '$uibModal', '$interval', 'Mask', 'UserDAO', 'GeneralUtil', '$translate', 'NotificationService'];
})();
17 changes: 17 additions & 0 deletions medplat-ui/app/common/services/notification.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
(function () {
'use strict';
angular.module('imtecho.services')
.service('NotificationService', NotificationService);

function NotificationService($timeout, toaster) {
var self = this;

self.startSimulating = function () {
// Periodically show random notifications for demo purposes
$timeout(function () {
toaster.pop('info', 'New Ticket', 'A new high priority ticket has been assigned to you: #9876');
self.startSimulating(); // Continue simulating
}, 60000); // Every 60 seconds
};
}
})();
26 changes: 24 additions & 2 deletions medplat-ui/app/common/views/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,18 @@
</ul>
</div>
</li>
<li class="user dropdown" uib-dropdown dropdown-append-to-body uib-dropdown-toggle>
<a type="" class="nav-link">
<i class="fa fa-language"></i> {{layout.currentLang | uppercase}}
</a>
<div class="user-data dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<ul>
<li ng-click="layout.changeLanguage('en')"><a href="javascript:void(0)">English</a></li>
<li ng-click="layout.changeLanguage('hi')"><a href="javascript:void(0)">हिन्दी (Hindi)</a></li>
<li ng-click="layout.changeLanguage('gu')"><a href="javascript:void(0)">ગુજરાતી (Gujarati)</a></li>
</ul>
</div>
</li>
<li class="user dropdown" uib-dropdown dropdown-append-to-body uib-dropdown-toggle>
<a type="" data-test="user-dropdown">
<span class="user-image"><img alt="image" src="img/default.jpg" class="img-fluid"></span>
Expand Down Expand Up @@ -170,6 +182,12 @@
</a>
<div class="position-wrapper">
<ul ng-if="layout.menuList.manage.length > 0" class="cst-scrollbar sub-menu">
<li>
<a href="javascript:void(0)" ui-sref="techo.manage.reportissue"
data-test="sub-menu-report-issue" ui-sref-opts="{clearSessionStorage:true}">
Report Issue
</a>
</li>
<li ng-repeat="menu in layout.menuList.manage" ng-class="{'has-sub':menu.isGroup}">
<a ng-if='menu.isGroup || menu.isSubGroup' data-test="sub-menu-{{menu.name}}">
{{menu.name}}
Expand Down Expand Up @@ -228,6 +246,9 @@
role="main">
<ui-view></ui-view>
</main>
<div ng-controller="ChatController as chat">
<div ng-include="'app/ai-assistant/chat.html'"></div>
</div>
<footer class="hr-footer">
<!-- <ul class="logo-list">
<li ng-repeat="imageData in layout.logoImages">
Expand All @@ -237,9 +258,10 @@
</li>
</ul> -->
<p style="text-align: justify;">
<i>A low code comprehensive Primary Healthcare management Platform to track, manage and improve SDG 3 indicators especially in a public health context</i>
<i>A low code comprehensive Primary Healthcare management Platform to track, manage and improve SDG 3 indicators
especially in a public health context</i>
</p>
<!-- <a href="http://www.argusoft.com/" target="_blank" border="0">
<!-- <a href="http://www.argusoft.com/" target="_blank" border="0">
<img alt="image" class="argus-logo" src="img/medplat.png" style="height: 50px;">
</a> -->
</footer>
22 changes: 13 additions & 9 deletions medplat-ui/app/config.lazyload.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@
'attendance.service': ['app/training/mytrainingdashboard/services/attendance.service.js'],
'common.service': ['app/training/services/common-method.service.js'],
'layout.controller': ['app/common/controllers/layout.controller.js'],
'ai-assistant.controller': ['app/ai-assistant/chat.controller.js'],
'report-issue.controller': ['app/manage/issue-reporting/report-issue.controller.js'],
'notification.service': ['app/common/services/notification.service.js'],
'roles.service': ['app/common/services/role.service.js'],
'menu-feature-config.controller': ['app/admin/menufeature/controllers/menu-feature-config.controller.js'],
'menu-config.service': ['app/admin/menufeature/services/menu-config.service.js'],
Expand Down Expand Up @@ -451,22 +454,22 @@
'hpr-creation-controller': ['app/manage/ndhm/hpr/controllers/hpr-creation.controller.js'],
'hpr-login.controller': ['app/manage/ndhm/hpr/controllers/hpr-login.controller.js'],
'hpr-auth-service': ['app/manage/ndhm/hpr/services/hpr-auth.service.js'],
'hpr-profile.controller' : ['app/manage/ndhm/hpr/controllers/hpr-profile.controller.js'],
'hpr-profile.controller': ['app/manage/ndhm/hpr/controllers/hpr-profile.controller.js'],
'hpr-search-service': ['app/manage/ndhm/hpr/services/hpr-search.service.js'],
'hpr-forgot.controller' : ['app/manage/ndhm/hpr/controllers/hpr-forgot.controller.js'],
'hpr-forgot.controller': ['app/manage/ndhm/hpr/controllers/hpr-forgot.controller.js'],
'hpr-forgot-service': ['app/manage/ndhm/hpr/services/hpr-forgot.service.js'],
'reset-password.modal.controller' : ['app/manage/ndhm/hpr/controllers/reset-password.modal.controller.js'],
'forgot-healthId.modal.controller' : ['app/manage/ndhm/hpr/controllers/forgot-healthId.modal.controller.js'],
'reset-password.modal.controller': ['app/manage/ndhm/hpr/controllers/reset-password.modal.controller.js'],
'forgot-healthId.modal.controller': ['app/manage/ndhm/hpr/controllers/forgot-healthId.modal.controller.js'],
'hfr-constants': ['app/manage/ndhm/hfr/constants/hfr.constants.js'],
'hfr-onboarding-service': ['app/manage/ndhm/hfr/services/hfr-onboarding.service.js'],
'hfr-hprlinkage-service': ['app/manage/ndhm/hfr/services/hfr-hprlinkage.service.js'],
'hfr-utility-service': ['app/manage/ndhm/hfr/services/hfr-utility.service.js'],
'hfr-search-service': ['app/manage/ndhm/hfr/services/hfr-search.service.js'],
'hfr-login.controller': ['app/manage/ndhm/hfr/controllers/hfr-login.controller.js'],
'login-hfr.modal.controller' : ['app/manage/ndhm/hfr/controllers/login-hfr.modal.controller.js'],
'hfr-dashboard.controller' : ['app/manage/ndhm/hfr/controllers/hfr-dashboard.controller.js'],
'hfr-basic.controller' : ['app/manage/ndhm/hfr/controllers/hfr-basic.controller.js'],
'facility-linking.modal.controller' : ['app/manage/healthfacilitymapping/controllers/facility-linking.modal.controller.js'],
'login-hfr.modal.controller': ['app/manage/ndhm/hfr/controllers/login-hfr.modal.controller.js'],
'hfr-dashboard.controller': ['app/manage/ndhm/hfr/controllers/hfr-dashboard.controller.js'],
'hfr-basic.controller': ['app/manage/ndhm/hfr/controllers/hfr-basic.controller.js'],
'facility-linking.modal.controller': ['app/manage/healthfacilitymapping/controllers/facility-linking.modal.controller.js'],
'health-infrastructure-service': ['app/manage/healthfacilitymapping/services/health-infrastructure.service.js'],
'search.constants': ['app/common/constants/search.constants.js'],
'ncd-member-detail-dnhdd.controller': ['app/ncd/refferedpatientsdnhdd/controllers/ncd-member-detail.controller.js'],
Expand Down Expand Up @@ -501,5 +504,6 @@
'sms-type.service': ["app/manage/smstype/services/sms-type.service.js"],
'sms-type.controller': ["app/manage/smstype/controllers/sms-type-manage.controller.js"],
'analytics-dashboard.controller': ['app/admin/analyticsdashboard/controllers/analytics-dashboard.controller.js'],
'lms-dashboard-v2.controller': ['app/training/dashboard/controllers/lms-dashboard-v2.controller.js'] });
'lms-dashboard-v2.controller': ['app/training/dashboard/controllers/lms-dashboard-v2.controller.js']
});
}());
Loading