diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 000000000..64a88fbc9 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,91 @@ +# NPM renames .gitignore to .npmignore +# In order to prevent that, we remove the initial "." +# And the CLI then renames it + +# Using Android gitignore template: https://github.com/github/gitignore/blob/master/Android.gitignore + +# Built application files +*.apk +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Cordova plugins for Capacitor +capacitor-cordova-android-plugins + +# Copied web assets +app/src/main/assets/public diff --git a/android/.idea/codeStyles/Project.xml b/android/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..681f41ae2 --- /dev/null +++ b/android/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + xmlns:android + + ^$ + + + + + + + + + xmlns:.* + + ^$ + + + BY_NAME + + + + + + + .*:id + + http://schemas.android.com/apk/res/android + + + + + + + + + .*:name + + http://schemas.android.com/apk/res/android + + + + + + + + + name + + ^$ + + + + + + + + + style + + ^$ + + + + + + + + + .* + + ^$ + + + BY_NAME + + + + + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + + + + + + + .* + + .* + + + BY_NAME + + + + + + + \ No newline at end of file diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml new file mode 100644 index 000000000..e34606ccd --- /dev/null +++ b/android/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml new file mode 100644 index 000000000..7bfef59df --- /dev/null +++ b/android/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/app/.npmignore b/android/app/.npmignore new file mode 100644 index 000000000..043df802a --- /dev/null +++ b/android/app/.npmignore @@ -0,0 +1,2 @@ +/build/* +!/build/.npmkeep diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 000000000..20c80874b --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,47 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "com.gpr.gabinetedigital" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +repositories { + flatDir{ + dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation project(':capacitor-android') + implementation 'com.android.support:support-v4:28.0.0' + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation project(':capacitor-cordova-android-plugins') +} + +apply from: 'capacitor.build.gradle' + +try { + def servicesJSON = file('google-services.json') + if (servicesJSON.text) { + apply plugin: 'com.google.gms.google-services' + } +} catch(Exception e) { + logger.warn("google-services.json not found, google-services plugin not applied. Push Notifications won't work") +} \ No newline at end of file diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle new file mode 100644 index 000000000..f950a9aa0 --- /dev/null +++ b/android/app/capacitor.build.gradle @@ -0,0 +1,19 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { + + implementation "com.android.support:support-v4:27.+" +} + + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java new file mode 100644 index 000000000..8834b0a51 --- /dev/null +++ b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.getcapacitor.myapp; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.getcapacitor.app", appContext.getPackageName()); + } +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..b4b21b5e7 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/assets/capacitor.config.json b/android/app/src/main/assets/capacitor.config.json new file mode 100644 index 000000000..4a2bb66dd --- /dev/null +++ b/android/app/src/main/assets/capacitor.config.json @@ -0,0 +1,20 @@ +{ + "appId": "com.gpr.gabinetedigital", + "appName": "gabinete-digital", + "webDir": "www", + "npmClient": "npm", + "cordova": { + "preferences": { + "ScrollEnabled": "false", + "BackupWebStorage": "none", + "SplashMaintainAspectRatio": "true", + "FadeSplashScreenDuration": "300", + "SplashShowOnlyFirstTime": "false", + "SplashScreen": "screen", + "SplashScreenDelay": "3000" + } + }, + "android": { + "allowMixedContent": true + } +} diff --git a/android/app/src/main/java/com/gpr/gabinetedigital/MainActivity.java b/android/app/src/main/java/com/gpr/gabinetedigital/MainActivity.java new file mode 100644 index 000000000..879fa210c --- /dev/null +++ b/android/app/src/main/java/com/gpr/gabinetedigital/MainActivity.java @@ -0,0 +1,21 @@ +package com.gpr.gabinetedigital; + +import android.os.Bundle; + +import com.getcapacitor.BridgeActivity; +import com.getcapacitor.Plugin; + +import java.util.ArrayList; + +public class MainActivity extends BridgeActivity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Initializes the Bridge + this.init(savedInstanceState, new ArrayList>() {{ + // Additional plugins you've installed go here + // Ex: add(TotallyAwesomePlugin.class); + }}); + } +} diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png new file mode 100644 index 000000000..e31573b4f Binary files /dev/null and b/android/app/src/main/res/drawable-land-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png new file mode 100644 index 000000000..f7a64923e Binary files /dev/null and b/android/app/src/main/res/drawable-land-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png new file mode 100644 index 000000000..807725501 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png new file mode 100644 index 000000000..14c6c8fe3 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png new file mode 100644 index 000000000..244ca2506 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png new file mode 100644 index 000000000..74faaa583 Binary files /dev/null and b/android/app/src/main/res/drawable-port-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png new file mode 100644 index 000000000..e944f4ad4 Binary files /dev/null and b/android/app/src/main/res/drawable-port-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png new file mode 100644 index 000000000..564a82ff9 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png new file mode 100644 index 000000000..bfabe6871 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png new file mode 100644 index 000000000..692907126 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..c7bd21dbd --- /dev/null +++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..d5fccc538 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png new file mode 100644 index 000000000..f7a64923e Binary files /dev/null and b/android/app/src/main/res/drawable/splash.png differ diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..b5ad13870 --- /dev/null +++ b/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c023e5059 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..2127973b2 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 000000000..b441f37d6 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..72905b854 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..8ed0605c2 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 000000000..9502e47a2 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..4d1e07710 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..df0f15880 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 000000000..853db043d Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6cdf97c11 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..2960cbb61 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..8e3093a86 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..46de6e255 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 000000000..d2ea9abed Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..a40d73e9c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 000000000..c5d5899fd --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..c967d7a2f --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + + gabinete-digital + gabinete-digital + com.gpr.gabinetedigital + com.gpr.gabinetedigital + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..bb45498f6 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/xml/config.xml b/android/app/src/main/res/xml/config.xml new file mode 100644 index 000000000..286e39ce1 --- /dev/null +++ b/android/app/src/main/res/xml/config.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 000000000..bd0c4d80d --- /dev/null +++ b/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java new file mode 100644 index 000000000..4a45edf8e --- /dev/null +++ b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.getcapacitor.myapp; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 000000000..68fcb19d0 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,29 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.google.gms:google-services:4.3.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +apply from: "variables.gradle" + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle new file mode 100644 index 000000000..9a5fa872e --- /dev/null +++ b/android/capacitor.settings.gradle @@ -0,0 +1,3 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 000000000..0566c221d --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,24 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..5c2d1cf01 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..39731c2d6 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jan 15 09:55:16 WAT 2021 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 000000000..83f2acfdc --- /dev/null +++ b/android/gradlew @@ -0,0 +1,188 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 000000000..9618d8d96 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 000000000..3b4431d77 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,5 @@ +include ':app' +include ':capacitor-cordova-android-plugins' +project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') + +apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/android/variables.gradle b/android/variables.gradle new file mode 100644 index 000000000..42ed4358a --- /dev/null +++ b/android/variables.gradle @@ -0,0 +1,17 @@ +ext { + minSdkVersion = 21 + compileSdkVersion = 29 + targetSdkVersion = 29 + androidxAppCompatVersion = '1.1.0' + androidxCoreVersion = '1.2.0' + androidxMaterialVersion = '1.1.0-rc02' + androidxBrowserVersion = '1.2.0' + androidxLocalbroadcastmanagerVersion = '1.0.0' + androidxExifInterfaceVersion = '1.2.0' + firebaseMessagingVersion = '20.1.2' + playServicesLocationVersion = '17.0.0' + junitVersion = '4.12' + androidxJunitVersion = '1.1.1' + androidxEspressoCoreVersion = '3.2.0' + cordovaAndroidVersion = '7.0.0' +} \ No newline at end of file diff --git a/capacitor.config.json b/capacitor.config.json new file mode 100644 index 000000000..4a2bb66dd --- /dev/null +++ b/capacitor.config.json @@ -0,0 +1,20 @@ +{ + "appId": "com.gpr.gabinetedigital", + "appName": "gabinete-digital", + "webDir": "www", + "npmClient": "npm", + "cordova": { + "preferences": { + "ScrollEnabled": "false", + "BackupWebStorage": "none", + "SplashMaintainAspectRatio": "true", + "FadeSplashScreenDuration": "300", + "SplashShowOnlyFirstTime": "false", + "SplashScreen": "screen", + "SplashScreenDelay": "3000" + } + }, + "android": { + "allowMixedContent": true + } +} diff --git a/git b/git new file mode 100644 index 000000000..e69de29bb diff --git a/ionic.config.json b/ionic.config.json index bad8f73b9..0861ddaef 100644 --- a/ionic.config.json +++ b/ionic.config.json @@ -1,9 +1,7 @@ { "name": "gabinete-digital", "integrations": { - "capacitor": { - "enabled": false - }, + "capacitor": {}, "cordova": {} }, "type": "angular" diff --git a/package-lock.json b/package-lock.json index 3279b6d9e..c050eb256 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1920,6 +1920,88 @@ "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-2.4.0.tgz", "integrity": "sha512-5sJicZjtuBRgtmBuV1kvWnIjlu7bnw2TGGp62UXf0ZrjvMUCYSFHBqIHZ8neffW7a3xM5cdGMUlxJ+HfA9ntAg==" }, + "@capacitor/cli": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-2.4.5.tgz", + "integrity": "sha512-nv0IRd3xnif8kIvAFk+ssEkwqZ8n0DvLuB7s0CmtRvMf6Rns02TTYndtV/YkSVja4JbrKb9FrcMd2aLu9KJEIg==", + "requires": { + "chalk": "^2.3.0", + "commander": "^4.1.1", + "compare-versions": "^3.1.0", + "fs-extra": "^4.0.3", + "inquirer": "6.3.1", + "open": "^6.1.0", + "ora": "^1.3.0", + "plist": "^3.0.1", + "semver": "^5.4.1", + "which": "^1.3.0", + "xml2js": "^0.4.19" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", + "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "requires": { + "chalk": "^2.1.0", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.1", + "log-symbols": "^2.1.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "@capacitor/core": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-2.4.5.tgz", + "integrity": "sha512-3GfDAN3s8ajglbn0X6wS+1mtmLwtaBNyvrje3qZ7mzRGVOMWLlOL+n2EeA9IlhMyp8KbQFwXr7gKUk6DjMAKUQ==", + "requires": { + "tslib": "^1.9.0" + } + }, "@capacitor/ios": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-2.4.0.tgz", @@ -2034,6 +2116,13 @@ "integrity": "sha512-wYdmZEbQwksJmcGc87FZkzT8BxvB1u8CrDX3K7czFZQX6y6+FYgLyAX2FYR1X1xf6CEtZhQV4qSGCs7sGTYGdQ==", "requires": { "@types/cordova": "^0.0.34" + }, + "dependencies": { + "@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + } } }, "@ionic-native/file-path": { @@ -2042,6 +2131,13 @@ "integrity": "sha512-rE5GqT5n+3JIbmeq9Z7QJhekYcayoZFBHC3URpgSzAGMXql50whdT+s1NZml9rx8b2RmB7LlbypsIku381WWvA==", "requires": { "@types/cordova": "^0.0.34" + }, + "dependencies": { + "@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + } } }, "@ionic-native/in-app-browser": { @@ -2065,6 +2161,13 @@ "integrity": "sha512-Ey0lz//ubjDLvyvcoRn5vg9Ql5hCzsav8SFsmgDpEt47WZTr8Bwh+kLJkVjWiLTehMvoVqijyKls2W9trN7v3A==", "requires": { "@types/cordova": "^0.0.34" + }, + "dependencies": { + "@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + } } }, "@ionic-native/splash-screen": { @@ -2107,212 +2210,209 @@ } }, "@ionic/angular-toolkit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-2.3.0.tgz", - "integrity": "sha512-4n5HmeX5S0W7UOv4gcfiEFAphFDmgmaAOryM4/E40+uLIvnOOL40ReooOlOjs5PRB3vwzVmCh1Uqjtq3XwqSgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-3.0.0.tgz", + "integrity": "sha512-H6SX8k+uPTdcsZAHEOaH5oIuQWSeIqEqEjjPqiD0e5+wmqc94RANNC/cRX/3cnVsWQiqcUY75CbpGec4xRvWoA==", "dev": true, "requires": { - "@schematics/angular": ">=8.0.0", + "@schematics/angular": "^11.0.0", "cheerio": "1.0.0-rc.3", "colorette": "1.1.0", - "copy-webpack-plugin": "5.1.1", - "tslib": "^1.9.0", + "copy-webpack-plugin": "^6.2.1", + "tapable": "^2.1.1", + "tslib": "^2.0.3", "ws": "^7.0.1" }, "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "@angular-devkit/core": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.5.tgz", + "integrity": "sha512-hwV8fjF8JNPJkiVWw8MNzeIfDo01aD/OAOlC4L5rQnVHn+i2EiU3brSDmFqyeHPPV3h/QjuBkS3tkN7gSnVWaQ==", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.5.tgz", + "integrity": "sha512-0NKGC8Nf/4vvDpWKB7bwxIazvNnNHnZBX6XlyBXNl+fW8tpTef3PNMJMSErTz9LFnuv61vsKbc36u/Ek2YChWg==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.5", + "ora": "5.1.0", + "rxjs": "6.6.3" + } + }, + "@schematics/angular": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.0.5.tgz", + "integrity": "sha512-7p2wweoJYhim8YUy3ih1SrPGqRsa6+aEFbYgo9v4zt7b3tOva8SvkbC2alayK74fclzQ7umqa6xAwvWhy8ORvg==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.5", + "@angular-devkit/schematics": "11.0.5", + "jsonc-parser": "2.3.1" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", "dev": true, "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" } }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "path-type": "^3.0.0" + "yallist": "^4.0.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, - "glob-parent": { + "p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "yocto-queue": "^0.1.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "randombytes": "^2.1.0" } }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", "dev": true } } @@ -2941,11 +3041,6 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -2956,6 +3051,11 @@ "@types/node": "*" } }, + "@types/hammerjs": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.36.tgz", + "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" + }, "@types/jasmine": { "version": "3.5.12", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.12.tgz", @@ -2977,6 +3077,11 @@ "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.165", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.165.tgz", + "integrity": "sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -3360,6 +3465,11 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -3375,7 +3485,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -3653,37 +3762,6 @@ "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "axobject-query": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", @@ -3867,6 +3945,16 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", @@ -4332,7 +4420,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4342,8 +4429,7 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "cheerio": { "version": "1.0.0-rc.3", @@ -4489,11 +4575,25 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, "cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { "version": "5.0.0", @@ -4645,6 +4745,11 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -4654,8 +4759,7 @@ "compare-versions": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" }, "component-bind": { "version": "1.0.0", @@ -6506,8 +6610,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint-scope": { "version": "4.0.3", @@ -6757,7 +6860,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -6893,6 +6995,14 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "file-loader": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", @@ -6903,6 +7013,13 @@ "schema-utils": "^2.6.5" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -7114,6 +7231,16 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -7293,6 +7420,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -7364,8 +7496,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.1", @@ -7827,7 +7958,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -7965,6 +8095,63 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -7989,6 +8176,17 @@ "resolved": "https://registry.npmjs.org/ionic-selectable/-/ionic-selectable-4.5.0.tgz", "integrity": "sha512-ya65y4IF8rgaE68VVqBllSfsSNozBzk+If8ohtg70qk4HHTkxAT4mhiD7EGcQ8oJ2LGyFomAK5vLO15pJ1vCKg==" }, + "ionic2-alpha-scroll": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ionic2-alpha-scroll/-/ionic2-alpha-scroll-2.0.1.tgz", + "integrity": "sha512-KAzZo/8XltmTJ+3pbSMEJyon/R+O18mmdEyAeJllOcBzW0Ogw0q3b1frQrztJ3DzP0TF2A/3ZHEsb6neaC/yCw==", + "requires": { + "@types/hammerjs": "^2.0.33", + "@types/lodash": "^4.14.106", + "hammerjs": "^2.0.8", + "lodash": "^4.17.5" + } + }, "ionic2-calendar": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/ionic2-calendar/-/ionic2-calendar-0.6.6.tgz", @@ -8307,8 +8505,7 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", @@ -8563,6 +8760,11 @@ } } }, + "jetifier": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", + "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8636,11 +8838,16 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -9109,6 +9316,66 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -9512,6 +9779,12 @@ "mime-db": "1.44.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", @@ -9746,6 +10019,19 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -10244,6 +10530,23 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -10253,6 +10556,88 @@ "is-wsl": "^1.1.0" } }, + "ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -12328,6 +12713,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -12394,8 +12789,7 @@ "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { "version": "1.1.9", @@ -12436,8 +12830,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { "version": "1.26.3", @@ -12501,8 +12894,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { "version": "2.7.0", @@ -13631,7 +14023,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" }, @@ -13639,8 +14030,7 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } }, @@ -13799,7 +14189,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -14062,8 +14451,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", @@ -14100,7 +14488,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -14403,8 +14790,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unorm": { "version": "1.6.0", @@ -14767,7 +15153,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", @@ -15342,7 +15732,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", @@ -15550,7 +15944,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -15699,7 +16092,6 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -15708,8 +16100,7 @@ "xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" } } }, @@ -15797,6 +16188,12 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zone.js": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", diff --git a/package.json b/package.json index 54bbe4cb2..042c9f13f 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "@angular/platform-browser-dynamic": "~9.1.6", "@angular/router": "~9.1.6", "@capacitor/android": "^2.4.0", + "@capacitor/cli": "^2.4.5", + "@capacitor/core": "^2.4.5", "@capacitor/ios": "^2.4.0", "@fullcalendar/angular": "^5.3.0", "@fullcalendar/daygrid": "^5.3.0", @@ -36,8 +38,6 @@ "@ionic/pwa-elements": "^3.0.1", "@ionic/storage": "^2.3.1", "@logisticinfotech/ionic4-datepicker": "^1.4.4", - "angular-tag-cloud-module": "^5.2.0", - "axios": "^0.19.2", "cordova-ios": "6.1.0", "cordova-plugin-camera": "^5.0.1", "cordova-plugin-file": "^6.0.2", @@ -46,7 +46,9 @@ "cordova-sqlite-storage": "^5.1.0", "date-fns": "^2.15.0", "ionic-selectable": "^4.5.0", + "ionic2-alpha-scroll": "^2.0.1", "ionic2-calendar": "^0.6.6", + "jetifier": "^1.6.6", "moment": "^2.27.0", "ngx-socket-io": "^3.2.0", "rxjs": "~6.5.1", @@ -61,7 +63,7 @@ "@angular/compiler": "~9.1.6", "@angular/compiler-cli": "~9.1.6", "@angular/language-service": "~9.1.6", - "@ionic/angular-toolkit": "^2.1.1", + "@ionic/angular-toolkit": "^3.0.0", "@ionic/lab": "3.1.7", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", @@ -103,7 +105,8 @@ "cordova-plugin-inappbrowser": {}, "cordova-plugin-camera": { "ANDROID_SUPPORT_V4_VERSION": "27.+" - } + }, + "cordova-sqlite-storage": {} }, "platforms": [ "ios", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index ed7241472..d03f1ebd9 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -9,28 +9,57 @@ const routes: Routes = [ { path: '', loadChildren: () => import('./home/home.module').then( m => m.HomePageModule) + }, + { + path: 'events', + loadChildren: () => import('./pages/events/events.module').then( m => m.EventsPageModule) + }, + { + path: 'chat', + loadChildren: () => import('./pages/chat/chat.module').then( m => m.ChatPageModule) + }, + { + path: 'publications', + loadChildren: () => import('./pages/publications/publications.module').then( m => m.PublicationsPageModule) + }, + { + path: 'header', + loadChildren: () => import('./shared/header/header.module').then( m => m.HeaderPageModule) + }, + { + path: 'header', + loadChildren: () => import('./shared/header/header.module').then( m => m.HeaderPageModule) + }, + { + path: 'header-pr', + loadChildren: () => import('./shared/header-pr/header-pr.module').then( m => m.HeaderPrPageModule) + }, + { + path: 'btn-seguinte', + loadChildren: () => import('./shared/btn-seguinte/btn-seguinte.module').then( m => m.BtnSeguintePageModule) + }, + { + path: 'btn-modal-dismiss', + loadChildren: () => import('./shared/btn-modal-dismiss/btn-modal-dismiss.module').then( m => m.BtnModalDismissPageModule) + }, + { + path: 'chat-popover', + loadChildren: () => import('./shared/popover/chat-popover/chat-popover.module').then( m => m.ChatPopoverPageModule) + }, + { + path: 'chat-options-popover', + loadChildren: () => import('./shared/popover/chat-options-popover/chat-options-popover.module').then( m => m.ChatOptionsPopoverPageModule) }, { - path: 'chat', - loadChildren: () => import('./pages/chat/chat.module').then( m => m.ChatPageModule) + path: 'messages-options', + loadChildren: () => import('./shared/popover/messages-options/messages-options.module').then( m => m.MessagesOptionsPageModule) }, { - path: 'publications', - loadChildren: () => import('./pages/publications/publications.module').then( m => m.PublicationsPageModule) - }, - { - path: 'header', - loadChildren: () => import('./shared/header/header.module').then( m => m.HeaderPageModule) - }, - { - path: 'header', - loadChildren: () => import('./shared/header/header.module').then( m => m.HeaderPageModule) - }, - { - path: 'header-pr', - loadChildren: () => import('./shared/header-pr/header-pr.module').then( m => m.HeaderPrPageModule) + path: 'group-duration', + loadChildren: () => import('./shared/popover/group-duration/group-duration.module').then( m => m.GroupDurationPageModule) }, + /* { path: 'cal-modal', loadChildren: () => import('./pages/cal-modal/cal-modal.module').then( m => m.CalModalPageModule) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 21fd97ea0..bc8c8e056 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -18,6 +18,7 @@ import { WebView } from '@ionic-native/ionic-webview/ngx'; import { FilePath } from '@ionic-native/file-path/ngx'; import { Camera } from '@ionic-native/camera/ngx'; import { IonicStorageModule } from '@ionic/storage'; +import { PipesModule } from './pipes/pipes.module'; @NgModule({ declarations: [AppComponent], @@ -26,6 +27,7 @@ import { IonicStorageModule } from '@ionic/storage'; IonicModule.forRoot(), IonicStorageModule.forRoot(), AppRoutingModule, + PipesModule, HttpClientModule, ], providers: [ diff --git a/src/app/home/home-routing.module.ts b/src/app/home/home-routing.module.ts index ec29eb7f3..2d788629c 100644 --- a/src/app/home/home-routing.module.ts +++ b/src/app/home/home-routing.module.ts @@ -153,7 +153,7 @@ const routes: Routes = [ }, { path: '', - redirectTo: 'home/events', + redirectTo: '/home/events', pathMatch: 'full' } ]; diff --git a/src/app/home/home.page.html b/src/app/home/home.page.html index 16eebfd41..d1f9ea7b1 100644 --- a/src/app/home/home.page.html +++ b/src/app/home/home.page.html @@ -31,7 +31,8 @@ - + + --> + diff --git a/src/app/models/chat/status.model.ts b/src/app/models/chat/status.model.ts new file mode 100644 index 000000000..ebd8b9bf4 --- /dev/null +++ b/src/app/models/chat/status.model.ts @@ -0,0 +1,5 @@ +export class Status { + _id: string; + status: string; + success: boolean; +} \ No newline at end of file diff --git a/src/app/models/contact.model.ts b/src/app/models/contact.model.ts new file mode 100644 index 000000000..5accb1b63 --- /dev/null +++ b/src/app/models/contact.model.ts @@ -0,0 +1,5 @@ +interface Contact { + first: string; + last: string; + url: string; + } \ No newline at end of file diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index b335c523f..8da456b1e 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -196,7 +196,7 @@ export class AgendaPage implements OnInit { this.eventSource=[]; if(this.profile == "mdgpr"){ this.eventService.getAllMdEvents(formatDate(startTime, 'yyyy-MM-dd HH:mm:ss', 'pt'), formatDate(endTime, 'yyyy-MM-dd HH:mm:ss', 'pt')).subscribe(response => { - this.eventsListPessoal = response.filter(data => data.CalendarName == "Pessoal");; + this.eventsListPessoal = response.filter(data => data.CalendarName == "Pessoal"); this.eventsListPessoal.forEach(element => { this.eventSource.push({ title: element.Subject, diff --git a/src/app/pages/chat/chat-routing.module.ts b/src/app/pages/chat/chat-routing.module.ts index 7c66d7d68..dd3a97dfb 100644 --- a/src/app/pages/chat/chat-routing.module.ts +++ b/src/app/pages/chat/chat-routing.module.ts @@ -14,6 +14,18 @@ const routes: Routes = [ { path: 'newchat', loadChildren: () => import('./newchat/newchat.module').then( m => m.NewchatPageModule) + }, + { + path: 'new-group', + loadChildren: () => import('./new-group/new-group.module').then( m => m.NewGroupPageModule) + }, + { + path: 'group-messages', + loadChildren: () => import('./group-messages/group-messages.module').then( m => m.GroupMessagesPageModule) + }, + { + path: 'messages', + loadChildren: () => import('./messages/messages.module').then( m => m.MessagesPageModule) } ]; diff --git a/src/app/pages/chat/chat.page.html b/src/app/pages/chat/chat.page.html index c50efbfab..999f7b612 100644 --- a/src/app/pages/chat/chat.page.html +++ b/src/app/pages/chat/chat.page.html @@ -9,8 +9,8 @@ Chat - - + + @@ -36,26 +36,110 @@ - + + + + + + + + + + + {{user}} + + + + {{dm.lastMessage._updatedAt | date: 'HH:mm'}} + + + {{dm.lastMessage.msg}} + + + + - + + + + + + + + + {{group.name}} + + {{group.lastMessage._updatedAt | date: 'HH:mm'}} + + + {{group.lastMessage.u.name}}: {{group.lastMessage.msg}} + + + + @@ -64,3 +148,4 @@ + diff --git a/src/app/pages/chat/chat.page.scss b/src/app/pages/chat/chat.page.scss index 25fc37b11..2d381ea85 100644 --- a/src/app/pages/chat/chat.page.scss +++ b/src/app/pages/chat/chat.page.scss @@ -1,26 +1,4 @@ -.iconschatnew-group{ - width: 30px; - height: 30px; - object-fit: contain; - margin: 0 5px 0 5px; -} -.iconschatgroup-chat-40 { - width: 40px; - height: 40px; - object-fit: contain; -} -.iconschatnew-conversation{ - width: 30px; - height: 30px; - object-fit: contain; - margin: 0 5px 0 5px; -} -.iconschatchat-40 { - width: 40px; - height: 40px; - object-fit: contain; -} .main-header{ width: 100%; /* 400px */ height: 100%; @@ -67,4 +45,60 @@ background-color: #fff; overflow:auto; padding: 15px 20px 0 20px; -} \ No newline at end of file + + .iconschatnew-group{ + width: 30px; + height: 30px; + object-fit: contain; + margin: 0 5px 0 5px; + } + .iconschatnew-conversation{ + width: 30px; + height: 30px; + object-fit: contain; + margin: 0 5px 0 5px; + } +} + +.item{ + width: 100%; + border-bottom: 1px solid #ebebeb; + overflow: auto; + + .item-icon{ + width: 40px; + float: left; + + .icon{ + margin-top: 10px; + font-size: 40px; + } + } + .item-content{ + width: 317px; + margin: 0 auto; + float:right + } + .item-title-time{ + width: 100%; + overflow: auto; + margin-top: 10px; + } + .item-title{ + width: 80%; + float: left; + font-size: 15px; + color: #0d89d1; + } + .item-date{ + width: 20%; + float: right; + font-size: 13px; + color: #797979; + text-align: right; + } + .item-description{ + font-size: 13px; + color: #000; + } +} diff --git a/src/app/pages/chat/chat.page.ts b/src/app/pages/chat/chat.page.ts index 2b3ecc684..cc083cb90 100644 --- a/src/app/pages/chat/chat.page.ts +++ b/src/app/pages/chat/chat.page.ts @@ -1,8 +1,14 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { AuthService } from 'src/app/services/auth.service'; import { ChatService } from 'src/app/services/chat.service'; import { ConversationPage } from './conversation/conversation.page'; +import { GroupMessagesPage } from './group-messages/group-messages.page'; +import { ContactsPage } from './messages/contacts/contacts.page'; +import { MessagesPage } from './messages/messages.page'; +import { NewGroupPage } from './new-group/new-group.page'; +import { NewchatPage } from './newchat/newchat.page'; @Component({ selector: 'app-chat', @@ -10,49 +16,123 @@ import { ConversationPage } from './conversation/conversation.page'; styleUrls: ['./chat.page.scss'], }) export class ChatPage implements OnInit { + + headers: HttpHeaders; + options:any; + X_User_Id:any; + X_Auth_Token:any; + showLoader: boolean; loggedUser: any; /* Set segment variable */ segment:string; - groupList: any[]; + allGroups: any[]; + privateGroups: any[]; + publicGroups: any[]; userConnectedList: any[]; + userRooms: any[]; + userChannels: any[]; + userDirectMessages: any[]; result:any; + dmUsers:any; constructor( + private http:HttpClient, private chatService: ChatService, private modalController: ModalController, - private authService: AuthService) { } + private authService: AuthService, + + ) { + this.headers = new HttpHeaders(); + this.headers = this.headers.set('X-User-Id', 'GqjNWiLrGEHRna7Zn'); + this.headers = this.headers.set('X-Auth-Token', 'SJwIgtlqfloPK696fpc2VBvyDluipuIHKB_0Q6-9ycJ'); + } ngOnInit() { this.segment = "Contactos"; + this.authService.userData$.subscribe((res:any)=>{ + this.loggedUser=res; + console.log(this.loggedUser); + + }); this.doRefresh(); - + this.loadJoinedRooms(); + } + loadJoinedRooms(){ + this.chatService.loadJoinedRooms().subscribe(res => { + console.log(res); + }); } onSegmentChange(){ this.doRefresh(); } doRefresh(){ - this.getGroups(); - this.getConnectedUsers(); + setInterval(()=>{ + this.getDirectMessages(); + this.getGroups(); + }, 2000); } getGroups(){ this.showLoader = true; this.result = this.chatService.getAllPrivateGroups().subscribe((res:any)=>{ - this.groupList = res.groups; + this.privateGroups = res.groups; + this.result = this.chatService.getAllUserChannels().subscribe((res:any)=>{ + this.publicGroups = res.channels; + this.allGroups = this.privateGroups.concat(this.publicGroups); this.showLoader = false; + }); }); } - - getConnectedUsers(){ + getDirectMessages(){ this.showLoader = true; + + this.result = this.chatService.getAllDirectMessages().subscribe((res:any)=>{ + this.userDirectMessages = res.ims; + console.log(res); + + this.showLoader = false; + }); + } + getChatMembers(){ + this.chatService.getMembers(this.userDirectMessages[0]._id).subscribe(res=> { + this.dmUsers = res['members'].filter(data => data.username != this.loggedUser.me.username) + /* console.log(res); + console.log(this.dmUsers); */ + }); + } + /* getConnectedChannels(){ + this.showLoader = true; + + this.result = this.chatService.getAllUserChannels().subscribe((res:any)=>{ + this.userChannels = res.channels; + console.log(res); + + this.showLoader = false; + }); + } */ + + /* getConnectedRooms(){ + this.showLoader = true; + + this.result = this.chatService.getAllRooms().subscribe((res:any)=>{ + this.userRooms = res.update; + console.log(res.update); + + this.showLoader = false; + }); + } */ + + /* getConnectedUsers(){ + this.showLoader = true; + this.result = this.chatService.getAllConnectedUsers().subscribe((res:any)=>{ this.userConnectedList = res.users; - console.log(this.userConnectedList); - this.showLoader = false; - }); - } - async starConversation(selectedUser) { + this.showLoader = false; + }); + } */ + + async startConversation(selectedUser) { const modal = await this.modalController.create({ component: ConversationPage, cssClass: 'conversation', @@ -64,4 +144,48 @@ export class ChatPage implements OnInit { await modal.present(); modal.onDidDismiss(); } + async selectContact(){ + const modal = await this.modalController.create({ + component: ContactsPage, + cssClass: 'contacts', + backdropDismiss: false, + }); + await modal.present(); + modal.onDidDismiss(); + } + async newGroup(){ + const modal = await this.modalController.create({ + component: NewGroupPage, + cssClass: 'new-group', + backdropDismiss: false, + }); + await modal.present(); + modal.onDidDismiss(); + } + async openMessages(dm:any){ + console.log(dm); + + const modal = await this.modalController.create({ + component: MessagesPage, + cssClass: 'group-messages', + backdropDismiss: false, + componentProps: { + dm: dm, + }, + }); + await modal.present(); + modal.onDidDismiss(); + } + async openGroupMessages(user:any){ + const modal = await this.modalController.create({ + component: GroupMessagesPage, + cssClass: 'group-messages', + backdropDismiss: false, + componentProps: { + user: user, + }, + }); + await modal.present(); + modal.onDidDismiss(); + } } diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts new file mode 100644 index 000000000..c998741ed --- /dev/null +++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { GroupContactsPage } from './group-contacts.page'; + +const routes: Routes = [ + { + path: '', + component: GroupContactsPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class GroupContactsPageRoutingModule {} diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts new file mode 100644 index 000000000..9ec279e82 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { GroupContactsPageRoutingModule } from './group-contacts-routing.module'; + +import { GroupContactsPage } from './group-contacts.page'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + GroupContactsPageRoutingModule + ], + declarations: [GroupContactsPage] +}) +export class GroupContactsPageModule {} diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html new file mode 100644 index 000000000..190194b56 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html @@ -0,0 +1,51 @@ + + + + + + + + + Contactos + + + + + + + + + + + + + + + + + + + + + + + + + + {{header}} + + + + + {{user.first}} {{user.last}} + + + + + + + diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss new file mode 100644 index 000000000..cf9de70f9 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss @@ -0,0 +1,127 @@ +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + .title-content{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + } + + .back-icon{ + width: 37px; + float: left; + font-size: 35px; + overflow: auto; + + } + .div-title{ + width: 221px; + padding: 0!important; + float: left; + margin: 2.5px 0 0 5px; + } + .title{ + font-size: 25px; + } + } + } + .toolbar-search{ + --padding-top:0 !important; + --padding-bottom:0 !important; + --padding-start:0 !important; + --padding-end:0 !important; + + .search{ + border: 1px solid #ebebeb; + margin: 5px 20px 5px 20px; + border-radius: 5px; + } + .search ion-searchbar{ + /* border: 1px solid green; */ + width: 100%; + margin: 0 !important; + padding: 0 !important; + --border-radius: 5px; + --box-shadow: none; + overflow: auto; + --icon-color:#0d89d1; + } + + } + ion-content{ + --background:transparent; + } + .main-content{ + width: 100%; + height: 100%; + font-family: Roboto; + margin: 0 auto; + background-color: #fff; + overflow:auto; + padding: 0 0 0 0; + + .item-divider{ + background: #ebebeb; + font-size: 15px; + margin: 10px 0 10px 0; + padding:5px 0 5px 20px; + + } + + .item-checkbox{ + display: flex; + margin: 10px 20px 10px 20px !important; + overflow: auto; + align-items: center; + + } + + .item-checkbox ion-checkbox{ + --border-color: #0d89d1; + --background-checked:#0d89d1; + float: left; + } + + .item-checkbox p{ + display: block; + margin: 0 !important; + width: 330px; + padding-left: 10px; + font-size: 15px; + color: #0d89d1; + float: left; + } + .item-checkbox ion-icon{ + font-size: 10px; + float: left; + color:#99e47b; + margin-left: 10px; + } + } + + \ No newline at end of file diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts new file mode 100644 index 000000000..dde2043a8 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { GroupContactsPage } from './group-contacts.page'; + +describe('GroupContactsPage', () => { + let component: GroupContactsPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GroupContactsPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(GroupContactsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts new file mode 100644 index 000000000..f109751bd --- /dev/null +++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts @@ -0,0 +1,152 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Component, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { GroupMessagesPage } from '../group-messages.page'; + +@Component({ + selector: 'app-group-contacts', + templateUrl: './group-contacts.page.html', + styleUrls: ['./group-contacts.page.scss'], +}) +export class GroupContactsPage implements OnInit { + showLoader: boolean; + users = []; + + contact: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"]; + + headers: HttpHeaders; + options:any; + + contacts: Contact[] = [ + { + first: 'Ana', + last: 'Manuel', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Abdullah', + last: 'Hill', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Batur', + last: 'Oymen', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Bianca', + last: 'Costa', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Zaya', + last: 'Mary', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Tiago', + last: 'Kayaya', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + } +]; + + constructor( + private modalController: ModalController, + private http: HttpClient, + ) + { + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Access-Control-Allow-Origin' , '*'); + this.headers = this.headers.set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT'); + this.headers = this.headers.set('Accept','application/json'); + this.headers = this.headers.set('content-type','application/json'); + + + } + + ngOnInit() { + this.loadUsers(); + + } + + loadUsers(){ + this.options = { + headers: this.headers, + }; + /* this.http.get('https://randomuser.me/api/?results=100', this.options) + .subscribe(res => { + this.users = res['results'].sort((a,b) => { + if(a.name.first < b.name.first){ + return -1; + } + if(a.name.first > b.name.first){ + return 1; + } + return 0; + }); + console.log(res); + console.log(this.users); + }); */ + this.users = this.contacts.sort((a,b) => { + if(a.first < b.first){ + return -1; + } + if(a.first > b.first){ + return 1; + } + return 0; + }); + } + + separateLetter(record, recordIndex, records){ + /* if(recordIndex == 0){ + return record.name.first[0]; + } + + let first_prev = records[recordIndex - 1].name.first[0]; + let first_current = record.name.first[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; */ + if(recordIndex == 0){ + return record.first[0]; + } + + let first_prev = records[recordIndex - 1].first[0]; + let first_current = record.first[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; + } + + doRefresh(event){ + + } + close(){ + this.modalController.dismiss(); + } + onChange(event){ + + } + clicked(){ + console.log('clicked'); + + } + async groupMessages(){ + const modal = await this.modalController.create({ + component: GroupMessagesPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + await modal.present(); + + modal.onDidDismiss(); + } + +} diff --git a/src/app/pages/chat/group-messages/group-messages-routing.module.ts b/src/app/pages/chat/group-messages/group-messages-routing.module.ts new file mode 100644 index 000000000..708ec8d8f --- /dev/null +++ b/src/app/pages/chat/group-messages/group-messages-routing.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { GroupMessagesPage } from './group-messages.page'; + +const routes: Routes = [ + { + path: '', + component: GroupMessagesPage + }, { + path: 'group-contacts', + loadChildren: () => import('./group-contacts/group-contacts.module').then( m => m.GroupContactsPageModule) + } + +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class GroupMessagesPageRoutingModule {} diff --git a/src/app/pages/chat/group-messages/group-messages.module.ts b/src/app/pages/chat/group-messages/group-messages.module.ts new file mode 100644 index 000000000..204590b92 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-messages.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { GroupMessagesPageRoutingModule } from './group-messages-routing.module'; + +import { GroupMessagesPage } from './group-messages.page'; +import { SharedModule } from 'src/app/shared/shared.module'; +import { PopoverModule } from 'src/app/shared/popover/chat-popover/popover.modules'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + PopoverModule, + GroupMessagesPageRoutingModule + ], + declarations: [GroupMessagesPage] +}) +export class GroupMessagesPageModule {} diff --git a/src/app/pages/chat/group-messages/group-messages.page.html b/src/app/pages/chat/group-messages/group-messages.page.html new file mode 100644 index 000000000..ca0a8e4b8 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-messages.page.html @@ -0,0 +1,114 @@ + + + + + + + Grupo de Trabalho A + + + + + + + + + + + + {{contact}} + + + + + + + + + + + Esta conversa passou a grupo + A conversa original mantêm-se como chat individual + + + + + Secretário Assuntos sociais + 14:23 + + + + Investidura Filipe Nyusi + + + + + Secretário Assuntos sociais + 14:23 + + + Caros colegas, partilho o momento de confraternização do presidente Filipe Nyusi e de dua excelência, o presidente da república + + + + + Presidente da República + 14:23 + + + Pois é, momentos históricos + + + + + Ministro do interior + 16:23 + + + Grande momento + + + + + Secretário Assuntos sociais + 14:23 + + + Caros colegas, partilho o momento de confraternização do presidente Filipe Nyusi e de dua excelência, o presidente da república + + + + + Secretário Assuntos sociais + 14:23 + + + Caros colegas, partilho o momento de confraternização do presidente Filipe Nyusi e de dua excelência, o presidente da república + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/pages/chat/group-messages/group-messages.page.scss b/src/app/pages/chat/group-messages/group-messages.page.scss new file mode 100644 index 000000000..cbe5a62e7 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-messages.page.scss @@ -0,0 +1,162 @@ +@import '~src/function.scss'; +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .header-top{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + background: #fff; + .middle{ + padding: 0!important; + float: left; + width: 280px; + margin: 2.5px 0 0 5px; + } + .right{ + padding: 0!important; + float: right; + font-size: 25px; + color: #0782c9; + margin: 5px 0 0 0; + } + } + .header-bottom{ + width: 310px; + overflow: auto; + margin: 0 auto; + + .header-bottom-icon{ + width: 30px; + font-size: 25px; + float: left; + padding: 2px; + + } + .header-bottom-contacts{ + width: 275px; + font-size: 15px; + color: #797979; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + float: left; + padding: 5px; + margin: 1px; + } + } + + .title{ + font-size: 25px; + } + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + } + } + ion-content{ + .welcome-text{ + /* width: 322px; */ + width: em(422px); + background: #ebebeb; + text-align: center; + font-size: 13px; + color: #797979; + padding: 10px; + margin: 0 auto; + line-height: 1.2rem; + margin: 20px 39px 25px; + border-radius: 8px; + } + .messages{ + font-size: 13px; + font-family: Roboto; + overflow: auto; + + .incoming, .outgoing{ + width: 305px; + padding: 15px 20px; + border-radius: 10px; + } + + .incoming{ + margin: 10px 75px 10px 20px; + background: #ebebeb; + float: left; + + } + } + .outgoing{ + margin: 10px 20px 10px 75px; + background: #e4f4fe; + float: right; + } + .title{ + color: #0782c9; + + font-weight: bold; + margin-bottom: 5px; + + .time{ + color: #797979; + text-align: right; + float: right; + } + } + } + + ion-footer{ + .row{ + width: 380px; + margin: 0 auto; + } + + .chat-icon-options{ + display:block !important; + font-size: 25px; + float: right !important; + margin-top: 10px; + } + + .chat-icon-send{ + font-size: 45px; + margin: 0 auto; + margin-top: 4px; + } + + .type-message{ + display: flex; + border: 1px solid #ebebeb; + border-radius: 25px; + padding-left: 15px; + align-items: center; + overflow: auto; + + ion-textarea{ + margin: 0 !important; + align-self: center; + } + } + } \ No newline at end of file diff --git a/src/app/pages/chat/group-messages/group-messages.page.spec.ts b/src/app/pages/chat/group-messages/group-messages.page.spec.ts new file mode 100644 index 000000000..62c380096 --- /dev/null +++ b/src/app/pages/chat/group-messages/group-messages.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { GroupMessagesPage } from './group-messages.page'; + +describe('GroupMessagesPage', () => { + let component: GroupMessagesPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GroupMessagesPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(GroupMessagesPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/group-messages/group-messages.page.ts b/src/app/pages/chat/group-messages/group-messages.page.ts new file mode 100644 index 000000000..5399545da --- /dev/null +++ b/src/app/pages/chat/group-messages/group-messages.page.ts @@ -0,0 +1,84 @@ +import { Component, OnInit } from '@angular/core'; +import { ActionSheetController, MenuController, ModalController, PopoverController } from '@ionic/angular'; +import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page'; +import { ChatPopoverPage } from 'src/app/shared/popover/chat-popover/chat-popover.page'; +import { ContactsPage } from '../new-group/contacts/contacts.page'; +import { NewGroupPage } from '../new-group/new-group.page'; + +@Component({ + selector: 'app-group-messages', + templateUrl: './group-messages.page.html', + styleUrls: ['./group-messages.page.scss'], +}) +export class GroupMessagesPage implements OnInit { + + message:any; + contacts: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"]; + + constructor( + private menu: MenuController, + private modalController: ModalController, + private actionSheetController: ActionSheetController, + public popoverController: PopoverController, + ) { } + + ngOnInit() { + } + + async actionSheet() { + const actionSheet = await this.actionSheetController.create({ + cssClass: 'my-custom-class', + buttons: [{ + text: 'Sair do grupo', + handler: () => { + console.log('Delete clicked'); + } + }, { + text: 'Alterar nome do grupo', + handler: () => { + console.log('Share clicked'); + } + }, { + text: 'Apagar o grupo', + handler: () => { + console.log('Play clicked'); + } + }, + ] + }); + await actionSheet.present(); + } + + async openOptions(ev: any) { + const popover = await this.popoverController.create({ + component: ChatPopoverPage, + cssClass: 'chat-popover', + event: ev, + translucent: true + }); + return await popover.present(); + } + async openChatOptions(ev: any) { + const popover = await this.popoverController.create({ + component: ChatOptionsPopoverPage, + cssClass: 'chat-options-popover', + event: ev, + translucent: true + }); + return await popover.present(); + } + async addContacts(){ + const modal = await this.modalController.create({ + component: ContactsPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + await modal.present(); + + modal.onDidDismiss(); + } + + +} diff --git a/src/app/pages/chat/messages/contacts/contacts-routing.module.ts b/src/app/pages/chat/messages/contacts/contacts-routing.module.ts new file mode 100644 index 000000000..fb8c7a5ea --- /dev/null +++ b/src/app/pages/chat/messages/contacts/contacts-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ContactsPage } from './contacts.page'; + +const routes: Routes = [ + { + path: '', + component: ContactsPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ContactsPageRoutingModule {} diff --git a/src/app/pages/chat/messages/contacts/contacts.module.ts b/src/app/pages/chat/messages/contacts/contacts.module.ts new file mode 100644 index 000000000..8284984be --- /dev/null +++ b/src/app/pages/chat/messages/contacts/contacts.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ContactsPageRoutingModule } from './contacts-routing.module'; + +import { ContactsPage } from './contacts.page'; +import { SharedModule } from 'src/app/shared/shared.module'; +import { PipesModule } from 'src/app/pipes/pipes.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + PipesModule, + ContactsPageRoutingModule + ], + declarations: [ContactsPage] +}) +export class ContactsPageModule {} diff --git a/src/app/pages/chat/messages/contacts/contacts.page.html b/src/app/pages/chat/messages/contacts/contacts.page.html new file mode 100644 index 000000000..b2f8e9705 --- /dev/null +++ b/src/app/pages/chat/messages/contacts/contacts.page.html @@ -0,0 +1,46 @@ + + + + + + + + + Nova Conversa + + + + + + + + + + + + + + + + + + + + + + + {{header}} + + + + {{user.name}} + + + + + + + + + + diff --git a/src/app/pages/chat/messages/contacts/contacts.page.scss b/src/app/pages/chat/messages/contacts/contacts.page.scss new file mode 100644 index 000000000..1eb104bdb --- /dev/null +++ b/src/app/pages/chat/messages/contacts/contacts.page.scss @@ -0,0 +1,136 @@ + +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + .title-content{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + } + + .back-icon{ + width: 37px; + float: left; + font-size: 35px; + overflow: auto; + + } + .div-title{ + width: 221px; + padding: 0!important; + float: left; + margin: 2.5px 0 0 5px; + } + .title{ + font-size: 25px; + } + } + } + .toolbar-search{ + --padding-top:0 !important; + --padding-bottom:0 !important; + --padding-start:0 !important; + --padding-end:0 !important; + + .search{ + border: 1px solid #ebebeb; + margin: 5px 20px 5px 20px; + border-radius: 5px; + height: auto; + padding: 0 !important; + } + .search ion-searchbar{ + /* border: 1px solid green; */ + width: 100%; + margin: 0 !important; + padding: 0 !important; + --border-radius: 5px; + --box-shadow: none; + overflow: hidden; + --icon-color:#0d89d1; + } + + } + ion-content{ + --background:transparent; + } + .main-content{ + width: 100%; + height: 100%; + font-family: Roboto; + margin: 0 auto; + background-color: #fff; + overflow:auto; + padding: 0 0 0 0; + + .item-divider{ + background: #ebebeb; + font-size: 15px; + margin: 10px 0 10px 0; + padding:5px 0 5px 20px; + + } + + .item-user{ + display: flex; + margin: 10px 20px 10px 20px !important; + overflow: auto; + align-items: center; + } + + .item-user p{ + display: block; + margin: 0 !important; + width: 90%; + font-size: 15px; + color: #0d89d1; + float: left; + } + .item-user .icon{ + width: 10%; + font-size: 10px; + display: block; + text-align: right; + overflow: auto; + } + .online{ + color:#99e47b; + } + .offline{ + color:#cbced1; + } + .away{ + color:#ffd21f; + } + .invisible{ + color:#cbced1; + } + .busy{ + color:#f5455c; + } + } \ No newline at end of file diff --git a/src/app/pages/chat/messages/contacts/contacts.page.spec.ts b/src/app/pages/chat/messages/contacts/contacts.page.spec.ts new file mode 100644 index 000000000..8f263232b --- /dev/null +++ b/src/app/pages/chat/messages/contacts/contacts.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ContactsPage } from './contacts.page'; + +describe('ContactsPage', () => { + let component: ContactsPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ContactsPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ContactsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/messages/contacts/contacts.page.ts b/src/app/pages/chat/messages/contacts/contacts.page.ts new file mode 100644 index 000000000..ff86e8d5b --- /dev/null +++ b/src/app/pages/chat/messages/contacts/contacts.page.ts @@ -0,0 +1,153 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Component, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { AuthService } from 'src/app/services/auth.service'; +import { ChatService } from 'src/app/services/chat.service'; +import { GroupMessagesPage } from '../../group-messages/group-messages.page'; +import { MessagesPage } from '../messages.page'; + +@Component({ + selector: 'app-contacts', + templateUrl: './contacts.page.html', + styleUrls: ['./contacts.page.scss'], +}) +export class ContactsPage implements OnInit { + showLoader: boolean; + loggedUser: any; + users = []; + + headers: HttpHeaders; + options:any; + contacts:any; + textSearch:string; + room:any; + dm:any; + + constructor( + private modalController: ModalController, + private http: HttpClient, + private chatService: ChatService, + private authService: AuthService, + ) + { + this.authService.userData$.subscribe((res:any)=>{ + this.loggedUser=res; + }); + this.textSearch=""; + this.dm=null; + this.room=null; + } + + ngOnInit() { + this.loadUsers(); + + } + onChange(event){ + this.textSearch = event.detail.value; + } + + loadUsers(){ + this.options = { + headers: this.headers, + }; + this.chatService.getAllUsers().subscribe((res:any)=>{ + console.log(res.users); + this.contacts = res.users.filter(data => data.username != this.loggedUser.me.username); + this.users = this.contacts.sort((a,b) => { + if(a.name < b.name){ + return -1; + } + if(a.name > b.name){ + return 1; + } + return 0; + }); + this.showLoader = false; + }); + } + + separateLetter(record, recordIndex, records){ + if(recordIndex == 0){ + return record.name[0]; + } + + let first_prev = records[recordIndex - 1].name[0]; + let first_current = record.name[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; + } + + doRefresh(event){ + } + + close(){ + this.modalController.dismiss(); + } + + clicked(){ + console.log('clicked'); + } + + createRoom(username:string){ + let body = { + username: username, + } + this.chatService.createRoom(body).subscribe(res => { + console.log(res); + this.room = res['room']; + this.getDirectMessage(this.room._id); + }); + } + getDirectMessage(roomId:any){ + console.log(roomId); + + this.chatService.getAllDirectMessages().subscribe(res=>{ + let result = res['ims'].filter(data => data._id == roomId); + this.dm = result[0]; + console.log(this.dm); + this.openModal(this.dm); + }); + } + async openModal(dm:any){ + this.close(); + console.log(dm); + + const modal = await this.modalController.create({ + component: MessagesPage, + cssClass: 'group-messages', + backdropDismiss: false, + componentProps: { + dm: dm, + }, + }); + await modal.present(); + modal.onDidDismiss(); + } + + async openMessages(username:string){ + /* this.close(); */ + + let dm:any; + //Create new room + this.createRoom(username); + //Get direct messages (dm) + /* this.getDirectMessage(this.room._id); */ + console.log(this.dm); + + + /* const modal = await this.modalController.create({ + component: MessagesPage, + cssClass: 'group-messages', + backdropDismiss: false, + componentProps: { + dm: dm, + }, + }); + await modal.present(); + modal.onDidDismiss(); */ + } + +} diff --git a/src/app/pages/chat/messages/messages-routing.module.ts b/src/app/pages/chat/messages/messages-routing.module.ts new file mode 100644 index 000000000..c00bd5ccb --- /dev/null +++ b/src/app/pages/chat/messages/messages-routing.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { MessagesPage } from './messages.page'; + +const routes: Routes = [ + { + path: '', + component: MessagesPage + }, { + path: 'contacts', + loadChildren: () => import('./contacts/contacts.module').then( m => m.ContactsPageModule) + } + +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MessagesPageRoutingModule {} diff --git a/src/app/pages/chat/messages/messages.module.ts b/src/app/pages/chat/messages/messages.module.ts new file mode 100644 index 000000000..c933f79fe --- /dev/null +++ b/src/app/pages/chat/messages/messages.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { MessagesPageRoutingModule } from './messages-routing.module'; + +import { MessagesPage } from './messages.page'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + MessagesPageRoutingModule + ], + declarations: [MessagesPage] +}) +export class MessagesPageModule {} diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html new file mode 100644 index 000000000..76c20b2f0 --- /dev/null +++ b/src/app/pages/chat/messages/messages.page.html @@ -0,0 +1,113 @@ + + + + + + + {{users.name}} + + + + + + + + + + + + Adicionar contacto + + + + + + + + + + + + + {{msg.u.name}} + {{msg._updatedAt | date: 'HH:mm' }} + + + {{msg.msg}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/pages/chat/messages/messages.page.scss b/src/app/pages/chat/messages/messages.page.scss new file mode 100644 index 000000000..c485116ff --- /dev/null +++ b/src/app/pages/chat/messages/messages.page.scss @@ -0,0 +1,194 @@ +@import '~src/function.scss'; +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .header-top{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + background: #fff; + .middle{ + padding: 0!important; + float: left; + width: 280px; + margin: 2.5px 0 0 5px; + display: flex; + align-items: center; + + } + .right{ + padding: 0!important; + float: right; + font-size: 25px; + color: #0782c9; + margin: 5px 0 0 0; + } + } + .header-bottom{ + width: 310px; + overflow: auto; + margin: 0 auto; + + .header-bottom-icon{ + width: 30px; + font-size: 25px; + float: left; + padding: 2px; + + } + .header-bottom-contacts{ + width: 275px; + font-size: 15px; + color: #797979; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + float: left; + padding: 5px; + margin: 1px; + } + } + + .title{ + font-size: 25px; + overflow: auto; + float: left; + } + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + } + } + ion-content{ + .welcome-text{ + /* width: 322px; */ + width: em(422px); + background: #ebebeb; + text-align: center; + font-size: 13px; + color: #797979; + padding: 10px; + margin: 0 auto; + line-height: 1.2rem; + margin: 20px 39px 25px; + border-radius: 8px; + } + .messages{ + font-size: 13px; + font-family: Roboto; + overflow: auto; + + //set scroll do bottom + position: absolute; + top: 0; + left: 0; + overflow-x: hidden; + overflow-y: auto; + width: 100%; + height: 100%; + word-wrap: break-word; + -webkit-overflow-scrolling: touch; + + + .incoming-true, .incoming-false{ + width: 305px; + padding: 15px 20px; + border-radius: 10px; + + } + + .incoming-true{ + margin: 10px 75px 10px 20px; + background: #ebebeb; + float: left; + + } + } + .incoming-false{ + margin: 10px 20px 10px 75px; + background: #e4f4fe; + float: right; + } + .title{ + display: inline; + color: #0782c9; + font-weight: bold; + margin-bottom: 5px; + + .time{ + color: #797979; + text-align: right; + float: right; + } + } + } + + ion-footer{ + .row{ + width: 380px; + margin: 0 auto; + } + + .chat-icon-options{ + display:block !important; + font-size: 25px; + float: right !important; + margin-top: 10px; + } + + .chat-icon-send{ + font-size: 45px; + margin: 0 auto; + margin-top: 4px; + } + + .type-message{ + display: flex; + border: 1px solid #ebebeb; + border-radius: 25px; + padding-left: 15px; + align-items: center; + overflow: auto; + + ion-textarea{ + margin: 0 !important; + align-self: center; + } + } + } + + .text-color-blue{ + font-size: 15px; + color: #0782c9; + font-weight: 500; + letter-spacing: normal; + } + .user-status-online{ + display: block; + float: left; + color:#99e47b; + padding-left: 10px; + } + \ No newline at end of file diff --git a/src/app/pages/chat/messages/messages.page.spec.ts b/src/app/pages/chat/messages/messages.page.spec.ts new file mode 100644 index 000000000..826962a23 --- /dev/null +++ b/src/app/pages/chat/messages/messages.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { MessagesPage } from './messages.page'; + +describe('MessagesPage', () => { + let component: MessagesPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MessagesPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(MessagesPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts new file mode 100644 index 000000000..ce5a3f1a5 --- /dev/null +++ b/src/app/pages/chat/messages/messages.page.ts @@ -0,0 +1,144 @@ +import { AfterViewChecked, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { ModalController, NavParams, PopoverController } from '@ionic/angular'; +import { Status } from 'src/app/models/chat/status.model'; +import { AuthService } from 'src/app/services/auth.service'; +import { ChatService } from 'src/app/services/chat.service'; +import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page'; +import { MessagesOptionsPage } from 'src/app/shared/popover/messages-options/messages-options.page'; +import { ContactsPage } from '../new-group/contacts/contacts.page'; + +@Component({ + selector: 'app-messages', + templateUrl: './messages.page.html', + styleUrls: ['./messages.page.scss'], +}) +export class MessagesPage implements OnInit, AfterViewChecked { + + @ViewChild('scrollMe') private myScrollContainer: ElementRef; + + loggedUser: any; + + message = ''; + messages:any; + dm:any; + userPresence=''; + dmUsers:any; + + + constructor( + public popoverController: PopoverController, + private modalController: ModalController, + private navParams: NavParams, + private chatService: ChatService, + private authService: AuthService, + ) { + this.dm = this.navParams.get('dm'); + } + + ngOnInit() { + + this.scrollToBottom(); + + this.authService.userData$.subscribe((res:any)=>{ + this.loggedUser=res; + console.log(this.loggedUser); + }); + + /* console.log(this.dm); */ + + setInterval(()=>{ + this.checkUserPresence(); + this.loadMessages(); + }, 2000); + + this.getChatMembers(); + + + } + loadUser(){ + console.log('working'); + + } + ngAfterViewChecked() { + this.scrollToBottom(); + } + scrollToBottom(): void { + try { + this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; + } catch(err) { } + } + loadMoreMessages(ev:any){ + + } + + checkUserPresence(){ + this.chatService.getUserPresence(this.dm.lastMessage.u._id).subscribe(res=>{ + this.userPresence = res['presence']; + }); + } + sendMessage(){ + + let body = { + "message": + { + "rid": this.dm._id, "msg": this.message + } + } + + this.chatService.sendMessage(body).subscribe(res=> { + this.loadMessages(); + }); + this.message = ""; + } + + loadMessages(){ + this.chatService.getRoomMessages(this.dm._id).subscribe(res => { + /* console.log(res); */ + this.messages = res['messages'].reverse(); + }) + } + getChatMembers(){ + this.chatService.getMembers(this.dm._id).subscribe(res=> { + this.dmUsers = res['members'].filter(data => data.username != this.loggedUser.me.username) + console.log(res); + console.log(this.dmUsers); + }); + } + + async openMessagesOptions(ev: any) { + const popover = await this.popoverController.create({ + component: MessagesOptionsPage, + componentProps: { + roomId: this.dm._id, + }, + cssClass: 'messages-options', + event: ev, + translucent: true, + }); + return await popover.present(); + } + + async addContacts(){ + const modal = await this.modalController.create({ + component: ContactsPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + await modal.present(); + + modal.onDidDismiss(); + } + + async openChatOptions(ev: any) { + const popover = await this.popoverController.create({ + component: ChatOptionsPopoverPage, + cssClass: 'chat-options-popover', + event: ev, + translucent: true + }); + return await popover.present(); + } + +} diff --git a/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts b/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts new file mode 100644 index 000000000..fb8c7a5ea --- /dev/null +++ b/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ContactsPage } from './contacts.page'; + +const routes: Routes = [ + { + path: '', + component: ContactsPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ContactsPageRoutingModule {} diff --git a/src/app/pages/chat/new-group/contacts/contacts.module.ts b/src/app/pages/chat/new-group/contacts/contacts.module.ts new file mode 100644 index 000000000..13749fd57 --- /dev/null +++ b/src/app/pages/chat/new-group/contacts/contacts.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ContactsPageRoutingModule } from './contacts-routing.module'; + +import { ContactsPage } from './contacts.page'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + ContactsPageRoutingModule + ], + declarations: [ContactsPage] +}) +export class ContactsPageModule {} diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.html b/src/app/pages/chat/new-group/contacts/contacts.page.html new file mode 100644 index 000000000..5120198ad --- /dev/null +++ b/src/app/pages/chat/new-group/contacts/contacts.page.html @@ -0,0 +1,53 @@ + + + + + + + + + Contactos + + + + + + + + + + + + + + + + + + + + + + + + + + {{header}} + + + + + {{user.first}} {{user.last}} + + + + + + + + + diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.scss b/src/app/pages/chat/new-group/contacts/contacts.page.scss new file mode 100644 index 000000000..c97008f82 --- /dev/null +++ b/src/app/pages/chat/new-group/contacts/contacts.page.scss @@ -0,0 +1,127 @@ + +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + .title-content{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + } + + .back-icon{ + width: 37px; + float: left; + font-size: 35px; + overflow: auto; + + } + .div-title{ + width: 221px; + padding: 0!important; + float: left; + margin: 2.5px 0 0 5px; + } + .title{ + font-size: 25px; + } + } +} +.toolbar-search{ + --padding-top:0 !important; + --padding-bottom:0 !important; + --padding-start:0 !important; + --padding-end:0 !important; + + .search{ + border: 1px solid #ebebeb; + margin: 5px 20px 5px 20px; + border-radius: 5px; + } + .search ion-searchbar{ + /* border: 1px solid green; */ + width: 100%; + margin: 0 !important; + padding: 0 !important; + --border-radius: 5px; + --box-shadow: none; + overflow: auto; + --icon-color:#0d89d1; + } + +} +ion-content{ + --background:transparent; +} +.main-content{ + width: 100%; + height: 100%; + font-family: Roboto; + margin: 0 auto; + background-color: #fff; + overflow:auto; + padding: 0 0 0 0; + + .item-divider{ + background: #ebebeb; + font-size: 15px; + margin: 10px 0 10px 0; + padding:5px 0 5px 20px; + + } + + .item-checkbox{ + display: flex; + margin: 10px 20px 10px 20px !important; + overflow: auto; + align-items: center; + + } + + .item-checkbox ion-checkbox{ + --border-color: #0d89d1; + --background-checked:#0d89d1; + float: left; + } + + .item-checkbox p{ + display: block; + margin: 0 !important; + width: 330px; + padding-left: 10px; + font-size: 15px; + color: #0d89d1; + float: left; + } + .item-checkbox ion-icon{ + font-size: 10px; + float: left; + color:#99e47b; + margin-left: 10px; + } + } + diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts b/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts new file mode 100644 index 000000000..8f263232b --- /dev/null +++ b/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ContactsPage } from './contacts.page'; + +describe('ContactsPage', () => { + let component: ContactsPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ContactsPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ContactsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.ts b/src/app/pages/chat/new-group/contacts/contacts.page.ts new file mode 100644 index 000000000..b2d114651 --- /dev/null +++ b/src/app/pages/chat/new-group/contacts/contacts.page.ts @@ -0,0 +1,152 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Component, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { GroupMessagesPage } from '../../group-messages/group-messages.page'; + +@Component({ + selector: 'app-contacts', + templateUrl: './contacts.page.html', + styleUrls: ['./contacts.page.scss'], +}) +export class ContactsPage implements OnInit { + showLoader: boolean; + users = []; + + contact: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"]; + + headers: HttpHeaders; + options:any; + + contacts: Contact[] = [ + { + first: 'Ana', + last: 'Manuel', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Abdullah', + last: 'Hill', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Batur', + last: 'Oymen', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Bianca', + last: 'Costa', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Zaya', + last: 'Mary', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + }, + { + first: 'Tiago', + last: 'Kayaya', + url: 'https://randomuser.me/api/portraits/med/women/54.jpg', + } +]; + + constructor( + private modalController: ModalController, + private http: HttpClient, + ) + { + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Access-Control-Allow-Origin' , '*'); + this.headers = this.headers.set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT'); + this.headers = this.headers.set('Accept','application/json'); + this.headers = this.headers.set('content-type','application/json'); + + + } + + ngOnInit() { + this.loadUsers(); + + } + + loadUsers(){ + this.options = { + headers: this.headers, + }; + /* this.http.get('https://randomuser.me/api/?results=100', this.options) + .subscribe(res => { + this.users = res['results'].sort((a,b) => { + if(a.name.first < b.name.first){ + return -1; + } + if(a.name.first > b.name.first){ + return 1; + } + return 0; + }); + console.log(res); + console.log(this.users); + }); */ + this.users = this.contacts.sort((a,b) => { + if(a.first < b.first){ + return -1; + } + if(a.first > b.first){ + return 1; + } + return 0; + }); + } + + separateLetter(record, recordIndex, records){ + /* if(recordIndex == 0){ + return record.name.first[0]; + } + + let first_prev = records[recordIndex - 1].name.first[0]; + let first_current = record.name.first[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; */ + if(recordIndex == 0){ + return record.first[0]; + } + + let first_prev = records[recordIndex - 1].first[0]; + let first_current = record.first[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; + } + + doRefresh(event){ + + } + close(){ + this.modalController.dismiss(); + } + onChange(event){ + + } + clicked(){ + console.log('clicked'); + + } + async groupMessages(){ + const modal = await this.modalController.create({ + component: GroupMessagesPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + await modal.present(); + + modal.onDidDismiss(); + } + +} diff --git a/src/app/pages/chat/new-group/group-chat/group-chat-routing.module.ts b/src/app/pages/chat/new-group/group-chat/group-chat-routing.module.ts new file mode 100644 index 000000000..d88c349d7 --- /dev/null +++ b/src/app/pages/chat/new-group/group-chat/group-chat-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { GroupChatPage } from './group-chat.page'; + +const routes: Routes = [ + { + path: '', + component: GroupChatPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class GroupChatPageRoutingModule {} diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.module.ts b/src/app/pages/chat/new-group/group-chat/group-chat.module.ts new file mode 100644 index 000000000..a86458890 --- /dev/null +++ b/src/app/pages/chat/new-group/group-chat/group-chat.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { GroupChatPageRoutingModule } from './group-chat-routing.module'; + +import { GroupChatPage } from './group-chat.page'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + GroupChatPageRoutingModule + ], + declarations: [GroupChatPage] +}) +export class GroupChatPageModule {} diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.html b/src/app/pages/chat/new-group/group-chat/group-chat.page.html new file mode 100644 index 000000000..4dfad122a --- /dev/null +++ b/src/app/pages/chat/new-group/group-chat/group-chat.page.html @@ -0,0 +1,17 @@ + + + + + + + Novo Grupo + + + + + + + + + + diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.scss b/src/app/pages/chat/new-group/group-chat/group-chat.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.spec.ts b/src/app/pages/chat/new-group/group-chat/group-chat.page.spec.ts new file mode 100644 index 000000000..641898e82 --- /dev/null +++ b/src/app/pages/chat/new-group/group-chat/group-chat.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { GroupChatPage } from './group-chat.page'; + +describe('GroupChatPage', () => { + let component: GroupChatPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GroupChatPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(GroupChatPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.ts b/src/app/pages/chat/new-group/group-chat/group-chat.page.ts new file mode 100644 index 000000000..c34b5eec7 --- /dev/null +++ b/src/app/pages/chat/new-group/group-chat/group-chat.page.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-group-chat', + templateUrl: './group-chat.page.html', + styleUrls: ['./group-chat.page.scss'], +}) +export class GroupChatPage implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/pages/chat/new-group/new-group-routing.module.ts b/src/app/pages/chat/new-group/new-group-routing.module.ts new file mode 100644 index 000000000..42b9b7e24 --- /dev/null +++ b/src/app/pages/chat/new-group/new-group-routing.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { NewGroupPage } from './new-group.page'; + +const routes: Routes = [ + { + path: '', + component: NewGroupPage + }, + { + path: 'contacts', + loadChildren: () => import('./contacts/contacts.module').then( m => m.ContactsPageModule) + }, + { + path: 'group-chat', + loadChildren: () => import('./group-chat/group-chat.module').then( m => m.GroupChatPageModule) + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class NewGroupPageRoutingModule {} diff --git a/src/app/pages/chat/new-group/new-group.module.ts b/src/app/pages/chat/new-group/new-group.module.ts new file mode 100644 index 000000000..97006324c --- /dev/null +++ b/src/app/pages/chat/new-group/new-group.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { NewGroupPageRoutingModule } from './new-group-routing.module'; + +import { NewGroupPage } from './new-group.page'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + SharedModule, + NewGroupPageRoutingModule + ], + declarations: [NewGroupPage] +}) +export class NewGroupPageModule {} diff --git a/src/app/pages/chat/new-group/new-group.page.html b/src/app/pages/chat/new-group/new-group.page.html new file mode 100644 index 000000000..5dbfe0769 --- /dev/null +++ b/src/app/pages/chat/new-group/new-group.page.html @@ -0,0 +1,39 @@ + + + + + + + + + Novo Grupo + + + + + + + + + + + + + + + Grupo Ultra-secreto + + + + + + + + + + + + + + + diff --git a/src/app/pages/chat/new-group/new-group.page.scss b/src/app/pages/chat/new-group/new-group.page.scss new file mode 100644 index 000000000..d05552f41 --- /dev/null +++ b/src/app/pages/chat/new-group/new-group.page.scss @@ -0,0 +1,154 @@ +ion-content{ + --background:transparent; +} +.header-toolbar{ + --background:transparent; + --opacity: 1; +} +.div-top-header{ + width: 400px; + margin: 0 auto; + background-color: #0782c9; + overflow: auto; + padding-top: 15px; + border: 0!important; + + .div-search{ + font-size: 45px; + float: left; + margin: 0 0 0 10px + } + .div-logo{ + background: transparent; + width: 140px; + margin: 5px 0 0px 71px; + float: left; + } + .div-logo img{ + width: 100%; + } + .div-profile{ + font-size: 45px; + float: right; + margin-right: 10px; + } + + } + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .title-content{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + background: #fff; + + .left{ + width: 37px; + float: left; + font-size: 35px; + overflow: auto; + } + .middle{ + padding: 0!important; + float: left; + width: 221px; + margin: 2.5px 0 0 5px; + } + .right{ + padding: 0!important; + float: right; + font-size: 15px; + color: #0782c9; + margin: 8px 0 0 5px; + } + } + + .title{ + font-size: 25px; + } + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + + + } + .main-content{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + margin: 0 auto; + background-color: #fff; + overflow:auto; + padding: 15px 20px 0 20px; + + .item-container{ + width: 360px; + margin: 15px auto; + border: 1px solid #ebebeb; + border-radius: 5px; + padding-left: 10px; + } + + .item-container-no-border{ + display: flex; + width: 360px; + margin: 25px auto; + border-radius: 5px; + align-items: center; + } + + .item-container-no-border ion-label{ + padding-left: 10px; + font-size: 12px; + color: #000; + } + } + + .container-div{ + margin-bottom: 15px; + overflow: auto; + + .ion-item-class-2{ + width: 360px; + margin: 0px auto; + + .ion-icon-class{ + width: 45px; + height: 45px; + float: left; + padding: 10px; + font-size: 25px; + } + } + .ion-input-class{ + width: 315px; + height: 45px; + border: 1px solid #ebebeb; + border-radius: 5px; + padding-left: 5px; + padding-right: 10px; + float: left; + } + } + + + diff --git a/src/app/pages/chat/new-group/new-group.page.spec.ts b/src/app/pages/chat/new-group/new-group.page.spec.ts new file mode 100644 index 000000000..2cb166ecd --- /dev/null +++ b/src/app/pages/chat/new-group/new-group.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { NewGroupPage } from './new-group.page'; + +describe('NewGroupPage', () => { + let component: NewGroupPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NewGroupPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(NewGroupPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/chat/new-group/new-group.page.ts b/src/app/pages/chat/new-group/new-group.page.ts new file mode 100644 index 000000000..4cd6e03be --- /dev/null +++ b/src/app/pages/chat/new-group/new-group.page.ts @@ -0,0 +1,174 @@ +import { analyzeAndValidateNgModules } from '@angular/compiler'; +import { Component, OnInit } from '@angular/core'; +import { ModalController, PickerController, PopoverController } from '@ionic/angular'; +import { GroupDurationPage } from 'src/app/shared/popover/group-duration/group-duration.page'; +import { ContactsPage } from './contacts/contacts.page'; + +@Component({ + selector: 'app-new-group', + templateUrl: './new-group.page.html', + styleUrls: ['./new-group.page.scss'], +}) +export class NewGroupPage implements OnInit { + showLoader: boolean; + displayDuration: any; + showDuration: boolean; + selectedDuration = ['','','']; + + constructor( + private pickerController: PickerController, + private popoverController: PopoverController, + private modalController: ModalController, + ) { + + } + + ngOnInit() { + + } + _ionChange(event){ + this.showDuration = event.detail.checked; + } + close(){ + this.modalController.dismiss(); + } + + async addContacts(){ + const modal = await this.modalController.create({ + component: ContactsPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + await modal.present(); + + modal.onDidDismiss(); + } + + async setDuration(ev: any) { + const popover = await this.popoverController.create({ + component: GroupDurationPage, + cssClass: 'group-duration', + event: ev, + translucent: true + }); + return await popover.present(); + } + + async showPicker(){ + const picker = await this.pickerController.create({ + cssClass: '', + buttons: [ + { + text: 'Cancelar', role: 'cancel', cssClass: 'btn-cancel' + }, + { + text: 'Ok', + cssClass: 'btn-cancel', + handler:(value:any)=>{ + console.log('button done pressed'); + this.selectedDuration = [ + value.days.value, + value.hours.value, + value.minutes.value, + ] + console.log(this.selectedDuration); + if(value.days.value != null && value.hours.value != null && value.minutes.value != null){ + if(value.days.value > 0){ + if(value.days.value == 1){ + if(value.hours.value == 1){ + this.displayDuration = value.days.value + " day " + + value.hours.value + " hora " + + value.minutes.value + " minutos"; + } + else{ + this.displayDuration = value.days.value + " days " + + value.hours.value + " horas " + + value.minutes.value + " minutos"; + } + } + else{ + if(value.hours.value == 1){ + this.displayDuration = value.days.value + " days " + + value.hours.value + " hora " + + value.minutes.value + " minutos"; + } + else{ + this.displayDuration = value.days.value + " days " + + value.hours.value + " horas " + + value.minutes.value + " minutos"; + } + } + } + else{ + if(value.hours.value == 1){ + this.displayDuration = value.hours.value + " hora " + + value.minutes.value + " minutos"; + } + else{ + this.displayDuration = value.hours.value + " horas " + + value.minutes.value + " minutos"; + } + } + } + }, + }, + ], + columns: [ + { + name: 'days', + prefix: 'Dias', + options: [ + { text: '0', value: 0 }, + { text: '1', value: 1 }, + { text: '2', value: 2 }, + { text: '3', value: 3 }, + { text: '4', value: 4 }, + ] + }, + { + name: 'hours', + prefix: 'Horas', + options: [ + { text: '0', value: 0 }, + { text: '1', value: 1 }, + { text: '2', value: 2 }, + { text: '3', value: 3 }, + { text: '4', value: 4 }, + { text: '5', value: 5 }, + { text: '6', value: 6 }, + { text: '7', value: 7 }, + { text: '8', value: 8 }, + ] + }, + { + name: 'minutes', + prefix: 'Minutos', + selectedIndex: 3, + options: [ + { text: '0', value: 0 }, + { text: '5', value: 5 }, + { text: '10', value: 10 }, + { text: '15', value: 15 }, + { text: '20', value: 20 }, + { text: '25', value: 25 }, + { text: '30', value: 30 }, + { text: '35', value: 35 }, + { text: '45', value: 45 }, + { text: '50', value: 50 }, + { text: '55', value: 55 }, + ] + } + ] + }); + await picker.present(); + picker.onDidDismiss().then(async data =>{ + let day = await picker.getColumn('days'); + let hour = await picker.getColumn('hours'); + let minutes = await picker.getColumn('minutes'); + }); + + } + +} diff --git a/src/app/pages/chat/newchat/newchat.module.ts b/src/app/pages/chat/newchat/newchat.module.ts index ea115e8f4..26265c661 100644 --- a/src/app/pages/chat/newchat/newchat.module.ts +++ b/src/app/pages/chat/newchat/newchat.module.ts @@ -1,4 +1,4 @@ -import { NgModule } from '@angular/core'; +import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; @@ -15,6 +15,7 @@ import { NewchatPage } from './newchat.page'; IonicModule, NewchatPageRoutingModule ], - declarations: [NewchatPage] + declarations: [NewchatPage], + schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class NewchatPageModule {} diff --git a/src/app/pages/chat/newchat/newchat.page.html b/src/app/pages/chat/newchat/newchat.page.html index 736a366e0..21194affc 100644 --- a/src/app/pages/chat/newchat/newchat.page.html +++ b/src/app/pages/chat/newchat/newchat.page.html @@ -1,20 +1,51 @@ - - - - - - Nova Conversa + + + + + + + + + Nova Conversa + + + - - - - - - {{user.name}} - - + + + + + + + + + + + + {{user.name}} + + + Tiago Kayaya + + + Gilson Manuel + + + + + {{item.$t}} + + + + + diff --git a/src/app/pages/chat/newchat/newchat.page.scss b/src/app/pages/chat/newchat/newchat.page.scss index 8759df7f9..11d380dea 100644 --- a/src/app/pages/chat/newchat/newchat.page.scss +++ b/src/app/pages/chat/newchat/newchat.page.scss @@ -1,3 +1,67 @@ +ion-content{ + --background:transparent; +} +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .div-icon{ + width: 40px; + float: right; + font-size: 35px; + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + .title-content{ + width: 360px; + margin: 0px auto; + overflow: auto; + padding: 0 !important; + } + + .back-icon{ + width: 37px; + float: left; + font-size: 35px; + overflow: auto; + + } + .div-title{ + width: 221px; + padding: 0!important; + float: left; + margin: 2.5px 0 0 5px; + } + .title{ + font-size: 25px; + } + } +} + .main-content{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + margin: 0 auto; + background-color: #fff; + overflow:auto; + padding: 15px 20px 0 20px; + } ion-searchbar{ --border-radius: 20px; -} \ No newline at end of file +} diff --git a/src/app/pages/chat/newchat/newchat.page.ts b/src/app/pages/chat/newchat/newchat.page.ts index 277d2469c..153a298ca 100644 --- a/src/app/pages/chat/newchat/newchat.page.ts +++ b/src/app/pages/chat/newchat/newchat.page.ts @@ -11,12 +11,27 @@ import { ConversationPage } from '../conversation/conversation.page'; styleUrls: ['./newchat.page.scss'], }) export class NewchatPage implements OnInit { + showLoader: boolean; userList: any[]; + contacts:any; + currentPageClass = this; + triggerAlphaScrollChange: number = 0; + constructor( private chatService: ChatService, private modalController: ModalController, - private router:Router) { } + private router:Router) { + this.contacts = [ + { + 'name': 'Affenpinscher' + }, + { + 'name': 'Afghan Hound' + }, + // ... + ]; + } result:any; searchCountryString:any; @@ -25,6 +40,16 @@ export class NewchatPage implements OnInit { ngOnInit() { this.getUsers(); } + close(){ + this.modalController.dismiss(); + } + doRefresh(event) { + this.getUsers(); + + setTimeout(() => { + event.target.complete(); + }, 2000); + } getUsers(){ this.result = this.chatService.getAllUsers().subscribe((res:any)=>{ @@ -60,6 +85,14 @@ export class NewchatPage implements OnInit { await modal.present(); modal.onDidDismiss(); } + + + onItemClick(item) { + // This is an example of how you could manually trigger ngOnChange + // for the component. If you modify "listData" it won't perform + // an ngOnChange, you will have to trigger manually to refresh the component. + this.triggerAlphaScrollChange++; + } } diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal.page.html b/src/app/pages/events/event-detail-modal/event-detail-modal.page.html index 52d1c6b52..c3179cca3 100644 --- a/src/app/pages/events/event-detail-modal/event-detail-modal.page.html +++ b/src/app/pages/events/event-detail-modal/event-detail-modal.page.html @@ -16,16 +16,16 @@ - + + //Error messages Campo obrigatório - + --> Descrição diff --git a/src/app/pages/events/events.page.ts b/src/app/pages/events/events.page.ts index 7f0702dcc..e4fb49600 100644 --- a/src/app/pages/events/events.page.ts +++ b/src/app/pages/events/events.page.ts @@ -123,13 +123,6 @@ export class EventsPage implements OnInit { event.target.complete(); } - - sortArrayISODate(myArray: any){ - return myArray.sort(function(a, b) { - return (a.Data < b.Data) ? -1 : ((a.Data > b.Data) ? 1 : 0); - }); - } - onSegmentChange(){ this.RefreshEvents(); } @@ -143,9 +136,11 @@ export class EventsPage implements OnInit { if(this.profile == "mdgpr"){ this.eventService.getAllMdEvents(formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss', 'pt') /* + ' 00:00:00' */, formatDate(new Date(), 'yyyy-MM-dd', 'pt') + ' 23:59:59').subscribe(res => { this.eventsList = res; - console.log(res) - console.log(res[0]) - this.currentEvent = res[0].Subject; + + if(res.length > 0){ + this.currentEvent = res[0].Subject; + } + this.totalEvent = this.eventsList.length; this.showLoader = false; }); @@ -266,7 +261,9 @@ export class EventsPage implements OnInit { LoadList() { this.processes.GetTasksList("Expediente", false).subscribe(result => { - this.taskslist = new Array(); + + const AllResult = new Array(); + result.forEach(element => { let task: DailyWorkTask = { "SerialNumber": element.serialNumber, @@ -276,9 +273,27 @@ export class EventsPage implements OnInit { "DocumentURL": element.formURL, "Remetente": element.workflowInstanceDataFields.Remetente } - this.taskslist.push(task); + // CreateDate + AllResult.push(task); }); + + console.log(AllResult); + + this.taskslist = this.sortArrayISODate(AllResult).reverse() + + + }); + + + } + + sortArrayISODate(myArray: any){ + return myArray.sort(function(a, b) { + return (a.CreateDate < b.CreateDate) ? -1 : ((a.CreateDate > b.CreateDate) ? 1 : 0); }); } + + + } diff --git a/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html b/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html index 5df27b85f..0fdabeb78 100644 --- a/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html +++ b/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html @@ -50,7 +50,7 @@ { + this.storageService.store(AuthConnstants.AUTH, res.data); console.log('Login to Rocket chat OK'); },(error:any) =>{ console.log('Network error'); @@ -66,7 +67,7 @@ export class LoginPage implements OnInit { async Login(){ - try { + /* try { */ //Go to our home in home/feed. //this.router.navigate(['/home/events']); if(this.validateInput()){ @@ -78,11 +79,10 @@ export class LoginPage implements OnInit { } if (await this.authService.login(this.userattempt)){ this.loginRocketChat(); - console.log('Log Gabinete Digital OK'); - this.router.navigate(['/home/events']); + this.router.navigate(['/home/events']);this.presentAlert('1'); } else - { + { //this.toastService.presentToast('Não foi possível fazer login"'); this.presentAlert('O nome de utilizador e palavra-passe estão incorretas ou verifique a sua conexão com a internet e volte a tentar.'); } @@ -91,8 +91,9 @@ export class LoginPage implements OnInit { //this.toastService.presentToast('Preencha todos campos'); this.presentAlert('Por favor, insira o seu nome de utilizador e palavra-passe.'); } - } catch (error) { - this.presentAlert('Ocorreu um erro ao fazer login. Contacte o administrador de sistema.'); - } + /* } catch (error) { + error + this.presentAlert('Ocorreu um erro ao fazer login. Contacte o administrador de sistema. '+ error); + } */ } } diff --git a/src/app/pages/publications/new-publication/new-publication.page.ts b/src/app/pages/publications/new-publication/new-publication.page.ts index ee3389064..48a448a72 100644 --- a/src/app/pages/publications/new-publication/new-publication.page.ts +++ b/src/app/pages/publications/new-publication/new-publication.page.ts @@ -10,9 +10,10 @@ import { Image } from 'src/app/models/image'; import { ThrowStmt } from '@angular/compiler'; import { PhotoService } from 'src/app/services/photo.service'; import { AlertService } from 'src/app/services/alert.service'; - +//Capacitor /* const { Camera } = Plugins; */ +//Cordova import { Camera, CameraOptions } from '@ionic-native/camera/ngx'; import { PublicationFolder } from 'src/app/models/publicationfolder'; import { ViewPublicationsPage } from '../view-publications/view-publications.page'; diff --git a/src/app/pages/search/search.page.ts b/src/app/pages/search/search.page.ts index bf130bee2..bab5bbef7 100644 --- a/src/app/pages/search/search.page.ts +++ b/src/app/pages/search/search.page.ts @@ -68,6 +68,7 @@ export class SearchPage implements OnInit { }); } + /** * @description Basic search */ diff --git a/src/app/pages/search/sender/sender.page.html b/src/app/pages/search/sender/sender.page.html index 66e06fa57..5164bd49a 100644 --- a/src/app/pages/search/sender/sender.page.html +++ b/src/app/pages/search/sender/sender.page.html @@ -5,5 +5,14 @@ - + + + + + + + {{ contact.Name }} + + + diff --git a/src/app/pages/search/sender/sender.page.scss b/src/app/pages/search/sender/sender.page.scss index e69de29bb..7608d29c6 100644 --- a/src/app/pages/search/sender/sender.page.scss +++ b/src/app/pages/search/sender/sender.page.scss @@ -0,0 +1,25 @@ +.main-container{ + padding: 0px 20px; + .input-text { + margin-top: 20px; + width: 100%; + height: 45px; + border-radius: 5px; + border: 1px solid #ebebeb; + } + ul{ + padding: 0px; + margin: 0px; + padding-top: 10px; + li{ + padding-top: 5px; + padding-bottom: 10px; + margin: 0px; + padding-bottom: 10px; + border-bottom: 1px solid #ebebeb; + list-style: none; + font-family: Roboto; + font-size: 15px; + } + } +} \ No newline at end of file diff --git a/src/app/pages/search/sender/sender.page.ts b/src/app/pages/search/sender/sender.page.ts index 39048617f..1246144d2 100644 --- a/src/app/pages/search/sender/sender.page.ts +++ b/src/app/pages/search/sender/sender.page.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { ModalController } from '@ionic/angular'; - +import { ContactsService } from 'src/app/services/contacts.service'; +import { EventPerson } from 'src/app/models/eventperson.model'; @Component({ selector: 'app-sender', templateUrl: './sender.page.html', @@ -9,9 +10,37 @@ import { ModalController } from '@ionic/angular'; }) export class SenderPage implements OnInit { - constructor(private modalController:ModalController) { } + contacts: EventPerson[]; + showContacts: EventPerson[]; + + + constructor(private modalController:ModalController, + private ContactsService: ContactsService) { + + } ngOnInit() { + this.getSender(); + } + + getSender(){ + this.ContactsService.getContacts("").subscribe(res=>{ + this.contacts = res; + }); + } + + filterContact(findName){ + console.log(findName) + // const persons = this.contacts.filter((person) => { + + // if (person.Name.indexOf(findName) == 0){ + // return true; + // } + + // }); + + // this.showContacts = persons; + } close(){ diff --git a/src/app/pipes/filter.pipe.spec.ts b/src/app/pipes/filter.pipe.spec.ts new file mode 100644 index 000000000..1427de361 --- /dev/null +++ b/src/app/pipes/filter.pipe.spec.ts @@ -0,0 +1,8 @@ +import { FilterPipe } from './filter.pipe'; + +describe('FilterPipe', () => { + it('create an instance', () => { + const pipe = new FilterPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/pipes/filter.pipe.ts b/src/app/pipes/filter.pipe.ts new file mode 100644 index 000000000..68440de14 --- /dev/null +++ b/src/app/pipes/filter.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'filter' +}) +export class FilterPipe implements PipeTransform { + + transform(array: any[], text:string, column:string): any { + + if(text === ''){ + return array; + } + + text = text.toLowerCase(); + + return array.filter(item =>{ + return item[column].toLowerCase().includes(text); + }); + } + +} diff --git a/src/app/pipes/pipes.module.ts b/src/app/pipes/pipes.module.ts new file mode 100644 index 000000000..0d9ad52be --- /dev/null +++ b/src/app/pipes/pipes.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { FilterPipe } from './filter.pipe'; + + +@NgModule({ + declarations: [FilterPipe], + exports: [FilterPipe], + imports: [] +}) +export class PipesModule { } diff --git a/src/app/resolvers/userData.resolver.ts b/src/app/resolvers/userData.resolver.ts index 8d9771fc6..b5b5bbc93 100644 --- a/src/app/resolvers/userData.resolver.ts +++ b/src/app/resolvers/userData.resolver.ts @@ -8,6 +8,6 @@ export class UserDataResolver{ constructor(private authService: AuthService){} resolve(){ - /* return this.authService.getUserData(); */ + return this.authService.getUserData(); } } \ No newline at end of file diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index 03ada687f..bdb4ca88e 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -35,6 +35,7 @@ export class AuthService { if (result) { this.ValidatedUser = user; + } return result; } @@ -49,26 +50,25 @@ export class AuthService { return this.httpService.post('login', postData); } - //Get user data from RocketChat - /* getUserData(){ + //Get user data from RocketChat | global object + getUserData(){ this.storageService.get(AuthConnstants.AUTH).then(res=>{ this.userData$.next(res); - }) - } */ + }); + } - /* getProfile(){ + getProfile(){ this.storageService.get(AuthConnstants.PROFILE).then(res=>{ return res; }); - } */ + } logoutChat(){ //this.storageService.clear(); - /* this.storageService.removeStorageItem(AuthConnstants.AUTH).then(res =>{ + this.storageService.removeStorageItem(AuthConnstants.AUTH).then(res =>{ this.userData$.next(''); this.router.navigate(['']); - }) */ - + }) } } diff --git a/src/app/services/chat.service.ts b/src/app/services/chat.service.ts index fcec14651..f400ca1ca 100644 --- a/src/app/services/chat.service.ts +++ b/src/app/services/chat.service.ts @@ -1,4 +1,4 @@ -import { HttpHeaders } from '@angular/common/http'; +import { HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from "rxjs" import { AuthService } from './auth.service'; @@ -6,6 +6,7 @@ import { HttpService } from './http.service'; import { StorageService } from './storage.service'; import { HttpClient, HttpHeaderResponse } from '@angular/common/http'; import { environment } from 'src/environments/environment'; +import { Storage } from '@ionic/storage'; @Injectable({ providedIn: 'root' @@ -13,14 +14,21 @@ import { environment } from 'src/environments/environment'; export class ChatService { headers: HttpHeaders; options:any; + options1:any; + X_User_Id:any; + X_Auth_Token:any; constructor( private http:HttpClient, private httpService: HttpService, private authService: AuthService, + private storage: Storage, private storageService:StorageService,) { this.headers = new HttpHeaders(); + /* this.headers = this.headers.set('X-User-Id', 'GqjNWiLrGEHRna7Zn'); + this.headers = this.headers.set('X-Auth-Token', 'dAM0ZOTAy8jzQA_vS25z2IrnSc6sYLfi5rmaa35YNUz'); */ + - this.authService.userData$.subscribe((res:any)=>{ this.headers = this.headers.set('X-User-Id', res.userId); this.headers = this.headers.set('X-Auth-Token', res.authToken); @@ -30,14 +38,114 @@ export class ChatService { }; } + /* getUser(){ + this.storage.get('user').then((val) => { + let user = JSON.parse(unescape(atob(val))).data; + + this.headers = this.headers.set('X-User-Id', user.userId); + this.headers = this.headers.set('X-Auth-Token', user.authToken); + + this.options1 = { + headers: this.headers, + }; + console.log(this.options1); + + this.http.get(environment.apiChatUrl+'users.presence', this.options1).subscribe(res => { + console.log(res); + }); + + }); + } */ + getAllDirectMessages(){ + return this.http.get(environment.apiChatUrl+'im.list', this.options); + } + getAllChannels(){ + return this.http.get(environment.apiChatUrl+'channels.list', this.options); + } + getAllUserChannels(){ + return this.http.get(environment.apiChatUrl+'channels.list.joined', this.options); + } + + getAllRooms(){ + return this.http.get(environment.apiChatUrl+'rooms.get', this.options); + } + getAllPrivateGroups(){ + return this.http.get(environment.apiChatUrl+'groups.list', this.options); + } + getAllUsers(){ - /* console.log(this.headers); */ return this.http.get(environment.apiChatUrl+'users.list', this.options); } getAllConnectedUsers(){ return this.http.get(environment.apiChatUrl+'users.presence', this.options); } - getAllPrivateGroups(){ - return this.http.get(environment.apiChatUrl+'groups.list', this.options); + //Check whether user is online or offline + getUserPresence(id:any){ + + let params = new HttpParams(); + params = params.set("userId", id); + + let opts = { + headers: this.headers, + params: params + } + return this.http.get(environment.apiChatUrl+'users.getPresence', opts); } + + //Load messages from roomId + loadJoinedRooms(){ + return this.http.get(environment.apiChatUrl+'im.list', this.options); + } + + //Load messages from roomId + getRoomMessages(roomId:any){ + + let params = new HttpParams(); + params = params.set("roomId", roomId); + + let opts = { + headers: this.headers, + params: params + } + return this.http.get(environment.apiChatUrl+'im.history', opts); + } + + sendMessage(body:any){ + let opts = { + headers: this.headers, + } + return this.http.post(environment.apiChatUrl+'chat.sendMessage', body, opts); + } + //Load members from a chat + getMembers(roomId:any){ + + let params = new HttpParams(); + params = params.set("roomId", roomId); + + let opts = { + headers: this.headers, + params: params + } + return this.http.get(environment.apiChatUrl+'im.members', opts); + } + removeChatRoom(body:any){ + let opts = { + headers: this.headers, + } + return this.http.post(environment.apiChatUrl+'im.close', body, this.options); + } + createRoom(body:any){ + return this.http.post(environment.apiChatUrl+'im.create', body, this.options); + } + getDirectMessage(roomId:string){ + let params = new HttpParams(); + params = params.set("roomId", roomId); + + let opts = { + headers: this.headers, + params: params + } + return this.http.get(environment.apiChatUrl+'im.messages', opts); + } + } diff --git a/src/app/services/storage.service.ts b/src/app/services/storage.service.ts index e65b0037a..d47dacad2 100644 --- a/src/app/services/storage.service.ts +++ b/src/app/services/storage.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@angular/core'; -/* import { Plugins } from '@capacitor/core'; -const { Storage } = Plugins; */ +import { Plugins } from '@capacitor/core'; +const { Storage } = Plugins; @Injectable({ providedIn: 'root' }) export class StorageService { constructor() {} - /* // Store the value + // Store the value async store(storageKey: string, value: any) { const encryptedValue = btoa(escape(JSON.stringify(value))); await Storage.set({ @@ -29,5 +29,5 @@ const { Storage } = Plugins; */ // Clear storage async clear() { await Storage.clear(); - } */ + } } diff --git a/src/app/shared/btn-modal-dismiss/btn-modal-dismiss-routing.module.ts b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss-routing.module.ts new file mode 100644 index 000000000..ed1fb491c --- /dev/null +++ b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { BtnModalDismissPage } from './btn-modal-dismiss.page'; + +const routes: Routes = [ + { + path: '', + component: BtnModalDismissPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class BtnModalDismissPageRoutingModule {} diff --git a/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module.ts b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module.ts new file mode 100644 index 000000000..de1bb2d5b --- /dev/null +++ b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { BtnModalDismissPageRoutingModule } from './btn-modal-dismiss-routing.module'; + +import { BtnModalDismissPage } from './btn-modal-dismiss.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + BtnModalDismissPageRoutingModule + ], + declarations: [BtnModalDismissPage] +}) +export class BtnModalDismissPageModule {} diff --git a/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.html b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.html new file mode 100644 index 000000000..563f30337 --- /dev/null +++ b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.html @@ -0,0 +1,3 @@ + + + diff --git a/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.scss b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.scss new file mode 100644 index 000000000..39e57070e --- /dev/null +++ b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.scss @@ -0,0 +1,6 @@ +.left{ + width: 37px; + float: left; + font-size: 35px; + overflow: hidden; +} \ No newline at end of file diff --git a/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.spec.ts b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.spec.ts new file mode 100644 index 000000000..c15360e1c --- /dev/null +++ b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { BtnModalDismissPage } from './btn-modal-dismiss.page'; + +describe('BtnModalDismissPage', () => { + let component: BtnModalDismissPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BtnModalDismissPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(BtnModalDismissPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.ts b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.ts new file mode 100644 index 000000000..f8d5f8507 --- /dev/null +++ b/src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; + +@Component({ + selector: 'app-btn-modal-dismiss', + templateUrl: './btn-modal-dismiss.page.html', + styleUrls: ['./btn-modal-dismiss.page.scss'], +}) +export class BtnModalDismissPage implements OnInit { + + constructor( + private modalController: ModalController, + ) { + + } + + ngOnInit() { + + } + close(){ + this.modalController.dismiss(); + } + +} diff --git a/src/app/shared/btn-seguinte/btn-seguinte-routing.module.ts b/src/app/shared/btn-seguinte/btn-seguinte-routing.module.ts new file mode 100644 index 000000000..00925313b --- /dev/null +++ b/src/app/shared/btn-seguinte/btn-seguinte-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { BtnSeguintePage } from './btn-seguinte.page'; + +const routes: Routes = [ + { + path: '', + component: BtnSeguintePage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class BtnSeguintePageRoutingModule {} diff --git a/src/app/shared/btn-seguinte/btn-seguinte.module.ts b/src/app/shared/btn-seguinte/btn-seguinte.module.ts new file mode 100644 index 000000000..bb07c7363 --- /dev/null +++ b/src/app/shared/btn-seguinte/btn-seguinte.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { BtnSeguintePageRoutingModule } from './btn-seguinte-routing.module'; + +import { BtnSeguintePage } from './btn-seguinte.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + BtnSeguintePageRoutingModule + ], + declarations: [BtnSeguintePage] +}) +export class BtnSeguintePageModule {} diff --git a/src/app/shared/btn-seguinte/btn-seguinte.page.html b/src/app/shared/btn-seguinte/btn-seguinte.page.html new file mode 100644 index 000000000..2ecf0814d --- /dev/null +++ b/src/app/shared/btn-seguinte/btn-seguinte.page.html @@ -0,0 +1,3 @@ + + Seguinte + diff --git a/src/app/shared/btn-seguinte/btn-seguinte.page.scss b/src/app/shared/btn-seguinte/btn-seguinte.page.scss new file mode 100644 index 000000000..fef7141e5 --- /dev/null +++ b/src/app/shared/btn-seguinte/btn-seguinte.page.scss @@ -0,0 +1,7 @@ +.right{ + padding: 0!important; + float: right; + font-size: 15px; + color: #0782c9; + margin: 8px 0 0 5px; + } \ No newline at end of file diff --git a/src/app/shared/btn-seguinte/btn-seguinte.page.spec.ts b/src/app/shared/btn-seguinte/btn-seguinte.page.spec.ts new file mode 100644 index 000000000..7f8fe0842 --- /dev/null +++ b/src/app/shared/btn-seguinte/btn-seguinte.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { BtnSeguintePage } from './btn-seguinte.page'; + +describe('BtnSeguintePage', () => { + let component: BtnSeguintePage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BtnSeguintePage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(BtnSeguintePage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/btn-seguinte/btn-seguinte.page.ts b/src/app/shared/btn-seguinte/btn-seguinte.page.ts new file mode 100644 index 000000000..9f724083e --- /dev/null +++ b/src/app/shared/btn-seguinte/btn-seguinte.page.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-btn-seguinte', + templateUrl: './btn-seguinte.page.html', + styleUrls: ['./btn-seguinte.page.scss'], +}) +export class BtnSeguintePage implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover-routing.module.ts b/src/app/shared/popover/chat-options-popover/chat-options-popover-routing.module.ts new file mode 100644 index 000000000..8e189ed7f --- /dev/null +++ b/src/app/shared/popover/chat-options-popover/chat-options-popover-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ChatOptionsPopoverPage } from './chat-options-popover.page'; + +const routes: Routes = [ + { + path: '', + component: ChatOptionsPopoverPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ChatOptionsPopoverPageRoutingModule {} diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.module.ts b/src/app/shared/popover/chat-options-popover/chat-options-popover.module.ts new file mode 100644 index 000000000..d6e7129d9 --- /dev/null +++ b/src/app/shared/popover/chat-options-popover/chat-options-popover.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ChatOptionsPopoverPageRoutingModule } from './chat-options-popover-routing.module'; + +import { ChatOptionsPopoverPage } from './chat-options-popover.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ChatOptionsPopoverPageRoutingModule + ], + declarations: [ChatOptionsPopoverPage] +}) +export class ChatOptionsPopoverPageModule {} diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.html b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.html new file mode 100644 index 000000000..ebd9a9c01 --- /dev/null +++ b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.html @@ -0,0 +1,23 @@ + + + + Tirar Fotografia + + + Digitalizar Documento + + + Anexar Fotografia + + + Anexar Documento + + + + + Cancelar + + + + + diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.scss b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.scss new file mode 100644 index 000000000..1e44f4b3d --- /dev/null +++ b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.scss @@ -0,0 +1,32 @@ +ion-row{ + padding: 10px 10px 5px 10px; +} +.border-top{ + padding-top: 5px !important; + border-top: 1px solid #ebebeb; +} +/* ion-col{ + border: 1px solid red; +} */ +.btn-cancel{ + display: block; + width: 170px !important; + height: 45px !important; + border-radius: 22.5px; + background-color: #e0e9ee; + --color: #061b52 !important; + --background:transparent; + --box-shadow: none; + margin: 0 auto !important; + } + +.btn-ok{ + display: block; + width: 170px !important; + height: 45px !important; + border-radius: 22.5px; + --background: #42b9fe; + --color: #ffffff !important; + margin: 0 auto !important; + + } \ No newline at end of file diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.spec.ts b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.spec.ts new file mode 100644 index 000000000..a720defb5 --- /dev/null +++ b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ChatOptionsPopoverPage } from './chat-options-popover.page'; + +describe('ChatOptionsPopoverPage', () => { + let component: ChatOptionsPopoverPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChatOptionsPopoverPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ChatOptionsPopoverPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.ts b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.ts new file mode 100644 index 000000000..283b273a0 --- /dev/null +++ b/src/app/shared/popover/chat-options-popover/chat-options-popover.page.ts @@ -0,0 +1,22 @@ +import { Component, OnInit } from '@angular/core'; +import { PopoverController } from '@ionic/angular'; + +@Component({ + selector: 'app-chat-options-popover', + templateUrl: './chat-options-popover.page.html', + styleUrls: ['./chat-options-popover.page.scss'], +}) +export class ChatOptionsPopoverPage implements OnInit { + + constructor( + private popoverController: PopoverController + ) { } + + ngOnInit() { + } + + close(){ + this.popoverController.dismiss(); + } + +} diff --git a/src/app/shared/popover/chat-popover/chat-popover-routing.module.ts b/src/app/shared/popover/chat-popover/chat-popover-routing.module.ts new file mode 100644 index 000000000..9fb84d892 --- /dev/null +++ b/src/app/shared/popover/chat-popover/chat-popover-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ChatPopoverPage } from './chat-popover.page'; + +const routes: Routes = [ + { + path: '', + component: ChatPopoverPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ChatPopoverPageRoutingModule {} diff --git a/src/app/shared/popover/chat-popover/chat-popover.module.ts b/src/app/shared/popover/chat-popover/chat-popover.module.ts new file mode 100644 index 000000000..7c5def554 --- /dev/null +++ b/src/app/shared/popover/chat-popover/chat-popover.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ChatPopoverPageRoutingModule } from './chat-popover-routing.module'; + +import { ChatPopoverPage } from './chat-popover.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ChatPopoverPageRoutingModule + ], + declarations: [ChatPopoverPage] +}) +export class ChatPopoverPageModule {} diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.html b/src/app/shared/popover/chat-popover/chat-popover.page.html new file mode 100644 index 000000000..93794cd0d --- /dev/null +++ b/src/app/shared/popover/chat-popover/chat-popover.page.html @@ -0,0 +1,18 @@ + + + + Sair do Grupo + + + Alterar nome do grupo + + + + + Cancelar + + + Apagar grupo + + + diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.scss b/src/app/shared/popover/chat-popover/chat-popover.page.scss new file mode 100644 index 000000000..0171ad1d0 --- /dev/null +++ b/src/app/shared/popover/chat-popover/chat-popover.page.scss @@ -0,0 +1,15 @@ +ion-row{ + padding: 10px 10px 5px 10px; +} +.border-top{ + padding-top: 5px !important; + border-top: 1px solid #ebebeb; +} +/* ion-col{ + border: 1px solid red; +} */ + +/* .btn-ok, .btn-cancel, .btn-delete{ + font-size: 13px; + padding:0 !important; +} */ diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.spec.ts b/src/app/shared/popover/chat-popover/chat-popover.page.spec.ts new file mode 100644 index 000000000..8e2c51542 --- /dev/null +++ b/src/app/shared/popover/chat-popover/chat-popover.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ChatPopoverPage } from './chat-popover.page'; + +describe('ChatPopoverPage', () => { + let component: ChatPopoverPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChatPopoverPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ChatPopoverPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.ts b/src/app/shared/popover/chat-popover/chat-popover.page.ts new file mode 100644 index 000000000..07c0841ee --- /dev/null +++ b/src/app/shared/popover/chat-popover/chat-popover.page.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { PopoverController } from '@ionic/angular'; + +@Component({ + selector: 'app-chat-popover', + templateUrl: './chat-popover.page.html', + styleUrls: ['./chat-popover.page.scss'], +}) +export class ChatPopoverPage implements OnInit { + + constructor( + private popoverController: PopoverController, + ) { } + + ngOnInit() { + } + close(){ + this.popoverController.dismiss(); + } + +} diff --git a/src/app/shared/popover/chat-popover/popover.modules.ts b/src/app/shared/popover/chat-popover/popover.modules.ts new file mode 100644 index 000000000..6612f7638 --- /dev/null +++ b/src/app/shared/popover/chat-popover/popover.modules.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { IonicModule } from '@ionic/angular'; +import { ChatPopoverPage } from './chat-popover.page'; + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ], + exports: [ + ChatPopoverPage, + ], + entryComponents:[], + declarations: [ + ChatPopoverPage, + ] +}) +export class PopoverModule {} \ No newline at end of file diff --git a/src/app/shared/popover/group-duration/group-duration-routing.module.ts b/src/app/shared/popover/group-duration/group-duration-routing.module.ts new file mode 100644 index 000000000..fe80d4118 --- /dev/null +++ b/src/app/shared/popover/group-duration/group-duration-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { GroupDurationPage } from './group-duration.page'; + +const routes: Routes = [ + { + path: '', + component: GroupDurationPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class GroupDurationPageRoutingModule {} diff --git a/src/app/shared/popover/group-duration/group-duration.module.ts b/src/app/shared/popover/group-duration/group-duration.module.ts new file mode 100644 index 000000000..eb4dd1468 --- /dev/null +++ b/src/app/shared/popover/group-duration/group-duration.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { GroupDurationPageRoutingModule } from './group-duration-routing.module'; + +import { GroupDurationPage } from './group-duration.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + GroupDurationPageRoutingModule + ], + declarations: [GroupDurationPage] +}) +export class GroupDurationPageModule {} diff --git a/src/app/shared/popover/group-duration/group-duration.page.html b/src/app/shared/popover/group-duration/group-duration.page.html new file mode 100644 index 000000000..768a33230 --- /dev/null +++ b/src/app/shared/popover/group-duration/group-duration.page.html @@ -0,0 +1,19 @@ + + + Duração + + + + + + + + Cancelar + + + Ok + + + + + diff --git a/src/app/shared/popover/group-duration/group-duration.page.scss b/src/app/shared/popover/group-duration/group-duration.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/shared/popover/group-duration/group-duration.page.spec.ts b/src/app/shared/popover/group-duration/group-duration.page.spec.ts new file mode 100644 index 000000000..ba52f3ffa --- /dev/null +++ b/src/app/shared/popover/group-duration/group-duration.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { GroupDurationPage } from './group-duration.page'; + +describe('GroupDurationPage', () => { + let component: GroupDurationPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GroupDurationPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(GroupDurationPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/popover/group-duration/group-duration.page.ts b/src/app/shared/popover/group-duration/group-duration.page.ts new file mode 100644 index 000000000..7e095ff05 --- /dev/null +++ b/src/app/shared/popover/group-duration/group-duration.page.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { PopoverController } from '@ionic/angular'; + +@Component({ + selector: 'app-group-duration', + templateUrl: './group-duration.page.html', + styleUrls: ['./group-duration.page.scss'], +}) +export class GroupDurationPage implements OnInit { + + constructor( + public popoverController: PopoverController, + ) { } + + ngOnInit() { + } + close(){ + this.popoverController.dismiss(); + } + +} diff --git a/src/app/shared/popover/messages-options/messages-options-routing.module.ts b/src/app/shared/popover/messages-options/messages-options-routing.module.ts new file mode 100644 index 000000000..1ae2ef283 --- /dev/null +++ b/src/app/shared/popover/messages-options/messages-options-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { MessagesOptionsPage } from './messages-options.page'; + +const routes: Routes = [ + { + path: '', + component: MessagesOptionsPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MessagesOptionsPageRoutingModule {} diff --git a/src/app/shared/popover/messages-options/messages-options.module.ts b/src/app/shared/popover/messages-options/messages-options.module.ts new file mode 100644 index 000000000..da09a957d --- /dev/null +++ b/src/app/shared/popover/messages-options/messages-options.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { MessagesOptionsPageRoutingModule } from './messages-options-routing.module'; + +import { MessagesOptionsPage } from './messages-options.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + MessagesOptionsPageRoutingModule + ], + declarations: [MessagesOptionsPage] +}) +export class MessagesOptionsPageModule {} diff --git a/src/app/shared/popover/messages-options/messages-options.page.html b/src/app/shared/popover/messages-options/messages-options.page.html new file mode 100644 index 000000000..be9bcf347 --- /dev/null +++ b/src/app/shared/popover/messages-options/messages-options.page.html @@ -0,0 +1,10 @@ + + + + Cancelar + + + Apagar conversa + + + diff --git a/src/app/shared/popover/messages-options/messages-options.page.scss b/src/app/shared/popover/messages-options/messages-options.page.scss new file mode 100644 index 000000000..63122bda8 --- /dev/null +++ b/src/app/shared/popover/messages-options/messages-options.page.scss @@ -0,0 +1,3 @@ +ion-row{ + padding: 10px 10px 5px 10px; +} \ No newline at end of file diff --git a/src/app/shared/popover/messages-options/messages-options.page.spec.ts b/src/app/shared/popover/messages-options/messages-options.page.spec.ts new file mode 100644 index 000000000..f81205230 --- /dev/null +++ b/src/app/shared/popover/messages-options/messages-options.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { MessagesOptionsPage } from './messages-options.page'; + +describe('MessagesOptionsPage', () => { + let component: MessagesOptionsPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MessagesOptionsPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(MessagesOptionsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/popover/messages-options/messages-options.page.ts b/src/app/shared/popover/messages-options/messages-options.page.ts new file mode 100644 index 000000000..98ac52044 --- /dev/null +++ b/src/app/shared/popover/messages-options/messages-options.page.ts @@ -0,0 +1,38 @@ +import { Component, OnInit } from '@angular/core'; +import { NavParams, PopoverController } from '@ionic/angular'; +import { ChatService } from 'src/app/services/chat.service'; + +@Component({ + selector: 'app-messages-options', + templateUrl: './messages-options.page.html', + styleUrls: ['./messages-options.page.scss'], +}) +export class MessagesOptionsPage implements OnInit { + + roomId:string; + + constructor( + private popoverController: PopoverController, + private chatService: ChatService, + private navParams: NavParams, + ) + { + this.roomId = this.navParams.get('roomId'); + } + + ngOnInit() { + } + + close(){ + this.popoverController.dismiss(); + } + + closeChatRoom(){ + let body = { "roomId": this.roomId } + this.chatService.removeChatRoom(body).subscribe(res=>{ + console.log(res); + }); + this.close(); + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index ff9aee71d..5af0817a6 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -4,6 +4,9 @@ import { FormsModule } from '@angular/forms'; import { IonicModule } from '@ionic/angular'; import { HeaderPage } from './header/header.page'; import { HeaderPrPage } from './header-pr/header-pr.page'; +import { BtnSeguintePage } from './btn-seguinte/btn-seguinte.page'; +import { BtnModalDismissPage } from './btn-modal-dismiss/btn-modal-dismiss.page'; +import { ChatPopoverPage } from './popover/chat-popover/chat-popover.page'; @NgModule({ imports: [ @@ -11,8 +14,17 @@ import { HeaderPrPage } from './header-pr/header-pr.page'; FormsModule, IonicModule, ], - exports: [HeaderPage, HeaderPrPage], + exports: [ + HeaderPage, + HeaderPrPage, + BtnSeguintePage, + BtnModalDismissPage, + ], entryComponents:[], - declarations: [HeaderPage, HeaderPrPage] + declarations: [HeaderPage, + HeaderPrPage, + BtnSeguintePage, + BtnModalDismissPage, + ] }) export class SharedModule {} \ No newline at end of file diff --git a/src/assets/icon/icons-chat-mic.svg b/src/assets/icon/icons-chat-mic.svg new file mode 100644 index 000000000..6ee4201ff --- /dev/null +++ b/src/assets/icon/icons-chat-mic.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/icon/icons-chat-options.svg b/src/assets/icon/icons-chat-options.svg new file mode 100644 index 000000000..0823c7065 --- /dev/null +++ b/src/assets/icon/icons-chat-options.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/icons-chat-send.svg b/src/assets/icon/icons-chat-send.svg similarity index 100% rename from src/assets/images/icons-chat-send.svg rename to src/assets/icon/icons-chat-send.svg diff --git a/src/assets/icon/icons-user.svg b/src/assets/icon/icons-user.svg new file mode 100644 index 000000000..74a4a034b --- /dev/null +++ b/src/assets/icon/icons-user.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/icons-chat-contacts-list.svg b/src/assets/images/icons-chat-contacts-list.svg new file mode 100644 index 000000000..74a4a034b --- /dev/null +++ b/src/assets/images/icons-chat-contacts-list.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/icons-duration.svg b/src/assets/images/icons-duration.svg new file mode 100644 index 000000000..4046e1ac4 --- /dev/null +++ b/src/assets/images/icons-duration.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/icons-menu.svg b/src/assets/images/icons-menu.svg new file mode 100644 index 000000000..b56583239 --- /dev/null +++ b/src/assets/images/icons-menu.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/images/icons-nav-home.svg b/src/assets/images/icons-nav-home.svg index ad505de12..829cf9cea 100644 --- a/src/assets/images/icons-nav-home.svg +++ b/src/assets/images/icons-nav-home.svg @@ -3,7 +3,11 @@ - + + + + + diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 640e53a5a..74da63bde 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,7 +1,7 @@ export const environment = { production: true, apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/v1/api/', - apiChatUrl: 'http://192.168.100.111:3000/api/v1/', + apiChatUrl: 'http://chat.gabinetedigital.local:3000/api/v1/', domain: 'gabinetedigital.local', defaultuser: '', defaultuserpwd: '' diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 4b92544cb..8792937f1 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/V3/api/', - apiChatUrl: 'http://192.168.100.111:3000/api/v1/', + apiChatUrl: 'http://chat.gabinetedigital.local:3000/api/v1/', domain: 'gabinetedigital.local', defaultuser: 'paulo.pinto', defaultuserpwd: 'tabteste@006' diff --git a/src/theme/variables.scss b/src/theme/variables.scss index 6d4ffd5d2..6e7fc3d46 100644 --- a/src/theme/variables.scss +++ b/src/theme/variables.scss @@ -250,6 +250,7 @@ --border-radius: 10px; padding: 25px; } */ +//MODALS .emend-message-modal{ --height: 50%; --border-radius: 10px; @@ -262,9 +263,52 @@ padding: 25px; background: rgba(51, 51, 51, 0.3); } +.newchat, .new-group, .contacts, .group-messages, .custom-modal{ + padding-top: 93px; + --border-radius: 25px 25px 0 0; + --border-width:0px; +} .capitalizeText{ text-transform: capitalize; } +//POPOVER +.chat-popover .popover-content { + width: 100% !important; + left: 0 !important; + bottom: 0 !important; + right: 0 !important; + top: calc(100% - 160px) !important; + max-height: 160px; + min-height: 160px; +} +.messages-options .popover-content{ + width: 100% !important; + left: 0 !important; + bottom: 0 !important; + right: 0 !important; + top: calc(100% - 90px) !important; + max-height: 90px; + min-height: 90px; +} +.chat-options-popover .popover-content{ + width: 100% !important; + left: 0 !important; + bottom: 0 !important; + right: 0 !important; + top: calc(100% - 210px) !important; + max-height: 210px; + min-height: 210px; +} +.group-duration .popover-content{ + width: 100% !important; + left: 0 !important; + bottom: 0 !important; + right: 0 !important; + top: calc(100% - 500px) !important; + max-height: 500px; + min-height: 500px; +} + /* .event-actions-popover ion-list{ } */ .Rectangle { @@ -364,10 +408,10 @@ --background: #fff; } .btn-ok{ - width: 160px !important; + width: 170px !important; height: 45px !important; - margin: 0 auto; - padding: 10px 15px; + margin: 0 auto !important; + padding:0 !important; border-radius: 22.5px; background-color: #42b9fe; color: #ffffff !important; @@ -375,28 +419,30 @@ .btn-ok-no-width{ height: 45px !important; margin: 0 auto; - padding: 10px 15px; + padding:0 !important; border-radius: 22.5px; background-color: #42b9fe; color: #ffffff !important; } .btn-delete{ + display: block; width: 170px !important; height: 45px !important; - margin: 0 auto; - padding: 10px 15px; + margin: 0 auto !important; + padding:0 !important; border-radius: 22.5px; background-color: #ffe0e0; color: #d30a0a !important; } .btn-cancel{ - width: 160px !important; + display: block; + width: 170px !important; height: 45px !important; - margin: 0 auto; - padding: 10px 15px; + padding:0 !important; border-radius: 22.5px; background-color: #e0e9ee; color: #061b52 !important; + margin: 0 auto !important; } .bg-blue{ --background:#0782c9;
{{user.first}} {{user.last}}
{{user.name}}