├── .angular-cli.json ├── .devel ├── ictfax.conf └── ictfax.spec ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .stylelintrc.json ├── .travis.yml ├── .vscode ├── launch.json └── settings.json ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DEV_DOCS.md ├── INSTALL.md ├── LICENSE.md ├── README.md ├── angular.json ├── doc ├── ApiGuide.md ├── ApiTutorial.md ├── README.md ├── TODO.md ├── admin-guide.md ├── api.md ├── build-guide.md ├── screenshots │ ├── add_extension.png │ ├── add_provider.png │ ├── add_userictfax.png │ ├── auth.png │ └── service.png └── user-guide.md ├── e2e └── tsconfig.e2e.json ├── karma.conf.js ├── ngsw-config.json ├── package-lock.json ├── package.json ├── protractor.conf.js ├── src ├── app │ ├── @core │ │ ├── core.module.ts │ │ ├── data │ │ │ ├── .gitkeep │ │ │ ├── README.md │ │ │ └── data.module.ts │ │ ├── mock │ │ │ └── README.md │ │ ├── module-import-guard.ts │ │ └── utils │ │ │ ├── .gitkeep │ │ │ ├── analytics.service.ts │ │ │ ├── index.ts │ │ │ ├── layout.service.ts │ │ │ ├── player.service.ts │ │ │ ├── seo.service.ts │ │ │ └── state.service.ts │ ├── @theme │ │ ├── components │ │ │ ├── footer │ │ │ │ ├── footer.component.scss │ │ │ │ └── footer.component.ts │ │ │ ├── header │ │ │ │ ├── header.component.html │ │ │ │ ├── header.component.scss │ │ │ │ └── header.component.ts │ │ │ ├── index.ts │ │ │ ├── search-input │ │ │ │ ├── search-input.component.scss │ │ │ │ └── search-input.component.ts │ │ │ └── tiny-mce │ │ │ │ └── tiny-mce.component.ts │ │ ├── directives │ │ │ └── .gitkeep │ │ ├── layouts │ │ │ ├── index.ts │ │ │ ├── one-column │ │ │ │ ├── one-column.layout.scss │ │ │ │ └── one-column.layout.ts │ │ │ ├── three-columns │ │ │ │ ├── three-columns.layout.scss │ │ │ │ └── three-columns.layout.ts │ │ │ └── two-columns │ │ │ │ ├── two-columns.layout.scss │ │ │ │ └── two-columns.layout.ts │ │ ├── pipes │ │ │ ├── .gitkeep │ │ │ ├── capitalize.pipe.ts │ │ │ ├── index.ts │ │ │ ├── number-with-commas.pipe.ts │ │ │ ├── plural.pipe.ts │ │ │ ├── round.pipe.ts │ │ │ └── timing.pipe.ts │ │ ├── styles │ │ │ ├── _layout.scss │ │ │ ├── _overrides.scss │ │ │ ├── pace.theme.scss │ │ │ ├── styles.scss │ │ │ ├── theme.corporate.ts │ │ │ ├── theme.cosmic.ts │ │ │ ├── theme.dark.ts │ │ │ ├── theme.default.ts │ │ │ └── themes.scss │ │ └── theme.module.ts │ ├── app-config.model.ts │ ├── app-routing.module.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── app.service.ts │ ├── auth-guard.service.ts │ ├── auth │ │ ├── auth-routing.module.ts │ │ ├── auth.module.ts │ │ ├── login │ │ │ ├── login.component.html │ │ │ └── login.component.ts │ │ ├── logout │ │ │ ├── logout.component.html │ │ │ └── logout.component.ts │ │ ├── request-password │ │ │ ├── request-password.component.html │ │ │ ├── request-password.component.scss │ │ │ └── request-password.component.ts │ │ ├── reset-password │ │ │ ├── reset-password.component.html │ │ │ ├── reset-password.component.scss │ │ │ └── reset-password.component.ts │ │ └── signin │ │ │ ├── auth-config.ts │ │ │ ├── signin.component.html │ │ │ ├── signin.component.scss │ │ │ ├── signin.component.ts │ │ │ └── signin.service.ts │ ├── file-download-helper.ts │ ├── modal.component.ts │ └── pages │ │ ├── campaigns │ │ ├── campaign-component.html │ │ ├── campaign-component.scss │ │ ├── campaign-component.ts │ │ ├── campaign-database.component.ts │ │ ├── campaign-datasource.component.ts │ │ ├── campaign-from-component.scss │ │ ├── campaign-routing.module.ts │ │ ├── campaign.component.ts │ │ ├── campaign.module.ts │ │ ├── campaign.service.ts │ │ ├── campaign.ts │ │ ├── senddocument │ │ │ ├── campaign-document-component.html │ │ │ ├── campaign-document-component.scss │ │ │ └── campaign-document-component.ts │ │ ├── sendemail │ │ │ ├── campaign-email-component.html │ │ │ ├── campaign-email-component.scss │ │ │ └── campaign-email-component.ts │ │ ├── sendsms │ │ │ ├── campaign-form-component.html │ │ │ ├── campaign-form-component.scss │ │ │ └── campaign-form-component.ts │ │ └── status-card │ │ │ ├── status-card.component.scss │ │ │ └── status-card.component.ts │ │ ├── changepassword │ │ ├── changepassword-component.scss │ │ ├── changepassword-component.ts │ │ ├── changepassword.module.ts │ │ └── password.check.directive.ts │ │ ├── cid │ │ ├── assign-cid-component.html │ │ ├── assign-cid-component.scss │ │ ├── assign-cid-component.ts │ │ ├── batch-cid-component.html │ │ ├── batch-cid-component.scss │ │ ├── batch-cid-component.ts │ │ ├── cid-component.html │ │ ├── cid-component.scss │ │ ├── cid-component.ts │ │ ├── cid-database.component.ts │ │ ├── cid-datasource.component.ts │ │ ├── cid-form-component.html │ │ ├── cid-form-component.scss │ │ ├── cid-form-component.ts │ │ ├── cid-routing.module.ts │ │ ├── cid.component.ts │ │ ├── cid.module.ts │ │ ├── cid.service.ts │ │ ├── cid.ts │ │ ├── import-cid-component.html │ │ ├── import-cid-component.scss │ │ └── import-cid-component.ts │ │ ├── contact │ │ ├── contact-component.html │ │ ├── contact-component.scss │ │ ├── contact-component.ts │ │ ├── contact-database.component.ts │ │ ├── contact-datasource.component.ts │ │ ├── contact-form-component.html │ │ ├── contact-form-component.scss │ │ ├── contact-form-component.ts │ │ ├── contact-routing.module.ts │ │ ├── contact.component.ts │ │ ├── contact.module.ts │ │ ├── contact.service.ts │ │ ├── contact.ts │ │ └── group │ │ │ ├── group-component.html │ │ │ ├── group-component.scss │ │ │ ├── group-component.ts │ │ │ ├── group-database.component.ts │ │ │ ├── group-datasource.component.ts │ │ │ ├── group-form-component.html │ │ │ ├── group-form-component.scss │ │ │ ├── group-form-component.ts │ │ │ ├── group.service.ts │ │ │ └── group.ts │ │ ├── contact_dnc │ │ ├── contact_dnc-component.html │ │ ├── contact_dnc-component.scss │ │ ├── contact_dnc-component.ts │ │ ├── contact_dnc-database.component.ts │ │ ├── contact_dnc-datasource.component.ts │ │ ├── contact_dnc-form-component.html │ │ ├── contact_dnc-form-component.scss │ │ ├── contact_dnc-form-component.ts │ │ ├── contact_dnc-routing.module.ts │ │ ├── contact_dnc.component.ts │ │ ├── contact_dnc.module.ts │ │ ├── contact_dnc.service.ts │ │ └── contact_dnc.ts │ │ ├── dashboard │ │ ├── dashboard.component.html │ │ ├── dashboard.component.scss │ │ ├── dashboard.component.ts │ │ ├── dashboard.module.ts │ │ ├── dashboard.service.ts │ │ └── status-card │ │ │ ├── status-card.component.scss │ │ │ └── status-card.component.ts │ │ ├── default_settings │ │ ├── default_settings-component.html │ │ ├── default_settings-component.scss │ │ ├── default_settings-component.ts │ │ ├── default_settings.module.ts │ │ ├── default_settings.service.ts │ │ └── default_settings.ts │ │ ├── did │ │ ├── assign-did-component.html │ │ ├── assign-did-component.scss │ │ ├── assign-did-component.ts │ │ ├── batch-did-component.html │ │ ├── batch-did-component.scss │ │ ├── batch-did-component.ts │ │ ├── did-component.html │ │ ├── did-component.scss │ │ ├── did-component.ts │ │ ├── did-database.component.ts │ │ ├── did-datasource.component.ts │ │ ├── did-form-component.html │ │ ├── did-form-component.scss │ │ ├── did-form-component.ts │ │ ├── did-routing.module.ts │ │ ├── did.component.ts │ │ ├── did.module.ts │ │ ├── did.service.ts │ │ ├── did.ts │ │ ├── import-did-component.html │ │ ├── import-did-component.scss │ │ └── import-did-component.ts │ │ ├── extension │ │ ├── extension-component.html │ │ ├── extension-component.scss │ │ ├── extension-component.ts │ │ ├── extension-database.component.ts │ │ ├── extension-datasource.component.ts │ │ ├── extension-form-component.html │ │ ├── extension-form-component.scss │ │ ├── extension-form-component.ts │ │ ├── extension-routing.module.ts │ │ ├── extension.component.ts │ │ ├── extension.module.ts │ │ ├── extension.service.ts │ │ └── extension.ts │ │ ├── faxsettings │ │ ├── faxsettings-component.scss │ │ ├── faxsettings-component.ts │ │ └── faxsettings.module.ts │ │ ├── incoming_cid_number │ │ ├── assign-incoming_cid_number-component.html │ │ ├── assign-incoming_cid_number-component.scss │ │ ├── assign-incoming_cid_number-component.ts │ │ ├── edit-incoming_cid_number-component.html │ │ ├── edit-incoming_cid_number-component.scss │ │ ├── edit-incoming_cid_number-component.ts │ │ ├── incoming_cid_number-component.html │ │ ├── incoming_cid_number-component.scss │ │ ├── incoming_cid_number-component.ts │ │ ├── incoming_cid_number-database.component.ts │ │ ├── incoming_cid_number-datasource.component.ts │ │ ├── incoming_cid_number-routing.module.ts │ │ ├── incoming_cid_number.component.ts │ │ ├── incoming_cid_number.module.ts │ │ ├── incoming_cid_number.service.ts │ │ └── incoming_cid_number.ts │ │ ├── incoming_number │ │ ├── assign-incoming_number-component.html │ │ ├── assign-incoming_number-component.scss │ │ ├── assign-incoming_number-component.ts │ │ ├── edit-incoming_number-component.html │ │ ├── edit-incoming_number-component.scss │ │ ├── edit-incoming_number-component.ts │ │ ├── forward-incoming_number-component.html │ │ ├── forward-incoming_number-component.scss │ │ ├── forward-incoming_number-component.ts │ │ ├── incoming_number-component.html │ │ ├── incoming_number-component.scss │ │ ├── incoming_number-component.ts │ │ ├── incoming_number-database.component.ts │ │ ├── incoming_number-datasource.component.ts │ │ ├── incoming_number-routing.module.ts │ │ ├── incoming_number.component.ts │ │ ├── incoming_number.module.ts │ │ ├── incoming_number.service.ts │ │ └── incoming_number.ts │ │ ├── infax │ │ ├── infax-component.html │ │ ├── infax-component.scss │ │ ├── infax-component.ts │ │ ├── infax-database.component.ts │ │ ├── infax-datasource.component.ts │ │ ├── infax.module.ts │ │ └── infax.service.ts │ │ ├── menu-item.ts │ │ ├── message │ │ ├── document │ │ │ ├── document-component.html │ │ │ ├── document-component.scss │ │ │ ├── document-component.ts │ │ │ ├── document-database.component.ts │ │ │ ├── document-datasource.component.ts │ │ │ ├── document-form-component.html │ │ │ ├── document-form-component.scss │ │ │ ├── document-form-component.ts │ │ │ ├── document.service.ts │ │ │ └── document.ts │ │ ├── email │ │ │ ├── email-component.html │ │ │ ├── email-component.scss │ │ │ ├── email-component.ts │ │ │ ├── email-database.component.ts │ │ │ ├── email-datasource.component.ts │ │ │ ├── email-form-component.html │ │ │ ├── email-form-component.scss │ │ │ ├── email-form-component.ts │ │ │ ├── email.service.ts │ │ │ └── email.ts │ │ ├── message-routing.module.ts │ │ ├── message.component.ts │ │ ├── message.module.ts │ │ ├── recording │ │ │ ├── recording-component.html │ │ │ ├── recording-component.scss │ │ │ ├── recording-component.ts │ │ │ ├── recording-database.component.ts │ │ │ ├── recording-datasource.component.ts │ │ │ ├── recording-form-component.html │ │ │ ├── recording-form-component.scss │ │ │ ├── recording-form-component.ts │ │ │ ├── recording.service.ts │ │ │ └── recording.ts │ │ └── text │ │ │ ├── text-component.html │ │ │ ├── text-component.scss │ │ │ ├── text-component.ts │ │ │ ├── text-database.component.ts │ │ │ ├── text-datasource.component.ts │ │ │ ├── text-form-component.html │ │ │ ├── text-form-component.scss │ │ │ ├── text-form-component.ts │ │ │ ├── text.service.ts │ │ │ └── text.ts │ │ ├── miscellaneous │ │ ├── miscellaneous-routing.module.ts │ │ ├── miscellaneous.component.ts │ │ ├── miscellaneous.module.ts │ │ └── not-found │ │ │ ├── not-found.component.html │ │ │ ├── not-found.component.scss │ │ │ └── not-found.component.ts │ │ ├── pages-menu.ts │ │ ├── pages-routing.module.ts │ │ ├── pages.component.scss │ │ ├── pages.component.ts │ │ ├── pages.module.ts │ │ ├── provider │ │ ├── provider-component.html │ │ ├── provider-component.scss │ │ ├── provider-component.ts │ │ ├── provider-database.component.ts │ │ ├── provider-datasource.component.ts │ │ ├── provider-form-component.html │ │ ├── provider-form-component.scss │ │ ├── provider-form-component.ts │ │ ├── provider-routing.module.ts │ │ ├── provider.component.ts │ │ ├── provider.module.ts │ │ ├── provider.service.ts │ │ └── provider.ts │ │ ├── sendfax │ │ ├── faxlogs.ts │ │ ├── sendfax-component.html │ │ ├── sendfax-component.scss │ │ ├── sendfax-component.ts │ │ ├── sendfax-database.component.ts │ │ ├── sendfax-datasource.component.ts │ │ ├── sendfax-form-component.html │ │ ├── sendfax-form-component.scss │ │ ├── sendfax-form-component.ts │ │ ├── sendfax-routing.module.ts │ │ ├── sendfax.component.ts │ │ ├── sendfax.module.ts │ │ ├── sendfax.service.ts │ │ └── sendfax.ts │ │ ├── transmission │ │ ├── senddocument │ │ │ ├── transmission-senddocument.html │ │ │ ├── transmission-senddocument.scss │ │ │ └── transmission-senddocument.ts │ │ ├── sendvoice │ │ │ ├── transmission-sendvoice.html │ │ │ ├── transmission-sendvoice.scss │ │ │ └── transmission-sendvoice.ts │ │ ├── status-card │ │ │ ├── status-card.component.scss │ │ │ └── status-card.component.ts │ │ ├── transmission-component.html │ │ ├── transmission-component.scss │ │ ├── transmission-component.ts │ │ ├── transmission-database.component.ts │ │ ├── transmission-datasource.component.ts │ │ ├── transmission-routing.module.ts │ │ ├── transmission.component.ts │ │ ├── transmission.module.ts │ │ ├── transmission.service.ts │ │ └── transmission.ts │ │ └── user │ │ ├── password.match.directive.ts │ │ ├── user-component.html │ │ ├── user-component.scss │ │ ├── user-component.ts │ │ ├── user-database.component.ts │ │ ├── user-datasource.component.ts │ │ ├── user-form-component.html │ │ ├── user-form-component.scss │ │ ├── user-form-component.ts │ │ ├── user-routing.module.ts │ │ ├── user.component.ts │ │ ├── user.module.ts │ │ ├── user.service.ts │ │ └── user.ts ├── assets │ ├── .gitkeep │ ├── config │ │ ├── config.dev.json │ │ └── config.prod.json │ ├── data │ │ └── news.json │ ├── i18n │ │ ├── english.json │ │ ├── italian.json │ │ └── japanese.json │ ├── icons │ │ ├── icon-128x128.png │ │ ├── icon-144x144.png │ │ ├── icon-152x152.png │ │ ├── icon-192x192.png │ │ ├── icon-384x384.png │ │ ├── icon-512x512.png │ │ ├── icon-72x72.png │ │ └── icon-96x96.png │ ├── images │ │ ├── alan.png │ │ ├── camera1.jpg │ │ ├── camera2.jpg │ │ ├── camera3.jpg │ │ ├── camera4.jpg │ │ ├── cover1.jpg │ │ ├── cover2.jpg │ │ ├── cover3.jpg │ │ ├── eva.png │ │ ├── ictfax-logo-org.png │ │ ├── ivr │ │ │ ├── large │ │ │ │ ├── amd.png │ │ │ │ ├── answer.png │ │ │ │ ├── dnc.png │ │ │ │ ├── getdigits.png │ │ │ │ ├── hangup.png │ │ │ │ ├── incoming.png │ │ │ │ ├── make-a-call.png │ │ │ │ ├── options.png │ │ │ │ ├── out-going.png │ │ │ │ ├── recording.png │ │ │ │ ├── say_alpha.png │ │ │ │ ├── say_date.png │ │ │ │ ├── say_digit.png │ │ │ │ ├── say_number.png │ │ │ │ ├── say_time.png │ │ │ │ ├── setting.png │ │ │ │ ├── setvar.png │ │ │ │ ├── start.png │ │ │ │ ├── transfer.png │ │ │ │ ├── tts.png │ │ │ │ └── voice_play.png │ │ │ └── small │ │ │ │ ├── amd.png │ │ │ │ ├── answer.png │ │ │ │ ├── dnc.png │ │ │ │ ├── edit.png │ │ │ │ ├── getdigits.png │ │ │ │ ├── hangup.png │ │ │ │ ├── incoming.png │ │ │ │ ├── make a call.png │ │ │ │ ├── options.png │ │ │ │ ├── outgoing.png │ │ │ │ ├── recording.png │ │ │ │ ├── say_alpha.png │ │ │ │ ├── say_date.png │ │ │ │ ├── say_digit.png │ │ │ │ ├── say_number.png │ │ │ │ ├── say_time.png │ │ │ │ ├── setting.png │ │ │ │ ├── setvariable.png │ │ │ │ ├── transfer.png │ │ │ │ ├── tts.png │ │ │ │ └── voice_play.png │ │ ├── jack.png │ │ ├── kate.png │ │ ├── kitten-corporate.png │ │ ├── kitten-cosmic.png │ │ ├── kitten-dark.png │ │ ├── kitten-default.png │ │ ├── lee.png │ │ ├── logo.png │ │ ├── nick.png │ │ ├── square_pattern.svg │ │ ├── square_pattern_cosmic.svg │ │ └── team.png │ ├── leaflet-countries │ │ └── countries.geo.json │ ├── map │ │ └── world.json │ └── skins │ │ └── lightgray │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── fonts │ │ ├── tinymce-small.eot │ │ ├── tinymce-small.svg │ │ ├── tinymce-small.ttf │ │ ├── tinymce-small.woff │ │ ├── tinymce.eot │ │ ├── tinymce.svg │ │ ├── tinymce.ttf │ │ └── tinymce.woff │ │ ├── img │ │ ├── anchor.gif │ │ ├── loader.gif │ │ ├── object.gif │ │ └── trans.gif │ │ ├── skin.ie7.min.css │ │ └── skin.min.css ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── favicon.png ├── index.html ├── main.ts ├── manifest.webmanifest ├── polyfills.ts ├── test.ts ├── themes.scss ├── tsconfig.app.json ├── tsconfig.spec.json └── typings.d.ts ├── tsconfig.json └── tslint.json /.devel/ictfax.conf: -------------------------------------------------------------------------------- 1 | Alias /ictfax /usr/ictfax 2 | 3 | Options Indexes FollowSymLinks Includes 4 | AllowOverride All 5 | 6 | Allow from all 7 | 8 | = 2.4> 9 | Require all granted 10 | 11 | 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://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 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "overrides": [ 7 | ], 8 | "parser": "@typescript-eslint/parser", 9 | "parserOptions": { 10 | "ecmaVersion": "latest", 11 | "sourceType": "module" 12 | }, 13 | "plugins": [ 14 | "@typescript-eslint" 15 | ], 16 | "rules": { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /tmp 4 | /out-tsc 5 | 6 | # dependencies 7 | /node_modules 8 | 9 | # IDEs and editors 10 | .angular 11 | /.idea 12 | .project 13 | .classpath 14 | .c9/ 15 | *.launch 16 | .settings/ 17 | *.sublime-workspace 18 | 19 | # IDE - VSCode 20 | .vscode/* 21 | !.vscode/settings.json 22 | !.vscode/tasks.json 23 | !.vscode/launch.json 24 | !.vscode/extensions.json 25 | 26 | # misc 27 | /.sass-cache 28 | /connect.lock 29 | /coverage 30 | /libpeerconnection.log 31 | npm-debug.log 32 | testem.log 33 | /typings 34 | /docs 35 | 36 | # e2e 37 | /e2e/*.js 38 | /e2e/*.map 39 | 40 | # System Files 41 | .DS_Store 42 | Thumbs.db 43 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: node_js 4 | 5 | node_js: 6 | - '6' 7 | - '7' 8 | - '8' 9 | 10 | cache: 11 | directories: 12 | - node_modules 13 | 14 | addons: 15 | apt: 16 | sources: 17 | - ubuntu-toolchain-r-test 18 | packages: 19 | - g++-4.8 20 | 21 | before_install: if [[ `npm -v` != 5* ]]; then npm i -g npm@5; fi 22 | 23 | install: 24 | - npm i 25 | 26 | script: 27 | - npm run lint:ci 28 | - npm run build:ci 29 | 30 | git: 31 | depth: 1 32 | 33 | notifications: 34 | slack: akveo:q559HckfZMSyZRb803aiLcjH 35 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "chrome", 6 | "request": "launch", 7 | "name": "Launch Chrome against localhost", 8 | "url": "http://localhost:4200", 9 | "sourceMaps": true, 10 | "webRoot": "${workspaceRoot}" 11 | }, 12 | { 13 | "type": "chrome", 14 | "request": "attach", 15 | "name": "Attach to Chrome", 16 | "port": 9222, 17 | "sourceMaps": true, 18 | "webRoot": "${workspaceRoot}" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "./node_modules/typescript/lib", 3 | "tslint.enable": false, 4 | "angular.enable-strict-mode-prompt": false 5 | } 6 | -------------------------------------------------------------------------------- /DEV_DOCS.md: -------------------------------------------------------------------------------- 1 | Please have a look at [Nebular Dev Docs](https://github.com/akveo/nebular/blob/master/DEV_DOCS.md). 2 | -------------------------------------------------------------------------------- /doc/TODO.md: -------------------------------------------------------------------------------- 1 | Task list for ICTFax 2 | ========================= 3 | 4 | Following are our recommendations and task list to improve overall user experience with ICTFax. 5 | 6 | ### Cover Page 7 | 8 | A cover page to be added to each and every fax which will include the Title and description of the Document, user details, Date and time and the recipent information. Before adding the document user will be asked to add some details like 9 | 10 | - Document Title 11 | - Description 12 | - User Details 13 | - Recipent Information 14 | 15 | It will then generate a cover page of this information and will append it as a page in the document. 16 | 17 | -------------------------------------------------------------------------------- /doc/screenshots/add_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/doc/screenshots/add_extension.png -------------------------------------------------------------------------------- /doc/screenshots/add_provider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/doc/screenshots/add_provider.png -------------------------------------------------------------------------------- /doc/screenshots/add_userictfax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/doc/screenshots/add_userictfax.png -------------------------------------------------------------------------------- /doc/screenshots/auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/doc/screenshots/auth.png -------------------------------------------------------------------------------- /doc/screenshots/service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/doc/screenshots/service.png -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /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 | const configuration = { 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-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], 20 | fixWebpackSourcePaths: true 21 | }, 22 | angularCli: { 23 | environment: 'dev' 24 | }, 25 | reporters: ['progress', 'kjhtml'], 26 | port: 9876, 27 | colors: true, 28 | logLevel: config.LOG_INFO, 29 | autoWatch: true, 30 | browsers: ['Chrome'], 31 | customLaunchers: { 32 | Chrome_travis_ci: { 33 | base: 'Chrome', 34 | flags: ['--no-sandbox'] 35 | } 36 | }, 37 | singleRun: false 38 | }; 39 | 40 | if (process.env.TRAVIS) { 41 | configuration.browsers = ['Chrome_travis_ci']; 42 | } 43 | 44 | config.set(configuration); 45 | }; 46 | -------------------------------------------------------------------------------- /ngsw-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/service-worker/config/schema.json", 3 | "index": "/index.html", 4 | "assetGroups": [ 5 | { 6 | "name": "app", 7 | "installMode": "prefetch", 8 | "resources": { 9 | "files": [ 10 | "/favicon.ico", 11 | "/index.html", 12 | "/*.css", 13 | "/*.js" 14 | ] 15 | } 16 | }, { 17 | "name": "assets", 18 | "installMode": "lazy", 19 | "updateMode": "prefetch", 20 | "resources": { 21 | "files": [ 22 | "/assets/**", 23 | "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)" 24 | ] 25 | } 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome', 13 | 'chromeOptions': { 14 | 'args': ['show-fps-counter=true', '--no-sandbox'] 15 | } 16 | }, 17 | directConnect: true, 18 | baseUrl: 'http://localhost:4200/', 19 | framework: 'jasmine', 20 | jasmineNodeOpts: { 21 | showColors: true, 22 | defaultTimeoutInterval: 30000, 23 | print: function() {} 24 | }, 25 | onPrepare() { 26 | require('ts-node').register({ 27 | project: 'e2e/tsconfig.e2e.json' 28 | }); 29 | 30 | jasmine.getEnv().addReporter(new SpecReporter({ acspec: { displayStacktrace: true } })); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/app/@core/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/@core/data/.gitkeep -------------------------------------------------------------------------------- /src/app/@core/data/README.md: -------------------------------------------------------------------------------- 1 | Application-wise data providers. 2 | -------------------------------------------------------------------------------- /src/app/@core/data/data.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, ModuleWithProviders } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | 5 | import { ContactService } from '../../pages/contact/contact.service'; 6 | import { DocumentService } from '../../pages/message/document/document.service'; 7 | import { TransmissionService } from '../../pages/transmission/transmission.service'; 8 | import { ProviderService } from '../../pages/provider/provider.service'; 9 | import { AppService } from '../../../app/app.service'; 10 | import { AUserService } from '../../pages/user/user.service'; 11 | import { AuthGuard } from '../../auth-guard.service'; 12 | import { DashboardService } from '../../pages/dashboard/dashboard.service'; 13 | import { IncomingNumberService } from '../../pages/incoming_number/incoming_number.service'; 14 | import { InFaxService } from '../../pages/infax/infax.service'; 15 | import { DIDService } from '../../pages/did/did.service'; 16 | import { DefaultSettingsService } from '../../pages/default_settings/default_settings.service'; 17 | import { ExtensionService } from '../../pages/extension/extension.service'; 18 | import { SendFaxService } from '../../pages/sendfax/sendfax.service'; 19 | 20 | const SERVICES = [ 21 | ContactService, 22 | DocumentService, 23 | TransmissionService, 24 | ProviderService, 25 | AppService, 26 | AUserService, 27 | DashboardService, 28 | IncomingNumberService, 29 | InFaxService, 30 | DIDService, 31 | DefaultSettingsService, 32 | ExtensionService, 33 | SendFaxService 34 | ]; 35 | 36 | @NgModule({ 37 | imports: [ 38 | CommonModule, 39 | ], 40 | providers: [ 41 | ...SERVICES, 42 | ], 43 | }) 44 | export class DataModule { 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/app/@core/mock/README.md: -------------------------------------------------------------------------------- 1 | Application-wise data providers. 2 | -------------------------------------------------------------------------------- /src/app/@core/module-import-guard.ts: -------------------------------------------------------------------------------- 1 | export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) { 2 | if (parentModule) { 3 | throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/app/@core/utils/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/@core/utils/.gitkeep -------------------------------------------------------------------------------- /src/app/@core/utils/analytics.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { NavigationEnd, Router } from '@angular/router'; 3 | import { Location } from '@angular/common'; 4 | import { filter } from 'rxjs/operators'; 5 | 6 | declare const ga: any; 7 | 8 | @Injectable() 9 | export class AnalyticsService { 10 | private enabled: boolean; 11 | 12 | constructor(private location: Location, private router: Router) { 13 | this.enabled = false; 14 | } 15 | 16 | trackPageViews() { 17 | if (this.enabled) { 18 | this.router.events.pipe( 19 | filter((event) => event instanceof NavigationEnd), 20 | ) 21 | .subscribe(() => { 22 | ga('send', {hitType: 'pageview', page: this.location.path()}); 23 | }); 24 | } 25 | } 26 | 27 | trackEvent(eventName: string) { 28 | if (this.enabled) { 29 | ga('send', 'event', eventName); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/@core/utils/index.ts: -------------------------------------------------------------------------------- 1 | import { LayoutService } from './layout.service'; 2 | import { AnalyticsService } from './analytics.service'; 3 | import { PlayerService } from './player.service'; 4 | import { StateService } from './state.service'; 5 | import { SeoService } from './seo.service'; 6 | 7 | export { 8 | LayoutService, 9 | AnalyticsService, 10 | PlayerService, 11 | SeoService, 12 | StateService, 13 | }; 14 | -------------------------------------------------------------------------------- /src/app/@core/utils/layout.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Observable, Subject } from 'rxjs'; 3 | import { delay, share } from 'rxjs/operators'; 4 | 5 | @Injectable() 6 | export class LayoutService { 7 | 8 | protected layoutSize$ = new Subject(); 9 | 10 | changeLayoutSize() { 11 | this.layoutSize$.next(); 12 | } 13 | 14 | onChangeLayoutSize(): Observable { 15 | return this.layoutSize$.pipe( 16 | share(), 17 | delay(1), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/@core/utils/player.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | export class Track { 4 | name: string; 5 | artist: string; 6 | url: string; 7 | cover: string; 8 | } 9 | 10 | @Injectable() 11 | export class PlayerService { 12 | current: number; 13 | playlist: Track[] = [ 14 | { 15 | name: 'Don\'t Wanna Fight', 16 | artist: 'Alabama Shakes', 17 | url: 'https://p.scdn.co/mp3-preview/6156cdbca425a894972c02fca9d76c0b70e001af', 18 | cover: 'assets/images/cover1.jpg', 19 | }, 20 | { 21 | name: 'Harder', 22 | artist: 'Daft Punk', 23 | url: 'https://p.scdn.co/mp3-preview/92a04c7c0e96bf93a1b1b1cae7dfff1921969a7b', 24 | cover: 'assets/images/cover2.jpg', 25 | }, 26 | { 27 | name: 'Come Together', 28 | artist: 'Beatles', 29 | url: 'https://p.scdn.co/mp3-preview/83090a4db6899eaca689ae35f69126dbe65d94c9', 30 | cover: 'assets/images/cover3.jpg', 31 | }, 32 | ]; 33 | 34 | random(): Track { 35 | this.current = Math.floor(Math.random() * this.playlist.length); 36 | return this.playlist[this.current]; 37 | } 38 | 39 | next(): Track { 40 | return this.getNextTrack(); 41 | } 42 | 43 | prev() { 44 | return this.getPrevTrack(); 45 | } 46 | 47 | private getNextTrack(): Track { 48 | if (this.current === this.playlist.length - 1) { 49 | this.current = 0; 50 | } else { 51 | this.current++; 52 | } 53 | 54 | return this.playlist[this.current]; 55 | } 56 | 57 | private getPrevTrack(): Track { 58 | if (this.current === 0) { 59 | this.current = this.playlist.length - 1; 60 | } else { 61 | this.current--; 62 | } 63 | 64 | return this.playlist[this.current]; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/app/@core/utils/seo.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, Inject, PLATFORM_ID, OnDestroy } from '@angular/core'; 2 | import { isPlatformBrowser } from '@angular/common'; 3 | import { NavigationEnd, Router } from '@angular/router'; 4 | import { NB_DOCUMENT } from '@nebular/theme'; 5 | import { filter, takeUntil } from 'rxjs/operators'; 6 | import { Subject } from 'rxjs'; 7 | 8 | @Injectable() 9 | export class SeoService implements OnDestroy { 10 | 11 | private readonly destroy$ = new Subject(); 12 | private readonly dom: Document; 13 | private readonly isBrowser: boolean; 14 | private linkCanonical: HTMLLinkElement; 15 | 16 | constructor( 17 | private router: Router, 18 | @Inject(NB_DOCUMENT) document, 19 | @Inject(PLATFORM_ID) platformId, 20 | ) { 21 | this.isBrowser = isPlatformBrowser(platformId); 22 | this.dom = document; 23 | 24 | if (this.isBrowser) { 25 | this.createCanonicalTag(); 26 | } 27 | } 28 | 29 | ngOnDestroy() { 30 | this.destroy$.next(); 31 | this.destroy$.complete(); 32 | } 33 | 34 | createCanonicalTag() { 35 | this.linkCanonical = this.dom.createElement('link'); 36 | this.linkCanonical.setAttribute('rel', 'canonical'); 37 | this.dom.head.appendChild(this.linkCanonical); 38 | this.linkCanonical.setAttribute('href', this.getCanonicalUrl()); 39 | } 40 | 41 | trackCanonicalChanges() { 42 | if (!this.isBrowser) { 43 | return; 44 | } 45 | 46 | this.router.events.pipe( 47 | filter((event) => event instanceof NavigationEnd), 48 | takeUntil(this.destroy$), 49 | ) 50 | .subscribe(() => { 51 | this.linkCanonical.setAttribute('href', this.getCanonicalUrl()); 52 | }); 53 | } 54 | 55 | private getCanonicalUrl(): string { 56 | return this.dom.location.origin + this.dom.location.pathname; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/app/@theme/components/footer/footer.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/themes'; 2 | @import '~@nebular/theme/styles/global/breakpoints'; 3 | @import '~bootstrap/scss/mixins/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | width: 100%; 7 | display: flex; 8 | justify-content: space-between; 9 | align-items: center; 10 | 11 | .socials { 12 | font-size: 2rem; 13 | 14 | a { 15 | padding: 0.4rem; 16 | color: nb-theme(text-hint-color); 17 | transition: color ease-out 0.1s; 18 | 19 | &:hover { 20 | color: nb-theme(text-basic-color); 21 | } 22 | } 23 | } 24 | 25 | @include media-breakpoint-down(is) { 26 | .socials { 27 | font-size: 1.5rem; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app/@theme/components/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-footer', 5 | styleUrls: ['./footer.component.scss'], 6 | template: ` 7 | 8 | ICTFax is a product developed by ICT Innovations. 9 | 10 |
11 | 12 | 13 | 14 | 15 |
16 | `, 17 | }) 18 | export class FooterComponent { 19 | } 20 | -------------------------------------------------------------------------------- /src/app/@theme/components/header/header.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 | 7 |
8 |
9 | 10 |
11 | 12 | 17 | {{ 18 | theme.name 19 | }} 20 | 21 |     22 | 27 | {{ 28 | lang 29 | }} 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 41 | 42 | 43 | 44 |
45 | -------------------------------------------------------------------------------- /src/app/@theme/components/header/header.component.scss: -------------------------------------------------------------------------------- 1 | @import '~bootstrap/scss/mixins/breakpoints'; 2 | @import '~@nebular/theme/styles/global/breakpoints'; 3 | @import '../../styles/themes'; 4 | 5 | @include nb-install-component() { 6 | display: flex; 7 | justify-content: space-between; 8 | width: 100%; 9 | 10 | .logo-container { 11 | display: flex; 12 | align-items: center; 13 | width: calc(#{nb-theme(sidebar-width)} - #{nb-theme(header-padding)}); 14 | } 15 | 16 | nb-action { 17 | height: auto; 18 | display: flex; 19 | align-content: center; 20 | } 21 | 22 | nb-user { 23 | cursor: pointer; 24 | } 25 | 26 | nb-search button { 27 | padding: 0!important; 28 | } 29 | 30 | .header-container { 31 | display: flex; 32 | align-items: center; 33 | width: auto; 34 | 35 | .sidebar-toggle { 36 | @include nb-ltr(padding-right, 1.25rem); 37 | @include nb-rtl(padding-left, 1.25rem); 38 | text-decoration: none; 39 | color: nb-theme(text-hint-color); 40 | nb-icon { 41 | font-size: 1.75rem; 42 | } 43 | } 44 | 45 | .logo { 46 | padding: 0 1.25rem; 47 | font-size: 1.75rem; 48 | @include nb-ltr(border-left, 1px solid nb-theme(divider-color)); 49 | @include nb-rtl(border-right, 1px solid nb-theme(divider-color)); 50 | white-space: nowrap; 51 | text-decoration: none; 52 | } 53 | } 54 | 55 | @include media-breakpoint-down(sm) { 56 | .control-item { 57 | display: none; 58 | } 59 | .user-action { 60 | border: none; 61 | padding: 0; 62 | } 63 | } 64 | 65 | @include media-breakpoint-down(is) { 66 | nb-select { 67 | display: none; 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/app/@theme/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './header/header.component'; 2 | export * from './footer/footer.component'; 3 | export * from './search-input/search-input.component'; 4 | export * from './tiny-mce/tiny-mce.component'; 5 | -------------------------------------------------------------------------------- /src/app/@theme/components/search-input/search-input.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | align-items: center; 4 | 5 | i.control-icon { 6 | &::before { 7 | font-size: 2.3rem; 8 | } 9 | 10 | &:hover { 11 | cursor: pointer; 12 | } 13 | } 14 | 15 | input { 16 | border: none; 17 | outline: none; 18 | margin-left: 1rem; 19 | width: 15rem; 20 | transition: width 0.2s ease; 21 | 22 | &.hidden { 23 | width: 0; 24 | margin: 0; 25 | } 26 | } 27 | 28 | search-input { 29 | input { 30 | background: transparent; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/@theme/components/search-input/search-input.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ElementRef, EventEmitter, Output, ViewChild } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-search-input', 5 | styleUrls: ['./search-input.component.scss'], 6 | template: ` 7 | 9 | 14 | `, 15 | }) 16 | export class SearchInputComponent { 17 | @ViewChild('input', { static: true }) input: ElementRef; 18 | 19 | @Output() search: EventEmitter = new EventEmitter(); 20 | 21 | isInputShown = false; 22 | 23 | showInput() { 24 | this.isInputShown = true; 25 | this.input.nativeElement.focus(); 26 | } 27 | 28 | hideInput() { 29 | this.isInputShown = false; 30 | } 31 | 32 | onInput(val: string) { 33 | this.search.emit(val); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/app/@theme/components/tiny-mce/tiny-mce.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnDestroy, AfterViewInit, Output, EventEmitter, ElementRef } from '@angular/core'; 2 | import { LocationStrategy } from '@angular/common'; 3 | 4 | @Component({ 5 | selector: 'ngx-tiny-mce', 6 | template: '', 7 | }) 8 | export class TinyMCEComponent implements OnDestroy, AfterViewInit { 9 | 10 | @Output() editorKeyup = new EventEmitter(); 11 | 12 | editor: any; 13 | 14 | constructor( 15 | private host: ElementRef, 16 | private locationStrategy: LocationStrategy, 17 | ) { } 18 | 19 | ngAfterViewInit() { 20 | tinymce.init({ 21 | target: this.host.nativeElement, 22 | plugins: ['link', 'paste', 'table'], 23 | skin_url: `${this.locationStrategy.getBaseHref()}assets/skins/lightgray`, 24 | setup: editor => { 25 | this.editor = editor; 26 | editor.on('keyup', () => { 27 | this.editorKeyup.emit(editor.getContent()); 28 | }); 29 | }, 30 | height: '320', 31 | }); 32 | } 33 | 34 | ngOnDestroy() { 35 | tinymce.remove(this.editor); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/app/@theme/directives/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/@theme/directives/.gitkeep -------------------------------------------------------------------------------- /src/app/@theme/layouts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './one-column/one-column.layout'; 2 | export * from './two-columns/two-columns.layout'; 3 | export * from './three-columns/three-columns.layout'; 4 | -------------------------------------------------------------------------------- /src/app/@theme/layouts/one-column/one-column.layout.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .menu-sidebar.scrollable { 7 | padding-top: nb-theme(layout-padding-top); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/layouts/one-column/one-column.layout.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-one-column-layout', 5 | styleUrls: ['./one-column.layout.scss'], 6 | template: ` 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | `, 25 | }) 26 | export class OneColumnLayoutComponent {} 27 | -------------------------------------------------------------------------------- /src/app/@theme/layouts/three-columns/three-columns.layout.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .menu-sidebar .scrollable { 7 | padding-top: nb-theme(layout-padding-top); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/layouts/three-columns/three-columns.layout.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-three-columns-layout', 5 | styleUrls: ['./three-columns.layout.scss'], 6 | template: ` 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 | export class ThreeColumnsLayoutComponent {} 33 | -------------------------------------------------------------------------------- /src/app/@theme/layouts/two-columns/two-columns.layout.scss: -------------------------------------------------------------------------------- 1 | @import '../../styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .menu-sidebar.scrollable { 7 | padding-top: nb-theme(layout-padding-top); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/layouts/two-columns/two-columns.layout.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-two-columns-layout', 5 | styleUrls: ['./two-columns.layout.scss'], 6 | template: ` 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | `, 29 | }) 30 | export class TwoColumnsLayoutComponent {} 31 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/@theme/pipes/.gitkeep -------------------------------------------------------------------------------- /src/app/@theme/pipes/capitalize.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxCapitalize' }) 4 | export class CapitalizePipe implements PipeTransform { 5 | 6 | transform(input: string): string { 7 | return input && input.length 8 | ? (input.charAt(0).toUpperCase() + input.slice(1).toLowerCase()) 9 | : input; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './capitalize.pipe'; 2 | export * from './plural.pipe'; 3 | export * from './round.pipe'; 4 | export * from './timing.pipe'; 5 | export * from './number-with-commas.pipe'; 6 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/number-with-commas.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxNumberWithCommas' }) 4 | export class NumberWithCommasPipe implements PipeTransform { 5 | 6 | transform(input: number): string { 7 | return new Intl.NumberFormat().format(input); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/plural.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxPlural' }) 4 | export class PluralPipe implements PipeTransform { 5 | 6 | transform(input: number, label: string, pluralLabel: string = ''): string { 7 | input = input || 0; 8 | return input === 1 9 | ? `${input} ${label}` 10 | : pluralLabel 11 | ? `${input} ${pluralLabel}` 12 | : `${input} ${label}s`; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/round.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ngxRound' }) 4 | export class RoundPipe implements PipeTransform { 5 | 6 | transform(input: number): number { 7 | return Math.round(input); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/@theme/pipes/timing.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'timing' }) 4 | export class TimingPipe implements PipeTransform { 5 | transform(time: number): string { 6 | if (time) { 7 | const minutes = Math.floor(time / 60); 8 | const seconds = Math.floor(time % 60); 9 | return `${this.initZero(minutes)}${minutes}:${this.initZero(seconds)}${seconds}`; 10 | } 11 | 12 | return '00:00'; 13 | } 14 | 15 | private initZero(time: number): string { 16 | return time < 10 ? '0' : ''; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/@theme/styles/_layout.scss: -------------------------------------------------------------------------------- 1 | @mixin ngx-layout() { 2 | @include media-breakpoint-down(is) { 3 | .row { 4 | margin-left: -10px; 5 | margin-right: -10px; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/app/@theme/styles/_overrides.scss: -------------------------------------------------------------------------------- 1 | @import './themes'; 2 | 3 | @mixin nb-overrides() { 4 | nb-select.size-medium button { 5 | padding: 0.4375rem 2.2rem 0.4375rem 1.125rem !important; 6 | 7 | nb-icon { 8 | right: 0.41rem !important; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/@theme/styles/pace.theme.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | @mixin ngx-pace-theme() { 8 | 9 | .pace .pace-progress { 10 | background: nb-theme(color-primary-default); 11 | } 12 | 13 | .pace .pace-progress-inner { 14 | box-shadow: 0 0 10px nb-theme(color-primary-default), 0 0 5px nb-theme(color-primary-default); 15 | } 16 | 17 | .pace .pace-activity { 18 | display: none; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/@theme/styles/styles.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,600,700&display=swap'); 2 | 3 | // themes - our custom or/and out of the box themes 4 | @import 'themes'; 5 | 6 | // framework component themes (styles tied to theme variables) 7 | @import '~@nebular/theme/styles/globals'; 8 | @import '~@nebular/auth/styles/all'; 9 | 10 | @import '~bootstrap/scss/functions'; 11 | @import '~bootstrap/scss/variables'; 12 | @import '~bootstrap/scss/mixins'; 13 | @import '~bootstrap/scss/grid'; 14 | 15 | // loading progress bar theme 16 | @import './pace.theme'; 17 | 18 | @import './layout'; 19 | @import './overrides'; 20 | 21 | // Load the Angular Material stylesheet 22 | @import '@angular/material/prebuilt-themes/deeppurple-amber.css'; 23 | 24 | // install the framework and custom global styles 25 | @include nb-install() { 26 | 27 | // framework global styles 28 | @include nb-theme-global(); 29 | @include nb-auth-global(); 30 | 31 | @include ngx-layout(); 32 | // loading progress bar 33 | @include ngx-pace-theme(); 34 | 35 | @include nb-overrides(); 36 | }; 37 | -------------------------------------------------------------------------------- /src/app/app-config.model.ts: -------------------------------------------------------------------------------- 1 | export interface IAppConfig { 2 | env: { 3 | name: string; 4 | }; 5 | apiServer: { 6 | url: string; 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { Component, OnInit } from '@angular/core'; 7 | import { AnalyticsService } from './@core/utils/analytics.service'; 8 | import { SeoService } from './@core/utils/seo.service'; 9 | import { TranslateService } from '@ngx-translate/core'; 10 | 11 | @Component({ 12 | selector: 'ngx-app', 13 | template: ` 14 | 15 | 16 | 17 | `, 18 | }) 19 | export class AppComponent implements OnInit { 20 | 21 | constructor(private analytics: AnalyticsService, private seoService: SeoService, public translate :TranslateService) { 22 | translate.addLangs(['english', 'japanese', 'italian']); 23 | translate.setDefaultLang('english'); 24 | 25 | const browserLang = translate.getBrowserLang(); 26 | translate.use(browserLang.match(/english|japanese/) ? browserLang : 'english'); 27 | } 28 | 29 | ngOnInit(): void { 30 | this.analytics.trackPageViews(); 31 | this.seoService.trackCanonicalChanges(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/auth-guard.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { CanActivate, Router } from '@angular/router'; 3 | import { NbAuthService } from '@nebular/auth'; 4 | import { tap } from 'rxjs/operators'; 5 | 6 | @Injectable() 7 | export class AuthGuard implements CanActivate { 8 | constructor(private authService: NbAuthService, private router: Router) { } 9 | 10 | canActivate() { 11 | return this.authService.isAuthenticated() 12 | .pipe( 13 | tap(authenticated => { 14 | if (!authenticated) { 15 | this.router.navigate(['auth/login']); 16 | } 17 | }) 18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/auth/auth-routing.module.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | import { NgModule } from '@angular/core'; 8 | import { RouterModule, Routes } from '@angular/router'; 9 | import { NbAuthComponent } from '@nebular/auth'; 10 | 11 | import { LoginComponent } from './login/login.component'; 12 | import { LogoutComponent } from './logout/logout.component'; 13 | import { RequestPasswordComponent } from './request-password/request-password.component'; 14 | import { ResetPasswordComponent } from './reset-password/reset-password.component'; 15 | 16 | export const routes: Routes = [ 17 | { 18 | path: '', 19 | component: NbAuthComponent, 20 | children: [ 21 | { 22 | path: 'login', 23 | component: LoginComponent, 24 | }, 25 | { 26 | path: 'logout', 27 | component: LogoutComponent, 28 | }, 29 | { 30 | path: "request-password", 31 | component: RequestPasswordComponent, 32 | }, 33 | { 34 | path: 'reset-password/:code', 35 | component: ResetPasswordComponent, 36 | }, 37 | ], 38 | }, 39 | ]; 40 | 41 | @NgModule({ 42 | imports: [RouterModule.forChild(routes)], 43 | exports: [RouterModule], 44 | }) 45 | export class AuthRoutingModule { 46 | } -------------------------------------------------------------------------------- /src/app/auth/auth.module.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | import { CommonModule } from '@angular/common'; 8 | import { NgModule } from '@angular/core'; 9 | import { FormsModule } from '@angular/forms'; 10 | 11 | import { AuthRoutingModule } from './auth-routing.module'; 12 | import { NbAuthModule } from '@nebular/auth'; 13 | import { NbAlertModule, NbButtonModule, NbCardModule, NbCheckboxModule, NbIconModule, NbInputModule } from '@nebular/theme'; 14 | 15 | import { LoginComponent } from './login/login.component'; 16 | import { LogoutComponent } from './logout/logout.component'; 17 | import { TranslateModule } from '@ngx-translate/core'; 18 | import { RequestPasswordComponent} from './request-password/request-password.component' 19 | import { ResetPasswordComponent} from './reset-password/reset-password.component' 20 | import { MatSnackBarModule } from '@angular/material/snack-bar'; 21 | import { RouterModule } from '@angular/router'; 22 | import { SigninComponent } from './signin/signin.component'; 23 | import { MatIconModule } from '@angular/material/icon'; 24 | 25 | 26 | @NgModule({ 27 | imports: [ 28 | CommonModule, 29 | FormsModule, 30 | NbCardModule, 31 | NbAlertModule, 32 | NbInputModule, 33 | NbButtonModule, 34 | MatIconModule, 35 | NbIconModule, 36 | NbCheckboxModule, 37 | AuthRoutingModule, 38 | TranslateModule, 39 | NbAuthModule, 40 | MatSnackBarModule, 41 | RouterModule 42 | ], 43 | declarations: [ 44 | LoginComponent, 45 | LogoutComponent, 46 | SigninComponent, 47 | RequestPasswordComponent, 48 | ResetPasswordComponent 49 | ], 50 | }) 51 | export class AuthModule { 52 | } -------------------------------------------------------------------------------- /src/app/auth/login/login.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { Component } from '@angular/core'; 7 | import { NbLoginComponent } from '@nebular/auth'; 8 | 9 | @Component({ 10 | selector: 'ngx-login', 11 | templateUrl: './login.component.html', 12 | }) 13 | export class LoginComponent extends NbLoginComponent { 14 | } -------------------------------------------------------------------------------- /src/app/auth/logout/logout.component.html: -------------------------------------------------------------------------------- 1 |
{{'logout.message' | translate}}
2 | 3 | -------------------------------------------------------------------------------- /src/app/auth/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { Component } from '@angular/core'; 7 | import { NbLogoutComponent } from '@nebular/auth'; 8 | 9 | @Component({ 10 | selector: 'ngx-logout', 11 | templateUrl: './logout.component.html', 12 | }) 13 | export class LogoutComponent extends NbLogoutComponent { 14 | } -------------------------------------------------------------------------------- /src/app/auth/request-password/request-password.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Forgot Password 5 | 6 | 7 |
8 |
9 |
10 |
11 | 12 | 24 | 25 | 26 |

27 | Email is required! 28 |

29 |

30 | Please enter a valid email address. 31 |

32 |
33 |
34 | 43 |
44 |
45 |
46 |
47 |
48 | -------------------------------------------------------------------------------- /src/app/auth/request-password/request-password.component.scss: -------------------------------------------------------------------------------- 1 | ::ng-deep .navigation .link nb-icon { 2 | display: none !important; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/auth/request-password/request-password.component.ts: -------------------------------------------------------------------------------- 1 | 2 | import { ChangeDetectionStrategy,Component, Inject } from '@angular/core'; 3 | import { NB_AUTH_OPTIONS } from '@nebular/auth'; 4 | import { getDeepFromObject } from '@nebular/auth'; 5 | import { SigninService } from '../signin/signin.service'; 6 | import { MatSnackBar } from '@angular/material/snack-bar'; 7 | 8 | 9 | 10 | @Component({ 11 | selector: 'ngx-request-password', 12 | styleUrls: ['./request-password.component.scss'], 13 | templateUrl: './request-password.component.html', 14 | changeDetection: ChangeDetectionStrategy.OnPush, 15 | }) 16 | export class RequestPasswordComponent { 17 | 18 | submitted = false; 19 | user: any = {}; 20 | 21 | constructor( 22 | @Inject(NB_AUTH_OPTIONS) protected options = {}, 23 | private signin_service: SigninService, 24 | private snackBar: MatSnackBar 25 | ) {} 26 | 27 | requestPass() { 28 | this.submitted = true; 29 | this.signin_service.requestPassword(this.user.email).then( 30 | (response) => { 31 | this.openSnackBar('Reset password link sent to your email. Check your email!'); 32 | }, 33 | (error) => { 34 | if (error.status === 401) { 35 | this.openSnackBar('Email not registered. Please check your email and try again.'); 36 | } else { 37 | this.openSnackBar('An error occurred. Please try again later.'); 38 | } 39 | } 40 | ); 41 | } 42 | 43 | getConfigValue(key: string): any { 44 | return getDeepFromObject(this.options, key, null); 45 | } 46 | private openSnackBar(message: string): void { 47 | this.snackBar.open(message, 'Close', { 48 | duration: 3000, 49 | verticalPosition: 'top', 50 | }); 51 | } 52 | 53 | 54 | } -------------------------------------------------------------------------------- /src/app/auth/reset-password/reset-password.component.scss: -------------------------------------------------------------------------------- 1 | ::ng-deep .navigation .link nb-icon { 2 | display: none !important; 3 | } 4 | .password-input-container { 5 | position: relative; 6 | } 7 | 8 | .password-input-container button { 9 | position: absolute; 10 | top: 50%; 11 | right: 12px; 12 | transform: translateY(-50%); 13 | background: none; 14 | border: none; 15 | cursor: pointer; 16 | padding: 0; 17 | margin: 0; 18 | } 19 | 20 | /* Add this to your component's CSS or SCSS file */ 21 | .snackbar-error { 22 | background-color: #f44336; /* Change the background color as needed */ 23 | color: #ffffff; /* Change the text color as needed */ 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/app/auth/signin/auth-config.ts: -------------------------------------------------------------------------------- 1 | import { LogLevel, Configuration, BrowserCacheLocation } from '@azure/msal-browser'; 2 | 3 | const isIE = window.navigator.userAgent.indexOf("MSIE ") > -1 || window.navigator.userAgent.indexOf("Trident/") > -1; 4 | 5 | export const b2cPolicies = { 6 | names: { 7 | signUpSignIn: "B2X_1_ICT_SAML" 8 | }, 9 | authorities: { 10 | signUpSignIn: { 11 | // authority: "https://kashifictinnovations.b2clogin.com/kashifictinnovations.onmicrosoft.com/b2c_1_susi_reset_v2", 12 | authority: "https://login.microsoftonline.com/common/" 13 | } 14 | }, 15 | authorityDomain: "kashifictinnovations.b2clogin.com" 16 | }; 17 | 18 | 19 | export const msalConfig: Configuration = { 20 | auth: { 21 | clientId: '1f1fe062-d01f-4592-9f73-4e313fe87910', 22 | authority: b2cPolicies.authorities.signUpSignIn.authority, 23 | knownAuthorities: [b2cPolicies.authorityDomain], 24 | // redirectUri: 'https://demo12.ictfax.com/auth', 25 | redirectUri: 'http://localhost:4200/auth', 26 | }, 27 | cache: { 28 | cacheLocation: BrowserCacheLocation.LocalStorage, 29 | storeAuthStateInCookie: isIE, 30 | }, 31 | system: { 32 | loggerOptions: { 33 | loggerCallback: (logLevel, message, containsPii) => { 34 | // console.log(message); 35 | }, 36 | logLevel: LogLevel.Verbose, 37 | piiLoggingEnabled: false 38 | } 39 | } 40 | } 41 | 42 | export const protectedResources = { 43 | todoListApi: { 44 | endpoint: "api://ictfax", 45 | scopes: ["api://ictfax/read"], 46 | }, 47 | } 48 | export const loginRequest = { 49 | scopes: [] 50 | }; -------------------------------------------------------------------------------- /src/app/auth/signin/signin.component.html: -------------------------------------------------------------------------------- 1 | 2 |

Hooray!

3 |
    4 |
  • You have been successfully logged in.
  • 5 |
6 |
7 | 8 |

Opss!

9 |
    10 |
  • Login failed.
  • 11 |
12 |
13 | 14 | 15 |
OR
16 | 17 | 18 | 19 | 23 | -------------------------------------------------------------------------------- /src/app/auth/signin/signin.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/auth/signin/signin.component.scss -------------------------------------------------------------------------------- /src/app/file-download-helper.ts: -------------------------------------------------------------------------------- 1 | import { saveAs } from 'file-saver'; 2 | import { Response } from '@angular/http'; 3 | 4 | /** 5 | * Saves a file by opening file-save-as dialog in the browser 6 | * using file-save library. 7 | * @param blobContent file content as a Blob 8 | * @param fileName name file should be saved as 9 | */ 10 | 11 | export const saveFile = (blobContent: Blob, fileName: string) => { 12 | fileName = fileName.replace(/^"(.*)"$/, '$1'); 13 | const blob = new Blob([blobContent], { type: 'application/octet-stream' }); 14 | saveAs(blob, fileName); 15 | }; 16 | 17 | /** 18 | * Derives file name from the http response 19 | * by looking inside content-disposition 20 | * @param res http Response 21 | */ 22 | export const getFileNameFromResponseContentDisposition = (res: Response) => { 23 | const contentDisposition = res.headers.get('content-disposition') || ''; 24 | const matches = /filename=([^;]+)/ig.exec(contentDisposition); 25 | const fileName = (matches[1] || 'untitled').trim(); 26 | return fileName; 27 | }; 28 | -------------------------------------------------------------------------------- /src/app/modal.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter } from '@angular/core'; 2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; 3 | 4 | @Component({ 5 | selector: 'ngx-modal', 6 | template: ` 7 | 13 | 16 | 20 | `, 21 | }) 22 | export class ModalComponent { 23 | 24 | modalHeader: string; 25 | modalContent = ``; 26 | public onChange: EventEmitter = new EventEmitter(); 27 | 28 | constructor(public activeModal: NgbActiveModal) { } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/campaigns/campaign-component.scss -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Campaign } from './campaign'; 2 | import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 3 | 4 | export class CampaignDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Campaign[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aCampaign: Campaign[]) { 10 | const campaignData = aCampaign.slice(); 11 | this.dataChange.next(campaignData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign-from-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/campaigns/campaign-from-component.scss -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { CampaignComponent } from './campaign.component'; 5 | import { FormsCampaignComponent } from './campaign-component'; 6 | import { AddDocCampaignComponent } from './senddocument/campaign-document-component'; 7 | import { AddEmailCampaignComponent } from './sendemail/campaign-email-component'; 8 | import { AddSMSCampaignComponent } from './sendsms/campaign-form-component'; 9 | 10 | const routes: Routes = [{ 11 | path: '', 12 | component: CampaignComponent, 13 | children: [{ 14 | path: 'campaigns', 15 | component: FormsCampaignComponent, 16 | }, { 17 | path: 'campaigns/sendfax/new', 18 | component: AddDocCampaignComponent, 19 | }, { 20 | path: 'campaigns/sendfax/:id', 21 | component: AddDocCampaignComponent, 22 | }, { 23 | path: 'campaigns/:id/delete', 24 | component: FormsCampaignComponent, 25 | }, { 26 | path: 'campaigns/sendemail/new', 27 | component: AddEmailCampaignComponent, 28 | }, { 29 | path: 'campaigns/sendemail/:id', 30 | component: AddEmailCampaignComponent, 31 | }, { 32 | path: 'campaigns/sendsms/new', 33 | component: AddSMSCampaignComponent, 34 | }, { 35 | path: 'campaigns/sendsms/:id', 36 | component: AddSMSCampaignComponent, 37 | }], 38 | }]; 39 | 40 | @NgModule({ 41 | imports: [ 42 | RouterModule.forChild(routes), 43 | ], 44 | exports: [ 45 | RouterModule, 46 | ], 47 | }) 48 | export class CampaignRoutingModule { 49 | 50 | } 51 | 52 | export const routedComponents = [ 53 | CampaignComponent, 54 | FormsCampaignComponent, 55 | AddDocCampaignComponent, 56 | AddEmailCampaignComponent, 57 | AddSMSCampaignComponent 58 | ]; 59 | -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class CampaignComponent { 10 | } -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { CampaignRoutingModule, routedComponents } from './campaign-routing.module'; 5 | import { MatTableModule } from '@angular/material/table'; 6 | import { CdkTableModule } from '@angular/cdk/table'; 7 | import { CampaignService } from './campaign.service'; 8 | import { MatSortModule } from '@angular/material/sort'; 9 | import { MatIconModule } from '@angular/material/icon'; 10 | import { MatButtonModule } from '@angular/material/button'; 11 | import { MatPaginatorModule } from '@angular/material/paginator'; 12 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 13 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 14 | import { StatusCardComponent } from './status-card/status-card.component'; 15 | import { TranslateModule } from '@ngx-translate/core'; 16 | 17 | 18 | @NgModule({ 19 | imports: [ 20 | ThemeModule, 21 | NbCardModule, 22 | CampaignRoutingModule, 23 | MatTableModule, 24 | CdkTableModule, 25 | MatSortModule, 26 | MatButtonModule, 27 | MatPaginatorModule, 28 | MatIconModule, 29 | FormsModule, 30 | ReactiveFormsModule, 31 | NbIconModule, 32 | TranslateModule 33 | ], 34 | declarations: [ 35 | ...routedComponents, 36 | StatusCardComponent 37 | ], 38 | }) 39 | export class CampaignModule { } 40 | -------------------------------------------------------------------------------- /src/app/pages/campaigns/campaign.ts: -------------------------------------------------------------------------------- 1 | export class Campaign { 2 | campaign_id: number; 3 | program_id: number; 4 | program_type: string; 5 | group_id: number; 6 | cpm: number; 7 | try_allowed: number; 8 | account_id: number; 9 | status: string; 10 | contact_total: any; 11 | contact_done: any; 12 | } 13 | 14 | export class SMSProgram { 15 | program_id: number; 16 | text_id: number; 17 | name: string; 18 | } 19 | 20 | export class TemplateProgram { 21 | program_id: number; 22 | template_id: number; 23 | name: string; 24 | } 25 | 26 | export class DocumentProgram { 27 | program_id: number; 28 | document_id: number; 29 | name: string; 30 | } 31 | 32 | export class VoiceCallProgram { 33 | program_id: number; 34 | recording_id: number; 35 | name: string; 36 | } 37 | 38 | export class IVRProgram { 39 | program_id: number; 40 | ivr_id: number; 41 | name: string; 42 | } -------------------------------------------------------------------------------- /src/app/pages/campaigns/senddocument/campaign-document-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/campaigns/senddocument/campaign-document-component.scss -------------------------------------------------------------------------------- /src/app/pages/campaigns/sendemail/campaign-email-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/campaigns/sendemail/campaign-email-component.scss -------------------------------------------------------------------------------- /src/app/pages/campaigns/sendsms/campaign-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/campaigns/sendsms/campaign-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/campaigns/status-card/status-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-status-card', 5 | styleUrls: ['./status-card.component.scss'], 6 | template: ` 7 | 8 |
9 |
10 | 11 |
12 |
13 | 14 |
15 |
{{ title }}
16 |
17 |
18 | `, 19 | }) 20 | export class StatusCardComponent { 21 | 22 | @Input() title: string; 23 | @Input() type: string; 24 | @Input() on = true; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/changepassword/changepassword-component.scss: -------------------------------------------------------------------------------- 1 | h1 { 2 | left: 0; 3 | line-height: 200px; 4 | margin-top: -100px; 5 | position: absolute; 6 | text-align: center; 7 | top: 50%; 8 | width: 100%; 9 | font-size: 30px; 10 | color: red; 11 | } 12 | 13 | .flex-centered { 14 | margin: auto; 15 | } 16 | nb-card-body { 17 | display: flex; 18 | } 19 | 20 | .title { 21 | text-align: center; 22 | } 23 | 24 | .sub-title { 25 | text-align: center; 26 | display: block; 27 | margin-bottom: 3rem; 28 | } 29 | 30 | .btn { 31 | margin-bottom: 2rem; 32 | } 33 | -------------------------------------------------------------------------------- /src/app/pages/changepassword/changepassword.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { NgxEchartsModule } from 'ngx-echarts'; 3 | 4 | import { ThemeModule } from '../../@theme/theme.module'; 5 | import { ChangePasswordComponent } from './changepassword-component'; 6 | import { RouterModule } from '@angular/router'; 7 | import { CheckValidator } from './password.check.directive'; 8 | import { NbButtonModule, NbCardModule } from '@nebular/theme'; 9 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | ThemeModule, 14 | NgxEchartsModule, 15 | RouterModule, 16 | NbCardModule, 17 | FormsModule, 18 | ReactiveFormsModule, 19 | NbButtonModule 20 | ], 21 | declarations: [ 22 | CheckValidator, 23 | ChangePasswordComponent, 24 | ], 25 | }) 26 | export class ChangePasswordModule { } 27 | -------------------------------------------------------------------------------- /src/app/pages/changepassword/password.check.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, forwardRef, Attribute } from '@angular/core'; 2 | import { NG_VALIDATORS, Validator, Validators, AbstractControl, ValidatorFn } from '@angular/forms'; 3 | 4 | @Directive({ 5 | selector: '[ngx_validateCheck][formControlName],[ngx_validateCheck][formControl],[ngx_validateCheck][ngModel]', 6 | providers: [{ provide: NG_VALIDATORS, useExisting: forwardRef(() => CheckValidator), multi: true }], 7 | }) 8 | 9 | export class CheckValidator implements Validator { 10 | constructor( @Attribute('ngx_validateCheck') public ngx_validateCheck: string) {} 11 | 12 | validate(c: AbstractControl): { [key: string]: any } { 13 | // self value (e.g. retype password) 14 | const v = c.value; 15 | 16 | // control value (e.g. password) 17 | const e = c.root.get(this.ngx_validateCheck); 18 | 19 | // value not equal 20 | if (e && v !== e.value) { 21 | return ({ngx_validateCheck: false}); 22 | } 23 | return null; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/cid/assign-cid-component.html: -------------------------------------------------------------------------------- 1 |

{{ 'cids.assign_cid' | translate }}

2 |
3 |
4 | 5 | 6 | {{ 'my_cids.did_info' | translate }} 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 | 15 | 16 | {{ 'user.user_info' | translate }} 17 | 18 | 19 |
20 |
26 |
27 |
28 | 29 |
30 | -------------------------------------------------------------------------------- /src/app/pages/cid/assign-cid-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/cid/assign-cid-component.scss -------------------------------------------------------------------------------- /src/app/pages/cid/batch-cid-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/cid/batch-cid-component.scss -------------------------------------------------------------------------------- /src/app/pages/cid/batch-cid-component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import { CID } from './cid'; 3 | import { CIDService } from './cid.service'; 4 | import { Router, ActivatedRoute } from '@angular/router'; 5 | 6 | @Component({ 7 | selector: 'ngx-batch-cid-component', 8 | templateUrl: './batch-cid-component.html', 9 | styleUrls: ['./batch-cid-component.scss'], 10 | }) 11 | 12 | export class BatchCIDComponent { 13 | 14 | constructor(private cid_service: CIDService, private router: Router, private route: ActivatedRoute) { 15 | this.cid.active = 1; 16 | } 17 | 18 | cid: CID= new CID; 19 | 20 | addCID() { 21 | for (let i = this.cid.range_from; i <= this.cid.range_to; i++) { 22 | this.cid.phone = i; 23 | this.cid.username = this.cid.phone; 24 | this.cid.first_name = this.cid.title + ' ' + i; 25 | this.cid_service.add_CID(this.cid).then(response => { 26 | }); 27 | if ( i == this.cid.range_to) { 28 | this.router.navigate(['../../cid'], {relativeTo: this.route}); 29 | } 30 | } 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | max-height: 500px; 6 | 7 | } 8 | 9 | .example-header { 10 | min-height: 64px; 11 | display: flex; 12 | align-items: center; 13 | padding-left: 24px; 14 | font-size: 20px; 15 | } 16 | 17 | .mat-table { 18 | overflow: auto; 19 | max-height: 500px; 20 | } 21 | 22 | .mat-sort-header-sorted { 23 | color: black; 24 | } 25 | 26 | .cdk-visually-hidden { 27 | border: 0; 28 | clip: rect(0 0 0 0); 29 | height: 1px; 30 | margin: -1px; 31 | overflow: hidden; 32 | padding: 0; 33 | position: absolute; 34 | width: 1px; 35 | } 36 | 37 | .example-button-row { 38 | display: flex; 39 | align-items: center; 40 | justify-content: space-around; 41 | } 42 | 43 | .mat-form-field { 44 | font-size: 14px; 45 | flex-grow: 1; 46 | margin-left: 32px; 47 | } 48 | 49 | .mat-cell, .mat-header-cell { 50 | overflow: hidden; 51 | word-wrap: break-word; 52 | } 53 | 54 | a:hover { 55 | color: rgb(10, 238, 10); 56 | // color: darkblue; 57 | } 58 | 59 | .fa-trash:hover { 60 | color: rgb(138, 4, 4); 61 | } 62 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid-database.component.ts: -------------------------------------------------------------------------------- 1 | import { CID } from './cid'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class CIDDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): CID[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aCID: CID[]) { 10 | const cidData = aCID.slice(); 11 | this.dataChange.next(cidData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid-form-component.html: -------------------------------------------------------------------------------- 1 |
2 |

{{err}}

3 |
4 | 5 |

{{ 'cids.add' | translate }}

6 |
7 |
8 | 9 | 10 | {{ 'my_cids.cid_info' | translate }} 11 | 12 | 13 |
14 |
15 |
16 | 17 | 18 |
19 |
{{ 'cids.cid_req' | translate }}
20 |
21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 |
35 | 36 |
37 |
38 | 39 |
40 |
41 |
-------------------------------------------------------------------------------- /src/app/pages/cid/cid-form-component.scss: -------------------------------------------------------------------------------- 1 | .mat-radio-button ~ .mat-radio-button { 2 | padding-right: 16px; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { CIDComponent } from './cid.component'; 5 | import { FormsCIDComponent } from './cid-component'; 6 | import { AddCIDComponent } from './cid-form-component'; 7 | import { BatchCIDComponent } from './batch-cid-component'; 8 | import { ImportCIDComponent } from './import-cid-component'; 9 | import { AssignCIDComponent } from './assign-cid-component'; 10 | 11 | const routes: Routes = [{ 12 | path: '', 13 | component: CIDComponent, 14 | children: [{ 15 | path: 'cid', 16 | component: FormsCIDComponent, 17 | }, { 18 | path: 'cid/new', 19 | component: AddCIDComponent, 20 | }, { 21 | path: 'cid/batch', 22 | component: BatchCIDComponent, 23 | }, { 24 | path: 'cid/import', 25 | component: ImportCIDComponent, 26 | }, { 27 | path: 'cid/:id', 28 | component: AddCIDComponent, 29 | }, { 30 | path: 'cid/:id/assign', 31 | component: AssignCIDComponent, 32 | }, { 33 | path: 'cid/:id/delete', 34 | component: AddCIDComponent, 35 | }], 36 | }]; 37 | 38 | @NgModule({ 39 | imports: [ 40 | RouterModule.forChild(routes), 41 | ], 42 | exports: [ 43 | RouterModule, 44 | ], 45 | }) 46 | export class CIDRoutingModule { 47 | 48 | } 49 | 50 | export const routedComponents = [ 51 | CIDComponent, 52 | FormsCIDComponent, 53 | AddCIDComponent, 54 | BatchCIDComponent, 55 | ImportCIDComponent, 56 | AssignCIDComponent, 57 | ]; 58 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class CIDComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { CIDRoutingModule, routedComponents } from './cid-routing.module'; 5 | import { FormsCIDComponent } from './cid-component'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { CdkTableModule } from '@angular/cdk/table'; 8 | import { CIDService } from './cid.service'; 9 | import { MatSortModule } from '@angular/material/sort'; 10 | import { MatIconModule } from '@angular/material/icon'; 11 | import { MatPaginator } from '@angular/material/paginator'; 12 | import { MatButtonModule } from '@angular/material/button'; 13 | import { MatPaginatorModule } from '@angular/material/paginator'; 14 | import { MatRadioModule } from '@angular/material/radio'; 15 | import { FileUploadModule } from 'ng2-file-upload'; 16 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 17 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 18 | import { TranslateModule } from '@ngx-translate/core'; 19 | 20 | @NgModule({ 21 | imports: [ 22 | ThemeModule, 23 | CIDRoutingModule, 24 | MatTableModule, 25 | CdkTableModule, 26 | MatSortModule, 27 | MatButtonModule, 28 | MatPaginatorModule, 29 | MatRadioModule, 30 | FileUploadModule, 31 | NbCardModule, 32 | MatIconModule, 33 | FormsModule, 34 | ReactiveFormsModule, 35 | NbIconModule, 36 | TranslateModule 37 | ], 38 | declarations: [ 39 | ...routedComponents, 40 | ], 41 | providers: [CIDService], 42 | }) 43 | export class CIDModule { } 44 | -------------------------------------------------------------------------------- /src/app/pages/cid/cid.ts: -------------------------------------------------------------------------------- 1 | export class CID { 2 | account_id: number; 3 | username: string; 4 | passwd: string; 5 | passwd_pin: string; 6 | first_name: string; 7 | last_name: string; 8 | phone: any; 9 | email: string; 10 | address: string; 11 | active: number; 12 | type: any; 13 | cid_number: any; 14 | title: any; 15 | assigned_to: any; 16 | range_from: any; 17 | range_to: any; 18 | user_id: any; 19 | service: any; 20 | name: any; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/pages/cid/import-cid-component.html: -------------------------------------------------------------------------------- 1 |

DID Information

2 |
3 |
4 | 5 | 6 | Upload DID List 7 | 8 | 9 |
10 | 12 |
13 |
14 | 15 |
16 |
17 |

18 |

Example File:

Sample.csv 19 |
20 |
21 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /src/app/pages/cid/import-cid-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/cid/import-cid-component.scss -------------------------------------------------------------------------------- /src/app/pages/contact/contact-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | 7 | .example-header { 8 | min-height: 64px; 9 | display: flex; 10 | align-items: center; 11 | padding-left: 24px; 12 | font-size: 20px; 13 | } 14 | 15 | .mat-table { 16 | overflow: auto; 17 | max-height: 500px; 18 | } 19 | 20 | .mat-header-cell .mat-sort-header-sorted { 21 | color: black; 22 | } 23 | 24 | .cdk-visually-hidden { 25 | border: 0; 26 | clip: rect(0 0 0 0); 27 | height: 1px; 28 | margin: -1px; 29 | overflow: hidden; 30 | padding: 0; 31 | position: absolute; 32 | width: 1px; 33 | } 34 | 35 | .mat-form-field { 36 | font-size: 14px; 37 | flex-grow: 1; 38 | margin-left: 32px; 39 | } 40 | 41 | .nav a { 42 | width: 100px; 43 | height: 40px; 44 | display: block; 45 | float: left; 46 | } 47 | 48 | .mat-cell, .mat-header-cell { 49 | overflow: hidden; 50 | word-wrap: break-word; 51 | } 52 | 53 | a:hover { 54 | color: rgb(10, 238, 10); 55 | } 56 | 57 | .mat-input-container { 58 | font-size: 14px; 59 | flex-grow: 1; 60 | margin-left: 32px; 61 | margin-top: 8px; 62 | } 63 | 64 | .cc { 65 | width: 40%; 66 | } 67 | -------------------------------------------------------------------------------- /src/app/pages/contact/contact-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Contact } from './contact'; 2 | import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 3 | 4 | export class ContactDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Contact[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(aContact: Contact[]) { 10 | const contactData = aContact.slice(); 11 | this.dataChange.next(contactData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/contact/contact-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/contact/contact-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/contact/contact-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ContactComponent } from './contact.component'; 5 | import { FormsContactComponent } from './contact-component'; 6 | import { AddContactComponent } from './contact-form-component'; 7 | import { FormsGroupComponent } from './group/group-component'; 8 | import { AddGroupComponent } from './group/group-form-component'; 9 | 10 | const routes: Routes = [{ 11 | path: '', 12 | component: ContactComponent, 13 | children: [{ 14 | path: 'contacts', 15 | component: FormsContactComponent, 16 | }, { 17 | path: 'contacts/new', 18 | component: AddContactComponent, 19 | }, { 20 | path: 'contacts/:id', 21 | component: AddContactComponent, 22 | }, { 23 | path: 'contacts/:id/delete', 24 | component: FormsContactComponent, 25 | }, 26 | { 27 | path: 'group', 28 | component: FormsGroupComponent, 29 | }, { 30 | path: 'group/new', 31 | component: AddGroupComponent, 32 | }, { 33 | path: 'group/:id', 34 | component: AddGroupComponent, 35 | }, { 36 | path: 'group/:id/delete', 37 | component: AddGroupComponent, 38 | } 39 | ], 40 | }]; 41 | 42 | @NgModule({ 43 | imports: [ 44 | RouterModule.forChild(routes), 45 | ], 46 | exports: [ 47 | RouterModule, 48 | ], 49 | }) 50 | export class ContactRoutingModule { 51 | 52 | } 53 | 54 | export const routedComponents = [ 55 | ContactComponent, 56 | FormsContactComponent, 57 | AddContactComponent, 58 | FormsGroupComponent, 59 | AddGroupComponent, 60 | ]; 61 | 62 | -------------------------------------------------------------------------------- /src/app/pages/contact/contact.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class ContactComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/contact/contact.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { ContactRoutingModule, routedComponents } from './contact-routing.module'; 5 | import { MatTableModule } from '@angular/material/table'; 6 | import { CdkTableModule } from '@angular/cdk/table'; 7 | import { MatSortModule } from '@angular/material/sort'; 8 | import { MatIconModule } from '@angular/material/icon'; 9 | import { MatButtonModule } from '@angular/material/button'; 10 | import { MatPaginatorModule } from '@angular/material/paginator'; 11 | import { FileUploadModule } from 'ng2-file-upload'; 12 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 13 | import { ReactiveFormsModule, FormsModule } from '@angular/forms'; 14 | import { TranslateModule } from '@ngx-translate/core'; 15 | import { Ng2CompleterModule } from "ng2-completer"; 16 | 17 | 18 | @NgModule({ 19 | imports: [ 20 | ThemeModule, 21 | ContactRoutingModule, 22 | MatTableModule, 23 | CdkTableModule, 24 | MatSortModule, 25 | FileUploadModule, 26 | MatButtonModule, 27 | MatPaginatorModule, 28 | MatIconModule, 29 | NbCardModule, 30 | FormsModule, 31 | ReactiveFormsModule, 32 | NbIconModule, 33 | TranslateModule, 34 | Ng2CompleterModule 35 | ], 36 | declarations: [ 37 | ...routedComponents, 38 | ], 39 | }) 40 | export class ContactModule { } 41 | -------------------------------------------------------------------------------- /src/app/pages/contact/contact.ts: -------------------------------------------------------------------------------- 1 | export class Contact { 2 | contact_id: number; 3 | first_name: string; 4 | last_name: string; 5 | phone: number; 6 | email: string; 7 | address: string; 8 | custom1: string; 9 | custom2: string; 10 | custom3: string; 11 | description: string; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /src/app/pages/contact/group/group-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | .example-header { 7 | min-height: 64px; 8 | display: flex; 9 | align-items: center; 10 | padding-left: 24px; 11 | font-size: 20px; 12 | } 13 | 14 | .mat-table { 15 | overflow: auto; 16 | max-height: 500px; 17 | } 18 | 19 | .mat-header-cell .mat-sort-header-sorted { 20 | color: black; 21 | } 22 | 23 | .cdk-visually-hidden { 24 | border: 0; 25 | clip: rect(0 0 0 0); 26 | height: 1px; 27 | margin: -1px; 28 | overflow: hidden; 29 | padding: 0; 30 | position: absolute; 31 | width: 1px; 32 | } 33 | 34 | .example-button-row { 35 | display: flex; 36 | align-items: center; 37 | justify-content: space-around; 38 | } 39 | 40 | .mat-form-field { 41 | font-size: 14px; 42 | flex-grow: 1; 43 | margin-left: 32px; 44 | } 45 | 46 | a:hover { 47 | color: rgb(10, 238, 10); 48 | } 49 | 50 | .cc { 51 | width: 40%; 52 | } 53 | -------------------------------------------------------------------------------- /src/app/pages/contact/group/group-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Group } from './group'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class GroupDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Group[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aGroup: Group[]) { 10 | const groupData = aGroup.slice(); 11 | this.dataChange.next(groupData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/contact/group/group-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/contact/group/group-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/contact/group/group.ts: -------------------------------------------------------------------------------- 1 | export class Group { 2 | group_id: number; 3 | name: string; 4 | description: string; 5 | contact_total: number; 6 | } 7 | 8 | -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc-component.scss: -------------------------------------------------------------------------------- 1 | .cc { 2 | width: 40%; 3 | } 4 | .example-container { 5 | display: flex; 6 | flex-direction: column; 7 | min-width: 300px; 8 | max-height: 500px; 9 | } 10 | dialog { 11 | border-color: transparent; 12 | overflow: hidden; 13 | border-radius: 5px; 14 | cursor: pointer; 15 | height: 100px; 16 | width: 500px; 17 | bottom: 400px; 18 | right: 45px; 19 | } 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc-database.component.ts: -------------------------------------------------------------------------------- 1 | import { ContactDNC } from './contact_dnc'; 2 | import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 3 | 4 | export class ContactDNCDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): ContactDNC[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(aContactDNC: ContactDNC[]) { 10 | const contact_dncData = aContactDNC.slice(); 11 | this.dataChange.next(contact_dncData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/contact_dnc/contact_dnc-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { FormsContactDNCComponent } from './contact_dnc-component'; 4 | import { AddContactDNCComponent } from './contact_dnc-form-component'; 5 | import { ContactDNCComponent } from './contact_dnc.component'; 6 | 7 | 8 | 9 | 10 | 11 | const routes: Routes = [{ 12 | path: '', 13 | component: ContactDNCComponent, 14 | children: [{ 15 | path: 'contact_dnc', 16 | component: FormsContactDNCComponent, 17 | }, { 18 | path: 'contact_dnc/new', 19 | component: AddContactDNCComponent, 20 | }, { 21 | path: 'contact_dnc/:id', 22 | component: AddContactDNCComponent, 23 | }, 24 | { 25 | path: 'contact_dnc/:id/delete', 26 | component: FormsContactDNCComponent, 27 | } 28 | ], 29 | }]; 30 | 31 | 32 | @NgModule({ 33 | imports: [RouterModule.forChild(routes)], 34 | exports: [RouterModule], 35 | declarations: [ 36 | 37 | ] 38 | }) 39 | export class ContactDNCRoutingModule { } 40 | 41 | 42 | export const routedComponents = [ 43 | AddContactDNCComponent, 44 | FormsContactDNCComponent, 45 | ContactDNCComponent 46 | ]; -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class ContactDNCComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { RouterModule } from '@angular/router'; 4 | import { NbCardModule } from '@nebular/theme'; 5 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { MatIconModule } from '@angular/material/icon'; 8 | import { MatPaginatorModule } from '@angular/material/paginator'; 9 | import { MatButtonModule } from '@angular/material/button'; 10 | import { NbIconModule, } from '@nebular/theme'; 11 | import { ContactDNCRoutingModule, routedComponents, } from './contact_dnc-routing.module'; 12 | import { MatSortModule } from '@angular/material/sort'; 13 | import { FileUploadModule, FileUploader, FileUploaderOptions } from 'ng2-file-upload'; 14 | import { TranslateModule } from '@ngx-translate/core'; 15 | import { MatCardModule } from '@angular/material/card'; 16 | import { MatDialogModule } from '@angular/material/dialog'; 17 | 18 | 19 | @NgModule({ 20 | declarations: [...routedComponents], 21 | imports: [ 22 | CommonModule, 23 | RouterModule, 24 | NbCardModule, 25 | FormsModule, 26 | ReactiveFormsModule, 27 | MatTableModule, 28 | MatIconModule, 29 | MatPaginatorModule, 30 | MatButtonModule, 31 | NbIconModule, 32 | ContactDNCRoutingModule, 33 | MatSortModule, 34 | FileUploadModule, 35 | TranslateModule, 36 | MatCardModule, 37 | MatDialogModule 38 | ], 39 | exports: [ 40 | 41 | ] 42 | }) 43 | export class ContactDNCModule { } 44 | -------------------------------------------------------------------------------- /src/app/pages/contact_dnc/contact_dnc.ts: -------------------------------------------------------------------------------- 1 | export class ContactDNC { 2 | contact_dnc_id: any; 3 | first_name: string; 4 | last_name: string; 5 | phone: number; 6 | email: string; 7 | address: string; 8 | custom1: string; 9 | custom2: string; 10 | custom3: string; 11 | description: string; 12 | } -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.component.scss: -------------------------------------------------------------------------------- 1 | @import '../../@theme/styles/themes'; 2 | @import '~bootstrap/scss/mixins/breakpoints'; 3 | @import '~@nebular/theme/styles/global/breakpoints'; 4 | 5 | @include nb-install-component() { 6 | .solar-card nb-card-header { 7 | border: none; 8 | padding-bottom: 0; 9 | } 10 | 11 | @include media-breakpoint-down(sm) { 12 | ngx-traffic { 13 | display: none; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { 3 | NbActionsModule, 4 | NbButtonModule, 5 | NbCardModule, 6 | NbTabsetModule, 7 | NbUserModule, 8 | NbRadioModule, 9 | NbSelectModule, 10 | NbListModule, 11 | NbIconModule, 12 | } from '@nebular/theme'; 13 | import { NgxEchartsModule } from 'ngx-echarts'; 14 | 15 | import { ThemeModule } from '../../@theme/theme.module'; 16 | import { DashboardComponent } from './dashboard.component'; 17 | import { StatusCardComponent } from './status-card/status-card.component'; 18 | import { FormsModule } from '@angular/forms'; 19 | import { MatSortModule } from '@angular/material/sort'; 20 | import { MatTableModule } from '@angular/material/table'; 21 | import { MatPaginatorModule } from '@angular/material/paginator'; 22 | import { CdkTableModule } from '@angular/cdk/table'; 23 | import { TranslateModule } from '@ngx-translate/core'; 24 | 25 | @NgModule({ 26 | imports: [ 27 | FormsModule, 28 | ThemeModule, 29 | NbCardModule, 30 | NbUserModule, 31 | NbButtonModule, 32 | NbTabsetModule, 33 | NbActionsModule, 34 | NbRadioModule, 35 | NbSelectModule, 36 | NbListModule, 37 | NbIconModule, 38 | NbButtonModule, 39 | NgxEchartsModule, 40 | MatTableModule, 41 | MatPaginatorModule, 42 | MatSortModule, 43 | CdkTableModule, 44 | TranslateModule 45 | ], 46 | declarations: [ 47 | DashboardComponent, 48 | StatusCardComponent, 49 | ], 50 | }) 51 | export class DashboardModule { } 52 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/dashboard.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Headers } from '@angular/http'; 3 | import { Http, RequestOptions } from '@angular/http'; 4 | import { AppService } from '../../app.service'; 5 | import 'rxjs/add/operator/map'; 6 | import 'rxjs/add/operator/toPromise'; 7 | 8 | @Injectable() 9 | 10 | export class DashboardService { 11 | 12 | constructor(private http: Http, private app_service: AppService) { } 13 | 14 | get_Statistics() { 15 | const headers = new Headers(); 16 | this.app_service.createAuthorizationHeader(headers); 17 | const options = new RequestOptions({ headers: headers}); 18 | return this.http.get(this.app_service.apiUrlDashboard, options).toPromise() 19 | .then(response => response.json()).catch(response => this.app_service.handleError(response)); 20 | } 21 | 22 | get_didStat() { 23 | const headers = new Headers(); 24 | this.app_service.createAuthorizationHeader(headers); 25 | const options = new RequestOptions({ headers: headers}); 26 | const url = `${this.app_service.apiUrlDashboard}?account_type=did`; 27 | return this.http.get(url, options).toPromise() 28 | .then(response => response.json()).catch(response => this.app_service.handleError(response)); 29 | } 30 | 31 | get_outFaxStat() { 32 | const headers = new Headers(); 33 | this.app_service.createAuthorizationHeader(headers); 34 | const options = new RequestOptions({ headers: headers}); 35 | const url = `${this.app_service.apiUrlDashboard}?service_flag=2`; 36 | return this.http.get(url, options).toPromise() 37 | .then(response => response.json()).catch(response => this.app_service.handleError(response)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/app/pages/dashboard/status-card/status-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-status-card', 5 | styleUrls: ['./status-card.component.scss'], 6 | template: ` 7 | 8 |
9 |
10 | 11 |
12 |
13 | 14 |
15 |
{{ title }}
16 |
17 |
18 | `, 19 | }) 20 | export class StatusCardComponent { 21 | 22 | @Input() title: string; 23 | @Input() type: string; 24 | @Input() on = true; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/default_settings/default_settings-component.html: -------------------------------------------------------------------------------- 1 |

Default Settings

2 |
3 |
4 | 5 | 6 | General Settings 7 | 8 | 9 | 10 |
11 | 12 |
13 |

When a caller has no did, then above caller id will be used for outgoing calls.

14 |
15 |
16 | 17 |
18 | -------------------------------------------------------------------------------- /src/app/pages/default_settings/default_settings-component.scss: -------------------------------------------------------------------------------- 1 | .pargrph { 2 | display: inline; 3 | font-size: 15px; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/pages/default_settings/default_settings-component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { AppService } from '../../app.service'; 3 | import { Router } from '@angular/router'; 4 | import { Settings } from './default_settings'; 5 | import { DefaultSettingsService } from './default_settings.service'; 6 | 7 | @Component({ 8 | selector: 'ngx-defaultsettings-component', 9 | templateUrl: './default_settings-component.html', 10 | styleUrls: ['./default_settings-component.scss'], 11 | }) 12 | 13 | export class DefaultSettingsComponent implements OnInit { 14 | 15 | settings: Settings = new Settings; 16 | 17 | constructor(private router: Router, private def_service: DefaultSettingsService) { } 18 | 19 | ngOnInit() { 20 | /* 21 | this.getDefaultSettings(); 22 | */ 23 | } 24 | 25 | getDefaultSettings() { 26 | this.def_service.getDefConf().then(response => { 27 | this.settings = response; 28 | }); 29 | } 30 | 31 | updateSettings() { 32 | this.router.navigate(['transmissions']); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/app/pages/default_settings/default_settings.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { DefaultSettingsComponent } from './default_settings-component'; 5 | import { RouterModule } from '@angular/router'; 6 | import { NbCardModule } from '@nebular/theme'; 7 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 8 | 9 | @NgModule({ 10 | imports: [ 11 | ThemeModule, 12 | RouterModule, 13 | NbCardModule, 14 | FormsModule, 15 | ReactiveFormsModule 16 | ], 17 | declarations: [ 18 | DefaultSettingsComponent, 19 | ], 20 | }) 21 | export class DefaultSettingsModule { } 22 | -------------------------------------------------------------------------------- /src/app/pages/default_settings/default_settings.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Headers } from '@angular/http'; 3 | import { Http, Response, HttpModule, RequestOptions } from '@angular/http'; 4 | import { AppService } from '../../../app/app.service'; 5 | 6 | import 'rxjs/add/operator/toPromise'; 7 | 8 | @Injectable() 9 | 10 | export class DefaultSettingsService { 11 | 12 | constructor(private http: Http, private app_service: AppService) { } 13 | 14 | getDefConf() { 15 | const headers = new Headers(); 16 | this.app_service.createAuthorizationHeader(headers); 17 | const options = new RequestOptions({headers: headers}); 18 | const getUrl = `${this.app_service.apiUrlAccounts}`; 19 | return this.http.get(getUrl, options).toPromise().then(response => response.json()) 20 | .catch(err => this.app_service.handleError(err)); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/app/pages/default_settings/default_settings.ts: -------------------------------------------------------------------------------- 1 | export class Settings { 2 | caller_id: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/pages/did/assign-did-component.html: -------------------------------------------------------------------------------- 1 |

Assign DID

2 |
3 |
4 | 5 | 6 | DID Information 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 | 15 | 16 | User Information 17 | 18 | 19 |
20 |
26 |
27 |
28 | 29 |
30 | -------------------------------------------------------------------------------- /src/app/pages/did/assign-did-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/did/assign-did-component.scss -------------------------------------------------------------------------------- /src/app/pages/did/batch-did-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/did/batch-did-component.scss -------------------------------------------------------------------------------- /src/app/pages/did/batch-did-component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import { DID } from './did'; 3 | import { DIDService } from './did.service'; 4 | import { Router, ActivatedRoute } from '@angular/router'; 5 | 6 | @Component({ 7 | selector: 'ngx-batch-did-component', 8 | templateUrl: './batch-did-component.html', 9 | styleUrls: ['./batch-did-component.scss'], 10 | }) 11 | 12 | export class BatchDIDComponent { 13 | 14 | constructor(private did_service: DIDService, private router: Router, private route: ActivatedRoute) { 15 | this.did.active = 1; 16 | } 17 | 18 | did: DID= new DID; 19 | 20 | addDID() { 21 | for (let i = this.did.range_from; i <= this.did.range_to; i++) { 22 | this.did.phone = i; 23 | this.did.username = this.did.phone; 24 | this.did.first_name = this.did.title + ' ' + i; 25 | this.did_service.add_DID(this.did).then(response => { 26 | }); 27 | if ( i == this.did.range_to) { 28 | this.router.navigate(['../../did'], {relativeTo: this.route}); 29 | } 30 | } 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /src/app/pages/did/did-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | max-height: 500px; 6 | 7 | } 8 | 9 | .example-header { 10 | min-height: 64px; 11 | display: flex; 12 | align-items: center; 13 | padding-left: 24px; 14 | font-size: 20px; 15 | } 16 | 17 | .mat-table { 18 | overflow: auto; 19 | max-height: 500px; 20 | } 21 | 22 | .mat-sort-header-sorted { 23 | color: black; 24 | } 25 | 26 | .cdk-visually-hidden { 27 | border: 0; 28 | clip: rect(0 0 0 0); 29 | height: 1px; 30 | margin: -1px; 31 | overflow: hidden; 32 | padding: 0; 33 | position: absolute; 34 | width: 1px; 35 | } 36 | 37 | .example-button-row { 38 | display: flex; 39 | align-items: center; 40 | justify-content: space-around; 41 | } 42 | 43 | .mat-form-field { 44 | font-size: 14px; 45 | flex-grow: 1; 46 | margin-left: 32px; 47 | } 48 | 49 | .mat-cell, .mat-header-cell { 50 | overflow: hidden; 51 | word-wrap: break-word; 52 | } 53 | 54 | a:hover { 55 | color: rgb(10, 238, 10); 56 | // color: darkblue; 57 | } 58 | 59 | .cc { 60 | width: 40%; 61 | } 62 | -------------------------------------------------------------------------------- /src/app/pages/did/did-database.component.ts: -------------------------------------------------------------------------------- 1 | import { DID } from './did'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class DIDDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): DID[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aDID: DID[]) { 10 | const didData = aDID.slice(); 11 | this.dataChange.next(didData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/did/did-form-component.html: -------------------------------------------------------------------------------- 1 |

{{'dids.add' | translate}}

2 |
3 |
4 | 5 | 6 | {{'my_dids.did_info' | translate}} 7 | 8 | 9 |
10 |
11 |
12 | 13 | 14 |
15 |
{{'dids.did_req' | translate}}.
16 |
17 |
18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 | 29 | 30 |
31 | 32 |
33 |
34 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/app/pages/did/did-form-component.scss: -------------------------------------------------------------------------------- 1 | .mat-radio-button ~ .mat-radio-button { 2 | padding-right: 16px; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /src/app/pages/did/did-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { DIDComponent } from './did.component'; 5 | import { FormsDIDComponent } from './did-component'; 6 | import { AddDIDComponent } from './did-form-component'; 7 | import { BatchDIDComponent } from './batch-did-component'; 8 | import { ImportDIDComponent } from './import-did-component'; 9 | import { AssignDIDComponent } from './assign-did-component'; 10 | 11 | const routes: Routes = [{ 12 | path: '', 13 | component: DIDComponent, 14 | children: [{ 15 | path: 'did', 16 | component: FormsDIDComponent, 17 | }, { 18 | path: 'did/new', 19 | component: AddDIDComponent, 20 | }, { 21 | path: 'did/batch', 22 | component: BatchDIDComponent, 23 | }, { 24 | path: 'did/import', 25 | component: ImportDIDComponent, 26 | }, { 27 | path: 'did/:id', 28 | component: AddDIDComponent, 29 | }, { 30 | path: 'did/:id/assign', 31 | component: AssignDIDComponent, 32 | }, { 33 | path: 'did/:id/delete', 34 | component: AddDIDComponent, 35 | }], 36 | }]; 37 | 38 | @NgModule({ 39 | imports: [ 40 | RouterModule.forChild(routes), 41 | ], 42 | exports: [ 43 | RouterModule, 44 | ], 45 | }) 46 | export class DIDRoutingModule { 47 | 48 | } 49 | 50 | export const routedComponents = [ 51 | DIDComponent, 52 | FormsDIDComponent, 53 | AddDIDComponent, 54 | BatchDIDComponent, 55 | ImportDIDComponent, 56 | AssignDIDComponent, 57 | ]; 58 | -------------------------------------------------------------------------------- /src/app/pages/did/did.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class DIDComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/did/did.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { DIDRoutingModule, routedComponents } from './did-routing.module'; 5 | import { FormsDIDComponent } from './did-component'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { CdkTableModule } from '@angular/cdk/table'; 8 | import { DIDService } from './did.service'; 9 | import { MatSortModule } from '@angular/material/sort'; 10 | import { MatButtonModule } from '@angular/material/button'; 11 | import { MatPaginatorModule } from '@angular/material/paginator'; 12 | import { MatIconModule } from '@angular/material/icon'; 13 | import { MatRadioModule } from '@angular/material/radio'; 14 | import { FileUploadModule } from 'ng2-file-upload'; 15 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 16 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 17 | import { TranslateModule } from '@ngx-translate/core'; 18 | 19 | @NgModule({ 20 | imports: [ 21 | ThemeModule, 22 | DIDRoutingModule, 23 | MatTableModule, 24 | CdkTableModule, 25 | MatSortModule, 26 | MatButtonModule, 27 | MatPaginatorModule, 28 | MatRadioModule, 29 | FileUploadModule, 30 | NbCardModule, 31 | MatIconModule, 32 | FormsModule, 33 | ReactiveFormsModule, 34 | TranslateModule, 35 | NbIconModule 36 | ], 37 | declarations: [ 38 | ...routedComponents, 39 | ], 40 | }) 41 | export class DIDModule { } 42 | -------------------------------------------------------------------------------- /src/app/pages/did/did.ts: -------------------------------------------------------------------------------- 1 | export class DID { 2 | account_id: number; 3 | username: string; 4 | passwd: string; 5 | passwd_pin: string; 6 | first_name: string; 7 | last_name: string; 8 | phone: any; 9 | email: string; 10 | address: string; 11 | active: number; 12 | type: any; 13 | did_number: any; 14 | title: any; 15 | assigned_to: any; 16 | range_from: any; 17 | range_to: any; 18 | user_id: any; 19 | service: any; 20 | name: any; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/pages/did/import-did-component.html: -------------------------------------------------------------------------------- 1 |

DID Information

2 |
3 |
4 | 5 | 6 | Upload DID List 7 | 8 | 9 |
10 | 12 |
13 |
14 | 15 |
16 |
17 |

18 |

Example File:

Sample.csv 19 |
20 |
21 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /src/app/pages/did/import-did-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/did/import-did-component.scss -------------------------------------------------------------------------------- /src/app/pages/extension/extension-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | max-height: 500px; 6 | } 7 | 8 | 9 | .example-header { 10 | min-height: 64px; 11 | display: flex; 12 | align-items: center; 13 | padding-left: 24px; 14 | font-size: 20px; 15 | } 16 | 17 | 18 | .mat-table { 19 | overflow: auto; 20 | max-height: 500px; 21 | } 22 | 23 | 24 | .mat-sort-header-sorted { 25 | color: black; 26 | } 27 | 28 | 29 | .cdk-visually-hidden { 30 | border: 0; 31 | clip: rect(0 0 0 0); 32 | height: 1px; 33 | margin: -1px; 34 | overflow: hidden; 35 | padding: 0; 36 | position: absolute; 37 | width: 1px; 38 | } 39 | 40 | 41 | .example-button-row { 42 | display: flex; 43 | align-items: center; 44 | justify-content: space-around; 45 | } 46 | 47 | 48 | .mat-form-field { 49 | font-size: 14px; 50 | flex-grow: 1; 51 | margin-left: 32px; 52 | } 53 | 54 | 55 | .mat-cell, .mat-header-cell { 56 | overflow: hidden; 57 | word-wrap: break-word; 58 | } 59 | 60 | a:hover { 61 | color: rgb(10, 238, 10); 62 | } 63 | 64 | .cc { 65 | width: 40%; 66 | } 67 | -------------------------------------------------------------------------------- /src/app/pages/extension/extension-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Extension } from './extension'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class ExtensionDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Extension[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aExtension: Extension[]) { 10 | const extensionData = aExtension.slice(); 11 | this.dataChange.next(extensionData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/extension/extension-form-component.scss: -------------------------------------------------------------------------------- 1 | .mat-radio-button ~ .mat-radio-button { 2 | padding-right: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/pages/extension/extension-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ExtensionComponent } from './extension.component'; 5 | import { FormsExtensionComponent } from './extension-component'; 6 | import { AddExtensionComponent } from './extension-form-component'; 7 | 8 | const routes: Routes = [{ 9 | path: '', 10 | component: ExtensionComponent, 11 | children: [{ 12 | path: 'extension', 13 | component: FormsExtensionComponent, 14 | }, { 15 | path: 'extension/new', 16 | component: AddExtensionComponent, 17 | }, { 18 | path: 'extension/:id', 19 | component: AddExtensionComponent, 20 | }, { 21 | path: 'extension/:id/delete', 22 | component: AddExtensionComponent, 23 | }], 24 | }]; 25 | 26 | @NgModule({ 27 | imports: [ 28 | RouterModule.forChild(routes), 29 | ], 30 | exports: [ 31 | RouterModule, 32 | ], 33 | }) 34 | export class ExtensionRoutingModule { 35 | 36 | } 37 | 38 | export const routedComponents = [ 39 | ExtensionComponent, 40 | FormsExtensionComponent, 41 | AddExtensionComponent, 42 | ]; 43 | -------------------------------------------------------------------------------- /src/app/pages/extension/extension.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class ExtensionComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/extension/extension.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { ExtensionRoutingModule, routedComponents } from './extension-routing.module'; 5 | import { MatTableModule } from '@angular/material/table'; 6 | import { CdkTableModule } from '@angular/cdk/table'; 7 | import { MatSortModule} from '@angular/material/sort'; 8 | import { MatIconModule } from '@angular/material/icon'; 9 | import { MatButtonModule } from '@angular/material/button'; 10 | import { MatPaginatorModule } from '@angular/material/paginator'; 11 | import { MatRadioModule } from '@angular/material/radio'; 12 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 13 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 14 | import { TranslateModule } from '@ngx-translate/core'; 15 | 16 | @NgModule({ 17 | imports: [ 18 | ThemeModule, 19 | ExtensionRoutingModule, 20 | MatTableModule, 21 | CdkTableModule, 22 | MatSortModule, 23 | MatButtonModule, 24 | MatPaginatorModule, 25 | MatRadioModule, 26 | NbCardModule, 27 | FormsModule, 28 | ReactiveFormsModule, 29 | MatIconModule, 30 | NbIconModule, 31 | TranslateModule 32 | ], 33 | declarations: [ 34 | ...routedComponents, 35 | ], 36 | }) 37 | export class ExtensionModule { } 38 | -------------------------------------------------------------------------------- /src/app/pages/extension/extension.ts: -------------------------------------------------------------------------------- 1 | export class Extension { 2 | account_id: number; 3 | username: string; 4 | passwd: string; 5 | passwd_pin: string; 6 | first_name: string; 7 | last_name: string; 8 | phone: number; 9 | email: string; 10 | address: string; 11 | active: number; 12 | type: any; 13 | settings : { 14 | emailtofax_coversheet: any; 15 | coverpage: any; 16 | } 17 | user_id: any; 18 | } 19 | 20 | export class Settings { 21 | value:any; 22 | } 23 | -------------------------------------------------------------------------------- /src/app/pages/faxsettings/faxsettings-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/faxsettings/faxsettings-component.scss -------------------------------------------------------------------------------- /src/app/pages/faxsettings/faxsettings.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { NgxEchartsModule } from 'ngx-echarts'; 3 | 4 | import { ThemeModule } from '../../@theme/theme.module'; 5 | import { FaxSettingsComponent } from './faxsettings-component'; 6 | import { RouterModule } from '@angular/router'; 7 | import { NbCardModule, NbButtonModule } from '@nebular/theme'; 8 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 9 | import { TranslateModule } from '@ngx-translate/core'; 10 | 11 | @NgModule({ 12 | imports: [ 13 | ThemeModule, 14 | NgxEchartsModule, 15 | RouterModule, 16 | NbCardModule, 17 | FormsModule, 18 | ReactiveFormsModule, 19 | NbButtonModule, 20 | TranslateModule 21 | ], 22 | declarations: [ 23 | FaxSettingsComponent, 24 | ], 25 | }) 26 | export class FaxSettingsModule { } 27 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/assign-incoming_cid_number-component.html: -------------------------------------------------------------------------------- 1 |

{{ 'cids.assign_cid' | translate }}

2 |
3 |
4 | 5 | 6 | 7 |
8 | 9 |
10 |
11 | 17 |
18 |
19 | 20 | 21 |
22 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/assign-incoming_cid_number-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/incoming_cid_number/assign-incoming_cid_number-component.scss -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/edit-incoming_cid_number-component.html: -------------------------------------------------------------------------------- 1 |

{{ 'my_dids.did_info' | translate }}

2 |
3 |
4 | 5 | 6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 |
14 | 15 | 16 |
17 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/edit-incoming_cid_number-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/incoming_cid_number/edit-incoming_cid_number-component.scss -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/incoming_cid_number-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | 7 | .example-header { 8 | min-height: 64px; 9 | display: flex; 10 | align-items: center; 11 | padding-left: 24px; 12 | font-size: 20px; 13 | } 14 | 15 | .mat-table { 16 | overflow: auto; 17 | max-height: 500px; 18 | } 19 | 20 | .mat-header-cell .mat-sort-header-sorted { 21 | color: black; 22 | } 23 | 24 | .cdk-visually-hidden { 25 | border: 0; 26 | clip: rect(0 0 0 0); 27 | height: 1px; 28 | margin: -1px; 29 | overflow: hidden; 30 | padding: 0; 31 | position: absolute; 32 | width: 1px; 33 | } 34 | 35 | .example-button-row { 36 | display: flex; 37 | align-items: center; 38 | justify-content: space-around; 39 | } 40 | 41 | .mat-form-field { 42 | font-size: 14px; 43 | flex-grow: 1; 44 | margin-left: 32px; 45 | } 46 | a:hover { 47 | color: rgb(10, 238, 10); 48 | // color: darkblue; 49 | } 50 | 51 | .fa-trash:hover { 52 | color: rgb(138, 4, 4); 53 | } 54 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/incoming_cid_number-database.component.ts: -------------------------------------------------------------------------------- 1 | import { IncomingCIDNumber } from './incoming_cid_number'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class IncomingCIDNumberDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): IncomingCIDNumber[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aNumber: IncomingCIDNumber[]) { 10 | const numberData = aNumber.slice(); 11 | this.dataChange.next(numberData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/incoming_cid_number-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { IncomingCIDNumberComponent } from './incoming_cid_number.component'; 5 | import { FormsIncomingCIDNumberComponent } from './incoming_cid_number-component'; 6 | import { EditIncomingCIDNumberComponent } from './edit-incoming_cid_number-component'; 7 | import { AssignIncomingCIDNumberComponent } from './assign-incoming_cid_number-component'; 8 | 9 | const routes: Routes = [{ 10 | path: '', 11 | component: IncomingCIDNumberComponent, 12 | children: [{ 13 | path: 'incoming_cid_number', 14 | component: FormsIncomingCIDNumberComponent, 15 | }, { 16 | path: 'incoming_cid_number/:id', 17 | component: EditIncomingCIDNumberComponent, 18 | }, 19 | { 20 | path: 'incoming_cid_number/:id/assign', 21 | component: AssignIncomingCIDNumberComponent, 22 | }], 23 | }]; 24 | 25 | @NgModule({ 26 | imports: [ 27 | RouterModule.forChild(routes), 28 | ], 29 | exports: [ 30 | RouterModule, 31 | ], 32 | }) 33 | export class IncomingNumberRoutingModule { 34 | 35 | } 36 | 37 | export const routedComponents = [ 38 | IncomingCIDNumberComponent, 39 | FormsIncomingCIDNumberComponent, 40 | EditIncomingCIDNumberComponent, 41 | AssignIncomingCIDNumberComponent, 42 | ]; 43 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/incoming_cid_number.component.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Component } from '@angular/core'; 3 | 4 | @Component({ 5 | selector: 'ngx-form-elements', 6 | template: ` 7 | 8 | `, 9 | }) 10 | export class IncomingCIDNumberComponent { 11 | } 12 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/incoming_cid_number.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { IncomingNumberRoutingModule, routedComponents } from './incoming_cid_number-routing.module'; 5 | import { FormsIncomingCIDNumberComponent } from './incoming_cid_number-component'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { CdkTableModule } from '@angular/cdk/table'; 8 | import { IncomingCIDNumberService, } from './incoming_cid_number.service'; 9 | import { MatSortModule } from '@angular/material/sort'; 10 | import { MatIconModule } from '@angular/material/icon'; 11 | import { MatButtonModule } from '@angular/material/button'; 12 | import { MatPaginatorModule } from '@angular/material/paginator'; 13 | import { NbCardModule } from '@nebular/theme'; 14 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 15 | import { TranslateModule } from '@ngx-translate/core'; 16 | import { RouterModule } from '@angular/router'; 17 | import { CIDService } from '../cid/cid.service'; 18 | 19 | 20 | 21 | @NgModule({ 22 | imports: [ 23 | ThemeModule, 24 | IncomingNumberRoutingModule, 25 | MatTableModule, 26 | CdkTableModule, 27 | MatSortModule, 28 | MatButtonModule, 29 | MatPaginatorModule, 30 | NbCardModule, 31 | MatIconModule, 32 | FormsModule, 33 | ReactiveFormsModule, 34 | TranslateModule, 35 | RouterModule, 36 | ], 37 | declarations: [ 38 | ...routedComponents, 39 | ], 40 | providers: [IncomingCIDNumberService,CIDService], 41 | }) 42 | export class IncomingCIDNumberModule { } 43 | -------------------------------------------------------------------------------- /src/app/pages/incoming_cid_number/incoming_cid_number.ts: -------------------------------------------------------------------------------- 1 | export class IncomingCIDNumber { 2 | phone: number; 3 | username: string; 4 | first_name: any; 5 | last_name: any; 6 | service_name: any; 7 | account_id: any; 8 | extension_id: any; 9 | cid_id: any; 10 | email:any; 11 | user_id: any; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/assign-incoming_number-component.html: -------------------------------------------------------------------------------- 1 |

{{ 'dids.assign_did' | translate }}

2 |
3 |
4 | 5 | 6 | 7 |
8 | 9 |
10 |
11 | 17 |
18 |
19 | 20 | 21 |
22 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/assign-incoming_number-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/incoming_number/assign-incoming_number-component.scss -------------------------------------------------------------------------------- /src/app/pages/incoming_number/edit-incoming_number-component.html: -------------------------------------------------------------------------------- 1 |

{{ 'my_dids.did_info' | translate }}

2 |
3 |
4 | 5 | 6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 |
14 | 15 | 16 |
17 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/edit-incoming_number-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/incoming_number/edit-incoming_number-component.scss -------------------------------------------------------------------------------- /src/app/pages/incoming_number/forward-incoming_number-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/incoming_number/forward-incoming_number-component.scss -------------------------------------------------------------------------------- /src/app/pages/incoming_number/incoming_number-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | 7 | .example-header { 8 | min-height: 64px; 9 | display: flex; 10 | align-items: center; 11 | padding-left: 24px; 12 | font-size: 20px; 13 | } 14 | 15 | .mat-table { 16 | overflow: auto; 17 | max-height: 500px; 18 | } 19 | 20 | .mat-header-cell .mat-sort-header-sorted { 21 | color: black; 22 | } 23 | 24 | .cdk-visually-hidden { 25 | border: 0; 26 | clip: rect(0 0 0 0); 27 | height: 1px; 28 | margin: -1px; 29 | overflow: hidden; 30 | padding: 0; 31 | position: absolute; 32 | width: 1px; 33 | } 34 | 35 | .example-button-row { 36 | display: flex; 37 | align-items: center; 38 | justify-content: space-around; 39 | } 40 | 41 | .mat-form-field { 42 | font-size: 14px; 43 | flex-grow: 1; 44 | margin-left: 32px; 45 | } 46 | a:hover { 47 | color: rgb(10, 238, 10); 48 | // color: darkblue; 49 | } 50 | 51 | .cc { 52 | width: 40%; 53 | } 54 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/incoming_number-database.component.ts: -------------------------------------------------------------------------------- 1 | import { IncomingNumber } from './incoming_number'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class IncomingNumberDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): IncomingNumber[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aNumber: IncomingNumber[]) { 10 | const numberData = aNumber.slice(); 11 | this.dataChange.next(numberData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/incoming_number-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { IncomingNumberComponent } from './incoming_number.component'; 5 | import { FormsIncomingNumberComponent } from './incoming_number-component'; 6 | import { ForwardIncomingNumberComponent } from './forward-incoming_number-component'; 7 | import { EditIncomingNumberComponent } from './edit-incoming_number-component'; 8 | import { AssignIncomingNumberComponent } from './assign-incoming_number-component'; 9 | 10 | const routes: Routes = [{ 11 | path: '', 12 | component: IncomingNumberComponent, 13 | children: [{ 14 | path: 'incoming_number', 15 | component: FormsIncomingNumberComponent, 16 | }, { 17 | path: 'incoming_number/:id', 18 | component: EditIncomingNumberComponent, 19 | }, { 20 | path: 'incoming_number/:id/forward', 21 | component: ForwardIncomingNumberComponent, 22 | }, { 23 | path: 'incoming_number/:id/assign', 24 | component: AssignIncomingNumberComponent, 25 | }], 26 | }]; 27 | 28 | @NgModule({ 29 | imports: [ 30 | RouterModule.forChild(routes), 31 | ], 32 | exports: [ 33 | RouterModule, 34 | ], 35 | }) 36 | export class IncomingNumberRoutingModule { 37 | 38 | } 39 | 40 | export const routedComponents = [ 41 | IncomingNumberComponent, 42 | FormsIncomingNumberComponent, 43 | EditIncomingNumberComponent, 44 | ForwardIncomingNumberComponent, 45 | AssignIncomingNumberComponent, 46 | ]; 47 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/incoming_number.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class IncomingNumberComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/incoming_number.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { IncomingNumberRoutingModule, routedComponents } from './incoming_number-routing.module'; 5 | import { FormsIncomingNumberComponent } from './incoming_number-component'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { CdkTableModule } from '@angular/cdk/table'; 8 | import { IncomingNumberService } from './incoming_number.service'; 9 | import { MatIconModule } from '@angular/material/icon'; 10 | import { MatSortModule } from '@angular/material/sort'; 11 | import { MatButtonModule } from '@angular/material/button'; 12 | import { MatPaginatorModule } from '@angular/material/paginator'; 13 | import { NbCardModule } from '@nebular/theme'; 14 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 15 | import { TranslateModule } from '@ngx-translate/core'; 16 | 17 | 18 | @NgModule({ 19 | imports: [ 20 | ThemeModule, 21 | IncomingNumberRoutingModule, 22 | MatTableModule, 23 | CdkTableModule, 24 | MatSortModule, 25 | MatButtonModule, 26 | MatPaginatorModule, 27 | NbCardModule, 28 | MatIconModule, 29 | FormsModule, 30 | ReactiveFormsModule, 31 | TranslateModule 32 | ], 33 | declarations: [ 34 | ...routedComponents, 35 | ], 36 | }) 37 | export class IncomingNumberModule { } 38 | -------------------------------------------------------------------------------- /src/app/pages/incoming_number/incoming_number.ts: -------------------------------------------------------------------------------- 1 | export class IncomingNumber { 2 | phone: number; 3 | username: string; 4 | first_name: any; 5 | service_name: any; 6 | account_id: any; 7 | extension_id: any; 8 | did_id: any; 9 | email:any; 10 | user_id: any; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/pages/infax/infax-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Transmission } from '../transmission/transmission'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class InFaxDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Transmission[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aInFax: Transmission[]) { 10 | const infaxData = aInFax.slice(); 11 | this.dataChange.next(infaxData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/infax/infax.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { InFaxComponent } from './infax-component'; 5 | import { RouterModule } from '@angular/router'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { CdkTableModule } from '@angular/cdk/table'; 8 | import { MatSortModule } from '@angular/material/sort'; 9 | import { MatPaginatorModule } from '@angular/material/paginator'; 10 | import { MatButtonModule} from '@angular/material/button'; 11 | import { MatNativeDateModule } from '@angular/material/core'; 12 | import {MatDatepickerModule} from '@angular/material/datepicker' 13 | import { MatIconModule } from '@angular/material/icon'; 14 | import { NbIconModule, NbCardModule } from '@nebular/theme'; 15 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 16 | import { TranslateModule } from '@ngx-translate/core'; 17 | import { PdfViewerModule } from 'ng2-pdf-viewer'; 18 | 19 | @NgModule({ 20 | imports: [ 21 | ThemeModule, 22 | RouterModule, 23 | MatTableModule, 24 | CdkTableModule, 25 | MatSortModule, 26 | MatPaginatorModule, 27 | MatDatepickerModule, 28 | MatNativeDateModule, 29 | NbCardModule, 30 | FormsModule, 31 | MatIconModule, 32 | ReactiveFormsModule, 33 | NbIconModule, 34 | MatButtonModule, 35 | TranslateModule, 36 | PdfViewerModule 37 | ], 38 | declarations: [ 39 | InFaxComponent, 40 | ], 41 | }) 42 | export class InFaxModule{} 43 | -------------------------------------------------------------------------------- /src/app/pages/menu-item.ts: -------------------------------------------------------------------------------- 1 | import { NbMenuItem } from '@nebular/theme'; 2 | 3 | export declare abstract class MenuItem extends NbMenuItem { 4 | key?: string; 5 | children?: MenuItem[]; 6 | parent?: MenuItem; 7 | } -------------------------------------------------------------------------------- /src/app/pages/message/document/document-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Document } from './document'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class DocumentDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Document[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aDocument: Document[]) { 10 | const documentData = aDocument.slice(); 11 | this.dataChange.next(documentData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/message/document/document-form-component.scss: -------------------------------------------------------------------------------- 1 | .my-drop-zone { border: dotted 3px lightgray; } 2 | 3 | .nv-file-over { border: dotted 3px red; } /* Default class applied to drop zones on over */ 4 | 5 | .another-file-over-class { border: dotted 3px green; } 6 | 7 | html, body { height: 100%; } 8 | 9 | .smmmm { 10 | font-size: 25px; 11 | display: inline; 12 | color: red; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/message/document/document.ts: -------------------------------------------------------------------------------- 1 | export class Document { 2 | document_id: number; 3 | name: string; 4 | file_name: any; 5 | type: string; 6 | description: string; 7 | quality: any; 8 | text: String; 9 | ocr: String; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/message/email/email-component.scss: -------------------------------------------------------------------------------- 1 | 2 | .example-container { 3 | display: flex; 4 | flex-direction: column; 5 | min-width: 300px; 6 | 7 | } 8 | 9 | .example-header { 10 | min-height: 64px; 11 | display: flex; 12 | align-items: center; 13 | padding-left: 24px; 14 | font-size: 20px; 15 | } 16 | 17 | .mat-table { 18 | overflow: auto; 19 | max-height: 500px; 20 | } 21 | 22 | .mat-header-cell .mat-sort-header-sorted { 23 | color: black; 24 | } 25 | 26 | .cdk-visually-hidden { 27 | border: 0; 28 | clip: rect(0 0 0 0); 29 | height: 1px; 30 | margin: -1px; 31 | overflow: hidden; 32 | padding: 0; 33 | position: absolute; 34 | width: 1px; 35 | } 36 | 37 | .example-button-row { 38 | display: flex; 39 | align-items: center; 40 | justify-content: space-around; 41 | } 42 | 43 | .mat-form-field { 44 | font-size: 14px; 45 | flex-grow: 1; 46 | margin-left: 32px; 47 | 48 | } 49 | a:hover { 50 | color: rgb(10, 238, 10); 51 | } 52 | 53 | .fa-trash:hover { 54 | color: rgb(138, 4, 4); 55 | } 56 | 57 | .fa-cloud-download:hover { 58 | color: darkblue; 59 | } 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/app/pages/message/email/email-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Template } from './email'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class TemplateDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Template[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aTemplate: Template[]) { 10 | const templateData = aTemplate.slice(); 11 | this.dataChange.next(templateData); 12 | } 13 | } -------------------------------------------------------------------------------- /src/app/pages/message/email/email-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/message/email/email-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/message/email/email.ts: -------------------------------------------------------------------------------- 1 | export class Template { 2 | template_id: number; 3 | name: string; 4 | description: string; 5 | subject: string; 6 | body: string; 7 | body_alt: string; 8 | attachment: any; 9 | type: string; 10 | } -------------------------------------------------------------------------------- /src/app/pages/message/message.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class MessageComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/message/message.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { MessageRoutingModule, routedComponents } from './message-routing.module'; 5 | import { FormsDocumentComponent } from '../message/document/document-component'; 6 | import { MatTableModule } from '@angular/material/table'; 7 | import { CdkTableModule } from '@angular/cdk/table'; 8 | import { MatSortModule} from '@angular/material/sort'; 9 | import { MatIconModule } from '@angular/material/icon'; 10 | import { FileUploadModule } from 'ng2-file-upload'; 11 | import { MatButtonModule } from '@angular/material/button'; 12 | import { MatPaginatorModule } from '@angular/material/paginator'; 13 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 14 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 15 | import { TranslateModule } from '@ngx-translate/core'; 16 | import { Ng2CompleterModule } from "ng2-completer"; 17 | import { PdfViewerModule } from 'ng2-pdf-viewer'; 18 | 19 | 20 | @NgModule({ 21 | imports: [ 22 | ThemeModule, 23 | MessageRoutingModule, 24 | MatTableModule, 25 | CdkTableModule, 26 | MatSortModule, 27 | FileUploadModule, 28 | MatButtonModule, 29 | MatPaginatorModule, 30 | NbCardModule, 31 | FormsModule, 32 | ReactiveFormsModule, 33 | MatIconModule, 34 | NbIconModule, 35 | TranslateModule, 36 | Ng2CompleterModule, 37 | PdfViewerModule 38 | ], 39 | declarations: [ 40 | ...routedComponents, 41 | ], 42 | }) 43 | export class MessageModule { } 44 | -------------------------------------------------------------------------------- /src/app/pages/message/recording/recording-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | 7 | .example-header { 8 | min-height: 64px; 9 | display: flex; 10 | align-items: center; 11 | padding-left: 24px; 12 | font-size: 20px; 13 | } 14 | 15 | .mat-table { 16 | overflow: auto; 17 | max-height: 500px; 18 | } 19 | 20 | .mat-header-cell .mat-sort-header-sorted { 21 | color: black; 22 | } 23 | 24 | .cdk-visually-hidden { 25 | border: 0; 26 | clip: rect(0 0 0 0); 27 | height: 1px; 28 | margin: -1px; 29 | overflow: hidden; 30 | padding: 0; 31 | position: absolute; 32 | width: 1px; 33 | } 34 | 35 | .example-button-row { 36 | display: flex; 37 | align-items: center; 38 | justify-content: space-around; 39 | } 40 | 41 | .mat-form-field { 42 | font-size: 14px; 43 | flex-grow: 1; 44 | margin-left: 32px; 45 | } 46 | 47 | a:hover { 48 | color: rgb(10, 238, 10); 49 | } 50 | 51 | .cc { 52 | width: 40%; 53 | } 54 | -------------------------------------------------------------------------------- /src/app/pages/message/recording/recording-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Recording } from './recording'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class RecordingDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Recording[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aRecording: Recording[]) { 10 | const recordingData = aRecording.slice(); 11 | this.dataChange.next(recordingData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/message/recording/recording-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/message/recording/recording-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/message/recording/recording.ts: -------------------------------------------------------------------------------- 1 | export class Recording { 2 | recording_id: number; 3 | name: string; 4 | file_name: string; 5 | type: string; 6 | description: string; 7 | length: number; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/pages/message/text/text-component.scss: -------------------------------------------------------------------------------- 1 | 2 | .example-container { 3 | display: flex; 4 | flex-direction: column; 5 | min-width: 300px; 6 | 7 | } 8 | 9 | .example-header { 10 | min-height: 64px; 11 | display: flex; 12 | align-items: center; 13 | padding-left: 24px; 14 | font-size: 20px; 15 | } 16 | 17 | .mat-table { 18 | overflow: auto; 19 | max-height: 500px; 20 | } 21 | 22 | .mat-header-cell .mat-sort-header-sorted { 23 | color: black; 24 | } 25 | 26 | .cdk-visually-hidden { 27 | border: 0; 28 | clip: rect(0 0 0 0); 29 | height: 1px; 30 | margin: -1px; 31 | overflow: hidden; 32 | padding: 0; 33 | position: absolute; 34 | width: 1px; 35 | } 36 | 37 | .example-button-row { 38 | display: flex; 39 | align-items: center; 40 | justify-content: space-around; 41 | } 42 | 43 | .mat-form-field { 44 | font-size: 14px; 45 | flex-grow: 1; 46 | margin-left: 32px; 47 | 48 | } 49 | 50 | a:hover { 51 | color: rgb(10, 238, 10); 52 | } 53 | 54 | .fa-trash:hover { 55 | color: rgb(138, 4, 4); 56 | } 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/app/pages/message/text/text-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Text } from './text'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class TextDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Text[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aText: Text[]) { 10 | const textData = aText.slice(); 11 | this.dataChange.next(textData); 12 | } 13 | } -------------------------------------------------------------------------------- /src/app/pages/message/text/text-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/message/text/text-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/message/text/text-form-component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, NgModule } from '@angular/core'; 2 | import { Router, ActivatedRoute, Params, ParamMap } from '@angular/router'; 3 | import { Http, HttpModule, Response } from '@angular/http'; 4 | import { FormsModule } from '@angular/forms'; 5 | import { Text } from './text'; 6 | import { TextService } from './text.service'; 7 | import 'rxjs/add/operator/toPromise'; 8 | 9 | @Component({ 10 | selector: 'ngx-add-text-component', 11 | templateUrl: './text-form-component.html', 12 | styleUrls: ['./text-form-component.scss'], 13 | }) 14 | 15 | export class AddTextComponent implements OnInit { 16 | 17 | constructor(private http: Http, private route: ActivatedRoute, private text_service: TextService, 18 | private router: Router) { } 19 | 20 | 21 | form1: any= {}; 22 | text: Text= new Text; 23 | text_id: any= null; 24 | 25 | ngOnInit(): void { 26 | this.route.params.subscribe(params => { 27 | this.text_id = +params['id']; 28 | const test_url = this.router.url.split('/'); 29 | const lastsegment = test_url[test_url.length - 1]; 30 | if (lastsegment === 'new') { 31 | return null; 32 | } else { 33 | return this.text_service.get_TextData(this.text_id).then(data => { 34 | this.text = data; 35 | }); 36 | } 37 | }); 38 | } 39 | 40 | addText(): void { 41 | this.text_service.add_Text(this.text).then(response => { 42 | this.router.navigate(['../../text'], {relativeTo: this.route}); 43 | }); 44 | } 45 | 46 | updateText(): void { 47 | this.text_service.update_Text(this.text).then(() => { 48 | this.router.navigate(['../../text'], {relativeTo: this.route}); 49 | }) 50 | .catch(this.handleError); 51 | } 52 | 53 | private handleError(error: any): Promise { 54 | console.error('An error occurred', error); 55 | return Promise.reject(error.message || error); 56 | } 57 | } -------------------------------------------------------------------------------- /src/app/pages/message/text/text.ts: -------------------------------------------------------------------------------- 1 | export class Text { 2 | text_id: number; 3 | name: string; 4 | data: string; 5 | type: string; 6 | description: string; 7 | length: number; 8 | } -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/miscellaneous-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | 4 | import { MiscellaneousComponent } from './miscellaneous.component'; 5 | import { NotFoundComponent } from './not-found/not-found.component'; 6 | 7 | const routes: Routes = [ 8 | { 9 | path: '', 10 | component: MiscellaneousComponent, 11 | children: [ 12 | { 13 | path: '404', 14 | component: NotFoundComponent, 15 | }, 16 | ], 17 | }, 18 | ]; 19 | 20 | @NgModule({ 21 | imports: [RouterModule.forChild(routes)], 22 | exports: [RouterModule], 23 | }) 24 | export class MiscellaneousRoutingModule { 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/miscellaneous.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-miscellaneous', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class MiscellaneousComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/miscellaneous.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { NbButtonModule, NbCardModule } from '@nebular/theme'; 3 | 4 | import { ThemeModule } from '../../@theme/theme.module'; 5 | import { MiscellaneousRoutingModule } from './miscellaneous-routing.module'; 6 | import { MiscellaneousComponent } from './miscellaneous.component'; 7 | import { NotFoundComponent } from './not-found/not-found.component'; 8 | import { TranslateModule } from '@ngx-translate/core'; 9 | 10 | @NgModule({ 11 | imports: [ 12 | ThemeModule, 13 | NbCardModule, 14 | NbButtonModule, 15 | MiscellaneousRoutingModule, 16 | TranslateModule 17 | ], 18 | declarations: [ 19 | MiscellaneousComponent, 20 | NotFoundComponent, 21 | ], 22 | }) 23 | export class MiscellaneousModule { } 24 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |
6 |

{{'miscellaneous.code' | translate}}

7 | {{'miscellaneous.message' | translate}} 8 | 11 |
12 |
13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | .flex-centered { 2 | margin: auto; 3 | } 4 | nb-card-body { 5 | display: flex; 6 | } 7 | 8 | .title { 9 | text-align: center; 10 | } 11 | 12 | .sub-title { 13 | text-align: center; 14 | display: block; 15 | margin-bottom: 3rem; 16 | } 17 | 18 | .home-button { 19 | margin-bottom: 2rem; 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/miscellaneous/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'ngx-not-found', 6 | styleUrls: ['./not-found.component.scss'], 7 | templateUrl: './not-found.component.html', 8 | }) 9 | export class NotFoundComponent { 10 | 11 | constructor(private router: Router) { 12 | } 13 | 14 | goToHome() { 15 | this.router.navigate(['pages/dashboard']); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/pages/pages.component.scss: -------------------------------------------------------------------------------- 1 | @import '../@theme/styles/themes'; 2 | 3 | @include nb-install-component() { 4 | router-outlet + * { 5 | display: block; 6 | animation: fade 1s; 7 | 8 | @keyframes fade { 9 | from { 10 | opacity: 0; 11 | } 12 | 13 | to { 14 | opacity: 1; 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/pages/pages.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { NbMenuModule } from '@nebular/theme'; 3 | 4 | import { ThemeModule } from '../@theme/theme.module'; 5 | import { PagesComponent } from './pages.component'; 6 | import { DefaultSettingsModule } from './default_settings/default_settings.module'; 7 | import { InFaxModule } from './infax/infax.module'; 8 | import { ChangePasswordModule } from './changepassword/changepassword.module'; 9 | import { DashboardModule } from './dashboard/dashboard.module'; 10 | import { PagesRoutingModule } from './pages-routing.module'; 11 | import { MiscellaneousModule } from './miscellaneous/miscellaneous.module'; 12 | import { TransmissionModule } from './transmission/transmission.module'; 13 | import { FaxSettingsModule } from './faxsettings/faxsettings.module'; 14 | import { IncomingCIDNumberModule } from './incoming_cid_number/incoming_cid_number.module'; 15 | 16 | 17 | @NgModule({ 18 | imports: [ 19 | PagesRoutingModule, 20 | ThemeModule, 21 | NbMenuModule, 22 | DashboardModule, 23 | TransmissionModule, 24 | DefaultSettingsModule, 25 | InFaxModule, 26 | ChangePasswordModule, 27 | IncomingCIDNumberModule, 28 | FaxSettingsModule 29 | ], 30 | declarations: [ 31 | PagesComponent, 32 | ], 33 | }) 34 | export class PagesModule { 35 | } 36 | -------------------------------------------------------------------------------- /src/app/pages/provider/provider-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | 7 | .example-header { 8 | min-height: 64px; 9 | display: flex; 10 | align-items: center; 11 | padding-left: 24px; 12 | font-size: 20px; 13 | } 14 | 15 | .mat-table { 16 | overflow: auto; 17 | max-height: 500px; 18 | } 19 | 20 | .mat-header-cell .mat-sort-header-sorted { 21 | color: black; 22 | } 23 | 24 | .cdk-visually-hidden { 25 | border: 0; 26 | clip: rect(0 0 0 0); 27 | height: 1px; 28 | margin: -1px; 29 | overflow: hidden; 30 | padding: 0; 31 | position: absolute; 32 | width: 1px; 33 | } 34 | 35 | .example-button-row { 36 | display: flex; 37 | align-items: center; 38 | justify-content: space-around; 39 | } 40 | 41 | .mat-form-field { 42 | font-size: 14px; 43 | flex-grow: 1; 44 | margin-left: 32px; 45 | } 46 | a:hover { 47 | color: rgb(10, 238, 10); 48 | // color: darkblue; 49 | } 50 | 51 | .cc { 52 | width: 40%; 53 | } 54 | -------------------------------------------------------------------------------- /src/app/pages/provider/provider-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Provider } from './provider'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class ProviderDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Provider[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aProvider: Provider[]) { 10 | const providerData = aProvider.slice(); 11 | this.dataChange.next(providerData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/provider/provider-form-component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/provider/provider-form-component.scss -------------------------------------------------------------------------------- /src/app/pages/provider/provider-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ProviderComponent } from './provider.component'; 5 | import { FormsProviderComponent } from './provider-component'; 6 | import { AddProviderComponent } from './provider-form-component'; 7 | 8 | const routes: Routes = [{ 9 | path: '', 10 | component: ProviderComponent, 11 | children: [{ 12 | path: 'provider', 13 | component: FormsProviderComponent, 14 | }, { 15 | path: 'provider/new', 16 | component: AddProviderComponent, 17 | }, { 18 | path: 'provider/:id', 19 | component: AddProviderComponent, 20 | }, { 21 | path: 'provider/:id/delete', 22 | component: AddProviderComponent, 23 | }], 24 | }]; 25 | 26 | @NgModule({ 27 | imports: [ 28 | RouterModule.forChild(routes), 29 | ], 30 | exports: [ 31 | RouterModule, 32 | ], 33 | }) 34 | export class ProviderRoutingModule { 35 | 36 | } 37 | 38 | export const routedComponents = [ 39 | ProviderComponent, 40 | FormsProviderComponent, 41 | AddProviderComponent, 42 | ]; 43 | -------------------------------------------------------------------------------- /src/app/pages/provider/provider.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class ProviderComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/provider/provider.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { ProviderRoutingModule, routedComponents } from './provider-routing.module'; 5 | import { MatTableModule } from '@angular/material/table'; 6 | import { CdkTableModule } from '@angular/cdk/table'; 7 | import { MatSortModule } from '@angular/material/sort'; 8 | import { MatIconModule } from '@angular/material/icon'; 9 | import { MatButtonModule } from '@angular/material/button'; 10 | import { MatPaginatorModule } from '@angular/material/paginator'; 11 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 12 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 13 | import { TranslateModule } from '@ngx-translate/core'; 14 | 15 | 16 | @NgModule({ 17 | imports: [ 18 | ThemeModule, 19 | ProviderRoutingModule, 20 | MatTableModule, 21 | CdkTableModule, 22 | MatSortModule, 23 | MatButtonModule, 24 | MatPaginatorModule, 25 | NbCardModule, 26 | FormsModule, 27 | ReactiveFormsModule, 28 | MatIconModule, 29 | NbIconModule, 30 | TranslateModule 31 | ], 32 | declarations: [ 33 | ...routedComponents, 34 | ], 35 | }) 36 | export class ProviderModule { } 37 | -------------------------------------------------------------------------------- /src/app/pages/provider/provider.ts: -------------------------------------------------------------------------------- 1 | export class Provider { 2 | provider_id: number; 3 | name: string; 4 | gateway_flag: number; 5 | // service_flag: number; 6 | node_id: number; 7 | host: number; 8 | port: number; 9 | username: string; 10 | password: string; 11 | dialstring: string; 12 | prefix: number; 13 | settings: string; 14 | register: boolean; 15 | weight: number; 16 | type: any; 17 | active: any; 18 | } 19 | -------------------------------------------------------------------------------- /src/app/pages/sendfax/faxlogs.ts: -------------------------------------------------------------------------------- 1 | export class Faxlogs { 2 | id : number; 3 | faxid : number; 4 | sourcename : string; 5 | sourcephone : string; 6 | destination : string; 7 | destinationname : string; 8 | faxlogs: any; 9 | faxstatus : string; 10 | duration : string; 11 | pending : string; 12 | processing : string; 13 | result : string; 14 | origin : string; 15 | date : Date; 16 | } 17 | 18 | 19 | export class Faxactivity { 20 | id: number; 21 | faxid : number; 22 | faxactivity : string; 23 | date : Date; 24 | } -------------------------------------------------------------------------------- /src/app/pages/sendfax/sendfax-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | max-height: 500px; 6 | } 7 | 8 | .example-header { 9 | min-height: 64px; 10 | display: flex; 11 | align-items: center; 12 | padding-left: 24px; 13 | font-size: 20px; 14 | } 15 | 16 | .mat-table { 17 | overflow: auto; 18 | max-height: 500px; 19 | } 20 | 21 | .mat-sort-header-sorted { 22 | color: black; 23 | } 24 | 25 | .cdk-visually-hidden { 26 | border: 0; 27 | clip: rect(0 0 0 0); 28 | height: 1px; 29 | margin: -1px; 30 | overflow: hidden; 31 | padding: 0; 32 | position: absolute; 33 | width: 1px; 34 | } 35 | 36 | .example-button-row { 37 | display: flex; 38 | align-items: center; 39 | justify-content: space-around; 40 | } 41 | 42 | .mat-form-field { 43 | font-size: 14px; 44 | flex-grow: 1; 45 | margin-left: 32px; 46 | } 47 | 48 | .mat-cell, .mat-header-cell { 49 | overflow: hidden; 50 | word-wrap: break-word; 51 | } 52 | 53 | a:hover { 54 | color: rgb(10, 238, 10); 55 | } 56 | 57 | .fa-trash:hover { 58 | color: rgb(138, 4, 4); 59 | } 60 | 61 | .mat-input-container { 62 | font-size: 14px; 63 | flex-grow: 1; 64 | margin-left: 32px; 65 | margin-top: 8px; 66 | } 67 | 68 | .cc { 69 | width: 40%; 70 | } 71 | 72 | td:first-child { 73 | width:200px; 74 | } 75 | -------------------------------------------------------------------------------- /src/app/pages/sendfax/sendfax-database.component.ts: -------------------------------------------------------------------------------- 1 | import { SendFax } from './sendfax'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class SendFaxDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): SendFax[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aSendFax: SendFax[]) { 10 | const sendFaxData = aSendFax.slice(); 11 | this.dataChange.next(sendFaxData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/sendfax/sendfax-form-component.scss: -------------------------------------------------------------------------------- 1 | .my-drop-zone { border: dotted 3px lightgray; } 2 | 3 | .nv-file-over { border: dotted 3px red; } /* Default class applied to drop zones on over */ 4 | 5 | .another-file-over-class { border: dotted 3px green; } 6 | 7 | 8 | html, body { height: 100%; } 9 | 10 | 11 | .smmmm { 12 | font-size: 25px; 13 | display: inline; 14 | color: red; 15 | } 16 | 17 | 18 | .gmmmm { 19 | font-size: 25px; 20 | display: inline; 21 | color: green; 22 | } 23 | 24 | 25 | .cmmmm { 26 | font-size: 25px; 27 | display: inline; 28 | color: blue; 29 | } 30 | 31 | 32 | .classcard { 33 | min-height: 18rem; 34 | } 35 | -------------------------------------------------------------------------------- /src/app/pages/sendfax/sendfax-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { SendFaxComponent } from './sendfax.component'; 5 | import { FormsSendFaxComponent } from './sendfax-component'; 6 | import { AddSendFaxComponent } from './sendfax-form-component'; 7 | 8 | 9 | const routes: Routes = [{ 10 | path: '', 11 | component: SendFaxComponent, 12 | children: [{ 13 | path: 'sendfax', 14 | component: FormsSendFaxComponent, 15 | }, { 16 | path: 'sendfax/new', 17 | component: AddSendFaxComponent, 18 | }], 19 | }]; 20 | 21 | @NgModule({ 22 | imports: [ 23 | RouterModule.forChild(routes), 24 | ], 25 | exports: [ 26 | RouterModule, 27 | ], 28 | }) 29 | export class SendFaxRoutingModule { 30 | 31 | } 32 | 33 | export const routedComponents = [ 34 | SendFaxComponent, 35 | FormsSendFaxComponent, 36 | AddSendFaxComponent, 37 | ]; 38 | -------------------------------------------------------------------------------- /src/app/pages/sendfax/sendfax.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class SendFaxComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/sendfax/sendfax.ts: -------------------------------------------------------------------------------- 1 | export class SendFax { 2 | program_id: number; 3 | title: string; 4 | transmission_id: number; 5 | service_flag: number; 6 | account_id: number; 7 | phone: any; 8 | email: string; 9 | contact_id: any; 10 | origin: string; 11 | direction: string; 12 | status: string; 13 | response: string; 14 | program_type: string; 15 | try_allowed: any; 16 | fax_from: any; 17 | fax_to: any; 18 | job_id: any; 19 | result: any; 20 | last_run: any; 21 | contact: { 22 | phone:any; 23 | } 24 | contact_phone:any; 25 | } 26 | 27 | export class DocumentProgram { 28 | program_id: number; 29 | document_id: number; 30 | name: string; 31 | } 32 | 33 | -------------------------------------------------------------------------------- /src/app/pages/transmission/senddocument/transmission-senddocument.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/transmission/senddocument/transmission-senddocument.scss -------------------------------------------------------------------------------- /src/app/pages/transmission/sendvoice/transmission-sendvoice.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/app/pages/transmission/sendvoice/transmission-sendvoice.scss -------------------------------------------------------------------------------- /src/app/pages/transmission/status-card/status-card.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-status-card', 5 | styleUrls: ['./status-card.component.scss'], 6 | template: ` 7 | 8 |
9 |
10 | 11 |
12 |
13 | 14 |
15 |
{{ title }}
16 |
17 |
18 | `, 19 | }) 20 | export class StatusCardComponent { 21 | 22 | @Input() title: string; 23 | @Input() type: string; 24 | @Input() on = true; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/transmission/transmission-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | } 6 | 7 | .example-header { 8 | min-height: 64px; 9 | display: flex; 10 | align-items: center; 11 | padding-left: 24px; 12 | font-size: 20px; 13 | } 14 | 15 | .mat-table { 16 | overflow: auto; 17 | max-height: 500px; 18 | } 19 | 20 | .mat-header-cell .mat-sort-header-sorted { 21 | color: black; 22 | } 23 | 24 | .cdk-visually-hidden { 25 | border: 0; 26 | clip: rect(0 0 0 0); 27 | height: 1px; 28 | margin: -1px; 29 | overflow: hidden; 30 | padding: 0; 31 | position: absolute; 32 | width: 1px; 33 | } 34 | 35 | .example-button-row { 36 | display: flex; 37 | align-items: center; 38 | justify-content: space-around; 39 | } 40 | 41 | .mat-form-field { 42 | font-size: 14px; 43 | flex-grow: 1; 44 | margin-left: 32px; 45 | 46 | } 47 | 48 | a:hover { 49 | color: rgb(10, 238, 10); 50 | } 51 | 52 | .fa-trash:hover { 53 | color: rgb(138, 4, 4); 54 | } 55 | 56 | .fa-play-circle:hover { 57 | color: darkblue; 58 | } 59 | 60 | .fa-stop:hover { 61 | color: darkblue; 62 | } 63 | -------------------------------------------------------------------------------- /src/app/pages/transmission/transmission-database.component.ts: -------------------------------------------------------------------------------- 1 | import { Transmission } from './transmission'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class TransmissionDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): Transmission[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aTransmission: Transmission[]) { 10 | const transmissionData = aTransmission.slice(); 11 | this.dataChange.next(transmissionData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/transmission/transmission-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { TransmissionComponent } from './transmission.component'; 5 | import { FormsTransmissionComponent } from './transmission-component'; 6 | import { AddTransSendDocumentComponent } from './senddocument/transmission-senddocument'; 7 | import { AddTransSendRecordingComponent } from './sendvoice/transmission-sendvoice'; 8 | 9 | 10 | const routes: Routes = [{ 11 | path: '', 12 | component: TransmissionComponent, 13 | children: [{ 14 | path: 'transmissions', 15 | component: FormsTransmissionComponent, 16 | }, { 17 | path: 'transsenddocument/new', 18 | component: AddTransSendDocumentComponent, 19 | }, { 20 | path: 'transsendvoice/new', 21 | component: AddTransSendRecordingComponent, 22 | }], 23 | }]; 24 | 25 | @NgModule({ 26 | imports: [ 27 | RouterModule.forChild(routes), 28 | ], 29 | exports: [ 30 | RouterModule, 31 | ], 32 | }) 33 | export class TransmissionRoutingModule { 34 | 35 | } 36 | 37 | export const routedComponents = [ 38 | TransmissionComponent, 39 | FormsTransmissionComponent, 40 | AddTransSendDocumentComponent, 41 | AddTransSendRecordingComponent 42 | ]; 43 | -------------------------------------------------------------------------------- /src/app/pages/transmission/transmission.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class TransmissionComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/transmission/transmission.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { TransmissionRoutingModule, routedComponents } from './transmission-routing.module'; 5 | import { MatTableModule } from '@angular/material/table'; 6 | import { CdkTableModule } from '@angular/cdk/table'; 7 | import { MatSortModule } from '@angular/material/sort'; 8 | import { MatIconModule } from '@angular/material/icon'; 9 | import { MatPaginatorModule } from '@angular/material/paginator'; 10 | import { MatButtonModule } from '@angular/material/button'; 11 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 12 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 13 | import { StatusCardComponent } from './status-card/status-card.component'; 14 | 15 | @NgModule({ 16 | imports: [ 17 | ThemeModule, 18 | TransmissionRoutingModule, 19 | MatTableModule, 20 | MatButtonModule, 21 | CdkTableModule, 22 | MatSortModule, 23 | MatPaginatorModule, 24 | NbCardModule, 25 | FormsModule, 26 | ReactiveFormsModule, 27 | MatIconModule, 28 | NbIconModule, 29 | ], 30 | declarations: [ 31 | ...routedComponents, 32 | StatusCardComponent 33 | ], 34 | }) 35 | export class TransmissionModule {} -------------------------------------------------------------------------------- /src/app/pages/transmission/transmission.ts: -------------------------------------------------------------------------------- 1 | export class Transmission { 2 | program_id: number; 3 | title: string; 4 | transmission_id: number; 5 | service_flag: number; 6 | account_id: number; 7 | phone: number; 8 | email: string; 9 | contact_id: number; 10 | origin: string; 11 | direction: string; 12 | status: string; 13 | response: string; 14 | program_type: string; 15 | try_allowed: any; 16 | fax_from: any; 17 | fax_to: any; 18 | job_id: any; 19 | result: any; 20 | last_run:any; 21 | contact: { 22 | phone:any; 23 | } 24 | contact_phone:any; 25 | } 26 | 27 | export class SMSProgram { 28 | program_id: number; 29 | text_id: number; 30 | name: string; 31 | } 32 | 33 | export class TemplateProgram { 34 | program_id: number; 35 | template_id: number; 36 | name: string; 37 | } 38 | 39 | export class DocumentProgram { 40 | program_id: number; 41 | document_id: number; 42 | name: string; 43 | } 44 | 45 | export class VoiceCallProgram { 46 | program_id: number; 47 | recording_id: number; 48 | name: string; 49 | } 50 | 51 | export class Program { 52 | program_id: number; 53 | parent_id: number; 54 | name: string; 55 | type: string; 56 | text_id: number; 57 | template_id: number; 58 | document_id: number; 59 | contact_id: number; 60 | recording_id: number; 61 | } 62 | 63 | export class IVRProgram { 64 | program_id: number; 65 | name: string; 66 | } 67 | -------------------------------------------------------------------------------- /src/app/pages/user/password.match.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, forwardRef, Attribute } from '@angular/core'; 2 | import { NG_VALIDATORS, Validator, Validators, AbstractControl, ValidatorFn } from '@angular/forms'; 3 | 4 | @Directive({ 5 | selector: '[ngx_validateEqual][formControlName],[ngx_validateEqual][formControl],[ngx_validateEqual][ngModel]', 6 | providers: [{ provide: NG_VALIDATORS, useExisting: forwardRef(() => EqualValidator), multi: true }], 7 | }) 8 | 9 | export class EqualValidator implements Validator { 10 | constructor( @Attribute('ngx_validateEqual') public ngx_validateEqual: string) {} 11 | 12 | validate(c: AbstractControl): { [key: string]: any } { 13 | // self value (e.g. retype password) 14 | const v = c.value; 15 | 16 | // control value (e.g. password) 17 | const e = c.root.get(this.ngx_validateEqual); 18 | 19 | // value not equal 20 | if (e && v !== e.value) { 21 | return ({ngx_validateEqual: false}); 22 | } 23 | return null; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/app/pages/user/user-component.scss: -------------------------------------------------------------------------------- 1 | .example-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-width: 300px; 5 | max-height: 500px; 6 | } 7 | 8 | .example-header { 9 | min-height: 64px; 10 | display: flex; 11 | align-items: center; 12 | padding-left: 24px; 13 | font-size: 20px; 14 | } 15 | 16 | .mat-table { 17 | overflow: auto; 18 | max-height: 500px; 19 | } 20 | 21 | .mat-sort-header-sorted { 22 | color: black; 23 | } 24 | 25 | .cdk-visually-hidden { 26 | border: 0; 27 | clip: rect(0 0 0 0); 28 | height: 1px; 29 | margin: -1px; 30 | overflow: hidden; 31 | padding: 0; 32 | position: absolute; 33 | width: 1px; 34 | } 35 | 36 | .example-button-row { 37 | display: flex; 38 | align-items: center; 39 | justify-content: space-around; 40 | } 41 | 42 | .mat-form-field { 43 | font-size: 14px; 44 | flex-grow: 1; 45 | margin-left: 32px; 46 | } 47 | 48 | .mat-cell, .mat-header-cell { 49 | overflow: hidden; 50 | word-wrap: break-word; 51 | } 52 | 53 | a:hover { 54 | color: rgb(10, 238, 10); 55 | } 56 | 57 | .fa-trash:hover { 58 | color: rgb(138, 4, 4); 59 | } 60 | 61 | .mat-input-container { 62 | font-size: 14px; 63 | flex-grow: 1; 64 | margin-left: 32px; 65 | margin-top: 8px; 66 | } 67 | 68 | .cc { 69 | width: 40%; 70 | } 71 | -------------------------------------------------------------------------------- /src/app/pages/user/user-database.component.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user'; 2 | import { BehaviorSubject} from 'rxjs/BehaviorSubject'; 3 | 4 | export class UserDatabase { 5 | dataChange: BehaviorSubject = new BehaviorSubject([]); 6 | get data(): User[] { 7 | return this.dataChange.value; 8 | } 9 | constructor(private aUser: User[]) { 10 | const userData = aUser.slice(); 11 | this.dataChange.next(userData); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/pages/user/user-form-component.scss: -------------------------------------------------------------------------------- 1 | .mat-radio-button ~ .mat-radio-button { 2 | padding-right: 16px; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /src/app/pages/user/user-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { UserComponent } from './user.component'; 5 | import { FormsUserComponent } from './user-component'; 6 | import { AddUserComponent } from './user-form-component'; 7 | 8 | const routes: Routes = [{ 9 | path: '', 10 | component: UserComponent, 11 | children: [{ 12 | path: 'user', 13 | component: FormsUserComponent, 14 | }, { 15 | path: 'user/new', 16 | component: AddUserComponent, 17 | }, { 18 | path: 'user/:id', 19 | component: AddUserComponent, 20 | }, { 21 | path: 'user/:id/delete', 22 | component: AddUserComponent, 23 | }], 24 | }]; 25 | 26 | @NgModule({ 27 | imports: [ 28 | RouterModule.forChild(routes), 29 | ], 30 | exports: [ 31 | RouterModule, 32 | ], 33 | }) 34 | export class UserRoutingModule { 35 | 36 | } 37 | 38 | export const routedComponents = [ 39 | UserComponent, 40 | FormsUserComponent, 41 | AddUserComponent, 42 | ]; 43 | -------------------------------------------------------------------------------- /src/app/pages/user/user.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ngx-form-elements', 5 | template: ` 6 | 7 | `, 8 | }) 9 | export class UserComponent { 10 | } 11 | -------------------------------------------------------------------------------- /src/app/pages/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ThemeModule } from '../../@theme/theme.module'; 4 | import { UserRoutingModule, routedComponents } from './user-routing.module'; 5 | import { MatTableModule } from '@angular/material/table'; 6 | import { CdkTableModule } from '@angular/cdk/table'; 7 | import { MatSortModule } from '@angular/material/sort'; 8 | import {MatIconModule} from '@angular/material/icon'; 9 | import {MatInputModule} from '@angular/material/input'; 10 | import { MatFormFieldModule } from '@angular/material/form-field'; 11 | import { MatButtonModule } from '@angular/material/button'; 12 | import { MatPaginatorModule } from '@angular/material/paginator'; 13 | import { MatRadioModule } from '@angular/material/radio'; 14 | import { EqualValidator } from './password.match.directive'; 15 | import { NbCardModule, NbIconModule } from '@nebular/theme'; 16 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 17 | import { TranslateModule } from '@ngx-translate/core'; 18 | 19 | @NgModule({ 20 | imports: [ 21 | ThemeModule, 22 | UserRoutingModule, 23 | MatTableModule, 24 | CdkTableModule, 25 | MatSortModule, 26 | MatButtonModule, 27 | MatPaginatorModule, 28 | MatRadioModule, 29 | NbCardModule, 30 | FormsModule, 31 | ReactiveFormsModule, 32 | MatIconModule, 33 | MatInputModule, 34 | MatFormFieldModule, 35 | NbIconModule, 36 | TranslateModule 37 | ], 38 | declarations: [ 39 | EqualValidator, 40 | ...routedComponents, 41 | ], 42 | }) 43 | export class UserModule { } 44 | 45 | -------------------------------------------------------------------------------- /src/app/pages/user/user.ts: -------------------------------------------------------------------------------- 1 | export class User { 2 | user_id: number; 3 | role_id: number; 4 | permission_id: number; 5 | username: string; 6 | password: any; 7 | first_name: string; 8 | last_name: string; 9 | phone: number; 10 | email: string; 11 | address: string; 12 | company: string; 13 | country_id: number; 14 | timezone_id: number; 15 | active: number; 16 | confirmPassword: any; 17 | } 18 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/config/config.dev.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "name": "dev" 4 | }, 5 | "apiServer": { 6 | "url": "http://172.17.0.3/api" 7 | } 8 | } -------------------------------------------------------------------------------- /src/assets/config/config.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "name": "prod" 4 | }, 5 | "apiServer": { 6 | "url": "https://demo.ictcore.org/api" 7 | } 8 | } -------------------------------------------------------------------------------- /src/assets/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-128x128.png -------------------------------------------------------------------------------- /src/assets/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-144x144.png -------------------------------------------------------------------------------- /src/assets/icons/icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-152x152.png -------------------------------------------------------------------------------- /src/assets/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-192x192.png -------------------------------------------------------------------------------- /src/assets/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-384x384.png -------------------------------------------------------------------------------- /src/assets/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-512x512.png -------------------------------------------------------------------------------- /src/assets/icons/icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-72x72.png -------------------------------------------------------------------------------- /src/assets/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/icons/icon-96x96.png -------------------------------------------------------------------------------- /src/assets/images/alan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/alan.png -------------------------------------------------------------------------------- /src/assets/images/camera1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/camera1.jpg -------------------------------------------------------------------------------- /src/assets/images/camera2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/camera2.jpg -------------------------------------------------------------------------------- /src/assets/images/camera3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/camera3.jpg -------------------------------------------------------------------------------- /src/assets/images/camera4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/camera4.jpg -------------------------------------------------------------------------------- /src/assets/images/cover1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/cover1.jpg -------------------------------------------------------------------------------- /src/assets/images/cover2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/cover2.jpg -------------------------------------------------------------------------------- /src/assets/images/cover3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/cover3.jpg -------------------------------------------------------------------------------- /src/assets/images/eva.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/eva.png -------------------------------------------------------------------------------- /src/assets/images/ictfax-logo-org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ictfax-logo-org.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/amd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/amd.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/answer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/answer.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/dnc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/dnc.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/getdigits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/getdigits.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/hangup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/hangup.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/incoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/incoming.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/make-a-call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/make-a-call.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/options.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/out-going.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/out-going.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/recording.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/recording.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/say_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/say_alpha.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/say_date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/say_date.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/say_digit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/say_digit.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/say_number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/say_number.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/say_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/say_time.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/setting.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/setvar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/setvar.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/start.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/transfer.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/tts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/tts.png -------------------------------------------------------------------------------- /src/assets/images/ivr/large/voice_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/large/voice_play.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/amd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/amd.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/answer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/answer.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/dnc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/dnc.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/edit.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/getdigits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/getdigits.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/hangup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/hangup.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/incoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/incoming.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/make a call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/make a call.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/options.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/outgoing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/outgoing.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/recording.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/recording.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/say_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/say_alpha.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/say_date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/say_date.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/say_digit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/say_digit.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/say_number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/say_number.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/say_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/say_time.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/setting.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/setvariable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/setvariable.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/transfer.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/tts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/tts.png -------------------------------------------------------------------------------- /src/assets/images/ivr/small/voice_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/ivr/small/voice_play.png -------------------------------------------------------------------------------- /src/assets/images/jack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/jack.png -------------------------------------------------------------------------------- /src/assets/images/kate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/kate.png -------------------------------------------------------------------------------- /src/assets/images/kitten-corporate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/kitten-corporate.png -------------------------------------------------------------------------------- /src/assets/images/kitten-cosmic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/kitten-cosmic.png -------------------------------------------------------------------------------- /src/assets/images/kitten-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/kitten-dark.png -------------------------------------------------------------------------------- /src/assets/images/kitten-default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/kitten-default.png -------------------------------------------------------------------------------- /src/assets/images/lee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/lee.png -------------------------------------------------------------------------------- /src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/logo.png -------------------------------------------------------------------------------- /src/assets/images/nick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/nick.png -------------------------------------------------------------------------------- /src/assets/images/square_pattern.svg: -------------------------------------------------------------------------------- 1 | Asset 2_svg -------------------------------------------------------------------------------- /src/assets/images/square_pattern_cosmic.svg: -------------------------------------------------------------------------------- 1 | Asset 2_svg 2 | -------------------------------------------------------------------------------- /src/assets/images/team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/images/team.png -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /src/assets/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /src/assets/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/assets/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | export const environment = { 7 | production: true, 8 | API_URL: '/api', 9 | }; 10 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | // The file contents for the current environment will overwrite these during build. 7 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 8 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 9 | // The list of which env maps to which file can be found in `.angular-cli.json`. 10 | 11 | export const environment = { 12 | production: false, 13 | API_URL: '/api' 14 | }; 15 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/favicon.ico -------------------------------------------------------------------------------- /src/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ictinnovations/ictdialer/52fb2d9457f37b91492c2d99b65228be87a70d18/src/favicon.png -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ICTFax 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Loading... 17 | 18 | 19 |
20 |
21 | 22 |
23 |
24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | import { enableProdMode } from '@angular/core'; 7 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 8 | 9 | import { AppModule } from './app/app.module'; 10 | import { environment } from './environments/environment'; 11 | 12 | if (environment.production) { 13 | enableProdMode(); 14 | } 15 | 16 | platformBrowserDynamic().bootstrapModule(AppModule) 17 | .catch(err => console.error(err)); 18 | -------------------------------------------------------------------------------- /src/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ngx-admin-demo", 3 | "short_name": "ngx-admin-demo", 4 | "theme_color": "#1976d2", 5 | "background_color": "#fafafa", 6 | "display": "standalone", 7 | "scope": "./", 8 | "start_url": "./", 9 | "icons": [ 10 | { 11 | "src": "assets/icons/icon-72x72.png", 12 | "sizes": "72x72", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "assets/icons/icon-96x96.png", 17 | "sizes": "96x96", 18 | "type": "image/png" 19 | }, 20 | { 21 | "src": "assets/icons/icon-128x128.png", 22 | "sizes": "128x128", 23 | "type": "image/png" 24 | }, 25 | { 26 | "src": "assets/icons/icon-144x144.png", 27 | "sizes": "144x144", 28 | "type": "image/png" 29 | }, 30 | { 31 | "src": "assets/icons/icon-152x152.png", 32 | "sizes": "152x152", 33 | "type": "image/png" 34 | }, 35 | { 36 | "src": "assets/icons/icon-192x192.png", 37 | "sizes": "192x192", 38 | "type": "image/png" 39 | }, 40 | { 41 | "src": "assets/icons/icon-384x384.png", 42 | "sizes": "384x384", 43 | "type": "image/png" 44 | }, 45 | { 46 | "src": "assets/icons/icon-512x512.png", 47 | "sizes": "512x512", 48 | "type": "image/png" 49 | } 50 | ] 51 | } -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 8 | 9 | import 'zone.js/dist/long-stack-trace-zone'; 10 | import 'zone.js/dist/proxy.js'; 11 | import 'zone.js/dist/sync-test'; 12 | import 'zone.js/dist/jasmine-patch'; 13 | import 'zone.js/dist/async-test'; 14 | import 'zone.js/dist/fake-async-test'; 15 | import { getTestBed } from '@angular/core/testing'; 16 | import { 17 | BrowserDynamicTestingModule, 18 | platformBrowserDynamicTesting, 19 | } from '@angular/platform-browser-dynamic/testing'; 20 | 21 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. 22 | declare const __karma__: any; 23 | declare const require: any; 24 | 25 | // Prevent Karma from running prematurely. 26 | __karma__.loaded = function () {}; 27 | 28 | // First, initialize the Angular testing environment. 29 | getTestBed().initTestEnvironment( 30 | BrowserDynamicTestingModule, 31 | platformBrowserDynamicTesting(), { 32 | teardown: { destroyAfterEach: false } 33 | }, 34 | ); 35 | // Then we find all the tests. 36 | const context = require.context('./', true, /\.spec\.ts$/); 37 | // And load the modules. 38 | context.keys().map(context); 39 | // Finally, start Karma to run the tests. 40 | __karma__.start(); 41 | -------------------------------------------------------------------------------- /src/themes.scss: -------------------------------------------------------------------------------- 1 | @forward '@nebular/theme/styles/theming'; 2 | @use '@nebular/theme/styles/theming' as *; 3 | @use '@nebular/theme/styles/themes/default'; 4 | 5 | $nb-themes: nb-register-theme(( 6 | 7 | // add your variables here like: 8 | 9 | // color-primary-100: #f2f6ff, 10 | // color-primary-200: #d9e4ff, 11 | // color-primary-300: #a6c1ff, 12 | // color-primary-400: #598bff, 13 | // color-primary-500: #3366ff, 14 | // color-primary-600: #274bdb, 15 | // color-primary-700: #1a34b8, 16 | // color-primary-800: #102694, 17 | // color-primary-900: #091c7a, 18 | 19 | ), default, default); 20 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "paths": { 7 | "@angular/*": [ 8 | "../node_modules/@angular/*" 9 | ], 10 | "@nebular/*": [ 11 | "../node_modules/@nebular/*" 12 | ] 13 | } 14 | }, 15 | "exclude": [ 16 | "test.ts", 17 | "**/*.spec.ts", 18 | "../node_modules/@nebular/**/*.spec.ts" 19 | ], 20 | "include": [ 21 | "../src/*.ts", 22 | "../src/**/*.ts", 23 | "../node_modules/@nebular/**/*.ts" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "types": [ 7 | "jasmine", 8 | "node" 9 | ] 10 | }, 11 | "files": [ 12 | "test.ts", 13 | "polyfills.ts" 14 | ], 15 | "include": [ 16 | "**/*.spec.ts", 17 | "**/*.d.ts" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Akveo. All Rights Reserved. 4 | * Licensed under the MIT License. See License.txt in the project root for license information. 5 | */ 6 | 7 | /* SystemJS module definition */ 8 | declare var module: NodeModule; 9 | interface NodeModule { 10 | id: string; 11 | } 12 | 13 | declare var tinymce: any; 14 | 15 | declare var echarts: any; 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "importHelpers": true, 5 | "module": "es2020", 6 | "outDir": "./dist/out-tsc", 7 | "sourceMap": true, 8 | "declaration": false, 9 | "moduleResolution": "node", 10 | "experimentalDecorators": true, 11 | "target": "es2015", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2017", 17 | "dom" 18 | ], 19 | "plugins": [ 20 | { "name": "tslint-language-service"} 21 | ] 22 | } 23 | } 24 | --------------------------------------------------------------------------------