Solving conflict

MOHEMM-SFH-COLORS
ansariakhtar 7 years ago
commit d94be71a2b

@ -0,0 +1,119 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.cloudsolutions.mohemm" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>MyApp</name>
<description>An awesome Ionic/Cordova app.</description>
<author email="hi@ionicframework.com" href="http://ionicframework.com/">Ionic Framework Team</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<preference name="ScrollEnabled" value="false" />
<preference name="android-minSdkVersion" value="19" />
<preference name="BackupWebStorage" value="none" />
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="FadeSplashScreenDuration" value="300" />
<preference name="SplashShowOnlyFirstTime" value="false" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="3000" />
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
<allow-intent href="market:*" />
<icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
<icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
<icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
<icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
<icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
<icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
<splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
<splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
<splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
<splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
<splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
<splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
<splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
<splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
<splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
<splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
<splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
<splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<icon height="57" src="resources/ios/icon/icon.png" width="57" />
<icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
<icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
<icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
<icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
<icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
<icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
<icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
<icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
<icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
<icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
<icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
<icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
<icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
<icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
<icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
<icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
<icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
<icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
<splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
<splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
<splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
<splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
<splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
<splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
<splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
<splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
<splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
<splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
<splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
</platform>
<plugin name="cordova-plugin-whitelist" spec="1.3.3" />
<plugin name="cordova-plugin-statusbar" spec="2.4.2" />
<plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
<plugin name="cordova-plugin-ionic-webview" spec="^4.0.0" />
<plugin name="call-number" spec="^1.0.1" />
<plugin name="cordova-android-support-gradle-release" spec="^2.1.0" />
<plugin name="phonegap-plugin-push" spec="2.2.3">
<variable name="GOOGLE_PLAY_SERVICES_VERSION" value="16.0.0" />
<variable name="FCM_VERSION" value="15.0.0" />
</plugin>
<plugin name="cordova-sqlite-storage" spec="^3.2.0" />
<plugin name="cordova-plugin-nativestorage" spec="^2.3.2" />
<plugin name="cordova-plugin-ble-central" spec="^1.2.2" />
<plugin name="uk.co.workingedge.phonegap.plugin.launchnavigator" spec="^3.2.2" />
<plugin name="cordova-plugin-themeablebrowser" spec="^0.2.18" />
<plugin name="cordova-plugin-inappbrowser" spec="^3.0.0" />
<plugin name="cordova-plugin-globalization" spec="^1.11.0" />
<plugin name="cordova-plugin-android-permissions" spec="^1.0.0" />
<plugin name="cordova-plugin-sms-receive" spec="^1.0.2" />
<plugin name="cordova-plugin-device" spec="^2.0.2" />
<plugin name="cordova-plugin-local-notification" spec="^0.9.0-beta.2" />
<plugin name="mx.ferreyra.callnumber" spec="0.0.2" />
<plugin name="cordova-plugin-badge" spec="^0.8.8" />
<plugin name="cordova-plugin-fingerprint-aio" spec="^1.7.0">
<variable name="FACEID_USAGE_DESCRIPTION" value="User Authentication" />
</plugin>
<plugin name="cordova.plugins.diagnostic" spec="^4.0.12" />
<plugin name="phonegap-plugin-barcodescanner" spec="^8.1.0" />
<plugin name="cordova-plugin-camera" spec="^4.0.3" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.1.3" />
<plugin name="cordova-opentok-android-permissions" spec="^1.0.1" />
<plugin name="cordova-plugin-appavailability" spec="^0.4.2" />
<plugin name="cordova-plugin-apprate" spec="^1.4.0" />
<engine name="browser" spec="5.0.4" />
<engine name="ios" spec="4.5.5" />
<engine name="android" spec="7.1.4" />
</widget>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,190 @@
{
"name": "MOHEM",
"version": "0.0.1",
"author": "Cloud Solutions",
"homepage": "http://www.cloudsolution-sa.com/",
"private": true,
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"dependencies": {
"@angular/animations": "^7.2.15",
"@angular/common": "^7.2.2",
"@angular/core": "^7.2.2",
"@angular/forms": "^7.2.2",
"@angular/http": "^7.2.2",
"@angular/platform-browser": "^7.2.2",
"@angular/platform-browser-dynamic": "^7.2.2",
"@angular/router": "^7.2.2",
"@ionic-native/android-permissions": "^5.8.0",
"@ionic-native/app-availability": "^5.8.0",
"@ionic-native/app-rate": "^5.8.0",
"@ionic-native/background-geolocation": "^5.4.0",
"@ionic-native/badge": "^5.8.0",
"@ionic-native/barcode-scanner": "^5.8.0",
"@ionic-native/ble": "^5.8.0",
"@ionic-native/call-number": "^5.8.0",
"@ionic-native/camera": "^5.8.0",
"@ionic-native/core": "^5.8.0",
"@ionic-native/device": "^5.8.0",
"@ionic-native/diagnostic": "^5.8.0",
"@ionic-native/fingerprint-aio": "^5.8.0",
"@ionic-native/globalization": "^5.8.0",
"@ionic-native/health": "^5.4.0",
"@ionic-native/in-app-browser": "^5.8.0",
"@ionic-native/keyboard": "^5.8.0",
"@ionic-native/launch-navigator": "^5.8.0",
"@ionic-native/local-notifications": "^5.8.0",
"@ionic-native/native-storage": "^5.8.0",
"@ionic-native/push": "^5.8.0",
"@ionic-native/sms": "^5.8.0",
"@ionic-native/splash-screen": "^5.0.0",
"@ionic-native/sqlite": "^5.8.0",
"@ionic-native/status-bar": "^5.0.0",
"@ionic-native/themeable-browser": "^5.8.0",
"@ionic/angular": "^4.1.0",
"@ng-bootstrap/ng-bootstrap": "^4.2.1",
"@swimlane/ngx-charts": "^10.1.0",
"angular-calendar": "^0.26.11",
"call-number": "^1.0.1",
"chart.js": "^2.8.0",
"cordova-android": "7.1.4",
"cordova-android-support-gradle-release": "^2.1.0",
"cordova-browser": "5.0.4",
"cordova-ios": "4.5.5",
"cordova-opentok-android-permissions": "^1.0.1",
"cordova-plugin-actionsheet": "^2.3.3",
"cordova-plugin-add-swift-support": "^2.0.2",
"cordova-plugin-android-permissions": "^1.0.0",
"cordova-plugin-appavailability": "^0.4.2",
"cordova-plugin-apprate": "^1.4.0",
"cordova-plugin-badge": "^0.8.8",
"cordova-plugin-ble-central": "^1.2.2",
"cordova-plugin-camera": "^4.0.3",
"cordova-plugin-compat": "^1.2.0",
"cordova-plugin-device": "^2.0.2",
"cordova-plugin-dialogs": "^2.0.1",
"cordova-plugin-fingerprint-aio": "^1.7.0",
"cordova-plugin-globalization": "^1.11.0",
"cordova-plugin-inappbrowser": "^3.0.0",
"cordova-plugin-ionic-keyboard": "^2.1.3",
"cordova-plugin-ionic-webview": "^3.1.2",
"cordova-plugin-local-notification": "^0.9.0-beta.2",
"cordova-plugin-nativestorage": "^2.3.2",
"cordova-plugin-sms-receive": "^1.0.2",
"cordova-plugin-splashscreen": "^5.0.2",
"cordova-plugin-statusbar": "^2.4.2",
"cordova-plugin-themeablebrowser": "^0.2.18",
"cordova-plugin-whitelist": "^1.3.3",
"cordova-sms-plugin": "^1.0.0",
"cordova-sqlite-storage": "^3.2.0",
"cordova.plugins.diagnostic": "^4.0.12",
"core-js": "^2.5.4",
"date-fns": "^1.30.1",
"mx.ferreyra.callnumber": "0.0.2",
"phonegap-plugin-barcodescanner": "^8.1.0",
"phonegap-plugin-multidex": "^1.0.0",
"phonegap-plugin-push": "2.2.3",
"primeicons": "^1.0.0",
"primeng": "^7.1.3",
"run": "1.4.0",
"rxjs": "~6.3.3",
"uk.co.workingedge.phonegap.plugin.launchnavigator": "^3.2.2",
"zone.js": "~0.8.29"
},
"devDependencies": {
"@angular-devkit/architect": "~0.12.3",
"@angular-devkit/build-angular": "~0.13.0",
"@angular-devkit/core": "~7.2.3",
"@angular-devkit/schematics": "~7.2.3",
"@angular/cli": "7.3.6",
"@angular/compiler": "~7.2.2",
"@angular/compiler-cli": "~7.2.2",
"@angular/language-service": "~7.2.2",
"@ionic/angular-toolkit": "~1.4.0",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~10.12.0",
"codelyzer": "~4.5.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "^4.0.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.4.0",
"ts-node": "~8.0.0",
"tslint": "~5.12.0",
"typescript": "~3.1.6"
},
"description": "An Ionic project",
"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},
"cordova-plugin-statusbar": {},
"cordova-plugin-device": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-ionic-webview": {
"ANDROID_SUPPORT_ANNOTATIONS_VERSION": "27.+"
},
"cordova-plugin-mauron85-background-geolocation": {
"GOOGLE_PLAY_SERVICES_VERSION": "16.0.0",
"ANDROID_SUPPORT_LIBRARY_VERSION": "26+",
"ICON": "@mipmap/icon",
"SMALL_ICON": "@mipmap/icon",
"ACCOUNT_NAME": "@string/app_name",
"ACCOUNT_LABEL": "@string/app_name",
"ACCOUNT_TYPE": "$PACKAGE_NAME.account",
"CONTENT_AUTHORITY": "$PACKAGE_NAME",
"ALWAYS_USAGE_DESCRIPTION": "This app always requires location tracking",
"MOTION_USAGE_DESCRIPTION": "This app requires motion detection"
},
"cordova-sqlite-storage": {},
"cordova-plugin-nativestorage": {},
"cordova-plugin-ble-central": {},
"uk.co.workingedge.phonegap.plugin.launchnavigator": {},
"cordova-plugin-themeablebrowser": {},
"cordova-plugin-globalization": {},
"cordova-plugin-android-permissions": {},
"cordova-plugin-sms-receive": {},
"cordova-plugin-local-notification": {},
"mx.ferreyra.callnumber": {},
"cordova-plugin-badge": {},
"cordova-plugin-fingerprint-aio": {
"FACEID_USAGE_DESCRIPTION": "User Authentication"
},
"cordova.plugins.diagnostic": {},
"phonegap-plugin-barcodescanner": {},
"cordova-plugin-camera": {},
"cordova-plugin-ionic-keyboard": {},
"cordova-android-support-gradle-release": {},
"cordova-opentok-android-permissions": {},
"cordova-plugin-health": {
"HEALTH_READ_PERMISSION": "App needs read access to read heart rate",
"HEALTH_WRITE_PERMISSION": "App needs write access for heart rate",
"GMS_VERSION": "16.0.1"
},
"cordova-plugin-appavailability": {},
"call-number": {},
"cordova-support-google-services": {},
"phonegap-plugin-push": {
"GOOGLE_PLAY_SERVICES_VERSION": "16.0.0",
"FCM_VERSION": "15.0.0"
},
"cordova-plugin-apprate": {},
"cordova-plugin-inappbrowser": {},
"cordova-sms-plugin": {}
},
"platforms": [
"browser",
"ios",
"android"
]
}
}

@ -0,0 +1 @@
to add ios - ionic cordova platform add ios

@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.ionic.starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget id="com.cloudsolutions.mohemm" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>MyApp</name>
<description>An awesome Ionic/Cordova app.</description>
<author email="hi@ionicframework.com" href="http://ionicframework.com/">Ionic Framework Team</author>
@ -85,7 +85,6 @@
<plugin name="cordova-plugin-statusbar" spec="2.4.2" />
<plugin name="cordova-plugin-splashscreen" spec="5.0.2" />
<plugin name="cordova-plugin-ionic-webview" spec="^4.0.0" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.0.5" />
<plugin name="cordova-plugin-cszbar" spec="1.3.4" />
<plugin name="cordova-plugin-geolocation" spec="4.0.1">
<variable name="GEOLOCATION_USAGE_DESCRIPTION" value="To fetch location for marking attendance" />
@ -94,6 +93,34 @@
<plugin name="cordova-android-support-gradle-release" spec="^3.0.1">
<variable name="ANDROID_SUPPORT_VERSION" value="27.+" />
</plugin>
<plugin name="call-number" spec="^1.0.1" />
<plugin name="cordova-android-support-gradle-release" spec="^2.1.0" />
<plugin name="phonegap-plugin-push" spec="2.2.3">
<variable name="GOOGLE_PLAY_SERVICES_VERSION" value="16.0.0" />
<variable name="FCM_VERSION" value="15.0.0" />
</plugin>
<plugin name="cordova-sqlite-storage" spec="^3.2.0" />
<plugin name="cordova-plugin-nativestorage" spec="^2.3.2" />
<plugin name="cordova-plugin-ble-central" spec="^1.2.2" />
<plugin name="uk.co.workingedge.phonegap.plugin.launchnavigator" spec="^3.2.2" />
<plugin name="cordova-plugin-themeablebrowser" spec="^0.2.18" />
<plugin name="cordova-plugin-inappbrowser" spec="^3.0.0" />
<plugin name="cordova-plugin-globalization" spec="^1.11.0" />
<plugin name="cordova-plugin-sms-receive" spec="^1.0.2" />
<plugin name="cordova-plugin-device" spec="^2.0.2" />
<plugin name="cordova-plugin-local-notification" spec="^0.9.0-beta.2" />
<plugin name="mx.ferreyra.callnumber" spec="0.0.2" />
<plugin name="cordova-plugin-badge" spec="^0.8.8" />
<plugin name="cordova-plugin-fingerprint-aio" spec="^1.7.0">
<variable name="FACEID_USAGE_DESCRIPTION" value="User Authentication" />
</plugin>
<plugin name="cordova.plugins.diagnostic" spec="^4.0.12" />
<plugin name="phonegap-plugin-barcodescanner" spec="^8.1.0" />
<plugin name="cordova-plugin-camera" spec="^4.0.3" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.1.3" />
<plugin name="cordova-opentok-android-permissions" spec="^1.0.1" />
<plugin name="cordova-plugin-appavailability" spec="^0.4.2" />
<plugin name="cordova-plugin-apprate" spec="^1.4.0" />
<engine name="browser" spec="5.0.4" />
<engine name="ios" spec="4.5.5" />
<engine name="android" spec="7.1.4" />

@ -0,0 +1 @@
to add ios - ionic cordova platform add ios

@ -0,0 +1,40 @@
{
"project_info": {
"project_number": "608631731238",
"firebase_url": "https://mohemm-cs.firebaseio.com",
"project_id": "mohemm-cs",
"storage_bucket": "mohemm-cs.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:608631731238:android:3a8384007f8700ec",
"android_client_info": {
"package_name": "com.cloudsolutions.mohemm"
}
},
"oauth_client": [
{
"client_id": "608631731238-83a5qndedia496ssa6ekkd3db5jo8khr.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyB5zpz9vC2NOxsU1dPr0TK0dVaMY5D4Mjg"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "608631731238-83a5qndedia496ssa6ekkd3db5jo8khr.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

@ -0,0 +1,164 @@
@echo start installing required native and 3rd party plugins
@echo to update angular -> npm install -g @angular/cli
@echo to update ionic -> npm install -g ionic
@echo add browser, android , ios platforms commit non required
@echo to add browser -> call ionic cordova platform add browser
@echo to add ios -> call ionic cordova platform add ios
call ionic cordova platform add android
@echo copying android FCM google servcie file
call cp ./google-services.json ./platforms/android/
call npm i @angular/animations
call npm i @swimlane/ngx-charts --save
@echo primeng framework [angular]
call npm install primeng --save
call npm install primeicons --save
@echo add css links for primeng in global.scss
@echo @import "../node_modules/primeng/resources/themes/nova-light/theme.css";
@echo @import "../node_modules/primeng/resources/primeng.min.css";
@echo @import "../node_modules/primeicons/primeicons.css";
@echo install chartjs as dependency for primeng chartjs
call npm install chart.js --save
@echo add reference in [angular.json] in [scripts] array add (node_modules/chart.js/dist/Chart.js)
@echo calendar https://mattlewis92.github.io/angular-calendar/#/kitchen-sink
call npm install --save @ng-bootstrap/ng-bootstrap
call npm install --save angular-calendar date-fns
@echo install android support gradle release because of barcode scanner to install missing android attributes
call ionic cordova plugin add cordova-android-support-gradle-release --fetch
@echo push notifications
call ionic cordova plugin add phonegap-plugin-push --variable GOOGLE_PLAY_SERVICES_VERSION="16.0.0" --variable FCM_VERSION="15.0.0"
call npm install @ionic-native/push
@echo sqlite storage
call ionic cordova plugin add cordova-sqlite-storage
call npm install @ionic-native/sqlite
@echo native storage
call ionic cordova plugin add cordova-plugin-nativestorage
call npm install @ionic-native/native-storage
@echo bluetooth ble centeral //check interface assets/js/bletooth.js
call ionic cordova plugin add cordova-plugin-ble-central
call npm install @ionic-native/ble
@echo launch navigator
@echo warning : for now we stick with launch navigator 3 since 5 has issue
REM call ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator --variable GOOGLE_API_KEY_FOR_ANDROID="AIzaSyC-XbzwGMyAVCnspof0cqiO4iLfKmeEYVA"
call ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator@3
call npm install @ionic-native/launch-navigator
@echo themeablebrowser
call ionic cordova plugin add cordova-plugin-themeablebrowser
call npm install @ionic-native/themeable-browser
@echo in app browser
call ionic cordova plugin add cordova-plugin-inappbrowser
call npm install @ionic-native/in-app-browser
@echo globalization
call ionic cordova plugin add cordova-plugin-globalization
call npm install @ionic-native/globalization
@echo android permissions plugin
call ionic cordova plugin add cordova-plugin-android-permissions
call npm install @ionic-native/android-permissions
@echo sms reader https://www.npmjs.com/package/cordova-plugin-sms-receive
call npm i cordova-plugin-sms-receive
call cordova plugin add cordova-plugin-sms-receive
@echo device information
call ionic cordova plugin add cordova-plugin-device
call npm install @ionic-native/device
@echo local notifications
call ionic cordova plugin add cordova-plugin-local-notification
call npm install @ionic-native/local-notifications
@echo call phone number
call ionic cordova plugin add call-number
call npm install @ionic-native/call-number
@echo badge
call ionic cordova plugin add cordova-plugin-badge
call npm install @ionic-native/badge
@echo biometric features
call ionic cordova plugin add cordova-plugin-fingerprint-aio --variable FACEID_USAGE_DESCRIPTION="User Authentication"
call npm install @ionic-native/fingerprint-aio
@echo install diagnostic
call ionic cordova plugin add cordova.plugins.diagnostic
call npm install @ionic-native/diagnostic
@echo install background-geolocation
call ionic cordova plugin add cordova-plugin-mauron85-background-geolocation@alpha --variable GOOGLE_PLAY_SERVICES_VERSION="16.0.0"
call npm install @ionic-native/background-geolocation
@echo install barcode plugin
call ionic cordova plugin add phonegap-plugin-barcodescanner
call npm install @ionic-native/barcode-scanner
@echo install camera plugin
call ionic cordova plugin add cordova-plugin-camera
call npm install @ionic-native/camera
@echo install keyboard plugin
call ionic cordova plugin add cordova-plugin-ionic-keyboard
call npm install @ionic-native/keyboard
@echo install opentok required permissions
call ionic cordova plugin add cordova-opentok-android-permissions
@echo install health plugin
call ionic cordova plugin add cordova-plugin-health --variable HEALTH_READ_PERMISSION="App needs read access to read heart rate" --variable HEALTH_WRITE_PERMISSION="App needs write access for heart rate" --variable GMS_VERSION="16.0.1"
call npm install @ionic-native/health
@echo install App Availability Plugin
call ionic cordova plugin add cordova-plugin-appavailability
call npm install @ionic-native/app-availability
@echo install rate plugin
call ionic cordova plugin add cordova-plugin-apprate
call npm install @ionic-native/app-rate
@echo reinitializing git repository
@echo git init
@echo git remote add origin https://enas_yaghi@hmg.git.cloudforge.com/patientappionic.git
@echo git push -f origin master
@echo update project from package.js change if necessary
@echo to install all dependencies in package.json
@echo npm cache clean --force
@echo exact version -> npm install --save --save-exact react
@echo latest versions based on package.json rules -> npm install
@echo to build or serve for (( production ))
@echo export NODE_OPTIONS=--max-old-space-size=4096
@echo ionic cordova build android --release --aot --minifyjs --optimizejs --minifycss
@echo ionic cordova build ios --release --aot --minifyjs --optimizejs --minifycss

@ -0,0 +1,167 @@
#!/bin/sh
echo start installing required native and 3rd party plugins
echo to update angular -> npm install -g @angular/cli
echo to update ionic -> npm install -g ionic
echo add browser, android , ios platforms commit non required
echo to add browser -> call ionic cordova platform add browser
echo to add ios -> call ionic cordova platform add ios
ionic cordova platform add android
echo copying android FCM google servcie file
cp ./google-services.json ./platforms/android/
npm i @angular/animations
npm i @swimlane/ngx-charts --save
echo primeng framework [angular]
npm install primeng --save
npm install primeicons --save
echo add css links for primeng in global.scss
echo @import "../node_modules/primeng/resources/themes/nova-light/theme.css";
echo @import "../node_modules/primeng/resources/primeng.min.css";
echo @import "../node_modules/primeicons/primeicons.css";
echo install chartjs as dependency for primeng chartjs
npm install chart.js --save
# echo add reference in [angular.json] in [scripts] array add (node_modules/chart.js/dist/Chart.js)
echo calendar https://mattlewis92.github.io/angular-calendar/#/kitchen-sink
npm install --save @ng-bootstrap/ng-bootstrap
npm install --save angular-calendar date-fns
echo install android support gradle release because of barcode scanner to install missing android attributes
ionic cordova plugin add cordova-android-support-gradle-release --fetch
echo push notifications
ionic cordova plugin add phonegap-plugin-push --variable GOOGLE_PLAY_SERVICES_VERSION="16.0.0" --variable FCM_VERSION="15.0.0"
npm install @ionic-native/push
echo sqlite storage
ionic cordova plugin add cordova-sqlite-storage
npm install @ionic-native/sqlite
echo native storage
ionic cordova plugin add cordova-plugin-nativestorage
npm install @ionic-native/native-storage
echo bluetooth ble centeral //check interface assets/js/bletooth.js
ionic cordova plugin add cordova-plugin-ble-central
npm install @ionic-native/ble
echo launch navigator
echo warning : for now we stick with launch navigator 3 since 5 has issue
# call ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator --variable GOOGLE_API_KEY_FOR_ANDROID="AIzaSyC-XbzwGMyAVCnspof0cqiO4iLfKmeEYVA"
ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator@3
npm install @ionic-native/launch-navigator
echo themeablebrowser
ionic cordova plugin add cordova-plugin-themeablebrowser
npm install @ionic-native/themeable-browser
echo in app browser
ionic cordova plugin add cordova-plugin-inappbrowser
npm install @ionic-native/in-app-browser
echo globalization
ionic cordova plugin add cordova-plugin-globalization
npm install @ionic-native/globalization
echo android permissions plugin
ionic cordova plugin add cordova-plugin-android-permissions
npm install @ionic-native/android-permissions
echo sms reader https://www.npmjs.com/package/cordova-plugin-sms-receive
npm i cordova-plugin-sms-receive
cordova plugin add cordova-plugin-sms-receive
echo device information§
ionic cordova plugin add cordova-plugin-device
npm install @ionic-native/device
echo local notifications
ionic cordova plugin add cordova-plugin-local-notification
npm install @ionic-native/local-notifications
echo call phone number
ionic cordova plugin add call-number
npm install @ionic-native/call-number
echo badge
ionic cordova plugin add cordova-plugin-badge
npm install @ionic-native/badge
echo biometric features
ionic cordova plugin add cordova-plugin-fingerprint-aio --variable FACEID_USAGE_DESCRIPTION="User Authentication"
npm install @ionic-native/fingerprint-aio
echo install diagnostic
ionic cordova plugin add cordova.plugins.diagnostic
npm install @ionic-native/diagnostic
echo install background-geolocation
ionic cordova plugin add cordova-plugin-mauron85-background-geolocation@alpha --variable GOOGLE_PLAY_SERVICES_VERSION="16.0.0"
npm install @ionic-native/background-geolocation
echo install barcode plugin
ionic cordova plugin add phonegap-plugin-barcodescanner
npm install @ionic-native/barcode-scanner
echo install camera plugin
ionic cordova plugin add cordova-plugin-camera
npm install @ionic-native/camera
echo install keyboard plugin
ionic cordova plugin add cordova-plugin-ionic-keyboard
npm install @ionic-native/keyboard
echo install opentok required permissions
ionic cordova plugin add cordova-opentok-android-permissions
echo install health plugin
ionic cordova plugin add cordova-plugin-health --variable HEALTH_READ_PERMISSION="App needs read access to read heart rate" --variable HEALTH_WRITE_PERMISSION="App needs write access for heart rate" --variable GMS_VERSION="16.0.1"
npm install @ionic-native/health
echo install App Availability Plugin
ionic cordova plugin add cordova-plugin-appavailability
npm install @ionic-native/app-availability
echo install rate plugin
ionic cordova plugin add cordova-plugin-apprate
npm install @ionic-native/app-rate
echo reinitializing git repository
echo git init
echo git remote add origin https://enas_yaghi@hmg.git.cloudforge.com/patientappionic.git
echo git push -f origin master
echo update project from package.js change if necessary
echo to install all dependencies in package.json
echo npm cache clean --force
echo exact version -> npm install --save --save-exact react
echo latest versions based on package.json rules -> npm install
echo to build or serve for (( production ))
echo export NODE_OPTIONS=--max-old-space-size=4096
echo ionic serve --prod -> for serving in production
echo ionic cordova build android --release --aot --minifyjs --optimizejs --minifycss
echo ionic cordova build ios --release --aot --minifyjs --optimizejs --minifycss

@ -0,0 +1 @@
latest versions based on package.json rules - install

@ -0,0 +1,40 @@
{
"project_info": {
"project_number": "608631731238",
"firebase_url": "https://mohemm-cs.firebaseio.com",
"project_id": "mohemm-cs",
"storage_bucket": "mohemm-cs.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:608631731238:android:3a8384007f8700ec",
"android_client_info": {
"package_name": "com.cloudsolutions.mohemm"
}
},
"oauth_client": [
{
"client_id": "608631731238-83a5qndedia496ssa6ekkd3db5jo8khr.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyB5zpz9vC2NOxsU1dPr0TK0dVaMY5D4Mjg"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "608631731238-83a5qndedia496ssa6ekkd3db5jo8khr.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

@ -0,0 +1,156 @@
@echo start installing required native and 3rd party plugins
@echo to update angular -> npm install -g @angular/cli
@echo to update ionic -> npm install -g ionic
@echo add browser, android , ios platforms commit non required
@echo to add browser -> call ionic cordova platform add browser
@echo to add ios -> call ionic cordova platform add ios
call ionic cordova platform add android
@echo copying android FCM google servcie file
call cp ./google-services.json ./platforms/android/
call npm i @angular/animations
call npm i @swimlane/ngx-charts --save
@echo primeng framework [angular]
call npm install primeng --save
call npm install primeicons --save
@echo add css links for primeng in global.scss
@echo @import "../node_modules/primeng/resources/themes/nova-light/theme.css";
@echo @import "../node_modules/primeng/resources/primeng.min.css";
@echo @import "../node_modules/primeicons/primeicons.css";
@echo install chartjs as dependency for primeng chartjs
call npm install chart.js --save
@echo add reference in [angular.json] in [scripts] array add (node_modules/chart.js/dist/Chart.js)
@echo calendar https://mattlewis92.github.io/angular-calendar/#/kitchen-sink
call npm install --save @ng-bootstrap/ng-bootstrap
call npm install --save angular-calendar date-fns
@echo install android support gradle release because of barcode scanner to install missing android attributes
call ionic cordova plugin add cordova-android-support-gradle-release --fetch
@echo push notifications
call ionic cordova plugin add phonegap-plugin-push --variable GOOGLE_PLAY_SERVICES_VERSION="16.0.0" --variable FCM_VERSION="15.0.0"
call npm install @ionic-native/push
@echo sqlite storage
call ionic cordova plugin add cordova-sqlite-storage
call npm install @ionic-native/sqlite
@echo native storage
call ionic cordova plugin add cordova-plugin-nativestorage
call npm install @ionic-native/native-storage
@echo bluetooth ble centeral //check interface assets/js/bletooth.js
call ionic cordova plugin add cordova-plugin-ble-central
call npm install @ionic-native/ble
@echo launch navigator
@echo warning : for now we stick with launch navigator 3 since 5 has issue
REM call ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator --variable GOOGLE_API_KEY_FOR_ANDROID="AIzaSyC-XbzwGMyAVCnspof0cqiO4iLfKmeEYVA"
call ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator@3
call npm install @ionic-native/launch-navigator
@echo themeablebrowser
call ionic cordova plugin add cordova-plugin-themeablebrowser
call npm install @ionic-native/themeable-browser
@echo in app browser
call ionic cordova plugin add cordova-plugin-inappbrowser
call npm install @ionic-native/in-app-browser
@echo globalization
call ionic cordova plugin add cordova-plugin-globalization
call npm install @ionic-native/globalization
@echo android permissions plugin
call ionic cordova plugin add cordova-plugin-android-permissions
call npm install @ionic-native/android-permissions
@echo sms reader https://www.npmjs.com/package/cordova-plugin-sms-receive
call npm i cordova-plugin-sms-receive
call cordova plugin add cordova-plugin-sms-receive
@echo device information
call ionic cordova plugin add cordova-plugin-device
call npm install @ionic-native/device
@echo local notifications
call ionic cordova plugin add cordova-plugin-local-notification
call npm install @ionic-native/local-notifications
@echo call phone number
call ionic cordova plugin add call-number
call npm install @ionic-native/call-number
@echo badge
call ionic cordova plugin add cordova-plugin-badge
call npm install @ionic-native/badge
@echo biometric features
call ionic cordova plugin add cordova-plugin-fingerprint-aio --variable FACEID_USAGE_DESCRIPTION="User Authentication"
call npm install @ionic-native/fingerprint-aio
@echo install diagnostic
call ionic cordova plugin add cordova.plugins.diagnostic
call npm install @ionic-native/diagnostic
@echo install barcode plugin
call ionic cordova plugin add phonegap-plugin-barcodescanner
call npm install @ionic-native/barcode-scanner
@echo install camera plugin
call ionic cordova plugin add cordova-plugin-camera
call npm install @ionic-native/camera
@echo install keyboard plugin
call ionic cordova plugin add cordova-plugin-ionic-keyboard
call npm install @ionic-native/keyboard
@echo install opentok required permissions
call ionic cordova plugin add cordova-opentok-android-permissions
@echo install App Availability Plugin
call ionic cordova plugin add cordova-plugin-appavailability
call npm install @ionic-native/app-availability
@echo install rate plugin
call ionic cordova plugin add cordova-plugin-apprate
call npm install @ionic-native/app-rate
@echo reinitializing git repository
@echo git init
@echo git remote add origin https://enas_yaghi@hmg.git.cloudforge.com/patientappionic.git
@echo git push -f origin master
@echo update project from package.js change if necessary
@echo to install all dependencies in package.json
@echo npm cache clean --force
@echo exact version -> npm install --save --save-exact react
@echo latest versions based on package.json rules -> npm install
@echo to build or serve for (( production ))
@echo export NODE_OPTIONS=--max-old-space-size=4096
@echo ionic cordova build android --release --aot --minifyjs --optimizejs --minifycss
@echo ionic cordova build ios --release --aot --minifyjs --optimizejs --minifycss

@ -0,0 +1 @@
latest versions based on package.json rules - install

File diff suppressed because it is too large Load Diff

@ -21,33 +21,37 @@
"@angular/platform-browser": "^7.2.2",
"@angular/platform-browser-dynamic": "^7.2.2",
"@angular/router": "^7.2.2",
"@ionic-native/android-permissions": "^5.4.0",
"@ionic-native/app-availability": "^5.4.0",
"@ionic-native/app-rate": "^5.5.1",
"@ionic-native/android-permissions": "^5.8.0",
"@ionic-native/app-availability": "^5.8.0",
"@ionic-native/app-rate": "^5.8.0",
"@ionic-native/background-geolocation": "^5.4.0",
"@ionic-native/badge": "^5.4.0",
"@ionic-native/ble": "^5.4.0",
"@ionic-native/call-number": "^5.4.0",
"@ionic-native/camera": "^5.4.0",
"@ionic-native/core": "^5.0.0",
"@ionic-native/device": "^5.8.0",
"@ionic-native/diagnostic": "^5.4.0",
"@ionic-native/fingerprint-aio": "^5.4.0",
"@ionic-native/geolocation": "^5.8.0",
"@ionic-native/globalization": "^5.4.0",
"@ionic-native/in-app-browser": "^5.5.1",
"@ionic-native/keyboard": "^5.4.0",
"@ionic-native/launch-navigator": "^5.4.0",
"@ionic-native/local-notifications": "^5.4.0",
"@ionic-native/native-storage": "^5.4.0",
"@ionic-native/badge": "^5.8.0",
"@ionic-native/barcode-scanner": "^5.8.0",
"@ionic-native/ble": "^5.8.0",
"@ionic-native/call-number": "^5.8.0",
"@ionic-native/camera": "^5.8.0",
"@ionic-native/core": "^5.8.0",
"@ionic-native/device": "^5.8.0",
"@ionic-native/diagnostic": "^5.8.0",
"@ionic-native/fingerprint-aio": "^5.8.0",
"@ionic-native/globalization": "^5.8.0",
"@ionic-native/health": "^5.4.0",
"@ionic-native/in-app-browser": "^5.8.0",
"@ionic-native/keyboard": "^5.8.0",
"@ionic-native/launch-navigator": "^5.8.0",
"@ionic-native/local-notifications": "^5.8.0",
"@ionic-native/native-storage": "^5.8.0",
"@ionic-native/push": "^5.8.0",
"@ionic-native/sms": "^5.8.0",
"@ionic-native/splash-screen": "^5.0.0",
"@ionic-native/sqlite": "^5.5.1",
"@ionic-native/sqlite": "^5.8.0",
"@ionic-native/status-bar": "^5.0.0",
"@ionic-native/themeable-browser": "^5.5.1",
"@ionic-native/zbar": "^5.8.0",
"@ionic/angular": "^4.1.0",
"@ng-bootstrap/ng-bootstrap": "^4.1.2",
"@ng-bootstrap/ng-bootstrap": "^4.2.1",
"@swimlane/ngx-charts": "^10.1.0",
"angular-calendar": "^0.26.11",
"call-number": "^1.0.1",
@ -87,11 +91,12 @@
"cordova.plugins.diagnostic": "^4.0.12",
"core-js": "^2.5.4",
"date-fns": "^1.30.1",
"moment": "^2.24.0",
"mx.ferreyra.callnumber": "0.0.2",
"phonegap-plugin-barcodescanner": "^8.1.0",
"phonegap-plugin-multidex": "^1.0.0",
"phonegap-plugin-push": "2.2.3",
"primeicons": "^1.0.0",
"primeng": "^7.1.2",
"primeng": "^7.1.3",
"run": "1.4.0",
"rxjs": "~6.3.3",
"uk.co.workingedge.phonegap.plugin.launchnavigator": "^3.2.2",
@ -133,6 +138,18 @@
"cordova-plugin-ionic-webview": {
"ANDROID_SUPPORT_ANNOTATIONS_VERSION": "28.0.0"
},
"cordova-plugin-mauron85-background-geolocation": {
"GOOGLE_PLAY_SERVICES_VERSION": "16.0.0",
"ANDROID_SUPPORT_LIBRARY_VERSION": "26+",
"ICON": "@mipmap/icon",
"SMALL_ICON": "@mipmap/icon",
"ACCOUNT_NAME": "@string/app_name",
"ACCOUNT_LABEL": "@string/app_name",
"ACCOUNT_TYPE": "$PACKAGE_NAME.account",
"CONTENT_AUTHORITY": "$PACKAGE_NAME",
"ALWAYS_USAGE_DESCRIPTION": "This app always requires location tracking",
"MOTION_USAGE_DESCRIPTION": "This app requires motion detection"
},
"cordova-sqlite-storage": {},
"cordova-plugin-nativestorage": {},
"cordova-plugin-ble-central": {},
@ -152,9 +169,20 @@
},
"cordova-plugin-camera": {},
"cordova-plugin-ionic-keyboard": {},
"cordova-android-support-gradle-release": {},
"cordova-opentok-android-permissions": {},
"cordova-plugin-health": {
"HEALTH_READ_PERMISSION": "App needs read access to read heart rate",
"HEALTH_WRITE_PERMISSION": "App needs write access for heart rate",
"GMS_VERSION": "16.0.1"
},
"cordova-plugin-appavailability": {},
"call-number": {},
"cordova-support-google-services": {},
"phonegap-plugin-push": {
"GOOGLE_PLAY_SERVICES_VERSION": "16.0.0",
"FCM_VERSION": "15.0.0"
},
"cordova-plugin-apprate": {},
"cordova-plugin-inappbrowser": {},
"cordova-sms-plugin": {},

@ -17,7 +17,7 @@ export class ConnectorService {
};
public static retryTimes = 0;
public static timeOut = 30 * 1000;
// public static host = 'http://10.50.100.113:6060/'; // development service
// public static host = 'http://10.50.100.113:6060/'; // development service
// public static host = 'https://hmgwebservices.com/';

@ -11,19 +11,13 @@
<ul class="cusprogressbar">
<ion-row nowrap>
<ion-col size="4">
<!-- <ul class="cusprogressbar"> -->
<li>{{'vacation-rule, itemType' | translate}}</li>
<!-- </ul> -->
</ion-col>
<ion-col size="4">
<!-- <ul class="cusprogressbar"> -->
<li>{{'vacation-rule, notification-type' | translate}}</li>
<!-- </ul> -->
</ion-col>
<ion-col size="4">
<!-- <ul class="cusprogressbar"> -->
<li class="active">{{'vacation-rule, create-vacation-rule' | translate}}</li>
<!-- </ul> -->
</ion-col>
</ion-row>
</ul>
@ -52,33 +46,58 @@
<ion-textarea required [(ngModel)]="msgVal"></ion-textarea>
</ion-item>
<ion-list radio-group [(ngModel)]="notifTypeSel">
<ion-list>
<ion-radio-group [(ngModel)]="notifTypeSel">
<ion-item *ngFor="let assignMode of REASSIGN_val;let i=index">
<ion-label>{{assignMode.RADIO_BUTTON_LABEL}}</ion-label>
<ion-radio value="{{assignMode.RADIO_BUTTON_ACTION}}" [checked]="i==0"></ion-radio>
</ion-item>
<ion-item *ngIf="isDeliver">
<ion-label>{{'createVacationRule.deliver' | translate}}</ion-label>
<ion-label>{{'vacation-rule, deliver' | translate}}</ion-label>
<ion-radio value="DELIVER"></ion-radio>
</ion-item>
<!-- <ion-item *ngIf="notifTypeSel!='RESPOND'">
<ion-label>{{selEmployeeName}}</ion-label>
<ion-label>{{selEmployeeID}}</ion-label>
</ion-item> -->
<ion-item *ngIf="showForType_Y">
<ion-label>{{'createVacationRule.close' | translate}}</ion-label>
<ion-label>{{'vacation-rule, close' | translate}}</ion-label>
<ion-radio value="CLOSE"></ion-radio>
</ion-item>
<!-- <button *ngIf="notifTypeSel!='RESPOND'" ion-button block (click)="SearchReplacment()">{{'createVacationRule.search' | translate}}</button> -->
<ion-item *ngIf="schemaNotific && showForType_Y == false">
<ion-label>{{'createVacationRule.respond' | translate}}</ion-label>
<ion-label>{{'vacation-rule, respond' | translate}}</ion-label>
<ion-radio value="RESPOND"></ion-radio>
</ion-item>
</ion-list>
</ion-radio-group>
</ion-list>
</ion-row>
<!-- <json-schema-form *ngIf="schemaNotific && notifTypeSel =='RESPOND'" [form]="schemaNotific"
[(ngModel)]="exampleJsonObject">
</json-schema-form> -->
<ion-item style="margin-right: 0px;" lines="none" (click)="SearchReplacment()"
*ngIf="(hideForwordEmployee && notifTypeSel =='RESPOND') || (notifTypeSel == 'DELEGATE') || (notifTypeSel == 'TRANSFER') ">
<ion-input [(ngModel)]="employeeSel" placeholder="{{'vacation-rule, search-employee' | translate}}"></ion-input>
<ion-button style="width: 19%;" button-type="clear">
<ion-icon slot="icon-only" name="search"></ion-icon>
</ion-button>
</ion-item>
</ion-row>
</ion-grid>
</ion-content>
<ion-footer>
<div class="centerDiv">
<div *ngIf="isUpdate==false" class="centerDiv">
<ion-button class="footer-button" color="customnavy" ion-button (click)="ApplyFunc()">
{{'vacation-rule, apply' | translate}}</ion-button>
</div>
</ion-content>
<div *ngIf="isUpdate" class="centerDiv">
<ion-button class="footer-button" color="customnavy" ion-button (click)="updateVacationRule()">
{{'vacation-rule, update' | translate}}</ion-button>
</div>
</div>
</ion-footer>

@ -12,3 +12,8 @@ ion-item {
width: 100%;
margin-right: 7%;
}
.select-text {
font-size: small;
white-space: normal;
}

@ -1,9 +1,18 @@
import { Component, OnInit } from '@angular/core';
import { createVacationRequest } from './../model/createVacation.Request';
import { ReplacementServiceRequest } from './../model/replacement-Service.request';
import { notificationTypeRequest } from './../model/notification.Request';
import { vacationTypeResponse } from './../model/vacationType.Respond';
import { vacationRuleResponse } from './../model/vacationRule.Respond';
import { Component, OnInit, ElementRef } from '@angular/core';
import * as moment from 'moment';
import { VacationRuleServiceService } from '../service/vacation-rule-service.service';
import { TranslatorService } from 'src/app/hmg-common/services/translator/translator.service';
import { CommonService } from 'src/app/hmg-common/services/common/common.service';
import { LoginRequest } from 'src/app/hmg-common/services/authentication/models/login.request';
import { NavController, ModalController } from '@ionic/angular';
import { notificationTypeResponse } from '../model/notification.Respond';
import { Router, ActivatedRoute } from '@angular/router';
import { ReplacementListComponent } from '../replacement-list/replacement-list.component';
@Component({
selector: 'app-create-vacation-rule',
@ -30,7 +39,7 @@ export class CreateVacationRuleComponent implements OnInit {
itemType: any;
notificationType: any;
RespondAttributeList: any;
// vacationRuleRequest: createVacationRequest;
vacationRuleRequest: createVacationRequest;
REASSIGN_val: any;
schemaNotific: any;
notifTypeSel: any;
@ -42,14 +51,346 @@ export class CreateVacationRuleComponent implements OnInit {
hideForwordEmployee: any;
exampleJsonObject: any;
constructor(public vacationRuleService: VacationRuleServiceService, public ts: TranslatorService, public cs: CommonService) {
constructor(public vacationRuleService: VacationRuleServiceService, public ts: TranslatorService, public cs: CommonService,
private elementRef: ElementRef, public navCtrl: NavController, public router: Router, public modalController: ModalController,
private route: ActivatedRoute) {
this.Sdate = moment().format('YYYY-MM-DDTHH:mm:ssZ');
this.isUpdate = this.cs.sharedService.getSharedData('isUpdate');
if (this.isUpdate) {
this.updateData = this.cs.sharedService.getSharedData(vacationRuleResponse.SHARED_DATA, true);
this.SelAction = this.updateData.ACTION;
if (this.updateData.ACTION == "RESPOND" && this.updateData.FYI_FLAG == "Y") {
this.SelAction = "Close"
}
this.notificationType = {
NOTIFICATION_NAME: this.updateData.NOTIFICATION_NAME,
NOTIFICATION_DISPLAY_NAME: this.updateData.NOTIFICATION_SUBJECT,
NOTIFICATION_SUBJECT: this.updateData.NOTIFICATION_SUBJECT,
FYI_FLAG: this.updateData.FYI_FLAG
}
/*************** */
this.P_ITEM_TYPE_TITLE = this.updateData.ITEM_TYPE_DISPLAY_NAME;
this.selEmployeeID = this.updateData.REPLACEMENT_USER_NAME;
if (this.selEmployeeID) {
this.selEmployeeName = this.updateData.RULE_NAME;
this.employeeSel = this.updateData.RULE_NAME;
}
/************ */
this.msgVal = this.updateData.MESSAGE;
this.notifTypeSel = this.updateData.ACTION;
this.itemType = this.updateData;
this.notificationType = this.updateData;
//this.Sdate = this.updateData.BEGIN_DATE;
//this.Edate = this.updateData.END_DATE;
let _Sdate = this.updateData.BEGIN_DATE ? this.updateData.BEGIN_DATE : "";
let _Edate = this.updateData.END_DATE ? this.updateData.END_DATE : "";
//let tzoffset = moment().utcOffset(); //offset in milliseconds
if (_Sdate) {
this.Sdate = moment(_Sdate).format('YYYY-MM-DDTHH:mm:ssZ');
//this.Sdate = (new Date(myStartTime - tzoffset)).toISOString().slice(0, -1);
//this.startTime = this.Sdate;
}
if (_Edate) {
this.Edate = moment(_Edate).format('YYYY-MM-DDTHH:mm:ssZ');
//this.Edate = (new Date(myEndTime - tzoffset)).toISOString().slice(0, -1);
// this.endTime = this.Edate;
}
//this.schemaNotific =this.updateData.RespondAttributeList;
//this.notifTypeSel=this.REASSIGN_val[0].RADIO_BUTTON_LABEL;
//console.log(this.notifTypeSel);
// this.getNotificationReassign();
} else {
this.isUpdate = false;
this.SelAction = "";
this.itemType = this.cs.sharedService.getSharedData(vacationTypeResponse.SHARED_DATA, true);
this.notificationType = this.cs.sharedService.getSharedData(notificationTypeResponse.SHARED_DATA, true);
}
this.Notification_Title = this.notificationType.NOTIFICATION_DISPLAY_NAME;
this.P_ITEM_TYPE_TITLE = this.itemType.ITEM_TYPE_DISPLAY_NAME;
if (this.notificationType.FYI_FLAG == 'Y') {
this.showForType_Y = true;
} else {
this.showForType_Y = false;
}
if (this.itemType.ITEM_TYPE == "*") {
this.isDeliver = false;
} else {
this.isDeliver = true;
}
}
ngOnInit() {
ngOnInit() {
this.getNotificationReassign();
this.respondAttributes();
}
async SearchReplacment() {
const modal = await this.modalController.create({
component: ReplacementListComponent
});
modal.onDidDismiss()
.then((data) => {
const user = data.data.empData;
console.log(data)
console.log(user);
if (data) {
this.selEmployeeName = user.EMPLOYEE_DISPLAY_NAME;
this.selEmployeeID = user.USER_NAME;
this.employeeSel = this.selEmployeeName + "," + this.selEmployeeID
}
});
return await modal.present();
}
clearEmployee() {
this.selEmployeeName = "";
this.selEmployeeID = "";
}
ApplyFunc() {
(this.elementRef.nativeElement.querySelectorAll('ion-item') as HTMLElement[]).forEach((x) => {
if (x.classList.contains('requiredItem')) {
x.classList.add('ng-touched');
x.classList.remove('ng-untouched');
}
});
// console.log(this.msgVal)
let msg: string = "";
if (this.notifTypeSel == undefined) {
msg = this.ts.trPK('vacation-rule', 'fillAction');
// this.common.showAlert(msg);
this.cs.presentAlert(msg);
} else if (this.msgVal == undefined) {
msg = this.ts.trPK('vacation-rule', 'fillMsg');
// this.common.showAlert(msg);
this.cs.presentAlert(msg);
} else if (this.Sdate == undefined) {
msg = this.ts.trPK('vacation-rule', 'fillSDate');
// this.common.showAlert(msg);
this.cs.presentAlert(msg);
} else {
var responseAttrDic = this.exampleJsonObject;
this.P_RESPOND_ATTRIBUTES_TBL = [];
for (let key in responseAttrDic) {
let obj: any = {};
obj.ATTRIBUTE_NAME = key;
if (typeof responseAttrDic[key] === "number") {
obj.ATTRIBUTE_NUMBER_VALUE = responseAttrDic[key];
}
// else if (isDate(responseAttrDic[key])) {
// obj.ATTRIBUTE_DATE_VALUE = responseAttrDic[key];
// }
else {
obj.ATTRIBUTE_TEXT_VALUE = responseAttrDic[key];
}
this.P_RESPOND_ATTRIBUTES_TBL.push(obj);
}
let repUserName = this.selEmployeeID;
if (this.hideForwordEmployee && this.hideForwordEmployee.ATTRIBUTE_NAME) {
let obj: any = {};
repUserName = "";
obj.ATTRIBUTE_NAME = this.hideForwordEmployee.ATTRIBUTE_NAME;
obj.ATTRIBUTE_TEXT_VALUE = this.selEmployeeID;
this.P_RESPOND_ATTRIBUTES_TBL.push(obj);
}
let pAction = "";
pAction = this.getActionValue();
let jsonSDate = "";
let jsonEDate = "";
if (this.Sdate) {
// let x: any; let y: any;
// x = moment(this.Sdate).format('YYYY/MM/DD');
// if (this.startTime)
// y = moment(this.startTime).format('hh:mm:ss');
// else
// y='00:00:00'
// jsonSDate = this.common.convertISODateToJsonDate(x + " " + y);
let startDate = moment(this.Sdate).format('YYYY-MM-DDTHH:mm:ssZ');
jsonSDate = this.cs.convertISODateToJsonDate(startDate);
} else {
jsonSDate = null;
}
if (this.Edate) {
// let x: any; let y: any;
// x = moment(this.Edate).format('YYYY/MM/DD');
// if (this.endTime)
// y = this.endTime;
// else
// y='00:00:00'
let endDate = moment(this.Edate).format('YYYY-MM-DDTHH:mm:ssZ');
jsonEDate = this.cs.convertISODateToJsonDate(endDate);
//jsonEDate = this.common.convertISODateToJsonDate(x + " " + y);
} else {
jsonEDate = null;
}
let request: createVacationRequest = new createVacationRequest();
request.P_BEGIN_DATE = jsonSDate;
request.P_END_DATE = jsonEDate;
request.P_MESSAGE = this.msgVal;
request.P_REPLACEMENT_USER_NAME = repUserName;
request.P_ITEM_TYPE = this.itemType.ITEM_TYPE;
request.P_NOTIFICATION_NAME = this.notificationType.NOTIFICATION_NAME;
request.P_ACTION = pAction;
request.RespondAttributeList = this.P_RESPOND_ATTRIBUTES_TBL;
this.vacationRuleRequest = request;
this.vacationRuleService.createVacationRule(request, () => {
this.ApplyFunc();
}, this.ts.trPK('general', 'retry')).subscribe((result) => {
if (this.cs.validResponse(result)) {
console.log(result);
this.handlecreateVacationResult(result);
} else {
this.cs.presentAlert(result.ErrorEndUserMessage);
}
});
}
}
handlecreateVacationResult(result) {
if (this.cs.validResponse(result)) {
//this.navCtrl.pop();
this.cs.JustAlertDialog(this.ts.trPK('general', 'ok'), this.ts.trPK('vacation-rule', 'rule-success'))
this.goToStart();
// this.navCtrl.push("VacationRulePage");
// let index= this.navCtrl.indexOf('VacationRulePage');
// this.navCtrl.popTo('VacationRulePage');
}
}
goToStart() {
// let index: number;
// let views: any[] = this.navCtrl()
// let found: boolean = views.some((view, i) => {
// index = i
// return (view.id == 'VacationRulePage')
// })
// found ? this.navCtrl.popTo(views[index]) : this.navCtrl.push("HomePage")
this.cs.navigateRoot('/home')
}
updateVacationRule() {
(this.elementRef.nativeElement.querySelectorAll('ion-item') as HTMLElement[]).forEach((x) => {
if (x.classList.contains('requiredItem')) {
x.classList.add('ng-touched');
x.classList.remove('ng-untouched');
}
});
let msg: string = "";
if (this.notifTypeSel == undefined) {
msg = this.ts.trPK('vacation-rule', 'fillAction');
// this.common.showAlert(msg);
} else if (this.msgVal == undefined) {
msg = this.ts.trPK('vacation-rule', 'fillMsg');
// this.common.showAlert(msg);
} else if (this.Sdate == undefined) {
msg = this.ts.trPK('vacation-rule', 'fillSDate');
// this.common.showAlert(msg);
} else {
var responseAttrDic = this.exampleJsonObject;
this.P_RESPOND_ATTRIBUTES_TBL = [];
for (let key in responseAttrDic) {
let obj: any = {};
obj.ATTRIBUTE_NAME = key;
if (typeof responseAttrDic[key] === "number") {
obj.ATTRIBUTE_NUMBER_VALUE = responseAttrDic[key];
}
// else if (isDate(responseAttrDic[key])) {
// obj.ATTRIBUTE_DATE_VALUE = responseAttrDic[key];
// }
else {
obj.ATTRIBUTE_TEXT_VALUE = responseAttrDic[key];
}
this.P_RESPOND_ATTRIBUTES_TBL.push(obj);
}
let repUserName = this.selEmployeeID;
if (this.hideForwordEmployee && this.hideForwordEmployee.ATTRIBUTE_NAME) {
let obj: any = {};
repUserName = "";
obj.ATTRIBUTE_NAME = this.hideForwordEmployee.ATTRIBUTE_NAME;
obj.ATTRIBUTE_TEXT_VALUE = this.selEmployeeID;
this.P_RESPOND_ATTRIBUTES_TBL.push(obj);
}
let pAction = "";
pAction = this.getActionValue();
let jsonSDate = "";
let jsonEDate = "";
// if (this.Sdate) {
// let x: any; let y: any;
// x = moment(this.Sdate).format('YYYY/MM/DD');
// if (this.startTime)
// y = moment(this.startTime).format('hh:mm:ss');
// jsonSDate = this.common.convertISODateToJsonDate(x + " " + y);
// } else {
// jsonSDate = null;
// }
if (this.Sdate) {
// let x: any; let y: any;
// x = moment(this.Sdate).format('YYYY/MM/DD');
// if (this.startTime)
// y = moment(this.startTime).format('hh:mm:ss');
// else
// y='00:00:00'
// jsonSDate = this.common.convertISODateToJsonDate(x + " " + y);
let startDate = moment(this.Sdate).format('YYYY-MM-DDTHH:mm:ssZ');
jsonSDate = this.cs.convertISODateToJsonDate(startDate);
} else {
jsonSDate = null;
}
// if (this.Edate)
// jsonEDate = this.common.convertISODateToJsonDate(this.Edate + " " + this.endTime);
// else
// jsonEDate = null;
if (this.Edate) {
// let x: any; let y: any;
// x = moment(this.Edate).format('YYYY/MM/DD');
// if (this.endTime)
// y = moment(this.endTime).format('hh:mm:ss');
// else
// y='00:00:00'
// jsonEDate = this.common.convertISODateToJsonDate(x + " " + y);
let endDate = moment(this.Edate).format('YYYY-MM-DDTHH:mm:ssZ');
jsonEDate = this.cs.convertISODateToJsonDate(endDate);
} else {
jsonEDate = null;
}
let body: any = {
P_RULE_ID: this.updateData.RULE_ID,
P_BEGIN_DATE: jsonSDate,
P_END_DATE: jsonEDate,
P_MESSAGE: this.msgVal,
P_REPLACEMENT_USER_NAME: repUserName,
P_ACTION: pAction,
RespondAttributeList: this.P_RESPOND_ATTRIBUTES_TBL
}
//let request = this.sharedData.getSharedData(vacationRuleResponse.SHARED_DATA);
this.vacationRuleService.updateVacationRule(
body).
subscribe((result: Response) => {
this.handleupdateVacationResult(result);
});
}
}
handleupdateVacationResult(result) {
if (this.cs.validResponse(result)) {
this.cs.JustAlertDialog(this.ts.trPK('general', 'ok'), this.ts.trPK('vacation-rule', 'rule-update-success'))
this.goToStart();
//this.navCtrl.popTo('VacationRulePage');
}
}
getNotificationReassign() {
let request: LoginRequest = new LoginRequest();
@ -68,6 +409,92 @@ export class CreateVacationRuleComponent implements OnInit {
});
}
respondAttributes() {
let request: notificationTypeRequest = new notificationTypeRequest();
request.P_NOTIFICATION_NAME = this.notificationType.NOTIFICATION_NAME;
request.P_ITEM_TYPE = this.itemType.ITEM_TYPE;
// this.vacationRuleService.respondAttributes(
// request).
// subscribe((result: Response) => {
// this.handlerespondAttributesResult(result);
// });
this.vacationRuleService.respondAttributes(request, () => {
this.respondAttributes();
}, this.ts.trPK('general', 'retry')).subscribe((result) => {
this.handlerespondAttributesResult(result);
});
}
handlerespondAttributesResult(result) {
if (this.cs.validResponse(result)) {
this.RespondAttributeList = result.RespondAttributesList;
if (result.RespondRolesList != "" && result.RespondRolesList[0].ATTRIBUTE_NAME != null && result.RespondRolesList[0].ATTRIBUTE_NAME != undefined) {
this.Resp2_val = result.RespondRolesList[0].ATTRIBUTE_NAME;
this.hideForwordEmployee = result.RespondRolesList[0];
}
if (result.P_Schema)
this.schemaNotific = JSON.parse(result.P_Schema);
this.reverseAction();
if (this.isUpdate) {
this.fillResposeAtrributes(result.RespondAttributesList);
}
// ATTRIBUTE_DISPLAY_NAME: "Note"
// ATTRIBUTE_FORMAT: "4000"
// ATTRIBUTE_NAME: "WF_NOTE"
// ATTRIBUTE_TYPE: "VARCHAR2"
}
}
fillResposeAtrributes(respList) {
let body = {
P_RULE_ID: this.updateData.RULE_ID,
GetRespondAttributeValueTBL: respList
}
this.vacationRuleService.getRespondAttributeValues(
body).
subscribe((result: Response) => {
this.handleFillResponseAttr(result);
});
}
handleFillResponseAttr(result) {
if (this.cs.validResponse(result)) {
if (result.GetRespondAttributeValueList && result.GetRespondAttributeValueList.length > 0) {
let resp_val: any = result.GetRespondAttributeValueList[0].P_ATTRIBUTE_NAME;
let Emp_ID: any = result.GetRespondAttributeValueList[0].P_ATTRIBUTE_TEXT_VALUE;
let valueList = result.GetRespondAttributeValueList;
var obj = {};
if (resp_val == this.Resp2_val) {
let request: ReplacementServiceRequest = new ReplacementServiceRequest();
request.P_SEARCH_USER_NAME = Emp_ID;
request.P_SEARCH_EMPLOYEE_DISPLAY_NAME = "";
request.P_SEARCH_EMAIL_ADDRESS = "";
request.P_PAGE_NUM = 1;
request.P_PAGE_LIMIT = 1000
this.vacationRuleService.getReplacementList(request).
subscribe((result: Response) => {
this.handleFillRole(result);
});
}
for (let i = 0; i < valueList.length; i++) {
obj[valueList[i].P_ATTRIBUTE_NAME] = valueList[i].P_ATTRIBUTE_TEXT_VALUE;
}
this.exampleJsonObject = obj;
// this.exampleJsonObject = new Map(valueList.map(obj => [ obj., obj.P_ATTRIBUTE_TEXT_VALUE ]));
}
}
}
handleFillRole(result) {
if (this.cs.validResponse(result)) {
this.selEmployeeName = result.ReplacementList[0].EMPLOYEE_DISPLAY_NAME;
this.selEmployeeID = result.ReplacementList[0].USER_NAME;
}
}
reverseAction() {
if (this.updateData) {
switch (this.SelAction) {
@ -99,9 +526,40 @@ export class CreateVacationRuleComponent implements OnInit {
}
}
respondAttributes() {
getActionValue(): string {
let pAction = "";
//this.pAction = this.notifTypeSel;
//console.log(this.pAction);
if (this.notifTypeSel) {
switch (this.notifTypeSel) {
case 'DELEGATE': {
pAction = "FORWARD";
break;
}
case 'RESPOND': {
pAction = "RESPOND";
break;
}
case 'CLOSE': {
pAction = "RESPOND";
break;
}
case 'DELIVER': {
pAction = "NOOP";
break;
}
case 'TRANSFER': {
pAction = "TRANSFER";
break;
}
default: {
pAction = "";
break;
}
}
return pAction;
}
}
}

@ -52,7 +52,7 @@
<label for="">{{'vacation-rule, notification' | translate}}</label>
</ion-col>
<ion-col>
<label for=""> {{item.NOTIFICATION_SUBJECT}}</label>
<label for=""> {{item.NOTIFICATION_DISPLAY_NAME}}</label>
</ion-col>
</ion-row>
<ion-row>

@ -1,8 +1,12 @@
import { vacationRuleResponse } from './../model/vacationRule.Respond';
import { notificationTypeRequest } from './../model/notification.Request';
import { DeleteVacationRuleRequest } from './../model/deleteVacationRule.Request';
import { CommonService } from 'src/app/hmg-common/services/common/common.service';
import { VacationRuleServiceService } from './../service/vacation-rule-service.service';
import { VacationRuleRequest } from './../model/VacationRuleRequest';
import { Component, OnInit } from '@angular/core';
import { TranslatorService } from 'src/app/hmg-common/services/translator/translator.service';
import { NavigationExtras, Router } from '@angular/router';
@Component({
selector: 'app-home',
@ -20,102 +24,9 @@ export class HomeComponent implements OnInit {
RespondAttributeList: any;
constructor(public vacationRuleService: VacationRuleServiceService, public ts: TranslatorService, public cs: CommonService) {
constructor(public vacationRuleService: VacationRuleServiceService, public ts: TranslatorService, public cs: CommonService, private router: Router) {
this.P_PAGE_NUM = 1;
this.P_PAGE_LIMIT = 50;
this.GetVacationRulesList = [
{
"ACTION": "FORWARD",
"ACTION_DISPLAY": "Forward",
"BEGIN_DATE": "6/26/2019 2:50:14 PM",
"END_DATE": "6/30/2019 2:50:22 PM",
"FROM_ROW_NUM": 1,
"FYI_FLAG": "Y",
"ITEM_TYPE": "HRSSA",
"ITEM_TYPE_DISPLAY_NAME": "HR",
"MESSAGE": "TEst Rule",
"NOTIFICATION_DISPLAY_NAME": "<All>",
"NOTIFICATION_NAME": "*",
"NOTIFICATION_SUBJECT": "<All>",
"NO_OF_ROWS": 1,
"REPLACEMENT_USER_NAME": "70915",
"ROW_NUM": 1,
"RULE_ID": 7770756,
"RULE_NAME": "Delegate: Al Oulah, Mohammed",
"RULE_STATUS": "Active",
"RULE_TIP_MESSAGE": "",
"TO_ROW_NUM": 1
},
{
"ACTION": "FORWARD",
"ACTION_DISPLAY": "Forward",
"BEGIN_DATE": "6/26/2019 2:50:14 PM",
"END_DATE": "6/30/2019 2:50:22 PM",
"FROM_ROW_NUM": 1,
"FYI_FLAG": "Y",
"ITEM_TYPE": "HRSSA",
"ITEM_TYPE_DISPLAY_NAME": "HR",
"MESSAGE": "TEst Rule",
"NOTIFICATION_DISPLAY_NAME": "<All>",
"NOTIFICATION_NAME": "*",
"NOTIFICATION_SUBJECT": "<All>",
"NO_OF_ROWS": 1,
"REPLACEMENT_USER_NAME": "70915",
"ROW_NUM": 1,
"RULE_ID": 7770756,
"RULE_NAME": "Delegate: Al Oulah, Mohammed",
"RULE_STATUS": "Active",
"RULE_TIP_MESSAGE": "",
"TO_ROW_NUM": 1
},
{
"ACTION": "FORWARD",
"ACTION_DISPLAY": "Forward",
"BEGIN_DATE": "6/26/2019 2:50:14 PM",
"END_DATE": "6/30/2019 2:50:22 PM",
"FROM_ROW_NUM": 1,
"FYI_FLAG": "Y",
"ITEM_TYPE": "HRSSA",
"ITEM_TYPE_DISPLAY_NAME": "HR",
"MESSAGE": "TEst Rule",
"NOTIFICATION_DISPLAY_NAME": "<All>",
"NOTIFICATION_NAME": "*",
"NOTIFICATION_SUBJECT": "<All>",
"NO_OF_ROWS": 1,
"REPLACEMENT_USER_NAME": "70915",
"ROW_NUM": 1,
"RULE_ID": 7770756,
"RULE_NAME": "Delegate: Al Oulah, Mohammed",
"RULE_STATUS": "Active",
"RULE_TIP_MESSAGE": "",
"TO_ROW_NUM": 1
},
{
"ACTION": "FORWARD",
"ACTION_DISPLAY": "Forward",
"BEGIN_DATE": "6/26/2019 2:50:14 PM",
"END_DATE": "6/30/2019 2:50:22 PM",
"FROM_ROW_NUM": 1,
"FYI_FLAG": "Y",
"ITEM_TYPE": "HRSSA",
"ITEM_TYPE_DISPLAY_NAME": "HR",
"MESSAGE": "TEst Rule",
"NOTIFICATION_DISPLAY_NAME": "<All>",
"NOTIFICATION_NAME": "*",
"NOTIFICATION_SUBJECT": "<All>",
"NO_OF_ROWS": 1,
"REPLACEMENT_USER_NAME": "70915",
"ROW_NUM": 1,
"RULE_ID": 7770756,
"RULE_NAME": "Delegate: Al Oulah, Mohammed",
"RULE_STATUS": "Active",
"RULE_TIP_MESSAGE": "",
"TO_ROW_NUM": 1
}
];
}
ngOnInit() {
@ -129,6 +40,7 @@ export class HomeComponent implements OnInit {
}
getVacationRules() {
this.GetVacationRulesList = [];
this.P_PAGE_NUM = 1;
this.IsReachEnd = false;
let request: VacationRuleRequest = new VacationRuleRequest();
@ -139,8 +51,8 @@ export class HomeComponent implements OnInit {
this.getVacationRules();
}, this.ts.trPK('general', 'retry')).subscribe((result) => {
if (this.cs.validResponse(result)) {
console.log(result);
console.log(JSON.stringify(result));
this.GetVacationRulesList = result.GetVacationRulesList;
console.log(result.GetVacationRulesList);
} else {
this.cs.presentAlert(result.ErrorEndUserMessage);
}
@ -148,9 +60,64 @@ export class HomeComponent implements OnInit {
}
deleteFunc(i) {
let alert = this.cs.confirmAlertDialog(() => {
this.deleteVacationRule(i);
}, this.ts.trPK('general', 'ok'), () => {
}, this.ts.trPK('general', 'cancel'), this.ts.trPK('vacation-rule', 'confirmation'), this.ts.trPK('vacation-rule', 'deleteVR'));
}
deleteVacationRule(i) {
let request: DeleteVacationRuleRequest = new DeleteVacationRuleRequest();
request.P_RULE_ID = this.GetVacationRulesList[i].RULE_ID;
this.vacationRuleService.deleteVacationRule(request, () => {
this.deleteVacationRule(i);
}, this.ts.trPK('general', 'retry')).subscribe((result) => {
if (this.cs.validResponse(result)) {
this.handleDeleteVacationRuleResult(result)
} else {
this.cs.presentAlert(result.ErrorEndUserMessage);
}
});
}
handleDeleteVacationRuleResult(result) {
if (this.cs.validResponse(result)) {
//this.navCtrl.push('HomePage');
this.cs.JustAlertDialog(this.ts.trPK('general', 'ok'), this.ts.trPK('vacation-rule', 'rule-delete-success'));
this.getVacationRules();
}
}
updateFunc(i) {
this.respondAttributes(i);
this.cs.sharedService.setSharedData(this.GetVacationRulesList[i], vacationRuleResponse.SHARED_DATA);
this.isUpdate = true;
this.cs.sharedService.setSharedData(this.isUpdate, 'isUpdate');
this.router.navigate(['/vacation-rule/create-vacation-rule']);
}
respondAttributes(i) {
let request: notificationTypeRequest = new notificationTypeRequest();
request.P_NOTIFICATION_NAME = this.GetVacationRulesList[i].NOTIFICATION_NAME;
request.P_ITEM_TYPE = this.GetVacationRulesList[i].ITEM_TYPE;
this.vacationRuleService.respondAttributes(request, () => {
this.respondAttributes(i);
}, this.ts.trPK('general', 'retry')).subscribe((result) => {
this.handlerespondAttributesResult(result, i);
});
}
handlerespondAttributesResult(result, i) {
// console.log("Respond att: ")
if (this.cs.validResponse(result)) {
// console.log(result.RespondAttributesList);
this.RespondAttributeList = result.RespondAttributesList;
this.GetVacationRulesList[i].RespondAttributeList = this.RespondAttributeList;
}
}
}

@ -0,0 +1,13 @@
import { LoginRequest } from '../../hmg-common/services/authentication/models/login.request';
export class createVacationRequest extends LoginRequest{
public static SHARED_DATA = 'vacation-request';
public P_ITEM_TYPE: string;
public P_BEGIN_DATE: string;
public P_END_DATE: string;
public P_MESSAGE: string;
public P_REPLACEMENT_USER_NAME: string;
public P_NOTIFICATION_NAME: string;
public P_ACTION:string;
public RespondAttributeList: string;
}

@ -0,0 +1,6 @@
import { LoginRequest } from '../../hmg-common/services/authentication/models/login.request';
export class DeleteVacationRuleRequest extends LoginRequest{
public static SHARED_DATA = 'deleteVacation-request';
public P_RULE_ID : number;
}

@ -0,0 +1,10 @@
import { Request } from '../../hmg-common/services/models/request';
export class ReplacementServiceRequest extends Request{
P_SEARCH_USER_NAME:string;
P_SEARCH_EMPLOYEE_DISPLAY_NAME:string;
P_SEARCH_EMAIL_ADDRESS:string;
P_PAGE_NUM:number;
P_PAGE_LIMIT:number;
P_SELECTED_EMPLOYEE_NUMBER:string
}

@ -0,0 +1,27 @@
import { Response } from '../../hmg-common/services/models/response';
export class vacationRuleResponse extends Response {
public static SHARED_DATA = 'vacationRuleRespond-shared';
public ACTION:string;
public ACTION_DISPLAY: string;
public BEGIN_DATE :string;
public END_DATE : string;
public FROM_ROW_NUM :number;
public FYI_FLAG :string;
public ITEM_TYPE : string;
public ITEM_TYPE_DISPLAY_NAME: string;
public MESSAGE: string;
public NOTIFICATION_DISPLAY_NAME: string;
public NOTIFICATION_NAME: string;
public NOTIFICATION_SUBJECT: string;
public NO_OF_ROWS : number;
public REPLACEMENT_USER_NAME: string;
public ROW_NUM : number;
public RULE_ID :number;
public RULE_NAME: string;
public RULE_STATUS: string;
public RULE_TIP_MESSAGE: string;
public TO_ROW_NUM : number;
public RespondAttributeList: any[];
}

@ -0,0 +1,8 @@
import { Response } from '../../hmg-common/services/models/response';
import {VRuleItemType} from './vr.itemType.List'
export class vacationTypeResponse extends Response {
public static SHARED_DATA = 'vacationTypeRespond-shared';
public VrItemTypesList : VRuleItemType[];
}

@ -0,0 +1,5 @@
export class VRuleItemType {
public ITEM_TYPE:string;
public ITEM_TYPE_DISPLAY_NAME: string;
}

@ -1,3 +1,6 @@
import { vacationTypeResponse } from './../model/vacationType.Respond';
import { VRuleItemType } from './../model/vr.itemType.List';
import { notificationTypeResponse } from './../model/notification.Respond';
import { Component, OnInit } from '@angular/core';
import { VacationRuleServiceService } from '../service/vacation-rule-service.service';
import { TranslatorService } from 'src/app/hmg-common/services/translator/translator.service';
@ -11,7 +14,7 @@ import { notificationTypeRequest } from '../model/notification.Request';
})
export class NotificationTypeComponent implements OnInit {
itemTypeObj: any;
itemTypeObj: VRuleItemType;
itemType: string;
notifTypeSel: any;
notification_list: any;
@ -19,15 +22,26 @@ export class NotificationTypeComponent implements OnInit {
constructor(public vacationRuleService: VacationRuleServiceService, public ts: TranslatorService, public cs: CommonService) {
this.itemTypeObj = this.cs.sharedService.getSharedData('selectedItemType');
this.itemTypeObj= this.cs.sharedService.getSharedData(vacationTypeResponse.SHARED_DATA, false);
this.itemType = this.itemTypeObj.ITEM_TYPE_DISPLAY_NAME;
}
ngOnInit() {
ngOnInit() {
console.log(this.cs.sharedService.getSharedData(vacationTypeResponse.SHARED_DATA, false));
this.getNotificationType();
}
NextPage() {
if (this.notifTypeSel == "*") {
let notificatioAtt: notificationTypeResponse = new notificationTypeResponse();
notificatioAtt.FYI_FLAG = "";
notificatioAtt.NOTIFICATION_DISPLAY_NAME = "All";
notificatioAtt.NOTIFICATION_NAME = "*";
notificatioAtt.NOTIFICATION_SUBJECT = "";
this.cs.sharedService.setSharedData(notificatioAtt, notificationTypeResponse.SHARED_DATA);
} else {
this.cs.sharedService.setSharedData(this.notification_list[this.var_notification], notificationTypeResponse.SHARED_DATA);
}
this.cs.navigateForward('/vacation-rule/create-vacation-rule');
}

@ -0,0 +1,55 @@
<ion-header>
<ion-toolbar class="header-toolbar">
<!-- <nav-buttons></nav-buttons> -->
<ion-title color="light">{{ 'vacation-rule, search-employee' | translate}}</ion-title>
</ion-toolbar>
</ion-header>
<ion-content padding>
<div style="padding: 0 10px;" [innerHTML]='"vacation-rule, replacement-employee-tip" | translate'></div>
<ion-item>
<ion-label class="boldTxtNav">{{'vacation-rule, search-by' | translate}}</ion-label>
<ion-select okText='{{"general, ok" | translate }}' cancelText='{{"general, cancel" | translate }}'
[(ngModel)]="searchKeySelect">
<ion-select-option value="1" selected="true">{{'vacation-rule, search-by-name' | translate}}</ion-select-option>
<ion-select-option value="2">{{'vacation-rule, search-by-username' | translate}}</ion-select-option>
<ion-select-option value="3">{{'vacation-rule, search-by-email' | translate}}</ion-select-option>
</ion-select>
</ion-item>
<ion-item>
<ion-input [(ngModel)]="searchKey" placeholder="{{'vacation-rule, search-employee' | translate}}"></ion-input>
<ion-button style="width: 19%;" button-type="clear" (click)="SearchReplacementList()">
<ion-icon slot="icon-only" name="search"></ion-icon>
</ion-button>
</ion-item>
<!-- <ion-item>
<ion-list [(ngModel)]="selEmp" *ngIf="ReplacementList">
<ion-item *ngFor="let employee of ReplacementList;let i=index;">
<ion-label><span class="boldTxt">{{employee.EMPLOYEE_DISPLAY_NAME}}</span> <br>{{employee.USER_NAME}}<br>
{{employee.EMAIL_ADDRESS}}</ion-label>
<ion-radio value="{{i}}"></ion-radio>
</ion-item>
</ion-list>
</ion-item> -->
<ion-list>
<ion-radio-group mode="md" [(ngModel)]="selEmp" *ngIf="ReplacementList">
<ion-item *ngFor="let employee of ReplacementList;let i=index;">
<ion-label><span class="boldTxt">{{employee.EMPLOYEE_DISPLAY_NAME}}</span> <br>{{employee.USER_NAME}}<br>
{{employee.EMAIL_ADDRESS}}</ion-label>
<ion-radio value="{{i}}"></ion-radio>
</ion-item>
</ion-radio-group>
</ion-list>
</ion-content>
<ion-footer>
<div class="centerDiv">
<ion-button (click)="closePage()" class="footer-button" color="customnavy">{{'general, save' | translate}}
</ion-button>
</div>
</ion-footer>

@ -0,0 +1,11 @@
ion-item {
margin-top: 5%;
margin-right: 7%;
}
.footer-button {
border-radius: 3px;
padding: 0 1.1em;
min-height: 45px;
min-width: 200px;
}

@ -0,0 +1,27 @@
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ReplacementListComponent } from './replacement-list.component';
describe('ReplacementListComponent', () => {
let component: ReplacementListComponent;
let fixture: ComponentFixture<ReplacementListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ReplacementListComponent ],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ReplacementListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

@ -0,0 +1,130 @@
import { ReplacementServiceRequest } from './../model/replacement-Service.request';
import { Component, OnInit } from '@angular/core';
import { VacationRuleServiceService } from '../service/vacation-rule-service.service';
import { TranslatorService } from 'src/app/hmg-common/services/translator/translator.service';
import { CommonService } from 'src/app/hmg-common/services/common/common.service';
import { ModalController } from '@ionic/angular';
@Component({
selector: 'app-replacement-list',
templateUrl: './replacement-list.component.html',
styleUrls: ['./replacement-list.component.scss'],
})
export class ReplacementListComponent implements OnInit {
P_SEARCH_USER_NAME: string = "";
P_SEARCH_EMPLOYEE_DISPLAY_NAME: string = "";
P_SEARCH_EMAIL_ADDRESS: string = "";
P_PAGE_NUM: number = 1;
P_PAGE_LIMIT: number = 50;
ReplacementList: any = [];
IsReachEnd: boolean = false;
selEmp: string = null;
callback: any;
searchKey: any = "";
searchKeySelect: string = "";
replacmentRequest: any = "";
isAbs: boolean = false;
isSave: boolean = false;
constructor(public vacationRuleService: VacationRuleServiceService, public ts: TranslatorService, public cs: CommonService, public modalController: ModalController) { }
ngOnInit() { }
SearchReplacementList() {
this.ReplacementList = [];
this.IsReachEnd = false;
this.P_PAGE_NUM = 1;
if (this.searchKey) {
switch (this.searchKeySelect) {
case '1': {
this.P_SEARCH_EMPLOYEE_DISPLAY_NAME = this.searchKey;
this.P_SEARCH_USER_NAME = "";
this.P_SEARCH_EMAIL_ADDRESS = "";
break;
}
case '2': {
this.P_SEARCH_USER_NAME = this.searchKey;
this.P_SEARCH_EMPLOYEE_DISPLAY_NAME = "";
this.P_SEARCH_EMAIL_ADDRESS = "";
break;
}
case '3': {
this.P_SEARCH_EMAIL_ADDRESS = this.searchKey;
this.P_SEARCH_USER_NAME = "";
this.P_SEARCH_EMPLOYEE_DISPLAY_NAME = "";
break;
}
default: {
this.P_SEARCH_USER_NAME = "";
this.P_SEARCH_EMPLOYEE_DISPLAY_NAME = "";
this.P_SEARCH_EMAIL_ADDRESS = "";
break;
}
}
} else {
this.P_SEARCH_USER_NAME = "";
this.P_SEARCH_EMPLOYEE_DISPLAY_NAME = "";
this.P_SEARCH_EMAIL_ADDRESS = "";
}
const request = new ReplacementServiceRequest();
request.P_SEARCH_USER_NAME = this.P_SEARCH_USER_NAME;
request.P_SEARCH_EMPLOYEE_DISPLAY_NAME = this.P_SEARCH_EMPLOYEE_DISPLAY_NAME;
request.P_SEARCH_EMAIL_ADDRESS = this.P_SEARCH_EMAIL_ADDRESS;
request.P_PAGE_NUM = this.P_PAGE_NUM;
request.P_PAGE_LIMIT = this.P_PAGE_LIMIT;
request.P_SELECTED_EMPLOYEE_NUMBER = this.selEmp;
this.vacationRuleService.getReplacementList(request).
subscribe((result: any) => {
this.handleReplacment(result);
});
}
handleReplacment(result) {
if (this.cs.validResponse(result)) {
if (this.cs.hasData(result.ReplacementList)) {
this.ReplacementList = result.ReplacementList;
this.P_PAGE_NUM++;
let lastItemIndex = this.ReplacementList.length - 1;
if (result.ReplacementList[lastItemIndex]) {
let lastitem = result.ReplacementList[lastItemIndex];
if (lastitem.NO_OF_ROWS == lastitem.ROW_NUM) {
this.IsReachEnd = true;
} else {
this.IsReachEnd = false;
}
}
}
}
}
doInfinite(infiniteScroll) {
}
closePage() {
this.isSave = true;
let data: any = null;
if (this.isSave == true) {
if (this.selEmp) {
data = this.ReplacementList[this.selEmp];
} else {
data = null;
}
if (typeof this.callback == 'function') {
this.callback(data);
}
this.modalController.dismiss({
'dismissed': true,
empData: data
});
}
}
}

@ -1,3 +1,4 @@
import { ReplacementServiceRequest } from './../model/replacement-Service.request';
import { notificationTypeRequest } from './../model/notification.Request';
import { Response } from 'src/app/hmg-common/services/models/response';
import { VacationRuleRequest } from './../model/VacationRuleRequest';
@ -7,6 +8,7 @@ import { Observable } from 'rxjs';
import { ConnectorService } from 'src/app/hmg-common/services/connector/connector.service';
import { VacationTypeRequest } from '../model/VacationTypeRequest';
import { LoginRequest } from 'src/app/hmg-common/services/authentication/models/login.request';
import { DeleteVacationRuleRequest } from '../model/deleteVacationRule.Request';
@Injectable({
providedIn: 'root'
@ -24,11 +26,13 @@ export class VacationRuleServiceService {
public static updateVacationRule = 'Services/ERP.svc/REST/UPDATE_VACATION_RULE';
public static respondAttributes = 'Services/ERP.svc/REST/GET_RESPOND_ATTRIBUTES';
public static notificationReassign = 'Services/ERP.svc/REST/GET_NOTIFICATION_REASSIGN_MODE';
public static getRespondAttributeValues = 'Services/ERP.svc/REST/GET_RESPOND_ATTRIBUTE_VALUE';
public static getReplacmentEmployeeList = 'Services/ERP.svc/REST/GET_REPLACEMENT_LIST';
constructor(public authService: AuthenticationService, public con: ConnectorService) { }
public getVacationRule(vacationRuleRequest: VacationRuleRequest, onError: any, errorLabel: string): Observable<Response> {
public getVacationRule(vacationRuleRequest: VacationRuleRequest, onError: any, errorLabel: string): Observable<any> {
const request = vacationRuleRequest;
console.log(request);
this.authService.authenticateRequest(request);
@ -53,4 +57,39 @@ export class VacationRuleServiceService {
return this.con.post(VacationRuleServiceService.notificationReassign, request, onError, errorLabel);
}
public respondAttributes(notificationTypeRequest: notificationTypeRequest, onError: any, errorLabel: string): Observable<any> {
const request = notificationTypeRequest;
this.authService.authenticateRequest(request);
return this.con.post(VacationRuleServiceService.respondAttributes, request, onError, errorLabel);
}
public getRespondAttributeValues(repsondAttrValues: any, onError?: any, errorLabel?: string): Observable<any> {
const request = repsondAttrValues;
this.authService.authenticateRequest(request);
return this.con.post(VacationRuleServiceService.getRespondAttributeValues, request, onError, errorLabel);
}
public getReplacementList(req: ReplacementServiceRequest, onError?: any, errorLabel?: string): Observable<any> {
const request = req;
this.authService.authenticateRequest(request);
return this.con.post(VacationRuleServiceService.getReplacmentEmployeeList, request, onError, errorLabel);
}
public createVacationRule(ActionHistoryRequest: LoginRequest, onError?: any, errorLabel?: string): Observable<any> {
const request = ActionHistoryRequest;
this.authService.authenticateRequest(request);
return this.con.post(VacationRuleServiceService.createVacationRule, request, onError, errorLabel);
}
public updateVacationRule(ActionHistoryRequest: LoginRequest, onError?: any, errorLabel?: string): Observable<any> {
const request = ActionHistoryRequest;
this.authService.authenticateRequest(request);
return this.con.post(VacationRuleServiceService.updateVacationRule, request, onError, errorLabel);
}
public deleteVacationRule(ActionHistoryRequest: DeleteVacationRuleRequest, onError?: any, errorLabel?: string): Observable<any> {
const request = ActionHistoryRequest;
this.authService.authenticateRequest(request);
return this.con.post(VacationRuleServiceService.deleteVacationRule, request, onError, errorLabel);
}
}

@ -4,13 +4,15 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { VacationRulePage } from './vacation-rule.page';
import { VacationTypeComponent } from './vacation-type/vacation-type.component';
import { NotificationTypeComponent } from './notification-type/notification-type.component';
import { CreateVacationRuleComponent } from './create-vacation-rule/create-vacation-rule.component';
// import { JsonSchemaFormModule, Framework, WidgetLibraryService, FrameworkLibraryService, JsonSchemaFormService } from 'angular6-json-schema-form';
import { ReplacementListComponent } from './replacement-list/replacement-list.component';
// import { MaterialDesignFrameworkModule } from 'angular6-json-schema-form';
const routes: Routes = [
{
@ -32,6 +34,10 @@ const routes: Routes = [
{
path: 'create-vacation-rule',
component: CreateVacationRuleComponent
},
{
path: 'replacement-list',
component: ReplacementListComponent
}
]
}
@ -43,6 +49,17 @@ const routes: Routes = [
FormsModule,
IonicModule,
HmgCommonModule,
// {
// ngModule: JsonSchemaFormModule,
// providers: [
// JsonSchemaFormService,
// FrameworkLibraryService,
// WidgetLibraryService,
// // { provide: Framework, useClass: IonicFramework, multi: true }
// ]
// },
// IonicFrameworkModule,
// MaterialDesignFrameworkModule,
RouterModule.forChild(routes)
],
declarations: [
@ -50,7 +67,8 @@ const routes: Routes = [
HomeComponent,
VacationTypeComponent,
NotificationTypeComponent,
CreateVacationRuleComponent
CreateVacationRuleComponent,
ReplacementListComponent
]
})
export class VacationRulePageModule { }

@ -1,3 +1,4 @@
import { vacationTypeResponse } from './../model/vacationType.Respond';
import { notificationTypeResponse } from './../model/notification.Respond';
import { VacationTypeRequest } from './../model/VacationTypeRequest';
import { Component, OnInit } from '@angular/core';
@ -37,8 +38,7 @@ export class VacationTypeComponent implements OnInit {
}
NextPage() {
this.cs.sharedService.setSharedData(this.ruleTypeList[this.index], 'selectedItemType');
this.cs.navigateForward('/vacation-rule/notification-type');
this.cs.sharedService.setSharedData(this.ruleTypeList[this.index], vacationTypeResponse.SHARED_DATA);
if (this.ruleTypeList[this.index].ITEM_TYPE == "*") {
let notificatioAtt: notificationTypeResponse = new notificationTypeResponse();

@ -882,6 +882,78 @@
"message-label": {
"en": "Message",
"ar": "رسالة"
},
"fillMsg": {
"en": "Please fill message field",
"ar": "يرجى ملء حقل الرسالة"
},
"fillSDate": {
"en": "Please fill start date",
"ar": "يرجى ملء تاريخ البدء"
},
"fillAction": {
"en": "Please fill action field",
"ar": "يرجى ملء حقل العمل"
},
"deliver": {
"en": "Deliver notifications to me regardless of any general rules",
"ar": "تسليم الإخطارات لي بغض النظر عن أي قواعد عامة"
},
"close": {
"en": "Close",
"ar": "أغلق"
},
"respond": {
"en": "Respond",
"ar": "رد"
},
"apply": {
"en": "Apply",
"ar": "تطبيق"
},
"update": {
"en": "Update",
"ar": "تحديث"
},
"search-employee": {
"en": "Search for an Employee",
"ar": "البحث عن موظف"
},
"replacement-employee-tip": {
"en": "You can search for an employee by <span class=\"boldTxtNav\">Name </span>, <span class=\"boldTxtNav\">User Name </span> and <span class=\"boldTxtNav\">Email </span>",
"ar": "يمكنك البحث عن موظف ب <span class=\"boldTxtNav\">الاسم </span>, <span class=\"boldTxtNav\">اسم المستخدم </span> ,أو <span class=\"boldTxtNav\">البريد الإلكتروني </span>"
},
"search-by": {
"en": "Search by",
"ar": "البحث بواسطة"
},
"search-by-name": {
"en": "Name",
"ar": "اسم"
},
"search-by-username": {
"en": "Username",
"ar": "اسم المستخدم"
},
"search-by-email": {
"en": "Email",
"ar": "البريد الإلكتروني"
},
"confirmation": {
"en": "Confirmation",
"ar": "البريد الإلكتروني"
},
"rule-success": {
"en": "Rule created successfully",
"ar": "تم إنشاء القاعدة بنجاح"
},
"rule-delete-success": {
"en": "Rule deleted successfully",
"ar": "تم حذف القاعدة بنجاح"
},
"rule-update-success": {
"en": "Rule updated successfully",
"ar": "تم تحديث القاعدة بنجاح"
}
},
"absenceList": {

@ -0,0 +1,40 @@
{
"project_info": {
"project_number": "608631731238",
"firebase_url": "https://mohemm-cs.firebaseio.com",
"project_id": "mohemm-cs",
"storage_bucket": "mohemm-cs.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:608631731238:android:3a8384007f8700ec",
"android_client_info": {
"package_name": "com.cloudsolutions.mohemm"
}
},
"oauth_client": [
{
"client_id": "608631731238-83a5qndedia496ssa6ekkd3db5jo8khr.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyB5zpz9vC2NOxsU1dPr0TK0dVaMY5D4Mjg"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "608631731238-83a5qndedia496ssa6ekkd3db5jo8khr.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
Loading…
Cancel
Save