├── README.md ├── app_teleconsulto ├── src │ ├── app │ │ ├── app.component.scss │ │ ├── access │ │ │ ├── login │ │ │ │ ├── login.page.scss │ │ │ │ ├── login-routing.module.ts │ │ │ │ ├── login.module.ts │ │ │ │ ├── login.page.spec.ts │ │ │ │ ├── login.page.html │ │ │ │ └── login.page.ts │ │ │ └── registration │ │ │ │ ├── registration.page.scss │ │ │ │ ├── registration-routing.module.ts │ │ │ │ ├── registration.module.ts │ │ │ │ ├── registration.page.spec.ts │ │ │ │ ├── registration.page.ts │ │ │ │ └── registration.page.html │ │ ├── logged │ │ │ ├── nuovo │ │ │ │ ├── nuovo.page.scss │ │ │ │ ├── nuovo-routing.module.ts │ │ │ │ ├── nuovo.module.ts │ │ │ │ ├── nuovo.page.spec.ts │ │ │ │ ├── nuovo.page.html │ │ │ │ └── nuovo.page.ts │ │ │ ├── profile │ │ │ │ ├── profile.page.scss │ │ │ │ ├── profile-routing.module.ts │ │ │ │ ├── profile.module.ts │ │ │ │ ├── profile.page.spec.ts │ │ │ │ ├── profile.page.ts │ │ │ │ └── profile.page.html │ │ │ ├── new-paziente │ │ │ │ ├── new-paziente.page.scss │ │ │ │ ├── new-paziente-routing.module.ts │ │ │ │ ├── new-paziente.module.ts │ │ │ │ ├── new-paziente.page.spec.ts │ │ │ │ ├── new-paziente.page.ts │ │ │ │ └── new-paziente.page.html │ │ │ ├── zoom │ │ │ │ ├── zoom-login │ │ │ │ │ ├── zoom-login.page.scss │ │ │ │ │ ├── zoom-login-routing.module.ts │ │ │ │ │ ├── zoom-login.module.ts │ │ │ │ │ ├── zoom-login.page.spec.ts │ │ │ │ │ ├── zoom-login.page.html │ │ │ │ │ └── zoom-login.page.ts │ │ │ │ └── zoom-non-login │ │ │ │ │ ├── zoom-non-login.page.scss │ │ │ │ │ ├── zoom-non-login-routing.module.ts │ │ │ │ │ ├── zoom-non-login.module.ts │ │ │ │ │ ├── zoom-non-login.page.spec.ts │ │ │ │ │ ├── zoom-non-login.page.html │ │ │ │ │ └── zoom-non-login.page.ts │ │ │ ├── new-partecipant │ │ │ │ ├── new-partecipant.page.scss │ │ │ │ ├── new-partecipant-routing.module.ts │ │ │ │ ├── new-partecipant.module.ts │ │ │ │ ├── new-partecipant.page.spec.ts │ │ │ │ ├── new-partecipant.page.html │ │ │ │ └── new-partecipant.page.ts │ │ │ ├── consulto │ │ │ │ ├── consulto.page.scss │ │ │ │ ├── consulto-routing.module.ts │ │ │ │ ├── consulto.page.spec.ts │ │ │ │ ├── consulto.module.ts │ │ │ │ ├── consulto.page.html │ │ │ │ └── consulto.page.ts │ │ │ ├── modals │ │ │ │ └── allegati │ │ │ │ │ ├── allegati.component.scss │ │ │ │ │ ├── allegati.component.spec.ts │ │ │ │ │ ├── allegati.component.html │ │ │ │ │ └── allegati.component.ts │ │ │ ├── home │ │ │ │ ├── home-routing.module.ts │ │ │ │ ├── home.module.ts │ │ │ │ ├── home.page.scss │ │ │ │ ├── home.page.spec.ts │ │ │ │ ├── home.page.ts │ │ │ │ └── home.page.html │ │ │ └── chat │ │ │ │ ├── chat-routing.module.ts │ │ │ │ ├── chat.module.ts │ │ │ │ ├── chat.page.spec.ts │ │ │ │ ├── chat.page.scss │ │ │ │ ├── chat.page.html │ │ │ │ └── chat.page.ts │ │ ├── app.component.html │ │ ├── models │ │ │ ├── chat.ts │ │ │ ├── paziente.ts │ │ │ ├── medico.ts │ │ │ └── consulto.ts │ │ ├── app.component.spec.ts │ │ ├── providers │ │ │ └── access-providers.ts │ │ ├── app.module.ts │ │ ├── app.component.ts │ │ └── app-routing.module.ts │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── assets │ │ ├── icon │ │ │ └── favicon.png │ │ └── shapes.svg │ ├── zone-flags.ts │ ├── main.ts │ ├── index.html │ ├── test.ts │ ├── global.scss │ ├── polyfills.ts │ └── theme │ │ └── variables.scss ├── resources │ ├── splash.png.md5 │ ├── icon.png │ ├── splash.png │ ├── ios │ │ ├── icon │ │ │ ├── icon.png │ │ │ ├── icon-1024.png │ │ │ ├── icon-20.png │ │ │ ├── icon-29.png │ │ │ ├── icon-40.png │ │ │ ├── icon-50.png │ │ │ ├── icon-60.png │ │ │ ├── icon-72.png │ │ │ ├── icon-76.png │ │ │ ├── icon@2x.png │ │ │ ├── icon-108@2x.png │ │ │ ├── icon-20@2x.png │ │ │ ├── icon-20@3x.png │ │ │ ├── icon-24@2x.png │ │ │ ├── icon-29@2x.png │ │ │ ├── icon-29@3x.png │ │ │ ├── icon-40@2x.png │ │ │ ├── icon-40@3x.png │ │ │ ├── icon-44@2x.png │ │ │ ├── icon-50@2x.png │ │ │ ├── icon-60@2x.png │ │ │ ├── icon-60@3x.png │ │ │ ├── icon-72@2x.png │ │ │ ├── icon-76@2x.png │ │ │ ├── icon-86@2x.png │ │ │ ├── icon-98@2x.png │ │ │ ├── icon-small.png │ │ │ ├── icon-27.5@2x.png │ │ │ ├── icon-83.5@2x.png │ │ │ ├── icon-small@2x.png │ │ │ └── icon-small@3x.png │ │ └── splash │ │ │ ├── Default-667h.png │ │ │ ├── Default-736h.png │ │ │ ├── Default-2436h.png │ │ │ ├── Default~iphone.png │ │ │ ├── Default@2x~iphone.png │ │ │ ├── Default-1792h~iphone.png │ │ │ ├── Default-2688h~iphone.png │ │ │ ├── Default-568h@2x~iphone.png │ │ │ ├── Default-Landscape-736h.png │ │ │ ├── Default-Landscape~ipad.png │ │ │ ├── Default-Portrait~ipad.png │ │ │ ├── Default-Landscape-2436h.png │ │ │ ├── Default-Portrait@2x~ipad.png │ │ │ ├── Default-Landscape@2x~ipad.png │ │ │ ├── Default-Landscape@~ipadpro.png │ │ │ ├── Default-Portrait@~ipadpro.png │ │ │ ├── Default@2x~universal~anyany.png │ │ │ ├── Default-Landscape-1792h~iphone.png │ │ │ └── Default-Landscape-2688h~iphone.png │ ├── android │ │ ├── icon │ │ │ ├── drawable-hdpi-icon.png │ │ │ ├── drawable-ldpi-icon.png │ │ │ ├── drawable-mdpi-icon.png │ │ │ ├── drawable-xhdpi-icon.png │ │ │ ├── drawable-xxhdpi-icon.png │ │ │ └── drawable-xxxhdpi-icon.png │ │ ├── splash │ │ │ ├── drawable-land-hdpi-screen.png │ │ │ ├── drawable-land-ldpi-screen.png │ │ │ ├── drawable-land-mdpi-screen.png │ │ │ ├── drawable-port-hdpi-screen.png │ │ │ ├── drawable-port-ldpi-screen.png │ │ │ ├── drawable-port-mdpi-screen.png │ │ │ ├── drawable-land-xhdpi-screen.png │ │ │ ├── drawable-land-xxhdpi-screen.png │ │ │ ├── drawable-land-xxxhdpi-screen.png │ │ │ ├── drawable-port-xhdpi-screen.png │ │ │ ├── drawable-port-xxhdpi-screen.png │ │ │ └── drawable-port-xxxhdpi-screen.png │ │ └── xml │ │ │ └── network_security_config.xml │ └── README.md ├── ionic.config.json ├── .firebaserc ├── e2e │ ├── tsconfig.json │ ├── src │ │ ├── app.po.ts │ │ └── app.e2e-spec.ts │ └── protractor.conf.js ├── .editorconfig ├── tsconfig.app.json ├── tsconfig.spec.json ├── .gitignore ├── tsconfig.json ├── .browserslistrc ├── firebase.json ├── .eslintrc.json ├── karma.conf.js ├── package.json └── angular.json ├── .htaccess ├── app_db ├── delete_message.php ├── remove_partecipante.php ├── nuovo_consulto.php ├── update_password.php ├── send_message.php ├── config.php ├── add_partecipante.php ├── nuovo_consultoPartecipante.php ├── send_allegato.php ├── search_paziente.php ├── process_login.php ├── search_partecipants.php ├── load_partecipanti.php ├── load_messages.php ├── process_register.php ├── load_allegati.php └── load_consulti_medico.php ├── .vscode └── launch.json └── api ├── medico.php └── paziente.php /README.md: -------------------------------------------------------------------------------- 1 | # teleconsulto -------------------------------------------------------------------------------- /app_teleconsulto/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/login/login.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/nuovo/nuovo.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/profile/profile.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/registration/registration.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-paziente/new-paziente.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-login/zoom-login.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/resources/splash.png.md5: -------------------------------------------------------------------------------- 1 | 2412a8324a656ec5993eb50b3b293c69 -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-partecipant/new-partecipant.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-non-login/zoom-non-login.page.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/consulto/consulto.page.scss: -------------------------------------------------------------------------------- 1 | ion-content { 2 | --background: whitesmoke; 3 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/modals/allegati/allegati.component.scss: -------------------------------------------------------------------------------- 1 | .whitesmoke{ 2 | background-color: whitesmoke; 3 | } -------------------------------------------------------------------------------- /app_teleconsulto/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/splash.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /app_teleconsulto/src/assets/icon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/src/assets/icon/favicon.png -------------------------------------------------------------------------------- /app_teleconsulto/ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "teleconsulto", 3 | "integrations": { 4 | "cordova": {} 5 | }, 6 | "type": "angular" 7 | } 8 | -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-1024.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-20.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-29.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-108@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-108@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-20@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-20@3x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-24@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-29@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-29@3x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-44@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-86@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-98@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-small.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-27.5@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-small@2x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/icon/icon-small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/icon/icon-small@3x.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-2436h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-2436h.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/src/app/models/chat.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface Chat { 3 | 4 | mittente?: string, 5 | data_ora?: string, 6 | messaggio?: string, 7 | allegato?: string; 8 | } -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-1792h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-1792h~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-2688h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-2688h~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape-2436h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape-2436h.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape@~ipadpro.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Portrait@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Portrait@~ipadpro.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default@2x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default@2x~universal~anyany.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-land-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-land-hdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-land-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-land-ldpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-land-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-land-mdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-port-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-port-hdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-port-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-port-ldpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-port-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-port-mdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-land-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-land-xhdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-land-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-land-xxhdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-land-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-land-xxxhdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-port-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-port-xhdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-port-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-port-xxhdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/splash/drawable-port-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/android/splash/drawable-port-xxxhdpi-screen.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape-1792h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape-1792h~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/resources/ios/splash/Default-Landscape-2688h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorenzoromandini/teleconsulto/HEAD/app_teleconsulto/resources/ios/splash/Default-Landscape-2688h~iphone.png -------------------------------------------------------------------------------- /app_teleconsulto/src/app/models/paziente.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface Paziente { 3 | id ?: string, 4 | nome ?: string, 5 | cognome ?: string, 6 | data_nascita ?: string, 7 | codice_fiscale ?: string, 8 | gender ?: string 9 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/zone-flags.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Prevents Angular change detection from 3 | * running with certain Web Component callbacks 4 | */ 5 | // eslint-disable-next-line no-underscore-dangle 6 | (window as any).__Zone_disable_customElements = true; 7 | -------------------------------------------------------------------------------- /app_teleconsulto/.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "teleconsulto-e1656": { 4 | "hosting": { 5 | "app": [ 6 | "teleconsulto-e1656" 7 | ] 8 | } 9 | } 10 | }, 11 | "projects": { 12 | "default": "teleconsulto-e1656" 13 | } 14 | } -------------------------------------------------------------------------------- /app_teleconsulto/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es2018", 7 | "types": [ 8 | "jasmine", 9 | "node" 10 | ] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app_teleconsulto/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.deepCss('app-root ion-content')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app_teleconsulto/resources/android/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | localhost 5 | 6 | 7 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/models/medico.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface Medico { 3 | 4 | id?: string; 5 | nome?: string; 6 | cognome?: string; 7 | codice_fiscale?: string; 8 | data_nascita?: string; 9 | gender?: string; 10 | professione?: string; 11 | email?: string; 12 | password?: string; 13 | 14 | } -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine On 2 | 3 | RewriteRule ^api/medici/?$ api/medico.php 4 | RewriteRule ^api/medici/([0-9]+)?$ api/medico.php?id=$1 5 | 6 | RewriteRule ^api/pazienti/?$ api/paziente.php 7 | RewriteRule ^api/pazienti/([0-9]+)?$ api/paziente.php?id=$1 8 | 9 | RewriteRule ^api/consulti/?$ api/consulto.php 10 | RewriteRule ^api/consulti/([0-9]+)?$ api/consulto.php?id=$1 -------------------------------------------------------------------------------- /app_teleconsulto/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /app_teleconsulto/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('new App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should be blank', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toContain('Start with Ionic UI Components'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /app_teleconsulto/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/models/consulto.ts: -------------------------------------------------------------------------------- 1 | import { Medico } from "./medico"; 2 | 3 | export interface Consulto { 4 | codice_consulto ?: string, 5 | cognome_paziente ?: string, 6 | nome_paziente ?: string, 7 | codice_paziente ?: string, 8 | partecipanti ?: Array, 9 | oggetto_consulto ?: string, 10 | data_inizio ?: string, 11 | richiedente ?: string 12 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /app_teleconsulto/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /app_db/delete_message.php: -------------------------------------------------------------------------------- 1 | true)); 11 | } else { 12 | $result = json_encode(array('success' => false)); 13 | } 14 | 15 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/home/home-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { HomePage } from './home.page'; 4 | 5 | const routes: Routes = [ 6 | { 7 | path: '', 8 | component: HomePage, 9 | } 10 | ]; 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule] 15 | }) 16 | export class HomePageRoutingModule {} 17 | -------------------------------------------------------------------------------- /app_teleconsulto/resources/README.md: -------------------------------------------------------------------------------- 1 | These are Cordova resources. You can replace icon.png and splash.png and run 2 | `ionic cordova resources` to generate custom icons and splash screens for your 3 | app. See `ionic cordova resources --help` for details. 4 | 5 | Cordova reference documentation: 6 | 7 | - Icons: https://cordova.apache.org/docs/en/latest/config_ref/images.html 8 | - Splash Screens: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/ 9 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/chat/chat-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ChatPage } from './chat.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: ChatPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class ChatPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/login/login-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { LoginPage } from './login.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: LoginPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class LoginPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/nuovo/nuovo-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { NuovoPage } from './nuovo.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: NuovoPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class NuovoPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/profile/profile-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ProfilePage } from './profile.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: ProfilePage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class ProfilePageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/consulto/consulto-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ConsultoPage } from './consulto.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: ConsultoPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class ConsultoPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-login/zoom-login-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ZoomLoginPage } from './zoom-login.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: ZoomLoginPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class ZoomLoginPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/registration/registration-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { RegistrationPage } from './registration.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: RegistrationPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class RegistrationPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-paziente/new-paziente-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { NewPazientePage } from './new-paziente.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: NewPazientePage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class NewPazientePageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-non-login/zoom-non-login-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ZoomNonLoginPage } from './zoom-non-login.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: ZoomNonLoginPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class ZoomNonLoginPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-partecipant/new-partecipant-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { NewPartecipantPage } from './new-partecipant.page'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: NewPartecipantPage 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class NewPartecipantPageRoutingModule {} 18 | -------------------------------------------------------------------------------- /app_db/remove_partecipante.php: -------------------------------------------------------------------------------- 1 | true)); 12 | } else { 13 | $result = json_encode(array('success' => false)); 14 | } 15 | 16 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { IonicModule } from '@ionic/angular'; 4 | import { FormsModule } from '@angular/forms'; 5 | import { HomePage } from './home.page'; 6 | 7 | import { HomePageRoutingModule } from './home-routing.module'; 8 | 9 | 10 | @NgModule({ 11 | imports: [ 12 | CommonModule, 13 | FormsModule, 14 | IonicModule, 15 | HomePageRoutingModule 16 | ], 17 | declarations: [HomePage] 18 | }) 19 | export class HomePageModule {} 20 | -------------------------------------------------------------------------------- /app_db/nuovo_consulto.php: -------------------------------------------------------------------------------- 1 | true)); 15 | } else { 16 | $result = json_encode(array('success' => false, 'msg' => "Errore nell'inserimento di un nuovo consulto")); 17 | } 18 | 19 | echo $result; -------------------------------------------------------------------------------- /app_db/update_password.php: -------------------------------------------------------------------------------- 1 | true, 'msg' => "Password modificata correttamente")); 13 | } else { 14 | $result = json_encode(array('success' => false, 'msg' => "Errore")); 15 | } 16 | 17 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/login/login.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { LoginPageRoutingModule } from './login-routing.module'; 8 | 9 | import { LoginPage } from './login.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | LoginPageRoutingModule 17 | ], 18 | declarations: [LoginPage] 19 | }) 20 | export class LoginPageModule {} 21 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/nuovo/nuovo.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { NuovoPageRoutingModule } from './nuovo-routing.module'; 8 | 9 | import { NuovoPage } from './nuovo.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | NuovoPageRoutingModule 17 | ], 18 | declarations: [NuovoPage] 19 | }) 20 | export class NuovoPageModule {} 21 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Usare IntelliSense per informazioni sui possibili attributi. 3 | // Al passaggio del mouse vengono visualizzate le descrizioni degli attributi esistenti. 4 | // Per altre informazioni, visitare: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "pwa-chrome", 9 | "request": "launch", 10 | "name": "Launch Chrome against localhost", 11 | "url": "http://localhost:8080", 12 | "webRoot": "${workspaceFolder}" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/profile/profile.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { ProfilePageRoutingModule } from './profile-routing.module'; 8 | 9 | import { ProfilePage } from './profile.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | ProfilePageRoutingModule 17 | ], 18 | declarations: [ProfilePage] 19 | }) 20 | export class ProfilePageModule {} 21 | -------------------------------------------------------------------------------- /app_db/send_message.php: -------------------------------------------------------------------------------- 1 | true)); 16 | } else { 17 | $result = json_encode(array('success' => false, 'msg' => "Errore nell'invio del messaggio")); 18 | } 19 | 20 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | *~ 5 | *.sw[mnpcod] 6 | .tmp 7 | *.tmp 8 | *.tmp.* 9 | *.sublime-project 10 | *.sublime-workspace 11 | .DS_Store 12 | Thumbs.db 13 | UserInterfaceState.xcuserstate 14 | $RECYCLE.BIN/ 15 | 16 | *.log 17 | log.txt 18 | npm-debug.log* 19 | 20 | /.idea 21 | /.ionic 22 | /.sass-cache 23 | /.sourcemaps 24 | /.versions 25 | /.vscode 26 | /coverage 27 | /dist 28 | /node_modules 29 | /platforms 30 | /plugins 31 | /www 32 | 33 | # Firebase 34 | .firebase 35 | *-debug.log 36 | .runtimeconfig.json 37 | -------------------------------------------------------------------------------- /app_db/config.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-login/zoom-login.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { ZoomLoginPageRoutingModule } from './zoom-login-routing.module'; 8 | 9 | import { ZoomLoginPage } from './zoom-login.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | ZoomLoginPageRoutingModule 17 | ], 18 | declarations: [ZoomLoginPage] 19 | }) 20 | export class ZoomLoginPageModule {} 21 | -------------------------------------------------------------------------------- /app_db/add_partecipante.php: -------------------------------------------------------------------------------- 1 | true, 'msg' => "Medico aggiunto")); 15 | } else { 16 | $result = json_encode(array('success' => false, 'msg' => "Errore nell'inserimento di un nuovo partecipante")); 17 | } 18 | 19 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-paziente/new-paziente.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { NewPazientePageRoutingModule } from './new-paziente-routing.module'; 8 | 9 | import { NewPazientePage } from './new-paziente.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | NewPazientePageRoutingModule 17 | ], 18 | declarations: [NewPazientePage] 19 | }) 20 | export class NewPazientePageModule {} 21 | -------------------------------------------------------------------------------- /app_db/nuovo_consultoPartecipante.php: -------------------------------------------------------------------------------- 1 | true, 'msg' => "Nuovo consulto inserito")); 15 | } else { 16 | $result = json_encode(array('success' => false, 'msg' => "Errore nell'inserimento del richiedente")); 17 | } 18 | 19 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/registration/registration.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { RegistrationPageRoutingModule } from './registration-routing.module'; 8 | 9 | import { RegistrationPage } from './registration.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | RegistrationPageRoutingModule 17 | ], 18 | declarations: [RegistrationPage] 19 | }) 20 | export class RegistrationPageModule {} 21 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/chat/chat.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { ChatPageRoutingModule } from './chat-routing.module'; 8 | 9 | import { ChatPage } from './chat.page'; 10 | import { LongPressModule } from 'ionic-long-press'; 11 | 12 | @NgModule({ 13 | imports: [ 14 | CommonModule, 15 | FormsModule, 16 | IonicModule, 17 | ChatPageRoutingModule, 18 | LongPressModule 19 | ], 20 | declarations: [ChatPage] 21 | }) 22 | export class ChatPageModule {} -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-non-login/zoom-non-login.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { ZoomNonLoginPageRoutingModule } from './zoom-non-login-routing.module'; 8 | 9 | import { ZoomNonLoginPage } from './zoom-non-login.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | ZoomNonLoginPageRoutingModule 17 | ], 18 | declarations: [ZoomNonLoginPage] 19 | }) 20 | export class ZoomNonLoginPageModule {} 21 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-partecipant/new-partecipant.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { NewPartecipantPageRoutingModule } from './new-partecipant-routing.module'; 8 | 9 | import { NewPartecipantPage } from './new-partecipant.page'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | FormsModule, 15 | IonicModule, 16 | NewPartecipantPageRoutingModule 17 | ], 18 | declarations: [NewPartecipantPage] 19 | }) 20 | export class NewPartecipantPageModule {} 21 | -------------------------------------------------------------------------------- /app_db/send_allegato.php: -------------------------------------------------------------------------------- 1 | true, 'msg' => "File caricato")); 17 | } else { 18 | $result = json_encode(array('success' => false, 'msg' => "Errore nel caricamento del file")); 19 | } 20 | 21 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/home/home.page.scss: -------------------------------------------------------------------------------- 1 | ion-content { 2 | --background: whitesmoke; 3 | } 4 | 5 | ion-toolbar { 6 | --background: whitesmoke; 7 | } 8 | 9 | #container { 10 | text-align: center; 11 | 12 | position: absolute; 13 | left: 0; 14 | right: 0; 15 | top: 50%; 16 | transform: translateY(-50%); 17 | } 18 | 19 | #container strong { 20 | font-size: 20px; 21 | line-height: 26px; 22 | } 23 | 24 | #container p { 25 | font-size: 16px; 26 | line-height: 22px; 27 | 28 | color: #8c8c8c; 29 | 30 | margin: 0; 31 | } 32 | 33 | #container a { 34 | text-decoration: none; 35 | } 36 | 37 | .card-header { 38 | --background: var(--ion-color-tertiary); 39 | color: white; 40 | font-size: 16px; 41 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 2 | import { TestBed, waitForAsync } from '@angular/core/testing'; 3 | 4 | import { AppComponent } from './app.component'; 5 | 6 | describe('AppComponent', () => { 7 | 8 | beforeEach(waitForAsync(() => { 9 | 10 | TestBed.configureTestingModule({ 11 | declarations: [AppComponent], 12 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 13 | }).compileComponents(); 14 | })); 15 | 16 | it('should create the app', () => { 17 | const fixture = TestBed.createComponent(AppComponent); 18 | const app = fixture.debugElement.componentInstance; 19 | expect(app).toBeTruthy(); 20 | }); 21 | // TODO: add more tests! 22 | 23 | }); 24 | -------------------------------------------------------------------------------- /app_teleconsulto/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "sourceMap": true, 8 | "declaration": false, 9 | "downlevelIteration": true, 10 | "experimentalDecorators": true, 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "es2015", 14 | "module": "es2020", 15 | "lib": ["es2018", "dom"] 16 | }, 17 | "angularCompilerOptions": { 18 | "enableI18nLegacyMessageIdFormat": false, 19 | "strictInjectionParameters": true, 20 | "strictInputAccessModifiers": true, 21 | "strictTemplates": true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app_teleconsulto/.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 1 Chrome version 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. 18 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/chat/chat.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { ChatPage } from './chat.page'; 5 | 6 | describe('ChatPage', () => { 7 | let component: ChatPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ ChatPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(ChatPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/home/home.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { HomePage } from './home.page'; 5 | 6 | describe('HomePage', () => { 7 | let component: HomePage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ HomePage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(HomePage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/login/login.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { LoginPage } from './login.page'; 5 | 6 | describe('LoginPage', () => { 7 | let component: LoginPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ LoginPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(LoginPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/nuovo/nuovo.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { NuovoPage } from './nuovo.page'; 5 | 6 | describe('NuovoPage', () => { 7 | let component: NuovoPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ NuovoPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(NuovoPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/profile/profile.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { ProfilePage } from './profile.page'; 5 | 6 | describe('ProfilePage', () => { 7 | let component: ProfilePage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ ProfilePage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(ProfilePage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/consulto/consulto.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { ConsultoPage } from './consulto.page'; 5 | 6 | describe('ConsultoPage', () => { 7 | let component: ConsultoPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ ConsultoPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(ConsultoPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/consulto/consulto.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { ConsultoPageRoutingModule } from './consulto-routing.module'; 8 | import { ConsultoPage } from './consulto.page'; 9 | import { AllegatiComponent } from '../modals/allegati/allegati.component'; 10 | import { AutosizeModule } from 'ngx-autosize'; 11 | 12 | @NgModule({ 13 | entryComponents: [AllegatiComponent], 14 | imports: [ 15 | CommonModule, 16 | FormsModule, 17 | IonicModule, 18 | ConsultoPageRoutingModule, 19 | AutosizeModule 20 | ], 21 | declarations: [ConsultoPage, AllegatiComponent] 22 | }) 23 | export class ConsultoPageModule {} 24 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-login/zoom-login.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { ZoomLoginPage } from './zoom-login.page'; 5 | 6 | describe('ZoomLoginPage', () => { 7 | let component: ZoomLoginPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ ZoomLoginPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(ZoomLoginPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-paziente/new-paziente.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { NewPazientePage } from './new-paziente.page'; 5 | 6 | describe('NewPazientePage', () => { 7 | let component: NewPazientePage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ NewPazientePage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(NewPazientePage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/registration/registration.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { RegistrationPage } from './registration.page'; 5 | 6 | describe('RegistrationPage', () => { 7 | let component: RegistrationPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ RegistrationPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(RegistrationPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ionic App 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/modals/allegati/allegati.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { AllegatiComponent } from './allegati.component'; 5 | 6 | describe('AllegatiComponent', () => { 7 | let component: AllegatiComponent; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ AllegatiComponent ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(AllegatiComponent); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-non-login/zoom-non-login.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { ZoomNonLoginPage } from './zoom-non-login.page'; 5 | 6 | describe('ZoomNonLoginPage', () => { 7 | let component: ZoomNonLoginPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ ZoomNonLoginPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(ZoomNonLoginPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: { 11 | context(path: string, deep?: boolean, filter?: RegExp): { 12 | keys(): string[]; 13 | (id: string): T; 14 | }; 15 | }; 16 | 17 | // First, initialize the Angular testing environment. 18 | getTestBed().initTestEnvironment( 19 | BrowserDynamicTestingModule, 20 | platformBrowserDynamicTesting() 21 | ); 22 | // Then we find all the tests. 23 | const context = require.context('./', true, /\.spec\.ts$/); 24 | // And load the modules. 25 | context.keys().map(context); 26 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-partecipant/new-partecipant.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; 2 | import { IonicModule } from '@ionic/angular'; 3 | 4 | import { NewPartecipantPage } from './new-partecipant.page'; 5 | 6 | describe('NewPartecipantPage', () => { 7 | let component: NewPartecipantPage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ NewPartecipantPage ], 13 | imports: [IonicModule.forRoot()] 14 | }).compileComponents(); 15 | 16 | fixture = TestBed.createComponent(NewPartecipantPage); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | })); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/providers/access-providers.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@angular/core"; 2 | import { HttpClient, HttpHeaders } from "@angular/common/http"; 3 | import 'rxjs/add/operator/map'; 4 | import 'rxjs/add/operator/timeout'; 5 | 6 | @Injectable() 7 | export class AccessProviders { 8 | 9 | // url backend api json 10 | server: string = 'https://mony-legends.000webhostapp.com/db/'; 11 | 12 | constructor( 13 | public http: HttpClient 14 | ) { } 15 | 16 | postData(body, file) { 17 | let headers = new HttpHeaders() 18 | .set('Accept', '*/*') 19 | .set('Content-Type', 'text/plain'); 20 | 21 | let options = { 22 | headers: headers 23 | } 24 | 25 | return this.http.post(this.server + file + ".php", JSON.stringify(body), options) 26 | .timeout(59000) // 59s timeout 27 | .map(res => res); 28 | } 29 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/chat/chat.page.scss: -------------------------------------------------------------------------------- 1 | ion-content { 2 | --ion-background-color: #81ffc4; 3 | } 4 | 5 | .message { 6 | padding: 10px; 7 | border-radius: 10px; 8 | margin-bottom: 4px; 9 | white-space: pre-wrap; 10 | } 11 | 12 | .other-message { 13 | background: var(--ion-color-tertiary); 14 | color: #ffffff 15 | } 16 | 17 | .my-message { 18 | background: var(--ion-color-secondary); 19 | color: #ffffff 20 | } 21 | 22 | .time{ 23 | color: #dfdfdf; 24 | float: right; 25 | font-size: small; 26 | } 27 | 28 | .msg-btn{ 29 | --padding-start: 0.5em; 30 | --padding-end:0.5em; 31 | } 32 | .message-input{ 33 | width: 100%; 34 | border: 1px solid var(--ion-color-medium); 35 | border-radius: 10px; 36 | background: #ffffff; 37 | resize: none; 38 | padding-left: 10px; 39 | padding-right: 10px; 40 | } 41 | 42 | 43 | .footer { 44 | --background: green; 45 | } -------------------------------------------------------------------------------- /app_teleconsulto/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "target": "app", 4 | "public": "www", 5 | "ignore": [ 6 | "**/.*" 7 | ], 8 | "headers": [ 9 | { 10 | "source": "*.[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].+(css|js)", 11 | "headers": [ 12 | { 13 | "key": "Cache-Control", 14 | "value": "public,max-age=31536000,immutable" 15 | } 16 | ] 17 | }, 18 | { 19 | "source": "/@(ngsw-worker.js|ngsw.json)", 20 | "headers": [ 21 | { 22 | "key": "Cache-Control", 23 | "value": "no-cache" 24 | } 25 | ] 26 | } 27 | ], 28 | "rewrites": [ 29 | { 30 | "source": "**", 31 | "destination": "/index.html" 32 | } 33 | ] 34 | } 35 | } -------------------------------------------------------------------------------- /app_db/search_paziente.php: -------------------------------------------------------------------------------- 1 | $rows['id'], 15 | 'cognome' => $rows['cognome'], 16 | 'nome' => $rows['nome'], 17 | 'codice_fiscale' => $rows['codice_fiscale'], 18 | 'data_nascita' => $rows['data_nascita'], 19 | ); 20 | } 21 | 22 | if ($query) { 23 | $result = json_encode(array('success' => true, 'result' => $data)); 24 | } else { 25 | $result = json_encode(array('success' => false)); 26 | } 27 | 28 | echo $result; -------------------------------------------------------------------------------- /app_db/process_login.php: -------------------------------------------------------------------------------- 1 | $logindata['id'], 13 | 'codice_fiscale' => $logindata['codice_fiscale'], 14 | 'nome' => $logindata['nome'], 15 | 'cognome' => $logindata['cognome'], 16 | 'professione' => $logindata['professione'], 17 | 'gender' => $logindata['gender'], 18 | 'data_nascita' => $logindata['data_nascita'], 19 | 'email' => $logindata['email'], 20 | 'password' => $password 21 | ); 22 | 23 | if ($logindata) { 24 | $result = json_encode(array('success' => true, 'result' => $data)); 25 | } else { 26 | $result = json_encode(array('success' => false)); 27 | } 28 | 29 | echo $result; -------------------------------------------------------------------------------- /app_db/search_partecipants.php: -------------------------------------------------------------------------------- 1 | $rows['id'], 14 | 'cognome' => $rows['cognome'], 15 | 'nome' => $rows['nome'], 16 | 'codice_fiscale' => $rows['codice_fiscale'], 17 | 'professione' => $rows['professione'], 18 | 'boolPartecipante' => false 19 | ); 20 | } 21 | 22 | if ($query) { 23 | $result = json_encode(array('success' => true, 'result' => $data)); 24 | } else { 25 | $result = json_encode(array('success' => false)); 26 | } 27 | 28 | echo $result; -------------------------------------------------------------------------------- /app_db/load_partecipanti.php: -------------------------------------------------------------------------------- 1 | $rows['medico_id'], 16 | 'medico_cognome' => $rows['medico_cognome'], 17 | 'medico_nome' => $rows['medico_nome'], 18 | 'richiedente' => $rows['richiedente'], 19 | ); 20 | } 21 | 22 | if ($query) { 23 | $result = json_encode(array('success' => true, 'result' => $data)); 24 | } else { 25 | $result = json_encode(array('success' => false)); 26 | } 27 | 28 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | browserName: 'chrome' 17 | }, 18 | directConnect: true, 19 | SELENIUM_PROMISE_MANAGER: false, 20 | baseUrl: 'http://localhost:4200/', 21 | framework: 'jasmine', 22 | jasmineNodeOpts: { 23 | showColors: true, 24 | defaultTimeoutInterval: 30000, 25 | print: function() {} 26 | }, 27 | onPrepare() { 28 | require('ts-node').register({ 29 | project: require('path').join(__dirname, './tsconfig.json') 30 | }); 31 | jasmine.getEnv().addReporter(new SpecReporter({ 32 | spec: { 33 | displayStacktrace: StacktraceOption.PRETTY 34 | } 35 | })); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /app_db/load_messages.php: -------------------------------------------------------------------------------- 1 | $rows['id_messaggio'], 15 | 'mittente_id' => $rows['mittente_id'], 16 | 'mittente_nome' => $rows['mittente_nome'], 17 | 'mittente_cognome' => $rows['mittente_cognome'], 18 | 'testo' => $rows['testo'], 19 | 'data_ora' => $rows['data_ora'], 20 | ); 21 | } 22 | 23 | if ($query) { 24 | $result = json_encode(array('success' => true, 'result' => $data)); 25 | } else { 26 | $result = json_encode(array('success' => false)); 27 | } 28 | 29 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false, 7 | firebase: { 8 | apiKey: "AIzaSyC_AaiEjnHL1isOQqM3CRDjWNjRHqyZEks", 9 | authDomain: "teleconsulto-e1656.firebaseapp.com", 10 | projectId: "teleconsulto-e1656", 11 | storageBucket: "teleconsulto-e1656.appspot.com", 12 | messagingSenderId: "754790250819", 13 | appId: "1:754790250819:web:6699592c9950fc1f3317f6", 14 | measurementId: "G-M4SBBFSGBV" 15 | } 16 | }; 17 | 18 | /* 19 | * For easier debugging in development mode, you can import the following file 20 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 21 | * 22 | * This import should be commented out in production mode because it will have a negative impact 23 | * on performance if an error is thrown. 24 | */ 25 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 26 | -------------------------------------------------------------------------------- /app_teleconsulto/src/assets/shapes.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app_db/process_register.php: -------------------------------------------------------------------------------- 1 | false, 'msg' => "Email già registrata")); 11 | } else { 12 | 13 | $password = md5($postjson['password']); 14 | 15 | $insert = mysqli_query($mysqli, "INSERT INTO medico SET 16 | codice_fiscale = '$postjson[codice_fiscale]', 17 | nome = '$postjson[nome]', 18 | cognome = '$postjson[cognome]', 19 | data_nascita = '$postjson[data_nascita]', 20 | professione = '$postjson[professione]', 21 | email = '$postjson[email]', 22 | gender = '$postjson[gender]', 23 | password = '$password' 24 | "); 25 | 26 | if ($insert) { 27 | $result = json_encode(array('success' => true, 'msg' => "Registrazione completata")); 28 | } else { 29 | $result = json_encode(array('success' => false, 'msg' => "Errore nella registrazione")); 30 | } 31 | } 32 | 33 | echo $result; -------------------------------------------------------------------------------- /app_db/load_allegati.php: -------------------------------------------------------------------------------- 1 | $rows['id_messaggio'], 16 | 'mittente_id' => $rows['mittente_id'], 17 | 'mittente_nome' => $rows['mittente_nome'], 18 | 'mittente_cognome' => $rows['mittente_cognome'], 19 | 'testo' => $rows['testo'], 20 | 'allegato' => $rows['allegato'], 21 | 'data_ora' => $rows['data_ora'], 22 | ); 23 | } 24 | 25 | if ($query) { 26 | $result = json_encode(array('success' => true, 'result' => $data)); 27 | } else { 28 | $result = json_encode(array('success' => false)); 29 | } 30 | 31 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/global.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * App Global CSS 3 | * ---------------------------------------------------------------------------- 4 | * Put style rules here that you want to apply globally. These styles are for 5 | * the entire app and not just one component. Additionally, this file can be 6 | * used as an entry point to import other CSS/Sass files to be included in the 7 | * output CSS. 8 | * For more information on global stylesheets, visit the documentation: 9 | * https://ionicframework.com/docs/layout/global-stylesheets 10 | */ 11 | 12 | /* Core CSS required for Ionic components to work properly */ 13 | @import "~@ionic/angular/css/core.css"; 14 | 15 | /* Basic CSS for apps built with Ionic */ 16 | @import "~@ionic/angular/css/normalize.css"; 17 | @import "~@ionic/angular/css/structure.css"; 18 | @import "~@ionic/angular/css/typography.css"; 19 | @import '~@ionic/angular/css/display.css'; 20 | 21 | /* Optional CSS utils that can be commented out */ 22 | @import "~@ionic/angular/css/padding.css"; 23 | @import "~@ionic/angular/css/float-elements.css"; 24 | @import "~@ionic/angular/css/text-alignment.css"; 25 | @import "~@ionic/angular/css/text-transformation.css"; 26 | @import "~@ionic/angular/css/flex-utils.css"; 27 | 28 | ion-toolbar { 29 | --background: whitesmoke; 30 | } 31 | 32 | 33 | ion-content { 34 | --background: whitesmoke; 35 | } -------------------------------------------------------------------------------- /app_teleconsulto/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "ignorePatterns": ["projects/**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts"], 7 | "parserOptions": { 8 | "project": ["tsconfig.json", "e2e/tsconfig.json"], 9 | "createDefaultProgram": true 10 | }, 11 | "extends": [ 12 | "plugin:@angular-eslint/ng-cli-compat", 13 | "plugin:@angular-eslint/ng-cli-compat--formatting-add-on", 14 | "plugin:@angular-eslint/template/process-inline-templates" 15 | ], 16 | "rules": { 17 | "@angular-eslint/component-class-suffix": [ 18 | "error", 19 | { 20 | "suffixes": ["Page", "Component"] 21 | } 22 | ], 23 | "@angular-eslint/component-selector": [ 24 | "error", 25 | { 26 | "type": "element", 27 | "prefix": "app", 28 | "style": "kebab-case" 29 | } 30 | ], 31 | "@angular-eslint/directive-selector": [ 32 | "error", 33 | { 34 | "type": "attribute", 35 | "prefix": "app", 36 | "style": "camelCase" 37 | } 38 | ] 39 | } 40 | }, 41 | { 42 | "files": ["*.html"], 43 | "extends": ["plugin:@angular-eslint/template/recommended"], 44 | "rules": {} 45 | } 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/login/login.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Login 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | Accedi 33 | 34 |
35 | 36 | Non sei ancora registrato ? 37 | 38 |
39 | Clicca qui per procedere alla registrazione 40 |
41 |
42 |
-------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-paziente/new-paziente.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NavigationExtras, Router } from '@angular/router'; 3 | import { Paziente } from 'src/app/models/paziente'; 4 | import { AccessProviders } from 'src/app/providers/access-providers'; 5 | 6 | @Component({ 7 | selector: 'app-new-paziente', 8 | templateUrl: './new-paziente.page.html', 9 | styleUrls: ['./new-paziente.page.scss'], 10 | }) 11 | export class NewPazientePage { 12 | 13 | pazienti: any = []; 14 | paziente_cognome: string = ""; 15 | paziente_nome: string = ""; 16 | paziente_cf: string = ""; 17 | 18 | constructor( 19 | private router: Router, 20 | private accessProviders: AccessProviders 21 | ) { } 22 | 23 | async searchPaziente() { 24 | this.pazienti = []; 25 | return new Promise(resolve => { 26 | let body = { 27 | paziente_cognome: this.paziente_cognome, 28 | paziente_nome: this.paziente_nome, 29 | paziente_cf: this.paziente_cf 30 | } 31 | 32 | this.accessProviders.postData(body, 'search_paziente').subscribe((res: any) => { 33 | for (let datas of res.result) { 34 | this.pazienti.push(datas); 35 | } 36 | resolve(true); 37 | }) 38 | }) 39 | } 40 | 41 | addPaziente(paziente: any) { 42 | let navigationExtras: NavigationExtras = { 43 | queryParams: { 44 | paziente: JSON.stringify(paziente), 45 | } 46 | }; 47 | this.router.navigate(['/nuovo'], navigationExtras); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /app_teleconsulto/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | jasmine: { 17 | // you can add configuration options for Jasmine here 18 | // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html 19 | // for example, you can disable the random execution with `random: false` 20 | // or set a specific seed with `seed: 4321` 21 | }, 22 | clearContext: false // leave Jasmine Spec Runner output visible in browser 23 | }, 24 | jasmineHtmlReporter: { 25 | suppressAll: true // removes the duplicated traces 26 | }, 27 | coverageReporter: { 28 | dir: require('path').join(__dirname, './coverage/ngv'), 29 | subdir: '.', 30 | reporters: [ 31 | { type: 'html' }, 32 | { type: 'text-summary' } 33 | ] 34 | }, 35 | reporters: ['progress', 'kjhtml'], 36 | port: 9876, 37 | colors: true, 38 | logLevel: config.LOG_INFO, 39 | autoWatch: true, 40 | browsers: ['Chrome'], 41 | singleRun: false, 42 | restartOnFileChange: true 43 | }); 44 | }; 45 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { RouteReuseStrategy } from '@angular/router'; 4 | import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; 5 | import { AppComponent } from './app.component'; 6 | import { AppRoutingModule } from './app-routing.module'; 7 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 8 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 9 | import { HttpClientModule } from '@angular/common/http'; 10 | import { IonicStorageModule } from '@ionic/storage-angular'; 11 | import { AccessProviders } from './providers/access-providers'; 12 | import { Zoom } from '@ionic-native/zoom/ngx'; 13 | import { PreviewAnyFile } from '@awesome-cordova-plugins/preview-any-file/ngx'; 14 | import { Downloader} from '@ionic-native/downloader/ngx'; 15 | import { environment } from '../environments/environment'; 16 | import { AngularFireModule } from '@angular/fire/compat'; 17 | import { AngularFireStorageModule } from '@angular/fire//compat/storage'; 18 | 19 | @NgModule({ 20 | declarations: [AppComponent], 21 | entryComponents: [], 22 | imports: [BrowserModule,IonicModule.forRoot(), AppRoutingModule, HttpClientModule, IonicStorageModule.forRoot(), 23 | AngularFireModule.initializeApp(environment.firebase), 24 | AngularFireStorageModule], 25 | providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, AccessProviders, Downloader, SplashScreen, StatusBar, Zoom, PreviewAnyFile], 26 | bootstrap: [AppComponent], 27 | }) 28 | export class AppModule { } 29 | -------------------------------------------------------------------------------- /app_db/load_consulti_medico.php: -------------------------------------------------------------------------------- 1 | $rows['oggetto'], 17 | 'data_inizio' => $rows['data_inizio'], 18 | 'paziente_nome' => $rows['paziente_nome'], 19 | 'paziente_cognome' => $rows['paziente_cognome'], 20 | 'paziente_cf' => $rows['paziente_cf'], 21 | 'paziente_data_nascita' => $rows['paziente_data_nascita'], 22 | 'id_consulto' => $rows['id_consulto'], 23 | 'richiedente_nome' => $rows['richiedente_nome'], 24 | 'richiedente_cognome' => $rows['richiedente_cognome'], 25 | ); 26 | } 27 | 28 | if ($query) { 29 | $result = json_encode(array('success' => true, 'result' => $data)); 30 | } else { 31 | $result = json_encode(array('success' => false)); 32 | } 33 | 34 | echo $result; -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/chat/chat.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Chat 4 | 5 | Chiudi 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | {{ messaggio.mittente_nome }} {{ messaggio.mittente_cognome }} 16 |
17 | {{ messaggio.testo }} 18 |
19 |
20 | {{ messaggio.data_ora | date: 'short'}} 21 |
22 |
23 | 24 | {{ messaggio.mittente_nome }} {{ messaggio.mittente_cognome }} 25 |
26 | {{ messaggio.testo }} 27 |
28 |
29 | {{ messaggio.data_ora | date: 'short'}} 30 |
31 |
32 |
33 |
34 |
35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-non-login/zoom-non-login.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Accesso Diretto 5 | 6 | 7 | Chiudi 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Entra nella riunione 16 | 17 | 18 |


Inserisci l'ID e la password della riunione per entrare

19 | 20 | 21 | ID Riunione 22 | 23 | 24 | 25 | Password Riunione 26 | 27 | 28 | 29 |
30 | 31 | 32 | Entra nella riunione 33 | 34 |
35 |
36 |
37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 | Diretto 45 | 46 | 47 | 48 | Autenticazione 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NavController, Platform, ToastController } from '@ionic/angular'; 3 | import { Storage } from '@ionic/storage'; 4 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 5 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 6 | import { Zoom } from '@ionic-native/zoom/ngx'; 7 | 8 | @Component({ 9 | selector: 'app-root', 10 | templateUrl: 'app.component.html', 11 | styleUrls: ['app.component.scss'], 12 | }) 13 | export class AppComponent { 14 | 15 | SDK_KEY = 'pAahSXkZJ3O6zyJAZq5nq9JYcL0MlHcZqiUs'; 16 | SDK_SECRET = 'DxylRRFGzHQpjUtrUwBeFXDnAUPouEh9L1df'; 17 | 18 | constructor( 19 | private storage: Storage, 20 | private platform: Platform, 21 | private splashScreen: SplashScreen, 22 | private statusBar: StatusBar, 23 | public navCtrl: NavController, 24 | private toastCtrl: ToastController, 25 | private zoomService: Zoom 26 | ) { 27 | this.initializeApp(); 28 | } 29 | 30 | async initializeApp() { 31 | this.platform.ready().then(() => { 32 | this.statusBar.styleDefault(); 33 | this.splashScreen.hide(); 34 | this.zoomService.initialize(this.SDK_KEY, this.SDK_SECRET) 35 | .then((success) => { 36 | console.log(success); 37 | // this.presentToast(success); 38 | }) 39 | .catch((error) => { 40 | console.log(error); 41 | // this.presentToast(error); 42 | }); 43 | }); 44 | 45 | await this.storage.create(); 46 | this.storage.get('storage_xxx').then((res) => { 47 | if (res == null) { 48 | this.navCtrl.navigateRoot('/login'); 49 | } else { 50 | this.navCtrl.navigateRoot('/home') 51 | } 52 | }); 53 | 54 | } 55 | 56 | async presentToast(text) { 57 | const toast = await this.toastCtrl.create({ 58 | message: text, 59 | duration: 3000, 60 | position: 'top' 61 | }); 62 | toast.present(); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = [ 5 | { 6 | path: '', 7 | redirectTo: 'home', 8 | pathMatch: 'full' 9 | }, 10 | { 11 | path: 'home', 12 | loadChildren: () => import('./logged/home/home.module').then( m => m.HomePageModule) 13 | }, 14 | { 15 | path: 'consulto', 16 | loadChildren: () => import('./logged/consulto/consulto.module').then( m => m.ConsultoPageModule) 17 | }, 18 | { 19 | path: 'nuovo', 20 | loadChildren: () => import('./logged/nuovo/nuovo.module').then( m => m.NuovoPageModule) 21 | }, 22 | { 23 | path: 'login', 24 | loadChildren: () => import('./access/login/login.module').then( m => m.LoginPageModule) 25 | }, 26 | { 27 | path: 'registration', 28 | loadChildren: () => import('./access/registration/registration.module').then( m => m.RegistrationPageModule) 29 | }, 30 | { 31 | path: 'zoom-login', 32 | loadChildren: () => import('./logged/zoom/zoom-login/zoom-login.module').then( m => m.ZoomLoginPageModule) 33 | }, 34 | { 35 | path: 'zoom-non-login', 36 | loadChildren: () => import('./logged/zoom/zoom-non-login/zoom-non-login.module').then( m => m.ZoomNonLoginPageModule) 37 | }, 38 | { 39 | path: 'new-partecipant', 40 | loadChildren: () => import('./logged/new-partecipant/new-partecipant.module').then( m => m.NewPartecipantPageModule) 41 | }, 42 | { 43 | path: 'new-paziente', 44 | loadChildren: () => import('./logged/new-paziente/new-paziente.module').then( m => m.NewPazientePageModule) 45 | }, 46 | { 47 | path: 'profile', 48 | loadChildren: () => import('./logged/profile/profile.module').then( m => m.ProfilePageModule) 49 | }, 50 | { 51 | path: 'chat', 52 | loadChildren: () => import('./logged/chat/chat.module').then( m => m.ChatPageModule) 53 | }, 54 | ]; 55 | 56 | @NgModule({ 57 | imports: [ 58 | RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) 59 | ], 60 | exports: [RouterModule] 61 | }) 62 | export class AppRoutingModule { } 63 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/home/home.page.ts: -------------------------------------------------------------------------------- 1 | import { Consulto } from '../../models/consulto'; 2 | import { Component } from '@angular/core'; 3 | import { Router, NavigationExtras } from '@angular/router'; 4 | import { LoadingController, ToastController } from '@ionic/angular'; 5 | import { AccessProviders } from 'src/app/providers/access-providers'; 6 | import { Storage } from '@ionic/storage'; 7 | import { JsonpClientBackend } from '@angular/common/http'; 8 | 9 | @Component({ 10 | selector: 'app-home', 11 | templateUrl: 'home.page.html', 12 | styleUrls: ['home.page.scss'], 13 | }) 14 | export class HomePage { 15 | 16 | datastorage: any; 17 | id: string; 18 | 19 | consulti: any = []; 20 | 21 | constructor( 22 | private router: Router, 23 | private toastCtrl: ToastController, 24 | private loadingCtrl: LoadingController, 25 | private accessProviders: AccessProviders, 26 | private storage: Storage 27 | ) { } 28 | 29 | ionViewWillEnter() { 30 | this.consulti = []; 31 | } 32 | 33 | ionViewDidEnter() { 34 | this.storage.get('storage_xxx').then((res) => { 35 | this.datastorage = res; 36 | this.id = this.datastorage.id; 37 | this.loadConsulti(); 38 | }) 39 | } 40 | 41 | async doRefresh(event) { 42 | const loader = await this.loadingCtrl.create({ 43 | message: "Attendi..." 44 | }) 45 | loader.present(); 46 | 47 | this.ionViewWillEnter(); 48 | this.ionViewDidEnter(); 49 | event.target.complete(); 50 | 51 | loader.dismiss(); 52 | } 53 | 54 | async loadConsulti() { 55 | return new Promise(resolve => { 56 | let body = { 57 | id_medico: this.id, 58 | } 59 | 60 | this.accessProviders.postData(body, 'load_consulti_medico').subscribe((res: any) => { 61 | for (let datas of res.result) { 62 | this.consulti.push(datas); 63 | } 64 | resolve(true); 65 | }) 66 | }) 67 | } 68 | 69 | openConsulto(consulto: any) { 70 | let navigationExtras: NavigationExtras = { 71 | queryParams: { 72 | consulto: JSON.stringify(consulto), 73 | id_utente: JSON.stringify(this.id) 74 | } 75 | }; 76 | this.router.navigate(['/consulto'], navigationExtras); 77 | } 78 | 79 | } 80 | 81 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/home/home.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Teleconsulto 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 21 | 22 | Nuovo consulto 23 | 24 | 25 | 27 | 28 | 29 |

{{ consulto.paziente_cognome }} {{ 30 | consulto.paziente_nome }}

31 |
32 |
33 |

{{ consulto.oggetto }}

34 |
35 | 36 |
Codice paziente: {{ consulto.paziente_cf }}
37 |
38 |
39 | 40 |
41 | Richiedente: {{ consulto.richiedente_cognome }} {{ consulto.richiedente_nome }} 42 |
43 |
44 |
45 | 46 |
Data inizio: {{ consulto.data_inizio }}
47 |
48 |
49 |
50 | 51 |
52 | 53 | 54 |
55 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/modals/allegati/allegati.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Allegati 4 | 5 | Chiudi 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | INVIA 15 | 16 | 17 | INVIA 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {{ allegato.mittente_cognome }} {{ allegato.mittente_cognome }} 29 | {{ allegato.data_ora | date: 'short'}} 30 | 31 | 32 | 33 | {{ allegato.testo }} 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-non-login/zoom-non-login.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ToastController } from '@ionic/angular'; 3 | import { Zoom } from '@ionic-native/zoom/ngx'; 4 | 5 | @Component({ 6 | selector: 'app-zoom-non-login', 7 | templateUrl: './zoom-non-login.page.html', 8 | styleUrls: ['./zoom-non-login.page.scss'], 9 | }) 10 | export class ZoomNonLoginPage { 11 | 12 | // Meeting variables 13 | meetingNumber = null; 14 | meetingPassword = ''; 15 | displayName = ''; 16 | 17 | constructor( 18 | private toastCtrl: ToastController, 19 | private zoomService: Zoom 20 | ) {} 21 | 22 | /** 23 | * Join a meeting. 24 | */ 25 | joinMeeting() { 26 | console.log('Going to join meeting'); 27 | // Prepare meeting option 28 | const options = { 29 | custom_meeting_id: "Customized Title", 30 | no_share: false, 31 | no_audio: false, 32 | no_video: false, 33 | no_driving_mode: true, 34 | no_invite: true, 35 | no_meeting_end_message: true, 36 | no_dial_in_via_phone: false, 37 | no_dial_out_to_phone: false, 38 | no_disconnect_audio: true, 39 | no_meeting_error_message: true, 40 | no_unmute_confirm_dialog: true, 41 | no_webinar_register_dialog: false, 42 | no_titlebar: false, 43 | no_bottom_toolbar: false, 44 | no_button_video: false, 45 | no_button_audio: false, 46 | no_button_share: false, 47 | no_button_participants: false, 48 | no_button_more: false, 49 | no_text_password: true, 50 | no_text_meeting_id: false, 51 | no_button_leave: false 52 | }; 53 | // Call join meeting method. 54 | this.zoomService.joinMeeting(this.meetingNumber, this.meetingPassword, this.displayName, options) 55 | .then((success) => { 56 | console.log(success); 57 | this.presentToast(success); 58 | this.meetingNumber = null; 59 | this.meetingPassword = null; 60 | }).catch((error) => { 61 | console.log(error); 62 | this.presentToast(error); 63 | }); 64 | } 65 | 66 | async presentToast(text) { 67 | const toast = await this.toastCtrl.create({ 68 | message: text, 69 | duration: 3000, 70 | position: 'top' 71 | }); 72 | toast.present(); 73 | } 74 | 75 | 76 | } 77 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-login/zoom-login.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Accesso con Autenticazione 5 | 6 | 7 | Chiudi 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Login 16 | 17 | 18 |


Inserisci le tue credenziali di Zoom

19 | 20 | 21 | Email 22 | 23 | 24 | 25 | Password 26 | 27 | 28 | 29 | Login 30 |
31 | Non sei registrato a Zoom ? 32 | Registrati a Zoom 33 | Logout 34 |
35 |
36 | 37 | 38 | Meeting 39 | 40 | 41 |
42 | Start an Instant Meeting 43 |
44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | Diretto 54 | 55 | 56 | 57 | Autenticazione 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/zoom/zoom-login/zoom-login.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ToastController } from '@ionic/angular'; 3 | import {Zoom} from '@ionic-native/zoom/ngx'; 4 | 5 | @Component({ 6 | selector: 'app-zoom-login', 7 | templateUrl: './zoom-login.page.html', 8 | styleUrls: ['./zoom-login.page.scss'], 9 | }) 10 | export class ZoomLoginPage { 11 | 12 | // Login variables 13 | userName = ''; 14 | password = ''; 15 | loggedIn = false; 16 | 17 | // Meeting variables 18 | meetingNumber = null; 19 | meetingPassword = ''; 20 | displayName = 'Zoom Ionic'; 21 | 22 | constructor( 23 | private toastCtrl: ToastController, 24 | private zoomService: Zoom, 25 | ) { 26 | // Check whether the user is logged in. 27 | this.zoomService.isLoggedIn().then((success) => { 28 | console.log(success); 29 | if (success === true) { 30 | this.loggedIn = true; 31 | } else { 32 | this.loggedIn = false; 33 | } 34 | }).catch((error) => { 35 | console.log(error); 36 | this.presentToast(error); 37 | }); 38 | } 39 | 40 | /** 41 | * Log user in with Zoom username and password. 42 | */ 43 | login() { 44 | console.log('Going to login'); 45 | this.zoomService.login(this.userName, this.password).then((success) => { 46 | console.log(success.message); 47 | this.presentToast(success.message); 48 | this.loggedIn = true; 49 | this.userName = ''; 50 | this.password = ''; 51 | }).catch((error) => { 52 | console.log(error); 53 | this.presentToast(error.message); 54 | }); 55 | } 56 | 57 | /** 58 | * Log user out. 59 | */ 60 | logout() { 61 | console.log('Going to logout'); 62 | this.zoomService.logout().then((success) => { 63 | console.log(success.message); 64 | this.presentToast(success.message); 65 | this.loggedIn = false; 66 | }).catch((error) => { 67 | this.presentToast(error.message); 68 | console.log(error); 69 | }); 70 | } 71 | 72 | /** 73 | * Start an instant meeting. 74 | */ 75 | startInstantMeeting() { 76 | // Prepare meeting options 77 | const options = {}; 78 | // Call start instant meeting method. 79 | this.zoomService.startInstantMeeting(options).then((success) => { 80 | console.log(success); 81 | this.presentToast(success); 82 | }).catch((error) => { 83 | console.log(error); 84 | this.presentToast(error); 85 | }); 86 | } 87 | 88 | async presentToast(text) { 89 | const toast = await this.toastCtrl.create({ 90 | message: text, 91 | duration: 3000, 92 | position: 'top' 93 | }); 94 | toast.present(); 95 | } 96 | 97 | 98 | } 99 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/login/login.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { LoadingController, NavController, ToastController } from '@ionic/angular'; 4 | import { AccessProviders } from 'src/app/providers/access-providers'; 5 | import { Storage } from '@ionic/storage'; 6 | 7 | @Component({ 8 | selector: 'app-login', 9 | templateUrl: './login.page.html', 10 | styleUrls: ['./login.page.scss'], 11 | }) 12 | export class LoginPage { 13 | 14 | email: string = ""; 15 | password: string = ""; 16 | regexpEmail: any = new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/); 17 | disabledButton; 18 | 19 | constructor( 20 | private router: Router, 21 | private toastCtrl: ToastController, 22 | private loadingCtrl: LoadingController, 23 | public navCtrl: NavController, 24 | private accessProviders: AccessProviders, 25 | private storage: Storage 26 | ) { } 27 | 28 | ionViewDidEnter() { 29 | this.disabledButton = false; 30 | } 31 | 32 | async tryLogin() { 33 | if (!this.regexpEmail.test(this.email)) { 34 | this.presentToast("Devi inserire una Email corretta"); 35 | } else if (this.password.length < 6 ) { 36 | this.presentToast("Devi inserire una Password di almeno 6 caratteri"); 37 | } else { 38 | this.disabledButton = true; 39 | const loader = await this.loadingCtrl.create({ 40 | message: "Attendi..." 41 | }); 42 | loader.present(); 43 | 44 | return new Promise(() => { 45 | let body = { 46 | email: this.email, 47 | password: this.password 48 | } 49 | 50 | this.accessProviders.postData(body, 'process_login').subscribe((res: any) => { 51 | if (res.success == true) { 52 | loader.dismiss(); 53 | this.disabledButton = false; 54 | this.presentToast("Accesso effettuato"); 55 | this.storage.set('storage_xxx', res.result); // create storage session 56 | this.navCtrl.navigateRoot(['/home']); 57 | } else { 58 | loader.dismiss(); 59 | this.disabledButton = false; 60 | this.presentToast("Email o password incorretti"); 61 | } 62 | }, (err) => { 63 | loader.dismiss(); 64 | this.disabledButton = false; 65 | this.presentToast(err.message); 66 | }); 67 | }) 68 | } 69 | } 70 | 71 | async presentToast(text) { 72 | const toast = await this.toastCtrl.create({ 73 | message: text, 74 | duration: 1500, 75 | position: "top" 76 | }); 77 | toast.present(); 78 | } 79 | 80 | openRegistration() { 81 | this.router.navigate(['/registration']); 82 | } 83 | 84 | 85 | } 86 | -------------------------------------------------------------------------------- /app_teleconsulto/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE11 requires the following for NgClass support on SVG elements */ 22 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 23 | 24 | /** 25 | * Web Animations `@angular/platform-browser/animations` 26 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. 27 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). 28 | */ 29 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 30 | 31 | /** 32 | * By default, zone.js will patch all possible macroTask and DomEvents 33 | * user can disable parts of macroTask/DomEvents patch by setting following flags 34 | * because those flags need to be set before `zone.js` being loaded, and webpack 35 | * will put import in the top of bundle, so user need to create a separate file 36 | * in this directory (for example: zone-flags.ts), and put the following flags 37 | * into that file, and then add the following code before importing zone.js. 38 | * import './zone-flags'; 39 | * 40 | * The flags allowed in zone-flags.ts are listed here. 41 | * 42 | * The following flags will work for all browsers. 43 | * 44 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 45 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 46 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 47 | * 48 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 49 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 50 | * 51 | * (window as any).__Zone_enable_cross_context_check = true; 52 | * 53 | */ 54 | 55 | import './zone-flags'; 56 | 57 | /*************************************************************************************************** 58 | * Zone JS is required by default for Angular itself. 59 | */ 60 | import 'zone.js/dist/zone'; // Included with Angular CLI. 61 | 62 | 63 | /*************************************************************************************************** 64 | * APPLICATION IMPORTS 65 | */ 66 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-paziente/new-paziente.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Aggiungi Paziente 4 | 5 | Chiudi 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Cognome 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | Nome 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | Codice Fiscale 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | Cerca 62 | 63 | 64 | 65 | Aggiungi 66 | 67 | 68 | {{ paziente.cognome }} {{ paziente.nome }} 69 | 70 | 71 | {{ paziente.codice_fiscale }} 72 | 73 | 74 | {{ paziente.data_nascita }} 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-partecipant/new-partecipant.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Aggiungi Partecipanti 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | Cognome 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | Nome 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | Professione 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | Cerca 61 | 62 | 63 | 64 | Aggiungi 65 | Aggiungi 66 | 67 | 68 | {{ partecipante.cognome }} {{ partecipante.nome }} 69 | 70 | 71 | {{ partecipante.codice_fiscale }} 72 | 73 | 74 | {{ partecipante.professione }} 75 | 76 | 77 | 78 | 79 | 80 | 81 |
-------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/new-partecipant/new-partecipant.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | import { LoadingController, NavController, ToastController } from '@ionic/angular'; 4 | import { AccessProviders } from 'src/app/providers/access-providers'; 5 | 6 | @Component({ 7 | selector: 'app-new-partecipant', 8 | templateUrl: './new-partecipant.page.html', 9 | styleUrls: ['./new-partecipant.page.scss'], 10 | }) 11 | export class NewPartecipantPage { 12 | 13 | partecipantiSearchList: any = []; 14 | partecipante_cognome: string = ""; 15 | partecipante_nome: string = ""; 16 | partecipante_professione: string = ""; 17 | consulto_id: string; 18 | partecipanti: any = []; 19 | 20 | constructor( 21 | private accessProviders: AccessProviders, 22 | private route: ActivatedRoute, 23 | private loadingCtrl: LoadingController, 24 | private toastCtrl: ToastController, 25 | public navCtrl: NavController, 26 | ) { } 27 | 28 | ngOnInit() { 29 | this.route.queryParams.subscribe(params => { 30 | this.consulto_id = JSON.parse(params["consulto_id"]); 31 | }) 32 | this.route.queryParams.subscribe(params => { 33 | this.partecipanti = JSON.parse(params["partecipanti"]); 34 | }) 35 | } 36 | 37 | async searchPartecipants() { 38 | this.partecipantiSearchList = []; 39 | return new Promise(resolve => { 40 | let body = { 41 | medico_cognome: this.partecipante_cognome, 42 | medico_nome: this.partecipante_nome, 43 | medico_professione: this.partecipante_professione 44 | } 45 | 46 | this.accessProviders.postData(body, 'search_partecipants').subscribe((res: any) => { 47 | for (let datas of res.result) { 48 | this.partecipantiSearchList.push(datas); 49 | } 50 | this.checkPartecipante(); 51 | resolve(true); 52 | }) 53 | }) 54 | } 55 | 56 | checkPartecipante() { 57 | for (var elementoLista of this.partecipantiSearchList) { 58 | for (var index of this.partecipanti) { 59 | if (elementoLista.id == index.medico_id) { 60 | elementoLista.boolPartecipante = true; 61 | } 62 | } 63 | } 64 | } 65 | 66 | async addPartecipante(medico_id: string) { 67 | const loader = await this.loadingCtrl.create({ 68 | message: "Aggiunta partecipante..." 69 | }); 70 | loader.present(); 71 | 72 | return new Promise(resolve => { 73 | let body = { 74 | id_consulto: this.consulto_id, 75 | id_partecipante: medico_id, 76 | richiedente: "false", 77 | } 78 | 79 | this.accessProviders.postData(body, 'add_partecipante').subscribe((res: any) => { 80 | if (res.success == true) { 81 | loader.dismiss(); 82 | this.presentToast(res.msg); 83 | resolve(true); 84 | } 85 | else { 86 | loader.dismiss(); 87 | this.presentToast(res.msg); 88 | } 89 | }) 90 | this.navCtrl.back(); 91 | }); 92 | 93 | } 94 | 95 | async presentToast(text) { 96 | const toast = await this.toastCtrl.create({ 97 | message: text, 98 | duration: 1500, 99 | }); 100 | toast.present(); 101 | } 102 | 103 | 104 | } 105 | -------------------------------------------------------------------------------- /api/medico.php: -------------------------------------------------------------------------------- 1 | real_escape_string($_GET['cognome']); 8 | $sql = $conn->query("SELECT cognome, nome, professione, data_nascita, codice_fiscale, gender, email FROM medico WHERE cognome LIKE '%$cognome%' ORDER BY cognome"); 9 | while ($d = $sql->fetch_assoc()) 10 | $data[] = $d; 11 | } else if (isset($_GET['professione'])) { 12 | $data = array(); 13 | $professione = $conn->real_escape_string($_GET['professione']); 14 | $sql = $conn->query("SELECT cognome, nome, professione, data_nascita, codice_fiscale, gender, email FROM medico WHERE professione LIKE '%$professione%' ORDER BY cognome"); 15 | while ($d = $sql->fetch_assoc()) 16 | $data[] = $d; 17 | } else { 18 | $data = array(); 19 | $sql = $conn->query("SELECT cognome, nome, professione, data_nascita, codice_fiscale, gender, email FROM medico ORDER BY cognome"); 20 | while ($d = $sql->fetch_assoc()) 21 | $data[] = $d; 22 | } 23 | exit(json_encode($data)); 24 | 25 | } else if ($_SERVER['REQUEST_METHOD'] == 'PUT') { 26 | if (!isset($_GET['codice_fiscale'])) 27 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs in the URL'))); 28 | 29 | $codice_fiscale = $conn->real_escape_string($_GET['codice_fiscale']); 30 | $data = urldecode(file_get_contents('php://input')); 31 | 32 | if (strpos($data, '=') !== false) { 33 | $allPairs = array(); 34 | $data = explode('&', $data); 35 | foreach($data as $pair) { 36 | $pair = explode('=', $pair); 37 | $allPairs[$pair[0]] = $pair[1]; 38 | } 39 | 40 | if (isset($allPairs['gender']) && isset($allPairs['professione'])) { 41 | $conn->query("UPDATE medico SET gender='".$allPairs['gender']."', professione='".$allPairs['professione']."' WHERE codice_fiscale='$codice_fiscale'"); 42 | } else if (isset($allPairs['gender'])) { 43 | $conn->query("UPDATE medico SET gender='".$allPairs['gender']."' WHERE codice_fiscale='$codice_fiscale'"); 44 | } else if (isset($allPairs['professione'])) { 45 | $conn->query("UPDATE medico SET professione='".$allPairs['professione']."' WHERE codice_fiscale='$codice_fiscale'"); 46 | } else 47 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs in the Body'))); 48 | 49 | exit(json_encode(array("status" => 'success'))); 50 | } else 51 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs'))); 52 | 53 | } else if ($_SERVER['REQUEST_METHOD'] == 'DELETE') { 54 | if (!isset($_GET['codice_fiscale'])) 55 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs'))); 56 | 57 | $codice_fiscale = $conn->real_escape_string($_GET['codice_fiscale']); 58 | $conn->query("DELETE FROM medico WHERE codice_fiscale='$codice_fiscale'"); 59 | exit(json_encode(array("status" => 'success'))); 60 | } 61 | ?> -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/nuovo/nuovo.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Nuovo Consulto 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | PAZIENTE 18 | 19 | 20 | 21 | PAZIENTE 22 | 23 | 24 | 25 | 26 | Rimuovi 27 | 28 | 29 | 30 | {{ paziente.cognome }} 31 | 32 | 33 | {{ paziente.nome }} 34 | 35 | 36 | 37 | 38 | {{ paziente.codice_fiscale }} 39 | 40 | 41 | 42 | 43 | {{ paziente.data_nascita }} 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |

OGGETTO DEL CONSULTO

57 |
58 |
59 |
60 | 61 | 62 | 63 | 64 | 65 |
66 | 67 | 68 | 69 | SALVA 70 | 71 | 72 | SALVA 73 | 74 | 75 | 76 |
77 | 78 |
-------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/consulto/consulto.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ paziente_cognome }} {{ paziente_nome }} 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | Codice fiscale: 17 | {{ paziente_cf }} 18 | 19 | 20 | 21 | 22 | Data nascita: 23 | {{ paziente_data_nascita }} 24 | 25 | 26 | 27 |
28 | 29 |
30 | 31 |

{{ oggetto }}

32 |
33 |
34 | 35 |
36 | 37 | 38 | 39 | 40 | 42 | 43 | 44 | PARTECIPANTI 45 | 46 | 47 | 48 | 49 | 50 | 51 | Aggiungi partecipanti 52 | 53 | 54 | 55 | Rimuovi 58 | {{ partecipante.medico_cognome }} {{ partecipante.medico_nome }} 59 | 60 | 61 | 62 | 63 |
64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | Videochiamata 75 | 76 | 77 | 78 | Chat 79 | 80 | 81 | 82 | Allegati 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /api/paziente.php: -------------------------------------------------------------------------------- 1 | real_escape_string($_GET['cognome']); 8 | $sql = $conn->query("SELECT cognome, nome, data_nascita, codice_fiscale, gender FROM paziente WHERE cognome LIKE '%$cognome%' ORDER BY cognome"); 9 | while ($d = $sql->fetch_assoc()) 10 | $data[] = $d; 11 | } else if (isset($_GET['gender'])) { 12 | $data = array(); 13 | $gender = $conn->real_escape_string($_GET['gender']); 14 | $sql = $conn->query("SELECT cognome, nome, data_nascita, codice_fiscale FROM paziente WHERE gender='$gender' ORDER BY cognome"); 15 | while ($d = $sql->fetch_assoc()) 16 | $data[] = $d; 17 | } else if (isset($_GET['codice_fiscale'])) { 18 | $data = array(); 19 | $gender = $conn->real_escape_string($_GET['codice_fiscale']); 20 | $sql = $conn->query("SELECT cognome, nome, data_nascita, codice_fiscale, gender FROM paziente WHERE codice_fiscale='$codice_fiscale' ORDER BY cognome"); 21 | while ($d = $sql->fetch_assoc()) 22 | $data[] = $d; 23 | } else { 24 | $data = array(); 25 | $sql = $conn->query("SELECT cognome, nome, data_nascita, codice_fiscale, gender FROM paziente ORDER BY cognome"); 26 | while ($d = $sql->fetch_assoc()) 27 | $data[] = $d; 28 | } 29 | 30 | if($data) { 31 | exit(json_encode($data)); 32 | 33 | } else echo "Nessun risultato disponibile"; 34 | 35 | } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { 36 | if (isset($_POST['cognome']) && isset($_POST['nome']) && isset($_POST['data_nascita']) && isset($_POST['codice_fiscale']) && isset($_POST['gender'])) { 37 | $cognome = $conn->real_escape_string($_POST['cognome']); 38 | $nome = $conn->real_escape_string($_POST['nome']); 39 | $data_nascita = $conn->real_escape_string($_POST['data_nascita']); 40 | $codice_fiscale = $conn->real_escape_string($_POST['codice_fiscale']); 41 | $gender = $conn->real_escape_string($_POST['gender']); 42 | 43 | $conn->query("INSERT INTO paziente (nome, cognome, codice_fiscale, gender, data_nascita) VALUES ('$nome', '$cognome', '$codice_fiscale', '$gender', '$data_nascita')"); 44 | exit(json_encode(array("status" => 'success'))); 45 | } else 46 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs'))); 47 | 48 | } else if ($_SERVER['REQUEST_METHOD'] == 'PUT') { 49 | if (!isset($_GET['codice_fiscale'])) 50 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs in the URL'))); 51 | 52 | $codice_fiscale = $conn->real_escape_string($_GET['codice_fiscale']); 53 | $data = urldecode(file_get_contents('php://input')); 54 | 55 | if (strpos($data, '=') !== false) { 56 | $allPairs = array(); 57 | $data = explode('&', $data); 58 | foreach($data as $pair) { 59 | $pair = explode('=', $pair); 60 | $allPairs[$pair[0]] = $pair[1]; 61 | } 62 | 63 | if (isset($allPairs['gender'])) { 64 | $conn->query("UPDATE paziente SET gender='".$allPairs['gender']."' WHERE codice_fiscale='$codice_fiscale'"); 65 | } else 66 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs in the Body'))); 67 | 68 | exit(json_encode(array("status" => 'success'))); 69 | } else 70 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs'))); 71 | 72 | } else if ($_SERVER['REQUEST_METHOD'] == 'DELETE') { 73 | if (!isset($_GET['codice_fiscale'])) 74 | exit(json_encode(array("status" => 'failed', 'reason' => 'Check Your Inputs'))); 75 | 76 | $codice_fiscale = $conn->real_escape_string($_GET['codice_fiscale']); 77 | $conn->query("DELETE FROM paziente WHERE codice_fiscale='$codice_fiscale'"); 78 | exit(json_encode(array("status" => 'success'))); 79 | } 80 | ?> -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/profile/profile.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { AlertController, LoadingController, NavController, ToastController } from '@ionic/angular'; 4 | import { AccessProviders } from 'src/app/providers/access-providers'; 5 | import { Storage } from '@ionic/storage'; 6 | 7 | @Component({ 8 | selector: 'app-profile', 9 | templateUrl: './profile.page.html', 10 | styleUrls: ['./profile.page.scss'], 11 | }) 12 | export class ProfilePage implements OnInit { 13 | 14 | datastorage: any; 15 | id: string; 16 | nome: string; 17 | cognome: string; 18 | codice_fiscale: string; 19 | data_nascita: string; 20 | gender: string; 21 | professione: string; 22 | email: string; 23 | password: string = ""; 24 | conferma_password: string = ""; 25 | boolModificaPassword: boolean = false; 26 | 27 | constructor( 28 | private router: Router, 29 | private toastCtrl: ToastController, 30 | private loadingCtrl: LoadingController, 31 | private alertCtrl: AlertController, 32 | public navCtrl: NavController, 33 | private accessProviders: AccessProviders, 34 | private storage: Storage 35 | ) { } 36 | 37 | ngOnInit() { 38 | this.storage.get('storage_xxx').then((res) => { 39 | this.datastorage = res; 40 | this.id = this.datastorage.id; 41 | this.nome = this.datastorage.nome; 42 | this.cognome = this.datastorage.cognome; 43 | this.codice_fiscale = this.datastorage.codice_fiscale; 44 | this.data_nascita = this.datastorage.data_nascita; 45 | this.gender = this.datastorage.gender; 46 | this.email = this.datastorage.email; 47 | this.professione = this.datastorage.professione; 48 | }) 49 | } 50 | 51 | async updatePasswordAlert() { 52 | const alert = await this.alertCtrl.create({ 53 | header: "Vuoi modificare la password ? Se Sì, verrà effettuato il Logout", 54 | backdropDismiss: false, 55 | buttons: [ 56 | { 57 | text: 'Sì', 58 | handler: () => { 59 | this.updatePassword(); 60 | } 61 | }, { 62 | text: 'Annulla', 63 | handler: () => { } 64 | } 65 | ] 66 | }); 67 | 68 | await alert.present(); 69 | await alert.onDidDismiss(); 70 | } 71 | 72 | async updatePassword() { 73 | if (this.password.length < 6) { 74 | this.presentToast("Devi inserire una Password di almeno 6 caratteri"); 75 | } else if (this.conferma_password.length < 6) { 76 | this.presentToast("La Conferma Password inserita ha meno di 6 caratteri") 77 | } else if (this.conferma_password != this.password) { 78 | this.presentToast("Le password inserite non sono uguali") 79 | } 80 | else { 81 | const loader = await this.loadingCtrl.create({ 82 | message: "Attendi..." 83 | }); 84 | loader.present(); 85 | 86 | return new Promise(resolve => { 87 | let body = { 88 | id: this.id, 89 | nuova_password: this.password 90 | } 91 | 92 | this.accessProviders.postData(body, 'update_password').subscribe((res: any) => { 93 | if (res.success == true) { 94 | loader.dismiss(); 95 | this.presentToast(res.msg); 96 | this.router.navigate(['/login']); 97 | } else { 98 | loader.dismiss(); 99 | this.presentToast(res.msg); 100 | } 101 | }) 102 | }) 103 | } 104 | } 105 | 106 | async presentToast(text) { 107 | const toast = await this.toastCtrl.create({ 108 | message: text, 109 | duration: 1500, 110 | position: "top" 111 | }); 112 | toast.present(); 113 | } 114 | 115 | async presentAlert(text) { 116 | const alert = await this.alertCtrl.create({ 117 | header: text, 118 | backdropDismiss: false, 119 | buttons: [ 120 | { 121 | text: 'Sì', 122 | handler: () => { } 123 | }, { 124 | text: 'No', 125 | handler: () => { } 126 | } 127 | ] 128 | }); 129 | 130 | await alert.present(); 131 | } 132 | 133 | async logout() { 134 | this.storage.clear(); 135 | this.navCtrl.navigateRoot(['/login']); 136 | const toast = await this.toastCtrl.create({ 137 | message: "Logout effettuato", 138 | duration: 1500 139 | }) 140 | toast.present(); 141 | } 142 | 143 | } 144 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/registration/registration.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { AlertController, LoadingController, ToastController } from '@ionic/angular'; 4 | import { AccessProviders } from '../../providers/access-providers'; 5 | 6 | @Component({ 7 | selector: 'app-registration', 8 | templateUrl: './registration.page.html', 9 | styleUrls: ['./registration.page.scss'], 10 | }) 11 | export class RegistrationPage { 12 | 13 | nome: string = ""; 14 | cognome: string = ""; 15 | codice_fiscale: string = ""; 16 | gender: string = ""; 17 | data_nascita: string = ""; 18 | professione: string = ""; 19 | email: string = ""; 20 | password: string = ""; 21 | conferma_password: string = ""; 22 | regexpEmail: any = new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/); 23 | regexpCF: any = new RegExp(/^(?:[A-Z][AEIOU][AEIOUX]|[AEIOU]X{2}|[B-DF-HJ-NP-TV-Z]{2}[A-Z]){2}(?:[\dLMNP-V]{2}(?:[A-EHLMPR-T](?:[04LQ][1-9MNP-V]|[15MR][\dLMNP-V]|[26NS][0-8LMNP-U])|[DHPS][37PT][0L]|[ACELMRT][37PT][01LM]|[AC-EHLMPR-T][26NS][9V])|(?:[02468LNQSU][048LQU]|[13579MPRTV][26NS])B[26NS][9V])(?:[A-MZ][1-9MNP-V][\dLMNP-V]{2}|[A-M][0L](?:[1-9MNP-V][\dLMNP-V]|[0L][1-9MNP-V]))[A-Z]$/i); 24 | 25 | disabledButton: boolean; 26 | 27 | constructor( 28 | private router: Router, 29 | private toastCtrl: ToastController, 30 | private loadingCtrl: LoadingController, 31 | private alertCtrl: AlertController, 32 | private accessProviders: AccessProviders 33 | ) { } 34 | 35 | ionViewDidEnter() { 36 | this.disabledButton = false; 37 | } 38 | 39 | 40 | async tryRegister() { 41 | if (this.nome.length < 1) { 42 | this.presentToast("Devi inserire il tuo Nome"); 43 | } else if (this.cognome.length < 1) { 44 | this.presentToast("Devi inserire il tuo Cognome"); 45 | } else if (!this.regexpCF.test(this.codice_fiscale)) { 46 | this.presentToast("Devi inserire il tuo Codice Fiscale corretto"); 47 | } else if (this.gender == "") { 48 | this.presentToast("Devi inserire il tuo Gender"); 49 | } else if (this.data_nascita == "") { 50 | this.presentToast("Devi inserire la tua Data di nascita"); 51 | } else if (!this.regexpEmail.test(this.email)) { 52 | this.presentToast("Devi inserire una Email corretta"); 53 | } else if (this.password.length < 6) { 54 | this.presentToast("Devi inserire una Password di almeno 6 caratteri"); 55 | } else if (this.conferma_password.length < 6) { 56 | this.presentToast("La Conferma Password inserita ha meno di 6 caratteri") 57 | } else if (this.conferma_password != this.password) { 58 | this.presentToast("Le password inserite non sono uguali"); 59 | } else { 60 | this.disabledButton = true; 61 | const loader = await this.loadingCtrl.create({ 62 | message: "Attendi..." 63 | }); 64 | loader.present(); 65 | 66 | return new Promise(resolve => { 67 | let body = { 68 | nome: this.nome.charAt(0).toUpperCase() + this.nome.slice(1), 69 | cognome: this.cognome.charAt(0).toUpperCase() + this.cognome.slice(1), 70 | codice_fiscale: this.codice_fiscale.toUpperCase(), 71 | gender: this.gender, 72 | professione: this.professione.charAt(0).toUpperCase() + this.professione.slice(1), 73 | data_nascita: this.data_nascita.substr(0, 10), 74 | email: this.email, 75 | password: this.password 76 | } 77 | 78 | this.accessProviders.postData(body, 'process_register').subscribe((res: any) => { 79 | if (res.success == true) { 80 | loader.dismiss(); 81 | this.disabledButton = false; 82 | this.presentToast(res.msg); 83 | this.router.navigate(['/login']); 84 | } else { 85 | loader.dismiss(); 86 | this.disabledButton = false; 87 | this.presentToast(res.msg); 88 | } 89 | }, (err) => { 90 | loader.dismiss(); 91 | this.disabledButton = false; 92 | this.presentAlert("Timeout"); 93 | }); 94 | }) 95 | } 96 | } 97 | 98 | async presentToast(text) { 99 | const toast = await this.toastCtrl.create({ 100 | message: text, 101 | duration: 1500, 102 | position: "top" 103 | }); 104 | toast.present(); 105 | } 106 | 107 | async presentAlert(text) { 108 | const alert = await this.alertCtrl.create({ 109 | header: text, 110 | backdropDismiss: false, 111 | buttons: [ 112 | { 113 | text: 'Chiudi', 114 | handler: () => { } 115 | }, { 116 | text: 'Riprova', 117 | handler: () => { 118 | this.tryRegister(); 119 | } 120 | } 121 | ] 122 | }); 123 | 124 | await alert.present(); 125 | } 126 | 127 | } 128 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/chat/chat.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | import { AlertController, IonContent, LoadingController, ToastController } from '@ionic/angular'; 4 | import { Chat } from 'src/app/models/chat'; 5 | import { AccessProviders } from 'src/app/providers/access-providers'; 6 | 7 | @Component({ 8 | selector: 'app-chat', 9 | templateUrl: './chat.page.html', 10 | styleUrls: ['./chat.page.scss'], 11 | }) 12 | export class ChatPage { 13 | 14 | utenteCorrente: string; 15 | nuovo_messaggio = ''; 16 | 17 | chat: Array; 18 | messaggi: any = []; 19 | consulto_id: string; 20 | id_utente: string; 21 | messaggio: string; 22 | messaggioID: string = ""; 23 | 24 | @ViewChild(IonContent) content: IonContent 25 | 26 | constructor( 27 | private loadingCtrl: LoadingController, 28 | private toastCtrl: ToastController, 29 | private route: ActivatedRoute, 30 | private accessProviders: AccessProviders, 31 | private alertCtrl: AlertController, 32 | ) { } 33 | 34 | ionViewWillEnter() { 35 | this.messaggi = []; 36 | } 37 | 38 | ionViewDidEnter() { 39 | this.route.queryParams.subscribe(params => { 40 | this.consulto_id = JSON.parse(params["id_consulto"]); 41 | }) 42 | this.route.queryParams.subscribe(params => { 43 | this.id_utente = JSON.parse(params["id_utente"]); 44 | this.utenteCorrente = this.id_utente; 45 | }) 46 | this.loadMessages(); 47 | } 48 | 49 | async loadMessages() { 50 | return new Promise(resolve => { 51 | let body = { 52 | id_consulto: this.consulto_id, 53 | } 54 | 55 | this.accessProviders.postData(body, 'load_messages').subscribe((res: any) => { 56 | for (let datas of res.result) { 57 | this.messaggi.push(datas); 58 | } 59 | resolve(true); 60 | }) 61 | }) 62 | } 63 | 64 | async sendMessage() { 65 | this.generateID(); 66 | const loader = await this.loadingCtrl.create({ 67 | message: "Invio..." 68 | }); 69 | loader.present(); 70 | 71 | return new Promise(resolve => { 72 | let body = { 73 | id_messaggio: this.messaggioID, 74 | id_consulto: this.consulto_id, 75 | id_utente: this.id_utente, 76 | testo: this.nuovo_messaggio, 77 | } 78 | 79 | this.accessProviders.postData(body, 'send_message').subscribe((res: any) => { 80 | if (res.success == true) { 81 | loader.dismiss(); 82 | resolve(true); 83 | } 84 | else { 85 | loader.dismiss(); 86 | this.presentToast(res.msg); 87 | } 88 | }) 89 | 90 | this.nuovo_messaggio = ''; 91 | setTimeout(() => { 92 | this.content.scrollToBottom(200); 93 | }); 94 | this.ionViewWillEnter(); 95 | this.ionViewDidEnter(); 96 | }); 97 | } 98 | 99 | async deleteMessageAlert(message_id: string) { 100 | const alert = await this.alertCtrl.create({ 101 | header: "Vuoi eliminare il messaggio selezionato?", 102 | backdropDismiss: false, 103 | buttons: [ 104 | { 105 | text: 'Sì', 106 | handler: () => { 107 | this.deleteMessage(message_id); 108 | } 109 | }, { 110 | text: 'Annulla', 111 | handler: () => { } 112 | } 113 | ] 114 | }); 115 | 116 | await alert.present(); 117 | await alert.onDidDismiss(); 118 | } 119 | 120 | async deleteMessage(message_id: string) { 121 | const loader = await this.loadingCtrl.create({ 122 | message: "Eliminazione messaggio..." 123 | }); 124 | loader.present(); 125 | 126 | return new Promise(resolve => { 127 | let body = { 128 | message_id: message_id, 129 | } 130 | 131 | this.accessProviders.postData(body, 'delete_message').subscribe((res: any) => { 132 | if (res.success == true) { 133 | loader.dismiss(); 134 | resolve(true); 135 | } 136 | else { 137 | loader.dismiss(); 138 | this.presentToast(res.msg); 139 | } 140 | }) 141 | 142 | this.nuovo_messaggio = ''; 143 | setTimeout(() => { 144 | this.content.scrollToBottom(200); 145 | }); 146 | this.ionViewWillEnter(); 147 | this.ionViewDidEnter(); 148 | }); 149 | } 150 | 151 | async presentToast(text) { 152 | const toast = await this.toastCtrl.create({ 153 | message: text, 154 | duration: 1500, 155 | }); 156 | toast.present(); 157 | } 158 | 159 | generateID() { 160 | var result = ''; 161 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 162 | var charactersLength = characters.length; 163 | for (var i = 0; i < 30; i++) { 164 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 165 | } 166 | this.messaggioID = result; 167 | return this.messaggioID; 168 | } 169 | 170 | } 171 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/nuovo/nuovo.page.ts: -------------------------------------------------------------------------------- 1 | import { Paziente } from '../../models/paziente'; 2 | import { Component } from '@angular/core'; 3 | import { AlertController, LoadingController, NavController, ToastController } from '@ionic/angular'; 4 | import { Medico } from '../../models/medico'; 5 | import { ActivatedRoute, Router } from '@angular/router'; 6 | import { AccessProviders } from 'src/app/providers/access-providers'; 7 | import { Storage } from '@ionic/storage'; 8 | 9 | @Component({ 10 | selector: 'app-nuovo', 11 | templateUrl: './nuovo.page.html', 12 | styleUrls: ['./nuovo.page.scss'], 13 | }) 14 | 15 | export class NuovoPage { 16 | 17 | datastorage: any; 18 | medico_id: string; 19 | 20 | paziente: Paziente; 21 | pazienti: Array = []; 22 | partecipante: Medico; 23 | partecipanti: Array = []; 24 | oggetto: String = ""; 25 | 26 | boolSalva: boolean = false; 27 | boolPaziente: boolean = false; 28 | consultoID: string = ""; 29 | 30 | constructor( 31 | private router: Router, 32 | private alertController: AlertController, 33 | private route: ActivatedRoute, 34 | private loadingCtrl: LoadingController, 35 | private toastCtrl: ToastController, 36 | public navCtrl: NavController, 37 | private accessProviders: AccessProviders, 38 | private storage: Storage 39 | ) { } 40 | 41 | ngOnInit() { 42 | this.storage.get('storage_xxx').then((res) => { 43 | this.datastorage = res; 44 | this.medico_id = this.datastorage.id; 45 | }); 46 | } 47 | 48 | ionViewWillEnter() { 49 | this.pazienti = []; 50 | } 51 | 52 | ionViewDidEnter() { 53 | this.route.queryParams.subscribe(params => { 54 | this.paziente = JSON.parse(params["paziente"]); 55 | this.pazienti.push(this.paziente) 56 | }) 57 | this.checkSalva(); 58 | } 59 | 60 | async rimuoviAssistitoAlert() { 61 | const alert = await this.alertController.create({ 62 | header: "Rimuovi", 63 | message: "Sei sicuro di voler rimuovere l'assistito ?", 64 | buttons: [ 65 | { 66 | text: 'Sì', 67 | handler: () => { 68 | this.rimuoviAssistito(); 69 | } 70 | }, { 71 | text: 'No', 72 | } 73 | ] 74 | }); 75 | 76 | await alert.present(); 77 | await alert.onDidDismiss(); 78 | } 79 | 80 | rimuoviAssistito() { 81 | this.pazienti = []; 82 | this.checkSalva(); 83 | } 84 | 85 | checkSalva() { 86 | if (this.checkPaziente() && this.oggetto != "" && this.oggetto != null) { 87 | this.boolSalva = true; 88 | } else this.boolSalva = false; 89 | 90 | return this.boolSalva; 91 | } 92 | 93 | checkPaziente() { 94 | if (this.pazienti.length == 1) { 95 | this.boolPaziente = true; 96 | } else this.boolPaziente = false; 97 | 98 | return this.boolPaziente; 99 | } 100 | 101 | async addConsulto() { 102 | this.generateID(); 103 | const loader = await this.loadingCtrl.create({ 104 | message: "Inserimento consulto..." 105 | }); 106 | loader.present(); 107 | 108 | return new Promise(resolve => { 109 | let body = { 110 | id_consulto: this.consultoID, 111 | oggetto: this.oggetto.charAt(0).toUpperCase() + this.oggetto.slice(1), 112 | paziente: this.pazienti[0].id, 113 | } 114 | 115 | this.accessProviders.postData(body, 'nuovo_consulto').subscribe((res: any) => { 116 | if (res.success == true) { 117 | this.newConsultoPartecipante() 118 | loader.dismiss(); 119 | resolve(true); 120 | } 121 | else { 122 | loader.dismiss(); 123 | this.presentToast(res.msg); 124 | } 125 | }) 126 | 127 | this.router.navigate(['/home']); 128 | }); 129 | 130 | } 131 | 132 | async newConsultoPartecipante() { 133 | return new Promise(resolve => { 134 | let body = { 135 | id_consulto: this.consultoID, 136 | id_medico: this.medico_id, 137 | richiedente: 'true', 138 | } 139 | 140 | this.accessProviders.postData(body, 'nuovo_consultoPartecipante').subscribe((res: any) => { 141 | if (res.success == true) { 142 | this.presentToast(res.msg); 143 | resolve(true); 144 | } 145 | else { 146 | this.presentToast(res.msg); 147 | } 148 | }) 149 | }); 150 | } 151 | 152 | async presentToast(text) { 153 | const toast = await this.toastCtrl.create({ 154 | message: text, 155 | duration: 1500, 156 | }); 157 | toast.present(); 158 | } 159 | 160 | generateID() { 161 | var result = ''; 162 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 163 | var charactersLength = characters.length; 164 | for (var i = 0; i < 10; i++) { 165 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 166 | } 167 | this.consultoID = result; 168 | return this.consultoID; 169 | } 170 | 171 | 172 | } 173 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/modals/allegati/allegati.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { LoadingController, ModalController, ToastController } from '@ionic/angular'; 3 | import { AngularFireStorage } from '@angular/fire//compat/storage'; 4 | import { AccessProviders } from 'src/app/providers/access-providers'; 5 | import { PreviewAnyFile } from '@awesome-cordova-plugins/preview-any-file/ngx'; 6 | import { Downloader, DownloadRequest, NotificationVisibility } from '@ionic-native/downloader/ngx'; 7 | 8 | @Component({ 9 | selector: 'app-allegati', 10 | templateUrl: './allegati.component.html', 11 | styleUrls: ['./allegati.component.scss'], 12 | }) 13 | export class AllegatiComponent { 14 | 15 | datastorage: any; 16 | file: any; 17 | ref: any; 18 | fileUrl: string = ""; 19 | fileName: string = ""; 20 | messaggioID: string = ""; 21 | id_utente; 22 | id_consulto; 23 | allegati: any = []; 24 | boolInvia: boolean = false; 25 | dateTime; 26 | 27 | constructor( 28 | private toastCtrl: ToastController, 29 | private accessProviders: AccessProviders, 30 | private loadingCtrl: LoadingController, 31 | private modalController: ModalController, 32 | // private previewFile: PreviewAnyFile, 33 | private downloader: Downloader, 34 | private firebaseStorage: AngularFireStorage) { } 35 | 36 | ngOnInit() { 37 | setTimeout(() => { 38 | this.dateTime = new Date().toISOString(); 39 | }); 40 | } 41 | 42 | ionViewWillEnter() { 43 | this.allegati = []; 44 | this.file = null; 45 | this.boolInvia = false; 46 | } 47 | 48 | ionViewDidEnter() { 49 | this.loadAllegati(); 50 | } 51 | 52 | async loadAllegati() { 53 | return new Promise(resolve => { 54 | let body = { 55 | id_consulto: this.id_consulto, 56 | } 57 | 58 | this.accessProviders.postData(body, 'load_allegati').subscribe((res: any) => { 59 | for (let datas of res.result) { 60 | this.allegati.push(datas); 61 | } 62 | resolve(true); 63 | }) 64 | }) 65 | } 66 | 67 | selectFile() { 68 | this.file = (document.getElementById("file")).files[0]; 69 | this.boolInvia = true; 70 | } 71 | 72 | async uploadFile() { 73 | const loader = await this.loadingCtrl.create({ 74 | message: "Caricamento allegato..." 75 | }); 76 | loader.present(); 77 | 78 | let ref = this.firebaseStorage.ref(this.id_consulto + '/' + this.file.name + '_' + this.dateTime); 79 | ref.put(this.file).then(() => { 80 | ref.getDownloadURL().subscribe(url => { 81 | this.fileUrl = url; 82 | this.fileName = this.file.name; 83 | }).add(() => { 84 | this.uploadAllegatoToDB(); 85 | loader.dismiss(); 86 | this.ionViewWillEnter(); 87 | this.ionViewDidEnter(); 88 | }) 89 | }).catch(e => { 90 | console.log(e); 91 | }) 92 | } 93 | 94 | async uploadAllegatoToDB() { 95 | this.generateID(); 96 | 97 | return new Promise(resolve => { 98 | let body = { 99 | id_messaggio: this.messaggioID, 100 | id_consulto: this.id_consulto, 101 | id_utente: this.id_utente, 102 | testo: this.fileName, 103 | allegato: this.fileUrl 104 | } 105 | 106 | this.accessProviders.postData(body, 'send_allegato').subscribe((res: any) => { 107 | if (res.success == true) { 108 | this.presentToast(res.msg); 109 | resolve(true); 110 | } 111 | else { 112 | this.presentToast(res.msg); 113 | } 114 | }) 115 | }); 116 | } 117 | 118 | 119 | /* 120 | openAllegato(urlAllegato: string) { 121 | this.previewFile.preview(urlAllegato).then(() => { 122 | 123 | }, (err) => { 124 | alert(JSON.stringify(err)); 125 | }) 126 | 127 | } 128 | */ 129 | 130 | 131 | openFileInBrowser(urlAllegato: string) { 132 | window.open(urlAllegato, '_system', 'location-yes'); 133 | } 134 | 135 | downloadAllegato(urlAllegato: string, titolo: string) { 136 | var request: DownloadRequest = { 137 | uri: urlAllegato, 138 | title: titolo, 139 | visibleInDownloadsUi: true, 140 | notificationVisibility: NotificationVisibility.VisibleNotifyCompleted, 141 | destinationInExternalPublicDir: { 142 | dirType: "Downloads", 143 | subPath: titolo 144 | } 145 | } 146 | 147 | this.downloader.download(request).then((location: string) => { 148 | alert("File salvato in : " + location) 149 | }) 150 | 151 | } 152 | 153 | generateID() { 154 | var result = ''; 155 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 156 | var charactersLength = characters.length; 157 | for (var i = 0; i < 30; i++) { 158 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 159 | } 160 | this.messaggioID = result; 161 | return this.messaggioID; 162 | } 163 | 164 | async presentToast(text) { 165 | const toast = await this.toastCtrl.create({ 166 | message: text, 167 | duration: 1500, 168 | }); 169 | toast.present(); 170 | } 171 | 172 | closeModal() { 173 | this.modalController.dismiss(); 174 | } 175 | 176 | } 177 | -------------------------------------------------------------------------------- /app_teleconsulto/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "teleconsulto", 3 | "version": "0.0.1", 4 | "author": "Ionic Framework", 5 | "homepage": "https://ionicframework.com/", 6 | "scripts": { 7 | "ng": "ng", 8 | "start": "ng serve", 9 | "build": "ng build", 10 | "test": "ng test", 11 | "lint": "ng lint", 12 | "e2e": "ng e2e" 13 | }, 14 | "private": true, 15 | "dependencies": { 16 | "@angular/common": "~12.1.1", 17 | "@angular/compiler": "~12.1.1", 18 | "@angular/core": "~12.1.1", 19 | "@angular/fire": "^7.2.0", 20 | "@angular/forms": "~12.1.1", 21 | "@angular/platform-browser": "~12.1.1", 22 | "@angular/platform-browser-dynamic": "~12.1.1", 23 | "@angular/router": "~12.1.1", 24 | "@awesome-cordova-plugins/core": "^5.38.0", 25 | "@awesome-cordova-plugins/preview-any-file": "^5.38.0", 26 | "@ionic-native/chooser": "^5.34.0", 27 | "@ionic-native/core": "^5.36.0", 28 | "@ionic-native/downloader": "^5.36.0", 29 | "@ionic-native/file": "^5.34.0", 30 | "@ionic-native/file-chooser": "^5.34.0", 31 | "@ionic-native/file-path": "^5.34.0", 32 | "@ionic-native/file-transfer": "^5.34.0", 33 | "@ionic-native/http": "^5.35.0", 34 | "@ionic-native/ionic-webview": "^5.34.0", 35 | "@ionic-native/keyboard": "^5.34.0", 36 | "@ionic-native/native-keyboard": "^5.34.0", 37 | "@ionic-native/splash-screen": "^5.35.0", 38 | "@ionic-native/sqlite": "^5.35.0", 39 | "@ionic-native/status-bar": "^5.35.0", 40 | "@ionic-native/zoom": "^5.35.0", 41 | "@ionic/angular": "^5.5.2", 42 | "@ionic/lab": "^3.2.10", 43 | "@ionic/storage": "^3.0.6", 44 | "@ionic/storage-angular": "^3.0.6", 45 | "@types/hammerjs": "^2.0.41", 46 | "cordova": "^11.0.0", 47 | "cordova-ios": "6.2.0", 48 | "cordova-plugin-advanced-http": "^3.2.0", 49 | "cordova-plugin-chooser": "^1.3.2", 50 | "cordova-plugin-file": "^6.0.2", 51 | "cordova-plugin-file-transfer": "^1.7.1", 52 | "cordova-plugin-filechooser": "^1.2.0", 53 | "cordova-plugin-filepath": "^1.6.0", 54 | "cordova-plugin-ionic-keyboard": "^2.2.0", 55 | "cordova-plugin-ionic-webview": "^5.0.0", 56 | "cordova-plugin-native-keyboard": "^2.0.6", 57 | "cordova-sqlite-storage": "^6.0.0", 58 | "firebase": "^9.6.5", 59 | "hammerjs": "^2.0.8", 60 | "ionic-long-press": "^2.0.3", 61 | "ngx-autosize": "^1.8.4", 62 | "platform": "1.3.6", 63 | "rxfire": "^6.0.0", 64 | "rxjs": "~6.6.0", 65 | "rxjs-compat": "^6.6.7", 66 | "tslib": "^2.2.0", 67 | "zone.js": "~0.11.4" 68 | }, 69 | "devDependencies": { 70 | "@angular-devkit/build-angular": "~12.1.1", 71 | "@angular-eslint/builder": "~12.0.0", 72 | "@angular-eslint/eslint-plugin": "~12.0.0", 73 | "@angular-eslint/eslint-plugin-template": "~12.0.0", 74 | "@angular-eslint/template-parser": "~12.0.0", 75 | "@angular/cli": "12.1.4", 76 | "@angular/compiler": "~12.1.1", 77 | "@angular/compiler-cli": "~12.1.1", 78 | "@angular/language-service": "~12.0.1", 79 | "@ionic/angular-toolkit": "^4.0.0", 80 | "@ionic/app-scripts": "^3.2.4", 81 | "@types/jasmine": "~3.6.0", 82 | "@types/jasminewd2": "~2.0.3", 83 | "@types/node": "^12.11.1", 84 | "@typescript-eslint/eslint-plugin": "4.16.1", 85 | "@typescript-eslint/parser": "4.16.1", 86 | "cordova-android": "^9.1.0", 87 | "cordova-plugin-add-swift-support": "^2.0.2", 88 | "cordova-plugin-androidx": "^3.0.0", 89 | "cordova-plugin-androidx-adapter": "^1.1.3", 90 | "cordova-plugin-device": "^2.0.2", 91 | "cordova-plugin-preview-any-file": "^0.2.9", 92 | "cordova-plugin-splashscreen": "^5.0.2", 93 | "cordova-plugin-statusbar": "^2.4.2", 94 | "cordova-plugin-whitelist": "^1.3.3", 95 | "cordova.plugin.zoom": "^4.6.2166-6.603", 96 | "eslint": "^7.6.0", 97 | "eslint-plugin-import": "2.22.1", 98 | "eslint-plugin-jsdoc": "30.7.6", 99 | "eslint-plugin-prefer-arrow": "1.2.2", 100 | "integrator-cordova-plugin-downloader": "^1.1.0", 101 | "jasmine-core": "~3.8.0", 102 | "jasmine-spec-reporter": "~5.0.0", 103 | "karma": "~6.3.2", 104 | "karma-chrome-launcher": "~3.1.0", 105 | "karma-coverage": "~2.0.3", 106 | "karma-coverage-istanbul-reporter": "~3.0.2", 107 | "karma-jasmine": "~4.0.0", 108 | "karma-jasmine-html-reporter": "^1.5.0", 109 | "protractor": "~7.0.0", 110 | "ts-node": "~8.3.0", 111 | "typescript": "~4.2.4" 112 | }, 113 | "description": "An Ionic project", 114 | "cordova": { 115 | "plugins": { 116 | "cordova-plugin-file-transfer": {}, 117 | "cordova-plugin-ionic-keyboard": {}, 118 | "cordova-plugin-ionic-webview": {}, 119 | "cordova-plugin-native-keyboard": {}, 120 | "cordova-plugin-file": {}, 121 | "cordova-plugin-filechooser": {}, 122 | "cordova-plugin-chooser": {}, 123 | "cordova-plugin-filepath": {}, 124 | "cordova-plugin-whitelist": {}, 125 | "cordova-plugin-statusbar": {}, 126 | "cordova-plugin-device": {}, 127 | "cordova-plugin-splashscreen": {}, 128 | "cordova-sqlite-storage": {}, 129 | "cordova-plugin-advanced-http": { 130 | "ANDROIDBLACKLISTSECURESOCKETPROTOCOLS": "SSLv3,TLSv1" 131 | }, 132 | "cordova.plugin.zoom": {}, 133 | "cordova-plugin-preview-any-file": {}, 134 | "integrator-cordova-plugin-downloader": {} 135 | }, 136 | "platforms": [ 137 | "android", 138 | "ios" 139 | ] 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/consulto/consulto.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { AlertController, LoadingController, ModalController, ToastController } from '@ionic/angular'; 3 | import { AllegatiComponent } from '../modals/allegati/allegati.component'; 4 | import { ActivatedRoute, NavigationExtras, Router } from '@angular/router'; 5 | import { AccessProviders } from 'src/app/providers/access-providers'; 6 | 7 | @Component({ 8 | selector: 'app-consulto', 9 | templateUrl: './consulto.page.html', 10 | styleUrls: ['./consulto.page.scss'], 11 | }) 12 | export class ConsultoPage implements OnInit { 13 | 14 | datastorage: any; 15 | partecipanti: any = []; 16 | consulto: any; 17 | paziente_nome: string; 18 | paziente_cognome: string; 19 | paziente_data_nascita: string; 20 | paziente_cf: string; 21 | oggetto: string; 22 | consulto_id: string; 23 | id_utente: string; 24 | boolRichiedente: boolean = false; 25 | 26 | constructor( 27 | private router: Router, 28 | private modalController: ModalController, 29 | private route: ActivatedRoute, 30 | private accessProviders: AccessProviders, 31 | private alertCtrl: AlertController, 32 | private toastCtrl: ToastController, 33 | private loadingCtrl: LoadingController, 34 | ) { } 35 | 36 | ngOnInit() { 37 | this.route.queryParams.subscribe(params => { 38 | this.consulto = JSON.parse(params["consulto"]); 39 | this.consulto_id = this.consulto.id_consulto; 40 | this.paziente_nome = this.consulto.paziente_nome; 41 | this.paziente_cognome = this.consulto.paziente_cognome; 42 | this.paziente_cf = this.consulto.paziente_cf; 43 | this.paziente_data_nascita = this.consulto.paziente_data_nascita; 44 | this.oggetto = this.consulto.oggetto; 45 | this.loadPartecipanti(); 46 | }) 47 | this.route.queryParams.subscribe(params => { 48 | this.id_utente = JSON.parse(params["id_utente"]); 49 | }) 50 | } 51 | 52 | async loadPartecipanti() { 53 | this.partecipanti = []; 54 | return new Promise(resolve => { 55 | let body = { 56 | id_consulto: this.consulto_id, 57 | } 58 | 59 | this.accessProviders.postData(body, 'load_partecipanti').subscribe((res: any) => { 60 | for (let datas of res.result) { 61 | this.partecipanti.push(datas); 62 | } 63 | 64 | this.checkRichiedente(); 65 | resolve(true); 66 | }) 67 | }) 68 | } 69 | 70 | async removePartecipanteAlert(partecipante_id: string) { 71 | const alert = await this.alertCtrl.create({ 72 | header: "Vuoi rimuovere questo partecipante?", 73 | backdropDismiss: false, 74 | buttons: [ 75 | { 76 | text: 'Sì', 77 | handler: () => { 78 | this.removePartecipante(partecipante_id); 79 | } 80 | }, { 81 | text: 'Annulla', 82 | handler: () => { } 83 | } 84 | ] 85 | }); 86 | 87 | await alert.present(); 88 | await alert.onDidDismiss(); 89 | } 90 | 91 | async removePartecipante(partecipante_id: string) { 92 | const loader = await this.loadingCtrl.create({ 93 | message: "Rimozione partecipante..." 94 | }); 95 | loader.present(); 96 | 97 | return new Promise(resolve => { 98 | let body = { 99 | id_partecipante: partecipante_id, 100 | id_consulto: this.consulto_id 101 | } 102 | 103 | this.accessProviders.postData(body, 'remove_partecipante').subscribe((res: any) => { 104 | if (res.success == true) { 105 | loader.dismiss(); 106 | resolve(true); 107 | } 108 | else { 109 | loader.dismiss(); 110 | this.presentToast(res.msg); 111 | } 112 | }) 113 | 114 | this.ngOnInit(); 115 | }); 116 | } 117 | 118 | openAddPartecipante() { 119 | let navigationExtras: NavigationExtras = { 120 | queryParams: { 121 | consulto_id: JSON.stringify(this.consulto_id), 122 | partecipanti: JSON.stringify(this.partecipanti) 123 | } 124 | }; 125 | this.router.navigate(['/new-partecipant'], navigationExtras); 126 | } 127 | 128 | async openAllegatiModal() { 129 | const modal = await this.modalController.create({ 130 | component: AllegatiComponent, 131 | componentProps: { 132 | id_utente: this.id_utente, 133 | id_consulto: this.consulto_id 134 | } 135 | }); 136 | 137 | await modal.present(); 138 | } 139 | 140 | async openAllegati() { 141 | let navigationExtras: NavigationExtras = { 142 | queryParams: { 143 | id_consulto: JSON.stringify(this.consulto_id), 144 | id_utente: JSON.stringify(this.id_utente) 145 | } 146 | }; 147 | this.router.navigate(['/allegati'], navigationExtras); 148 | } 149 | 150 | openChat() { 151 | let navigationExtras: NavigationExtras = { 152 | queryParams: { 153 | id_consulto: JSON.stringify(this.consulto_id), 154 | id_utente: JSON.stringify(this.id_utente) 155 | } 156 | }; 157 | this.router.navigate(['/chat'], navigationExtras); 158 | } 159 | 160 | checkRichiedente() { 161 | for (var partecipante of this.partecipanti) { 162 | if (partecipante.medico_id == this.id_utente && partecipante.richiedente == "true") { 163 | this.boolRichiedente = true; 164 | } 165 | } 166 | } 167 | 168 | async presentToast(text) { 169 | const toast = await this.toastCtrl.create({ 170 | message: text, 171 | duration: 1500, 172 | }); 173 | toast.present(); 174 | } 175 | 176 | 177 | } 178 | -------------------------------------------------------------------------------- /app_teleconsulto/src/app/access/registration/registration.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Registrazione 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Nome 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | Cognome 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | Codice Fiscale 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | Gender 62 | 63 | 64 | 65 | 66 | 67 | 68 | M 69 | F 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | Data nascita 79 | 80 | 81 | 82 | 83 | 84 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | Professione 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | Email 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | Password 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | Conferma password 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | Registrati 152 | 153 | 154 | 155 | -------------------------------------------------------------------------------- /app_teleconsulto/angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "defaultProject": "app", 5 | "newProjectRoot": "projects", 6 | "projects": { 7 | "app": { 8 | "root": "", 9 | "sourceRoot": "src", 10 | "projectType": "application", 11 | "prefix": "app", 12 | "schematics": {}, 13 | "architect": { 14 | "build": { 15 | "builder": "@angular-devkit/build-angular:browser", 16 | "options": { 17 | "outputPath": "www", 18 | "index": "src/index.html", 19 | "main": "src/main.ts", 20 | "polyfills": "src/polyfills.ts", 21 | "tsConfig": "tsconfig.app.json", 22 | "assets": [ 23 | { 24 | "glob": "**/*", 25 | "input": "src/assets", 26 | "output": "assets" 27 | }, 28 | { 29 | "glob": "**/*.svg", 30 | "input": "node_modules/ionicons/dist/ionicons/svg", 31 | "output": "./svg" 32 | } 33 | ], 34 | "styles": [ 35 | "src/theme/variables.scss", 36 | "src/global.scss" 37 | ], 38 | "scripts": [], 39 | "aot": false, 40 | "vendorChunk": true, 41 | "extractLicenses": false, 42 | "buildOptimizer": false, 43 | "sourceMap": true, 44 | "optimization": false, 45 | "namedChunks": true 46 | }, 47 | "configurations": { 48 | "production": { 49 | "fileReplacements": [ 50 | { 51 | "replace": "src/environments/environment.ts", 52 | "with": "src/environments/environment.prod.ts" 53 | } 54 | ], 55 | "optimization": true, 56 | "outputHashing": "all", 57 | "sourceMap": false, 58 | "namedChunks": false, 59 | "aot": true, 60 | "extractLicenses": true, 61 | "vendorChunk": false, 62 | "buildOptimizer": true, 63 | "budgets": [ 64 | { 65 | "type": "initial", 66 | "maximumWarning": "2mb", 67 | "maximumError": "5mb" 68 | } 69 | ] 70 | }, 71 | "ci": { 72 | "progress": false 73 | } 74 | } 75 | }, 76 | "serve": { 77 | "builder": "@angular-devkit/build-angular:dev-server", 78 | "options": { 79 | "browserTarget": "app:build" 80 | }, 81 | "configurations": { 82 | "production": { 83 | "browserTarget": "app:build:production" 84 | }, 85 | "ci": { 86 | "progress": false 87 | } 88 | } 89 | }, 90 | "extract-i18n": { 91 | "builder": "@angular-devkit/build-angular:extract-i18n", 92 | "options": { 93 | "browserTarget": "app:build" 94 | } 95 | }, 96 | "test": { 97 | "builder": "@angular-devkit/build-angular:karma", 98 | "options": { 99 | "main": "src/test.ts", 100 | "polyfills": "src/polyfills.ts", 101 | "tsConfig": "tsconfig.spec.json", 102 | "karmaConfig": "karma.conf.js", 103 | "styles": [], 104 | "scripts": [], 105 | "assets": [ 106 | { 107 | "glob": "favicon.ico", 108 | "input": "src/", 109 | "output": "/" 110 | }, 111 | { 112 | "glob": "**/*", 113 | "input": "src/assets", 114 | "output": "/assets" 115 | } 116 | ] 117 | }, 118 | "configurations": { 119 | "ci": { 120 | "progress": false, 121 | "watch": false 122 | } 123 | } 124 | }, 125 | "lint": { 126 | "builder": "@angular-eslint/builder:lint", 127 | "options": { 128 | "lintFilePatterns": [ 129 | "src/**/*.ts", 130 | "src/**/*.html" 131 | ] 132 | } 133 | }, 134 | "e2e": { 135 | "builder": "@angular-devkit/build-angular:protractor", 136 | "options": { 137 | "protractorConfig": "e2e/protractor.conf.js", 138 | "devServerTarget": "app:serve" 139 | }, 140 | "configurations": { 141 | "production": { 142 | "devServerTarget": "app:serve:production" 143 | }, 144 | "ci": { 145 | "devServerTarget": "app:serve:ci" 146 | } 147 | } 148 | }, 149 | "ionic-cordova-build": { 150 | "builder": "@ionic/angular-toolkit:cordova-build", 151 | "options": { 152 | "browserTarget": "app:build" 153 | }, 154 | "configurations": { 155 | "production": { 156 | "browserTarget": "app:build:production" 157 | } 158 | } 159 | }, 160 | "ionic-cordova-serve": { 161 | "builder": "@ionic/angular-toolkit:cordova-serve", 162 | "options": { 163 | "cordovaBuildTarget": "app:ionic-cordova-build", 164 | "devServerTarget": "app:serve" 165 | }, 166 | "configurations": { 167 | "production": { 168 | "cordovaBuildTarget": "app:ionic-cordova-build:production", 169 | "devServerTarget": "app:serve:production" 170 | } 171 | } 172 | }, 173 | "deploy": { 174 | "builder": "@angular/fire:deploy", 175 | "options": { 176 | "prerender": false, 177 | "ssr": false, 178 | "browserTarget": "app:build:production", 179 | "firebaseProject": "teleconsulto-e1656", 180 | "firebaseHostingSite": "teleconsulto-e1656" 181 | } 182 | } 183 | } 184 | } 185 | }, 186 | "cli": { 187 | "defaultCollection": "@ionic/angular-toolkit" 188 | }, 189 | "schematics": { 190 | "@ionic/angular-toolkit:component": { 191 | "styleext": "scss" 192 | }, 193 | "@ionic/angular-toolkit:page": { 194 | "styleext": "scss" 195 | } 196 | } 197 | } -------------------------------------------------------------------------------- /app_teleconsulto/src/app/logged/profile/profile.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Profilo 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | Nome 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | Cognome 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | Codice Fiscale 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Gender 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | Data nascita 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | Professione 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | Email 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 |
120 | 121 | 122 | 123 | 124 | 126 | 127 | 128 | Modifica Password 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | Password 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | Conferma 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 |
162 | 163 | 164 | Modifica Password 165 | 166 |
167 |
168 |
169 |
170 |
171 |
-------------------------------------------------------------------------------- /app_teleconsulto/src/theme/variables.scss: -------------------------------------------------------------------------------- 1 | // Ionic Variables and Theming. For more info, please see: 2 | // http://ionicframework.com/docs/theming/ 3 | 4 | /** Ionic CSS Variables **/ 5 | :root { 6 | /** primary **/ 7 | --ion-color-primary: #3880ff; 8 | --ion-color-primary-rgb: 56, 128, 255; 9 | --ion-color-primary-contrast: #ffffff; 10 | --ion-color-primary-contrast-rgb: 255, 255, 255; 11 | --ion-color-primary-shade: #3171e0; 12 | --ion-color-primary-tint: #4c8dff; 13 | 14 | /** secondary **/ 15 | --ion-color-secondary: #3dc2ff; 16 | --ion-color-secondary-rgb: 61, 194, 255; 17 | --ion-color-secondary-contrast: #ffffff; 18 | --ion-color-secondary-contrast-rgb: 255, 255, 255; 19 | --ion-color-secondary-shade: #36abe0; 20 | --ion-color-secondary-tint: #50c8ff; 21 | 22 | /** tertiary **/ 23 | --ion-color-tertiary: #3e1ae0; 24 | --ion-color-tertiary-rgb: 82, 96, 255; 25 | --ion-color-tertiary-contrast: #ffffff; 26 | --ion-color-tertiary-contrast-rgb: 255, 255, 255; 27 | --ion-color-tertiary-shade: #4854e0; 28 | --ion-color-tertiary-tint: #6370ff; 29 | 30 | /** success **/ 31 | --ion-color-success: #2dd36f; 32 | --ion-color-success-rgb: 45, 211, 111; 33 | --ion-color-success-contrast: #ffffff; 34 | --ion-color-success-contrast-rgb: 255, 255, 255; 35 | --ion-color-success-shade: #28ba62; 36 | --ion-color-success-tint: #42d77d; 37 | 38 | /** warning **/ 39 | --ion-color-warning: #ffc409; 40 | --ion-color-warning-rgb: 255, 196, 9; 41 | --ion-color-warning-contrast: #000000; 42 | --ion-color-warning-contrast-rgb: 0, 0, 0; 43 | --ion-color-warning-shade: #e0ac08; 44 | --ion-color-warning-tint: #ffca22; 45 | 46 | /** danger **/ 47 | --ion-color-danger: #eb445a; 48 | --ion-color-danger-rgb: 235, 68, 90; 49 | --ion-color-danger-contrast: #ffffff; 50 | --ion-color-danger-contrast-rgb: 255, 255, 255; 51 | --ion-color-danger-shade: #cf3c4f; 52 | --ion-color-danger-tint: #ed576b; 53 | 54 | /** dark **/ 55 | --ion-color-dark: #222428; 56 | --ion-color-dark-rgb: 34, 36, 40; 57 | --ion-color-dark-contrast: #ffffff; 58 | --ion-color-dark-contrast-rgb: 255, 255, 255; 59 | --ion-color-dark-shade: #1e2023; 60 | --ion-color-dark-tint: #383a3e; 61 | 62 | /** medium **/ 63 | --ion-color-medium: #92949c; 64 | --ion-color-medium-rgb: 146, 148, 156; 65 | --ion-color-medium-contrast: #ffffff; 66 | --ion-color-medium-contrast-rgb: 255, 255, 255; 67 | --ion-color-medium-shade: #808289; 68 | --ion-color-medium-tint: #9d9fa6; 69 | 70 | /** light **/ 71 | --ion-color-light: #f4f5f8; 72 | --ion-color-light-rgb: 244, 245, 248; 73 | --ion-color-light-contrast: #000000; 74 | --ion-color-light-contrast-rgb: 0, 0, 0; 75 | --ion-color-light-shade: #d7d8da; 76 | --ion-color-light-tint: #f5f6f9; 77 | } 78 | 79 | @media (prefers-color-scheme: dark) { 80 | /* 81 | * Dark Colors 82 | * ------------------------------------------- 83 | */ 84 | 85 | body { 86 | --ion-color-primary: #428cff; 87 | --ion-color-primary-rgb: 66,140,255; 88 | --ion-color-primary-contrast: #ffffff; 89 | --ion-color-primary-contrast-rgb: 255,255,255; 90 | --ion-color-primary-shade: #3a7be0; 91 | --ion-color-primary-tint: #5598ff; 92 | 93 | --ion-color-secondary: #50c8ff; 94 | --ion-color-secondary-rgb: 80,200,255; 95 | --ion-color-secondary-contrast: #ffffff; 96 | --ion-color-secondary-contrast-rgb: 255,255,255; 97 | --ion-color-secondary-shade: #46b0e0; 98 | --ion-color-secondary-tint: #62ceff; 99 | 100 | --ion-color-tertiary: #6a64ff; 101 | --ion-color-tertiary-rgb: 106,100,255; 102 | --ion-color-tertiary-contrast: #ffffff; 103 | --ion-color-tertiary-contrast-rgb: 255,255,255; 104 | --ion-color-tertiary-shade: #5d58e0; 105 | --ion-color-tertiary-tint: #7974ff; 106 | 107 | --ion-color-success: #2fdf75; 108 | --ion-color-success-rgb: 47,223,117; 109 | --ion-color-success-contrast: #000000; 110 | --ion-color-success-contrast-rgb: 0,0,0; 111 | --ion-color-success-shade: #29c467; 112 | --ion-color-success-tint: #44e283; 113 | 114 | --ion-color-warning: #ffd534; 115 | --ion-color-warning-rgb: 255,213,52; 116 | --ion-color-warning-contrast: #000000; 117 | --ion-color-warning-contrast-rgb: 0,0,0; 118 | --ion-color-warning-shade: #e0bb2e; 119 | --ion-color-warning-tint: #ffd948; 120 | 121 | --ion-color-danger: #ff4961; 122 | --ion-color-danger-rgb: 255,73,97; 123 | --ion-color-danger-contrast: #ffffff; 124 | --ion-color-danger-contrast-rgb: 255,255,255; 125 | --ion-color-danger-shade: #e04055; 126 | --ion-color-danger-tint: #ff5b71; 127 | 128 | --ion-color-dark: #f4f5f8; 129 | --ion-color-dark-rgb: 244,245,248; 130 | --ion-color-dark-contrast: #000000; 131 | --ion-color-dark-contrast-rgb: 0,0,0; 132 | --ion-color-dark-shade: #d7d8da; 133 | --ion-color-dark-tint: #f5f6f9; 134 | 135 | --ion-color-medium: #989aa2; 136 | --ion-color-medium-rgb: 152,154,162; 137 | --ion-color-medium-contrast: #000000; 138 | --ion-color-medium-contrast-rgb: 0,0,0; 139 | --ion-color-medium-shade: #86888f; 140 | --ion-color-medium-tint: #a2a4ab; 141 | 142 | --ion-color-light: #222428; 143 | --ion-color-light-rgb: 34,36,40; 144 | --ion-color-light-contrast: #ffffff; 145 | --ion-color-light-contrast-rgb: 255,255,255; 146 | --ion-color-light-shade: #1e2023; 147 | --ion-color-light-tint: #383a3e; 148 | } 149 | 150 | /* 151 | * iOS Dark Theme 152 | * ------------------------------------------- 153 | */ 154 | 155 | .ios body { 156 | --ion-background-color: #000000; 157 | --ion-background-color-rgb: 0,0,0; 158 | 159 | --ion-text-color: #ffffff; 160 | --ion-text-color-rgb: 255,255,255; 161 | 162 | --ion-color-step-50: #0d0d0d; 163 | --ion-color-step-100: #1a1a1a; 164 | --ion-color-step-150: #262626; 165 | --ion-color-step-200: #333333; 166 | --ion-color-step-250: #404040; 167 | --ion-color-step-300: #4d4d4d; 168 | --ion-color-step-350: #595959; 169 | --ion-color-step-400: #666666; 170 | --ion-color-step-450: #737373; 171 | --ion-color-step-500: #808080; 172 | --ion-color-step-550: #8c8c8c; 173 | --ion-color-step-600: #999999; 174 | --ion-color-step-650: #a6a6a6; 175 | --ion-color-step-700: #b3b3b3; 176 | --ion-color-step-750: #bfbfbf; 177 | --ion-color-step-800: #cccccc; 178 | --ion-color-step-850: #d9d9d9; 179 | --ion-color-step-900: #e6e6e6; 180 | --ion-color-step-950: #f2f2f2; 181 | 182 | --ion-item-background: #000000; 183 | 184 | --ion-card-background: #1c1c1d; 185 | } 186 | 187 | .ios ion-modal { 188 | --ion-background-color: var(--ion-color-step-100); 189 | --ion-toolbar-background: var(--ion-color-step-150); 190 | --ion-toolbar-border-color: var(--ion-color-step-250); 191 | } 192 | 193 | 194 | /* 195 | * Material Design Dark Theme 196 | * ------------------------------------------- 197 | */ 198 | 199 | .md body { 200 | --ion-background-color: #121212; 201 | --ion-background-color-rgb: 18,18,18; 202 | 203 | --ion-text-color: #ffffff; 204 | --ion-text-color-rgb: 255,255,255; 205 | 206 | --ion-border-color: #222222; 207 | 208 | --ion-color-step-50: #1e1e1e; 209 | --ion-color-step-100: #2a2a2a; 210 | --ion-color-step-150: #363636; 211 | --ion-color-step-200: #414141; 212 | --ion-color-step-250: #4d4d4d; 213 | --ion-color-step-300: #595959; 214 | --ion-color-step-350: #656565; 215 | --ion-color-step-400: #717171; 216 | --ion-color-step-450: #7d7d7d; 217 | --ion-color-step-500: #898989; 218 | --ion-color-step-550: #949494; 219 | --ion-color-step-600: #a0a0a0; 220 | --ion-color-step-650: #acacac; 221 | --ion-color-step-700: #b8b8b8; 222 | --ion-color-step-750: #c4c4c4; 223 | --ion-color-step-800: #d0d0d0; 224 | --ion-color-step-850: #dbdbdb; 225 | --ion-color-step-900: #e7e7e7; 226 | --ion-color-step-950: #f3f3f3; 227 | 228 | --ion-item-background: #1e1e1e; 229 | 230 | --ion-toolbar-background: #1f1f1f; 231 | 232 | --ion-tab-bar-background: #1f1f1f; 233 | 234 | --ion-card-background: #1e1e1e; 235 | } 236 | } 237 | --------------------------------------------------------------------------------