├── .browserslistrc
├── .editorconfig
├── .github
├── .ISSUE_TEMPLATE
│ ├── 01_bug_report.yml
│ └── 02_feature_request.yml
├── scripts
│ └── bumpversion.sh
└── workflows
│ └── main.yml
├── .gitignore
├── .gitlab-ci.yml
├── Dockerfile
├── LICENSE
├── README.md
├── angular.json
├── custom-widgets.json
├── karma.conf.js
├── package.json
├── src
├── VERSION.ts
├── app
│ ├── app-routing.module.ts
│ ├── app.component.html
│ ├── app.component.ts
│ ├── app.material-module.ts
│ ├── app.module.ts
│ ├── app.routing.ts
│ ├── components
│ │ ├── controls
│ │ │ ├── alert
│ │ │ │ ├── alert-overlay.service.ts
│ │ │ │ ├── alert-ref.ts
│ │ │ │ ├── alert-source.component.ts
│ │ │ │ ├── alert.component.html
│ │ │ │ ├── alert.component.scss
│ │ │ │ ├── alert.component.ts
│ │ │ │ ├── alert.module.ts
│ │ │ │ └── alert.tokens.ts
│ │ │ ├── codejar-wrapper
│ │ │ │ ├── codejar-wrapper.component.html
│ │ │ │ ├── codejar-wrapper.component.scss
│ │ │ │ └── codejar-wrapper.component.ts
│ │ │ ├── copy
│ │ │ │ ├── copy.component.html
│ │ │ │ ├── copy.component.scss
│ │ │ │ ├── copy.component.ts
│ │ │ │ └── copy.module.ts
│ │ │ ├── custom-ag-grid
│ │ │ │ ├── custom-ag-grid.component.html
│ │ │ │ ├── custom-ag-grid.component.scss
│ │ │ │ ├── custom-ag-grid.component.ts
│ │ │ │ ├── custom-ag-grid.module.ts
│ │ │ │ ├── drag-drop-list
│ │ │ │ │ ├── drag-drop-list.component.html
│ │ │ │ │ ├── drag-drop-list.component.scss
│ │ │ │ │ └── drag-drop-list.component.ts
│ │ │ │ ├── setting-button.html
│ │ │ │ ├── setting-button.scss
│ │ │ │ └── setting-button.ts
│ │ │ ├── custom-table
│ │ │ │ ├── custom-table.component.css
│ │ │ │ ├── custom-table.component.html
│ │ │ │ ├── custom-table.component.ts
│ │ │ │ └── custom-table.module.ts
│ │ │ ├── daterangepicker
│ │ │ │ ├── daterangepicker-theme.scss
│ │ │ │ ├── daterangepicker.component.html
│ │ │ │ ├── daterangepicker.component.scss
│ │ │ │ ├── daterangepicker.component.ts
│ │ │ │ ├── daterangepicker.config.ts
│ │ │ │ ├── daterangepicker.directive.ts
│ │ │ │ ├── daterangepicker.module.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── locale.service.ts
│ │ │ │ └── timezone.pipe.ts
│ │ │ ├── flow-tooltip
│ │ │ │ ├── flow-tooltip.component.html
│ │ │ │ ├── flow-tooltip.component.scss
│ │ │ │ ├── flow-tooltip.component.ts
│ │ │ │ └── flow-tooltip.module.ts
│ │ │ ├── full-screen
│ │ │ │ ├── full-screen.component.html
│ │ │ │ ├── full-screen.component.scss
│ │ │ │ └── full-screen.component.ts
│ │ │ ├── index.ts
│ │ │ ├── loading-circle
│ │ │ │ ├── loading-circle.component.html
│ │ │ │ ├── loading-circle.component.scss
│ │ │ │ └── loading-circle.component.ts
│ │ │ ├── loki-results
│ │ │ │ ├── loki-results.component.html
│ │ │ │ ├── loki-results.component.scss
│ │ │ │ ├── loki-results.component.ts
│ │ │ │ ├── loki-results.module.ts
│ │ │ │ └── moment.pipe.ts
│ │ │ ├── modal-resizable
│ │ │ │ ├── modal-resizable.component.html
│ │ │ │ ├── modal-resizable.component.scss
│ │ │ │ ├── modal-resizable.component.ts
│ │ │ │ ├── modal-resizable.model.ts
│ │ │ │ ├── modal-resizable.module.ts
│ │ │ │ ├── modal.service.ts
│ │ │ │ └── window
│ │ │ │ │ ├── window.component.html
│ │ │ │ │ ├── window.component.scss
│ │ │ │ │ ├── window.component.ts
│ │ │ │ │ └── window.service.ts
│ │ │ ├── transaction-filter
│ │ │ │ ├── transaction-filter.component.html
│ │ │ │ ├── transaction-filter.component.scss
│ │ │ │ ├── transaction-filter.component.ts
│ │ │ │ ├── transaction-filter.module.ts
│ │ │ │ └── transaction-filter.service.ts
│ │ │ ├── transaction-graph-settings
│ │ │ │ ├── transaction-graph-settings.component.html
│ │ │ │ ├── transaction-graph-settings.component.scss
│ │ │ │ └── transaction-graph-settings.component.ts
│ │ │ ├── transaction-info
│ │ │ │ ├── transaction-info.component.html
│ │ │ │ ├── transaction-info.component.scss
│ │ │ │ ├── transaction-info.component.ts
│ │ │ │ └── transaction-info.module.ts
│ │ │ ├── update-alert
│ │ │ │ ├── update-alert.component.html
│ │ │ │ ├── update-alert.component.scss
│ │ │ │ ├── update-alert.component.ts
│ │ │ │ ├── update-alert.service.spec.ts
│ │ │ │ └── update-alert.service.ts
│ │ │ └── webshark
│ │ │ │ ├── html.pipe.ts
│ │ │ │ ├── webshark-dictionary-api.service.ts
│ │ │ │ ├── webshark-dictionary.ts
│ │ │ │ ├── webshark.component.html
│ │ │ │ ├── webshark.component.scss
│ │ │ │ ├── webshark.component.ts
│ │ │ │ └── webshark.module.ts
│ │ ├── dashboard
│ │ │ ├── add-dashboard-dialog
│ │ │ │ ├── add-dashboard-dialog.component.html
│ │ │ │ ├── add-dashboard-dialog.component.scss
│ │ │ │ ├── add-dashboard-dialog.component.ts
│ │ │ │ └── url-warning-dialog
│ │ │ │ │ ├── url-warning-dialog.component.html
│ │ │ │ │ ├── url-warning-dialog.component.scss
│ │ │ │ │ └── url-warning-dialog.component.ts
│ │ │ ├── add-dialog
│ │ │ │ ├── add-dialog.component.html
│ │ │ │ ├── add-dialog.component.scss
│ │ │ │ └── add-dialog.component.ts
│ │ │ ├── dashboard.component.html
│ │ │ ├── dashboard.component.scss
│ │ │ ├── dashboard.component.ts
│ │ │ ├── delete-dialog
│ │ │ │ ├── delete-dialog.component.html
│ │ │ │ ├── delete-dialog.component.scss
│ │ │ │ └── delete-dialog.component.ts
│ │ │ ├── edit-dialog
│ │ │ │ ├── edit-dialog.component.html
│ │ │ │ ├── edit-dialog.component.scss
│ │ │ │ └── edit-dialog.component.ts
│ │ │ ├── index.ts
│ │ │ └── share-qr-dialog
│ │ │ │ ├── img
│ │ │ │ └── hepic_qr_logo.png
│ │ │ │ ├── share-qr-dialog.component.html
│ │ │ │ ├── share-qr-dialog.component.scss
│ │ │ │ └── share-qr-dialog.component.ts
│ │ ├── index.ts
│ │ ├── login
│ │ │ ├── login.component.html
│ │ │ ├── login.component.scss
│ │ │ └── login.component.ts
│ │ ├── menu
│ │ │ ├── menu.component.html
│ │ │ ├── menu.component.scss
│ │ │ └── menu.component.ts
│ │ ├── preference
│ │ │ ├── cell-types
│ │ │ │ ├── active-cell
│ │ │ │ │ ├── active-cell.component.html
│ │ │ │ │ ├── active-cell.component.scss
│ │ │ │ │ └── active-cell.component.ts
│ │ │ │ ├── data-cell
│ │ │ │ │ ├── data-cell.component.html
│ │ │ │ │ ├── data-cell.component.scss
│ │ │ │ │ └── data-cell.component.ts
│ │ │ │ ├── db-stats-cell
│ │ │ │ │ ├── db-stats-cell.component.html
│ │ │ │ │ ├── db-stats-cell.component.scss
│ │ │ │ │ └── db-stats-cell.component.ts
│ │ │ │ ├── expire-cell
│ │ │ │ │ ├── expire-cell.component.html
│ │ │ │ │ ├── expire-cell.component.scss
│ │ │ │ │ └── expire-cell.component.ts
│ │ │ │ ├── generic-cell
│ │ │ │ │ ├── generic-cell.component.html
│ │ │ │ │ ├── generic-cell.component.scss
│ │ │ │ │ └── generic-cell.component.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── last-error-cell
│ │ │ │ │ ├── last-error-cell.component.html
│ │ │ │ │ ├── last-error-cell.component.scss
│ │ │ │ │ └── last-error-cell.component.ts
│ │ │ │ └── tool-cell
│ │ │ │ │ ├── tool-cell.component.html
│ │ │ │ │ ├── tool-cell.component.scss
│ │ │ │ │ └── tool-cell.component.ts
│ │ │ ├── dialogs
│ │ │ │ ├── dialog-advanced
│ │ │ │ │ ├── dialog-advanced.component.html
│ │ │ │ │ ├── dialog-advanced.component.scss
│ │ │ │ │ └── dialog-advanced.component.ts
│ │ │ │ ├── dialog-agentsub
│ │ │ │ │ ├── dialog-agentsub.component.html
│ │ │ │ │ ├── dialog-agentsub.component.scss
│ │ │ │ │ └── dialog-agentsub.component.ts
│ │ │ │ ├── dialog-alias
│ │ │ │ │ ├── dialog-alias.component.html
│ │ │ │ │ ├── dialog-alias.component.scss
│ │ │ │ │ └── dialog-alias.component.ts
│ │ │ │ ├── dialog-authkey
│ │ │ │ │ ├── dialog-authkey.component.html
│ │ │ │ │ ├── dialog-authkey.component.scss
│ │ │ │ │ └── dialog-authkey.component.ts
│ │ │ │ ├── dialog-authtoken-display
│ │ │ │ │ ├── dialog-authtoken-display.component.html
│ │ │ │ │ ├── dialog-authtoken-display.component.scss
│ │ │ │ │ └── dialog-authtoken-display.component.ts
│ │ │ │ ├── dialog-db-selector
│ │ │ │ │ ├── dialog-db-selector.component.html
│ │ │ │ │ ├── dialog-db-selector.component.scss
│ │ │ │ │ └── dialog-db-selector.component.ts
│ │ │ │ ├── dialog-delete-alert
│ │ │ │ │ ├── dialog-delete-alert.component.html
│ │ │ │ │ ├── dialog-delete-alert.component.scss
│ │ │ │ │ └── dialog-delete-alert.component.ts
│ │ │ │ ├── dialog-hepsub
│ │ │ │ │ ├── dialog-hepsub.component.html
│ │ │ │ │ ├── dialog-hepsub.component.scss
│ │ │ │ │ └── dialog-hepsub.component.ts
│ │ │ │ ├── dialog-mapping
│ │ │ │ │ ├── dialog-mapping.component.html
│ │ │ │ │ ├── dialog-mapping.component.scss
│ │ │ │ │ └── dialog-mapping.component.ts
│ │ │ │ ├── dialog-scripts
│ │ │ │ │ ├── dialog-scripts.component.html
│ │ │ │ │ ├── dialog-scripts.component.scss
│ │ │ │ │ └── dialog-scripts.component.ts
│ │ │ │ ├── dialog-user-settings
│ │ │ │ │ ├── dialog-user-settings.component.html
│ │ │ │ │ ├── dialog-user-settings.component.scss
│ │ │ │ │ └── dialog-user-settings.component.ts
│ │ │ │ ├── dialog-users
│ │ │ │ │ ├── dialog-users.component.html
│ │ │ │ │ ├── dialog-users.component.scss
│ │ │ │ │ └── dialog-users.component.ts
│ │ │ │ └── index.ts
│ │ │ ├── pages
│ │ │ │ ├── index.ts
│ │ │ │ ├── page-about
│ │ │ │ │ ├── page-about.component.html
│ │ │ │ │ ├── page-about.component.scss
│ │ │ │ │ └── page-about.component.ts
│ │ │ │ ├── page-admin
│ │ │ │ │ ├── page-admin.component.html
│ │ │ │ │ ├── page-admin.component.scss
│ │ │ │ │ └── page-admin.component.ts
│ │ │ │ ├── page-advanced-settings
│ │ │ │ │ ├── page-advanced-settings.component.html
│ │ │ │ │ ├── page-advanced-settings.component.scss
│ │ │ │ │ └── page-advanced-settings.component.ts
│ │ │ │ ├── page-agent-subscriptions
│ │ │ │ │ ├── page-agent-subscriptions.component.html
│ │ │ │ │ ├── page-agent-subscriptions.component.scss
│ │ │ │ │ └── page-agent-subscriptions.component.ts
│ │ │ │ ├── page-alias
│ │ │ │ │ ├── page-alias.component.html
│ │ │ │ │ ├── page-alias.component.scss
│ │ │ │ │ └── page-alias.component.ts
│ │ │ │ ├── page-api-auth
│ │ │ │ │ ├── page-api-auth.component.html
│ │ │ │ │ ├── page-api-auth.component.scss
│ │ │ │ │ └── page-api-auth.component.ts
│ │ │ │ ├── page-api-doc
│ │ │ │ │ ├── page-api-doc.component.html
│ │ │ │ │ ├── page-api-doc.component.scss
│ │ │ │ │ └── page-api-doc.component.ts
│ │ │ │ ├── page-hepsub
│ │ │ │ │ ├── page-hepsub.component.html
│ │ │ │ │ ├── page-hepsub.component.scss
│ │ │ │ │ └── page-hepsub.component.ts
│ │ │ │ ├── page-mapping
│ │ │ │ │ ├── page-mapping.component.html
│ │ │ │ │ ├── page-mapping.component.scss
│ │ │ │ │ └── page-mapping.component.ts
│ │ │ │ ├── page-profile
│ │ │ │ │ ├── page-profile.component.html
│ │ │ │ │ ├── page-profile.component.scss
│ │ │ │ │ └── page-profile.component.ts
│ │ │ │ ├── page-reset
│ │ │ │ │ ├── page-reset.component.html
│ │ │ │ │ ├── page-reset.component.scss
│ │ │ │ │ └── page-reset.component.ts
│ │ │ │ ├── page-scripts
│ │ │ │ │ ├── page-scripts.component.html
│ │ │ │ │ ├── page-scripts.component.scss
│ │ │ │ │ └── page-scripts.component.ts
│ │ │ │ ├── page-system-overview
│ │ │ │ │ ├── page-system-overview.component.html
│ │ │ │ │ ├── page-system-overview.component.scss
│ │ │ │ │ └── page-system-overview.component.ts
│ │ │ │ ├── page-user-settings
│ │ │ │ │ ├── page-user-settings.component.html
│ │ │ │ │ ├── page-user-settings.component.scss
│ │ │ │ │ └── page-user-settings.component.ts
│ │ │ │ └── page-users
│ │ │ │ │ ├── page-users.component.html
│ │ │ │ │ ├── page-users.component.scss
│ │ │ │ │ └── page-users.component.ts
│ │ │ ├── preference.component.html
│ │ │ ├── preference.component.scss
│ │ │ ├── preference.component.ts
│ │ │ ├── service-dialogs
│ │ │ │ ├── dialog-export
│ │ │ │ │ ├── dialog-export.component.html
│ │ │ │ │ ├── dialog-export.component.scss
│ │ │ │ │ └── dialog-export.component.ts
│ │ │ │ ├── dialog-import
│ │ │ │ │ ├── dialog-import.component.html
│ │ │ │ │ ├── dialog-import.component.scss
│ │ │ │ │ └── dialog-import.component.ts
│ │ │ │ └── index.ts
│ │ │ └── setting-button
│ │ │ │ ├── setting-button.component.html
│ │ │ │ ├── setting-button.component.scss
│ │ │ │ └── setting-button.component.ts
│ │ ├── search-grid-call
│ │ │ ├── detail-dialog
│ │ │ │ ├── detail-dialog.component.html
│ │ │ │ ├── detail-dialog.component.scss
│ │ │ │ ├── detail-dialog.component.ts
│ │ │ │ ├── tab-callinfo
│ │ │ │ │ ├── html.pipe.ts
│ │ │ │ │ ├── tab-callinfo.component.html
│ │ │ │ │ ├── tab-callinfo.component.scss
│ │ │ │ │ ├── tab-callinfo.component.ts
│ │ │ │ │ └── tab-callinfo.module.ts
│ │ │ │ ├── tab-events
│ │ │ │ │ ├── tab-events.component.css
│ │ │ │ │ ├── tab-events.component.html
│ │ │ │ │ ├── tab-events.component.ts
│ │ │ │ │ └── tab-events.module.ts
│ │ │ │ ├── tab-export
│ │ │ │ │ ├── tab-export.component.html
│ │ │ │ │ ├── tab-export.component.scss
│ │ │ │ │ └── tab-export.component.ts
│ │ │ │ ├── tab-flow
│ │ │ │ │ ├── flow-item
│ │ │ │ │ │ ├── flow-item.component.html
│ │ │ │ │ │ ├── flow-item.component.scss
│ │ │ │ │ │ └── flow-item.component.ts
│ │ │ │ │ ├── tab-flow.component.html
│ │ │ │ │ ├── tab-flow.component.scss
│ │ │ │ │ ├── tab-flow.component.ts
│ │ │ │ │ └── tab-flow.module.ts
│ │ │ │ ├── tab-hepsub
│ │ │ │ │ ├── moment.pipe.ts
│ │ │ │ │ ├── tab-hepsub.component.html
│ │ │ │ │ ├── tab-hepsub.component.scss
│ │ │ │ │ ├── tab-hepsub.component.ts
│ │ │ │ │ └── tab-hepsub.module.ts
│ │ │ │ ├── tab-logs
│ │ │ │ │ ├── tab-logs.component.html
│ │ │ │ │ ├── tab-logs.component.scss
│ │ │ │ │ └── tab-logs.component.ts
│ │ │ │ ├── tab-messages
│ │ │ │ │ ├── tab-messages.component.html
│ │ │ │ │ ├── tab-messages.component.scss
│ │ │ │ │ ├── tab-messages.component.ts
│ │ │ │ │ └── tab-messages.module.ts
│ │ │ │ ├── tab-qos
│ │ │ │ │ ├── tab-qos.component.html
│ │ │ │ │ ├── tab-qos.component.scss
│ │ │ │ │ ├── tab-qos.component.ts
│ │ │ │ │ └── tab-qos.module.ts
│ │ │ │ └── tab-sub
│ │ │ │ │ ├── tab-sub.component.css
│ │ │ │ │ ├── tab-sub.component.html
│ │ │ │ │ ├── tab-sub.component.ts
│ │ │ │ │ └── tab-sub.module.ts
│ │ │ ├── export-dialog
│ │ │ │ ├── export-dialog.component.html
│ │ │ │ ├── export-dialog.component.scss
│ │ │ │ └── export-dialog.component.ts
│ │ │ ├── filters
│ │ │ │ ├── index.ts
│ │ │ │ └── status-filter
│ │ │ │ │ ├── status-filter.component.html
│ │ │ │ │ ├── status-filter.component.scss
│ │ │ │ │ └── status-filter.component.ts
│ │ │ ├── grid-chart-dialog
│ │ │ │ ├── grid-chart-dialog.component.html
│ │ │ │ ├── grid-chart-dialog.component.scss
│ │ │ │ └── grid-chart-dialog.component.ts
│ │ │ ├── grid-controller.ts
│ │ │ ├── grid-settings-dialog
│ │ │ │ ├── grid-settings-dialog.html
│ │ │ │ ├── grid-settings-dialog.scss
│ │ │ │ └── grid-settings-dialog.ts
│ │ │ ├── index.ts
│ │ │ ├── message-content
│ │ │ │ ├── message-content.component.html
│ │ │ │ ├── message-content.component.scss
│ │ │ │ ├── message-content.component.ts
│ │ │ │ ├── message-content.module.ts
│ │ │ │ └── message-safe-html.component.ts
│ │ │ ├── renderer
│ │ │ │ ├── column-action-renderer.component.ts
│ │ │ │ ├── column-alias-renderer
│ │ │ │ │ ├── column-alias-renderer.component.html
│ │ │ │ │ └── column-alias-renderer.component.ts
│ │ │ │ ├── column-callid-renderer.component.ts
│ │ │ │ ├── column-country-renderer.component.ts
│ │ │ │ ├── column-method-renderer.component.ts
│ │ │ │ ├── column-mos-renderer.component.ts
│ │ │ │ ├── column-uuid-renderer.component.ts
│ │ │ │ ├── generic-cell-renderer.component.ts
│ │ │ │ ├── header-action-renderer.component.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── loki-highlight-renderer.component.ts
│ │ │ ├── search-grid-call.component.html
│ │ │ ├── search-grid-call.component.scss
│ │ │ └── search-grid-call.component.ts
│ │ └── widgets
│ │ │ ├── IWidget.ts
│ │ │ ├── README.md
│ │ │ ├── ace-editor-widget
│ │ │ ├── ace-editor-widget.component.html
│ │ │ ├── ace-editor-widget.component.scss
│ │ │ ├── ace-editor-widget.component.ts
│ │ │ ├── settings-ace-editor-widget.component.html
│ │ │ ├── settings-ace-editor-widget.component.scss
│ │ │ └── settings-ace-editor-widget.component.ts
│ │ │ ├── alert-widget
│ │ │ ├── alert-widget.component.html
│ │ │ ├── alert-widget.component.scss
│ │ │ ├── alert-widget.component.ts
│ │ │ ├── setting-alert-widget.component.html
│ │ │ ├── setting-alert-widget.component.scss
│ │ │ ├── setting-alert-widget.component.ts
│ │ │ ├── snack-bar.component.html
│ │ │ └── snack-bar.component.ts
│ │ │ ├── clickhousechart-widget
│ │ │ ├── clickhousechart-widget.component.html
│ │ │ ├── clickhousechart-widget.component.scss
│ │ │ ├── clickhousechart-widget.component.ts
│ │ │ ├── setting-clickhousechart-widget.component.html
│ │ │ ├── setting-clickhousechart-widget.component.scss
│ │ │ └── setting-clickhousechart-widget.component.ts
│ │ │ ├── clock-widget
│ │ │ ├── clock-widget.component.html
│ │ │ ├── clock-widget.component.scss
│ │ │ ├── clock-widget.component.ts
│ │ │ ├── setting-clock-widget.component.html
│ │ │ ├── setting-clock-widget.component.scss
│ │ │ └── setting-clock-widget.component.ts
│ │ │ ├── dialog-alarm
│ │ │ ├── dialog-alarm.component.html
│ │ │ ├── dialog-alarm.component.scss
│ │ │ └── dialog-alarm.component.ts
│ │ │ ├── general-iframe-widget
│ │ │ ├── general-iframe-widget.component.html
│ │ │ ├── general-iframe-widget.component.scss
│ │ │ ├── general-iframe-widget.component.ts
│ │ │ ├── setting-general-iframe-widget.component.html
│ │ │ ├── setting-general-iframe-widget.component.scss
│ │ │ └── setting-general-iframe-widget.component.ts
│ │ │ ├── grafana-widget
│ │ │ ├── grafana-widget.component.html
│ │ │ ├── grafana-widget.component.scss
│ │ │ ├── grafana-widget.component.ts
│ │ │ ├── setting-grafana-widget.component.html
│ │ │ ├── setting-grafana-widget.component.scss
│ │ │ └── setting-grafana-widget.component.ts
│ │ │ ├── index.ts
│ │ │ ├── influxdbchart-widget
│ │ │ ├── influxdbchart-widget.component.html
│ │ │ ├── influxdbchart-widget.component.scss
│ │ │ ├── influxdbchart-widget.component.ts
│ │ │ ├── setting-influxdbchart-widget.component.html
│ │ │ ├── setting-influxdbchart-widget.component.scss
│ │ │ └── setting-influxdbchart-widget.component.ts
│ │ │ ├── pcap-uploader-widget
│ │ │ ├── pcap-uploader-widget.component.html
│ │ │ ├── pcap-uploader-widget.component.scss
│ │ │ ├── pcap-uploader-widget.component.ts
│ │ │ └── pcap-uploader.service.ts
│ │ │ ├── prometheus-widget
│ │ │ ├── prometheus-widget.component.html
│ │ │ ├── prometheus-widget.component.scss
│ │ │ ├── prometheus-widget.component.ts
│ │ │ ├── setting-prometheus-widget.component.html
│ │ │ ├── setting-prometheus-widget.component.scss
│ │ │ └── setting-prometheus-widget.component.ts
│ │ │ ├── protosearch-widget
│ │ │ ├── chips-input
│ │ │ │ ├── chips-input.component.html
│ │ │ │ ├── chips-input.component.scss
│ │ │ │ └── chips-input.component.ts
│ │ │ ├── drag-drop-list
│ │ │ │ ├── drag-drop-list.component.html
│ │ │ │ ├── drag-drop-list.component.scss
│ │ │ │ └── drag-drop-list.component.ts
│ │ │ ├── protosearch-widget.component.html
│ │ │ ├── protosearch-widget.component.scss
│ │ │ ├── protosearch-widget.component.ts
│ │ │ ├── ps-fields
│ │ │ │ └── multi-select-field
│ │ │ │ │ ├── READ-ME.MD
│ │ │ │ │ ├── multi-select-field.component.html
│ │ │ │ │ ├── multi-select-field.component.scss
│ │ │ │ │ ├── multi-select-field.component.ts
│ │ │ │ │ └── multi-select-field.module.ts
│ │ │ ├── setting-protosearch-widget.component.html
│ │ │ ├── setting-protosearch-widget.component.scss
│ │ │ └── setting-protosearch-widget.component.ts
│ │ │ ├── result-chart-widget
│ │ │ ├── result-chart-widget.component.html
│ │ │ ├── result-chart-widget.component.scss
│ │ │ ├── result-chart-widget.component.ts
│ │ │ ├── setting-result-chart-widget.component.html
│ │ │ ├── setting-result-chart-widget.component.scss
│ │ │ └── setting-result-chart-widget.component.ts
│ │ │ ├── result-widget
│ │ │ ├── result-widget.component.html
│ │ │ ├── result-widget.component.scss
│ │ │ ├── result-widget.component.ts
│ │ │ ├── setting-result-widget.component.html
│ │ │ ├── setting-result-widget.component.scss
│ │ │ └── setting-result-widget.component.ts
│ │ │ ├── rsearch-widget
│ │ │ ├── code-style-field
│ │ │ │ ├── code-style-field.component.html
│ │ │ │ ├── code-style-field.component.scss
│ │ │ │ ├── code-style-field.component.ts
│ │ │ │ └── code-style-field.module.ts
│ │ │ ├── code-style-prometheus-field
│ │ │ │ ├── code-style-prometheus-field.component.html
│ │ │ │ ├── code-style-prometheus-field.component.scss
│ │ │ │ └── code-style-prometheus-field.component.ts
│ │ │ ├── rsearch-widget.component.html
│ │ │ ├── rsearch-widget.component.scss
│ │ │ └── rsearch-widget.component.ts
│ │ │ └── smart-input-widget
│ │ │ ├── code-proto-selector
│ │ │ ├── code-proto-selector.component.html
│ │ │ ├── code-proto-selector.component.scss
│ │ │ └── code-proto-selector.component.ts
│ │ │ ├── code-style-smart-input-field
│ │ │ ├── code-style-smart-input-field.component.html
│ │ │ ├── code-style-smart-input-field.component.scss
│ │ │ └── code-style-smart-input-field.component.ts
│ │ │ ├── query-history.service.ts
│ │ │ ├── setting-smart-input-widget.component.html
│ │ │ ├── setting-smart-input-widget.component.scss
│ │ │ ├── setting-smart-input-widget.component.ts
│ │ │ ├── smart-input-widget.component.html
│ │ │ ├── smart-input-widget.component.scss
│ │ │ └── smart-input-widget.component.ts
│ ├── guards
│ │ ├── auth.guard.ts
│ │ └── index.ts
│ ├── helpers
│ │ ├── ErrorCodes.ts
│ │ ├── email-validator.directive.ts
│ │ ├── error.interceptor.ts
│ │ ├── functions.ts
│ │ ├── hep-tooltip.directive.ts
│ │ ├── http-get-buffer.ts
│ │ ├── index.ts
│ │ ├── jwt.interceptor.ts
│ │ ├── ng-multiselect.directive.ts
│ │ ├── parser.ts
│ │ ├── translate-link-complier.ts
│ │ ├── widget.ts
│ │ └── windowFunctions.ts
│ ├── hep-tooltip
│ │ └── hep-tooltip.module.ts
│ ├── models
│ │ ├── CallIDColor.model.ts
│ │ ├── ag-grid-colors.model.ts
│ │ ├── agent-request-model.ts
│ │ ├── alert.model.ts
│ │ ├── const-value.model.ts
│ │ ├── dashboard-content.model.ts
│ │ ├── dashboard.model.ts
│ │ ├── dictionary.model.ts
│ │ ├── flow-item-type.model.ts
│ │ ├── index.ts
│ │ ├── preference-advanced.model.ts
│ │ ├── preference-agentsub.model.ts
│ │ ├── preference-alias.model.ts
│ │ ├── preference-authkey.model.ts
│ │ ├── preference-hepsub.model.ts
│ │ ├── preference-interception.model.ts
│ │ ├── preference-ip-alias.model.ts
│ │ ├── preference-mapping-field.model.ts
│ │ ├── preference-mapping-protocol.model.ts
│ │ ├── preference-mapping.model.ts
│ │ ├── preference-scripts.model.ts
│ │ ├── preference-user-settings.model.ts
│ │ ├── preference-users.model.ts
│ │ ├── preferences-component-mapping.ts
│ │ ├── preferences-kw-mapping.ts
│ │ ├── search-call.model.ts
│ │ ├── search-method.model.ts
│ │ ├── statistic-database.model.ts
│ │ ├── user-settings.model.ts
│ │ ├── user.model.ts
│ │ ├── widget.model.ts
│ │ └── worker-commands.module.ts
│ ├── pipes
│ │ ├── colorOffset.module.ts
│ │ ├── colorOffset.pipe.ts
│ │ ├── filter.pipe.ts
│ │ ├── html.pipe.ts
│ │ ├── moment.pipe.ts
│ │ ├── preferences.pipe.ts
│ │ └── safe.pipe.ts
│ ├── services
│ │ ├── agentsub.service.ts
│ │ ├── alert.service.ts
│ │ ├── authentication.service.ts
│ │ ├── call
│ │ │ ├── full-transaction.service.ts
│ │ │ ├── hep-log.service.ts
│ │ │ ├── report.service.ts
│ │ │ └── transaction.service.ts
│ │ ├── clickhouse.service.ts
│ │ ├── copy.service.ts
│ │ ├── dashboard.service.ts
│ │ ├── data-time-range.service.ts
│ │ ├── export
│ │ │ └── call.service.ts
│ │ ├── hepsub.service.ts
│ │ ├── index.ts
│ │ ├── message-details.service.ts
│ │ ├── modules.service.ts
│ │ ├── preferences
│ │ │ ├── admin.service.ts
│ │ │ ├── advanced.service.ts
│ │ │ ├── agentsub.service.ts
│ │ │ ├── alias.service.ts
│ │ │ ├── authkey.service.ts
│ │ │ ├── hepsub.service.ts
│ │ │ ├── index.ts
│ │ │ ├── ipalias.service.ts
│ │ │ ├── mapping-protocol.service.ts
│ │ │ ├── scripts.service.ts
│ │ │ ├── user-settings.service.ts
│ │ │ ├── user.service.ts
│ │ │ └── version.service.ts
│ │ ├── prometheus.service.ts
│ │ ├── proxy.service.ts
│ │ ├── search.service.ts
│ │ ├── search
│ │ │ ├── call.service.ts
│ │ │ ├── remote.service.ts
│ │ │ └── smart.service.ts
│ │ ├── session-storage.service.ts
│ │ ├── statistic.service.ts
│ │ ├── time-formatting.service.ts
│ │ ├── tooltip.service.ts
│ │ ├── upload.service.ts
│ │ ├── user-security.service.ts
│ │ ├── window.service.ts
│ │ └── worker.service.ts
│ └── workers
│ │ ├── clickhouse.worker.ts
│ │ ├── qos.worker.ts
│ │ └── transaction.worker.ts
├── assets
│ ├── .gitkeep
│ ├── css
│ │ ├── mapbox-gl.css
│ │ └── vis.min.scss
│ ├── fonts
│ │ ├── MaterialIcons-Regular.eot
│ │ ├── MaterialIcons-Regular.ttf
│ │ ├── MaterialIcons-Regular.woff
│ │ ├── MaterialIcons-Regular.woff2
│ │ ├── Roboto-Black.ttf
│ │ ├── Roboto-BlackItalic.ttf
│ │ ├── Roboto-Bold.ttf
│ │ ├── Roboto-BoldItalic.ttf
│ │ ├── Roboto-Italic.ttf
│ │ ├── Roboto-Light.ttf
│ │ ├── Roboto-LightItalic.ttf
│ │ ├── Roboto-Medium.ttf
│ │ ├── Roboto-MediumItalic.ttf
│ │ ├── Roboto-Regular.ttf
│ │ ├── Roboto-Thin.ttf
│ │ └── Roboto-ThinItalic.ttf
│ ├── i18n
│ │ ├── Localization documentation.md
│ │ └── en.json
│ ├── images
│ │ ├── baseline_room_black_18dp.png
│ │ ├── chart-samples
│ │ │ ├── area.png
│ │ │ ├── bar-force-stacked.svg
│ │ │ ├── bar-grouped.svg
│ │ │ ├── bar-stacked.svg
│ │ │ ├── column-force-stacked.svg
│ │ │ ├── column-grouped.svg
│ │ │ ├── column-stacked.svg
│ │ │ └── pie-chart.svg
│ │ ├── homerseven.png
│ │ └── vis
│ │ │ ├── addNodeIcon.png
│ │ │ ├── backIcon.png
│ │ │ ├── connectIcon.png
│ │ │ ├── cross.png
│ │ │ ├── deleteIcon.png
│ │ │ ├── downArrow.png
│ │ │ ├── editIcon.png
│ │ │ ├── leftArrow.png
│ │ │ ├── minus.png
│ │ │ ├── plus.png
│ │ │ ├── rightArrow.png
│ │ │ ├── upArrow.png
│ │ │ └── zoomExtends.png
│ ├── img
│ │ └── gateways
│ │ │ ├── exchange.png
│ │ │ ├── pbx.png
│ │ │ ├── phone.png
│ │ │ ├── sbc.png
│ │ │ ├── scanner.png
│ │ │ ├── sipgateway.png
│ │ │ ├── sipproxy.png
│ │ │ ├── unknown.png
│ │ │ └── useragent.png
│ └── roboto
│ │ ├── fonts
│ │ ├── Black
│ │ │ ├── Roboto-Black.ttf
│ │ │ ├── Roboto-Black.woff
│ │ │ └── Roboto-Black.woff2
│ │ ├── BlackItalic
│ │ │ ├── Roboto-BlackItalic.ttf
│ │ │ ├── Roboto-BlackItalic.woff
│ │ │ └── Roboto-BlackItalic.woff2
│ │ ├── Bold
│ │ │ ├── Roboto-Bold.ttf
│ │ │ ├── Roboto-Bold.woff
│ │ │ └── Roboto-Bold.woff2
│ │ ├── BoldItalic
│ │ │ ├── Roboto-BoldItalic.ttf
│ │ │ ├── Roboto-BoldItalic.woff
│ │ │ └── Roboto-BoldItalic.woff2
│ │ ├── Italic
│ │ │ ├── Roboto-Italic.ttf
│ │ │ ├── Roboto-Italic.woff
│ │ │ └── Roboto-Italic.woff2
│ │ ├── Light
│ │ │ ├── Roboto-Light.ttf
│ │ │ ├── Roboto-Light.woff
│ │ │ └── Roboto-Light.woff2
│ │ ├── LightItalic
│ │ │ ├── Roboto-LightItalic.ttf
│ │ │ ├── Roboto-LightItalic.woff
│ │ │ └── Roboto-LightItalic.woff2
│ │ ├── Medium
│ │ │ ├── Roboto-Medium.ttf
│ │ │ ├── Roboto-Medium.woff
│ │ │ └── Roboto-Medium.woff2
│ │ ├── MediumItalic
│ │ │ ├── Roboto-MediumItalic.ttf
│ │ │ ├── Roboto-MediumItalic.woff
│ │ │ └── Roboto-MediumItalic.woff2
│ │ ├── Regular
│ │ │ ├── Roboto-Regular.ttf
│ │ │ ├── Roboto-Regular.woff
│ │ │ └── Roboto-Regular.woff2
│ │ ├── Thin
│ │ │ ├── Roboto-Thin.ttf
│ │ │ ├── Roboto-Thin.woff
│ │ │ └── Roboto-Thin.woff2
│ │ └── ThinItalic
│ │ │ ├── Roboto-ThinItalic.ttf
│ │ │ ├── Roboto-ThinItalic.woff
│ │ │ └── Roboto-ThinItalic.woff2
│ │ ├── roboto.scss
│ │ └── sass
│ │ ├── _Black.scss
│ │ ├── _BlackItalic.scss
│ │ ├── _Bold.scss
│ │ ├── _BoldItalic.scss
│ │ ├── _Italic.scss
│ │ ├── _Light.scss
│ │ ├── _LightItalic.scss
│ │ ├── _Medium.scss
│ │ ├── _MediumItalic.scss
│ │ ├── _Regular.scss
│ │ ├── _Thin.scss
│ │ ├── _ThinItalic.scss
│ │ ├── _mixins.scss
│ │ ├── _variables.scss
│ │ └── roboto.scss
├── browserslist
├── environments
│ ├── environment.dev.ts
│ ├── environment.prod-noenv.ts
│ ├── environment.prod.ts
│ └── environment.ts
├── favicon.ico
├── index.html
├── main.ts
├── polyfills.ts
├── styles.scss
├── test.ts
├── theme.scss
├── tsconfig.app.json
├── tsconfig.spec.json
├── tslint.json
├── typings.d.ts
└── upgrade.html
├── swagger-styles.scss
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.spec.json
└── tsconfig.worker.json
/.browserslistrc:
--------------------------------------------------------------------------------
1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
2 | # For additional information regarding the format and rule options, please see:
3 | # https://github.com/browserslist/browserslist#queries
4 |
5 | # For the full list of supported browsers by the Angular framework, please see:
6 | # https://angular.io/guide/browser-support
7 |
8 | # You can see what browsers were selected by your queries by running:
9 | # npx browserslist
10 |
11 | last 1 Chrome version
12 | last 1 Firefox version
13 | last 2 Edge major versions
14 | last 2 Safari major versions
15 | last 2 iOS major versions
16 | Firefox ESR
17 | not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line.
18 | not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.
19 | not ios_saf 15.2-15.3
20 | not safari 15.2-15.3
21 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see https://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.ts]
12 | quote_type = single
13 |
14 | [*.md]
15 | max_line_length = off
16 | trim_trailing_whitespace = false
17 |
--------------------------------------------------------------------------------
/.github/.ISSUE_TEMPLATE/02_feature_request.yml:
--------------------------------------------------------------------------------
1 | name: Feature Request
2 | description: For feature requests regarding the Homer-UI.
3 | labels: ['feature request']
4 | body:
5 | - type: markdown
6 | attributes:
7 | value: |
8 | Thank you for taking the time to fill out an issue, this template is meant for any feature suggestions.
9 | - type: textarea
10 | id: proposal
11 | attributes:
12 | label: "Description of the feature you're suggesting."
13 | description: |
14 | Please describe your feature request in as many details as possible.
15 | - Describe what it should do.
16 | - Note whetever it is to extend existing functionality or introduce new functionality.
17 | - Provide mock-up if possible
18 | validations:
19 | required: true
20 | - type: textarea
21 | id: anything-else
22 | attributes:
23 | label: Anything else?
24 | description: Let us know if you have anything else to share.
--------------------------------------------------------------------------------
/.github/scripts/bumpversion.sh:
--------------------------------------------------------------------------------
1 | VERSION=($(egrep -o '[0-9]+' ./src/VERSION.ts))
2 | VERSION_PATCH=${VERSION[2]}
3 | NEW_VERSION_PATCH=$(( VERSION_PATCH + 1 ))
4 | VERSION_FOR_OUTPUT=${VERSION[0]}.${VERSION[1]}.$NEW_VERSION_PATCH
5 | VERSION_STRING="export const VERSION = '$VERSION_FOR_OUTPUT'"
6 | echo $VERSION_STRING > ./src/VERSION.ts
7 | echo "TAG_NAME=$VERSION_FOR_OUTPUT" >> $GITHUB_OUTPUT
8 | tag="
"
9 | sed -i "1s@.*@$badge@" ./README.md
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | /dist
5 | /tmp
6 | /out-tsc
7 | # Only exists if Bazel was run
8 | /bazel-out
9 |
10 | # dependencies
11 | /node_modules
12 |
13 | # profiling files
14 | chrome-profiler-events*.json
15 |
16 | # IDEs and editors
17 | /.idea
18 | .project
19 | .classpath
20 | .c9/
21 | *.launch
22 | .settings/
23 | *.sublime-workspace
24 |
25 | # IDE - VSCode
26 | .vscode/*
27 | !.vscode/settings.json
28 | !.vscode/tasks.json
29 | !.vscode/launch.json
30 | !.vscode/extensions.json
31 | .history/*
32 |
33 | # misc
34 | /.sass-cache
35 | /connect.lock
36 | /coverage
37 | /libpeerconnection.log
38 | npm-debug.log
39 | yarn-error.log
40 | testem.log
41 | /typings
42 |
43 | # System Files
44 | .DS_Store
45 | Thumbs.db
46 |
47 | package-lock.json
48 | # Angular cache
49 | .angular
50 |
51 | #Env
52 | src/environments/environment.dev.ts
53 | src/environments/environment.prod.ts
54 | src/environments/environment.ts
55 | src/environments/environment.prod-noenv.ts
56 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:12-alpine
2 |
3 | RUN apk add git && git clone https://github.com/sipcapture/homer-ui /app
4 | WORKDIR /app
5 | RUN npm install && npm install -g @angular/cli
6 | CMD ["ng","build"]
7 |
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # HEPIC User-Interface
6 |
7 | This project provides the Front-End components of [HEPIC 3.x](http://qxip.net) featuring native integration with all
8 | supported backend components for search and analytics including `pgsql`, `influxdb`, `prometheus`, `loki` and more.
9 |
10 |
11 | ### Support
12 | For commercial licensing and support, please contact the [QXIP Team](http://qxip.net)
13 |
14 |
15 | ### License & Copyright
16 | *(C) 2008-2024 [QXIP BV](http://qxip.net)*
17 |
18 |
--------------------------------------------------------------------------------
/src/VERSION.ts:
--------------------------------------------------------------------------------
1 | export const VERSION = '7.11.14'
2 |
--------------------------------------------------------------------------------
/src/app/app-routing.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule, Routes } from '@angular/router';
3 |
4 | const routes: Routes = [];
5 |
6 | @NgModule({
7 | imports: [RouterModule.forRoot(routes)],
8 | exports: [RouterModule]
9 | })
10 | export class AppRoutingModule { }
11 |
--------------------------------------------------------------------------------
/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/app/components/controls/alert/alert-ref.ts:
--------------------------------------------------------------------------------
1 | import { OverlayRef } from '@angular/cdk/overlay';
2 |
3 | export class AlertOverlayRef {
4 |
5 | constructor(private overlayRef: OverlayRef) { }
6 |
7 | close(): void {
8 | this.overlayRef.dispose();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/app/components/controls/alert/alert.tokens.ts:
--------------------------------------------------------------------------------
1 | import { InjectionToken } from '@angular/core';
2 | import { AlertSubject } from '@app/models/alert.model';
3 |
4 |
5 | export const ALERT_OVERLAY = new InjectionToken('ALERT_OVERLAY');
--------------------------------------------------------------------------------
/src/app/components/controls/codejar-wrapper/codejar-wrapper.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ errorMessage }}
4 |
5 |
12 |
13 |
--------------------------------------------------------------------------------
/src/app/components/controls/codejar-wrapper/codejar-wrapper.component.scss:
--------------------------------------------------------------------------------
1 | :host {
2 | display: block;
3 | height: 100%;
4 | }
5 | .btn-send {
6 | float: right;
7 | position: absolute;
8 | right: 1rem;
9 | bottom: 1rem;
10 | z-index: 3;
11 | }
12 | .error {
13 | margin: 10px;
14 | position: absolute;
15 | bottom: 0rem;
16 | display: block;
17 | border-radius: 4px;
18 | width: calc(100% - 20px);
19 | padding: 0.5rem;
20 | color: #FF0;
21 | background-color: #900;
22 | box-sizing: border-box;
23 | }
24 |
--------------------------------------------------------------------------------
/src/app/components/controls/copy/copy.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/app/components/controls/copy/copy.component.scss:
--------------------------------------------------------------------------------
1 | .copyField{
2 | border: 0;
3 | padding: 0;
4 | margin: 0;
5 | font-size: 1px;
6 | position: fixed;
7 | top: 0;
8 | left: 0;
9 | opacity: 0;
10 | max-width: 1px;
11 | overflow: hidden;
12 | }
--------------------------------------------------------------------------------
/src/app/components/controls/copy/copy.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { CopyComponent } from './copy.component';
4 | import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
5 | import { fas } from '@fortawesome/free-solid-svg-icons';
6 | import { fab } from '@fortawesome/free-brands-svg-icons';
7 | import { far } from '@fortawesome/free-regular-svg-icons';
8 | import { MatIconModule } from '@angular/material/icon';
9 | import { AlertModule } from '@it-app/components/controls/alert/alert.module';
10 | import { AlertService } from '@it-app/services/alert.service';
11 | import { Router } from '@angular/router';
12 |
13 | @NgModule({
14 | imports: [
15 | CommonModule,
16 | FontAwesomeModule,
17 | MatIconModule,
18 | AlertModule
19 | ],
20 | declarations: [CopyComponent],
21 | exports: [CopyComponent],
22 | providers: [AlertService]
23 | })
24 | export class CopyModule {
25 | constructor(library: FaIconLibrary) {
26 | library.addIconPacks(fas as any, fab as any, far as any);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/app/components/controls/custom-ag-grid/custom-ag-grid.component.html:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/src/app/components/controls/custom-ag-grid/custom-ag-grid.component.scss:
--------------------------------------------------------------------------------
1 | .custom .ag-cell {
2 | border: 4px solid black;
3 | }
--------------------------------------------------------------------------------
/src/app/components/controls/custom-ag-grid/drag-drop-list/drag-drop-list.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Inactive
4 |
11 |
{{item && item.name || '\{skipped on Mapping\}'}}
12 |
13 |
14 |
15 |
16 |
Active
17 |
24 |
{{item && item.name || '\{skipped on Mapping\}'}}
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/app/components/controls/custom-ag-grid/setting-button.html:
--------------------------------------------------------------------------------
1 |
6 | {{headerName | titlecase}}
7 |
8 |
10 |
Columns settings
11 |
13 |
14 |
--------------------------------------------------------------------------------
/src/app/components/controls/custom-ag-grid/setting-button.scss:
--------------------------------------------------------------------------------
1 | .container {
2 | padding: 1rem;
3 | min-width: 400px;
4 | max-height: 600px;
5 | overflow-y: auto;
6 | }
7 | .button-icon-right-top {
8 | width: 30px;
9 | }
10 | ::ng-deep.mat-mdc-menu-panel {
11 | max-width: initial !important;
12 | }
13 |
--------------------------------------------------------------------------------
/src/app/components/controls/custom-table/custom-table.component.css:
--------------------------------------------------------------------------------
1 | table.this-table {
2 | table-layout: fixed;
3 | width: 100%;
4 | max-width: 100%;
5 | }
6 | table.this-table tr {
7 | transition: background-color 0.3s;
8 | height: 38px;
9 | }
10 | table.this-table tr:hover {
11 | background-color: rgba(0, 0, 0, 0.12);
12 | cursor: pointer;
13 | }
14 |
15 | table.this-table th,
16 | table.this-table td {
17 | padding: 1rem;
18 | overflow: hidden;
19 | white-space: nowrap;
20 | text-overflow: ellipsis;
21 | }
22 |
23 | .mat-mdc-row:nth-child(2n+1){
24 | background-color: #e4f0ec;
25 | }
26 |
27 | .mat-mdc-row:not(:nth-child(2n+1)){
28 | background-color:#ffffff;
29 | }
30 |
31 | .search-input {
32 | border: 0;
33 | background-color: rgba(0,0,0,0.1);
34 | outline: none;
35 | }
--------------------------------------------------------------------------------
/src/app/components/controls/custom-table/custom-table.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { CustomTableComponent } from './custom-table.component';
4 | import { MatPaginatorModule } from '@angular/material/paginator';
5 | import { MatTableModule } from '@angular/material/table';
6 | import { MatSortModule } from '@angular/material/sort';
7 |
8 | @NgModule({
9 | imports: [
10 | CommonModule,
11 | MatPaginatorModule,
12 | MatTableModule,
13 | MatSortModule
14 | ],
15 | declarations: [CustomTableComponent],
16 | exports: [CustomTableComponent]
17 | })
18 | export class CustomTableModule { }
19 |
--------------------------------------------------------------------------------
/src/app/components/controls/daterangepicker/daterangepicker.config.ts:
--------------------------------------------------------------------------------
1 | import { InjectionToken } from '@angular/core';
2 | import * as _moment from 'moment-timezone';
3 | const moment = _moment;
4 |
5 | export const LOCALE_CONFIG = new InjectionToken('daterangepicker.config');
6 | /**
7 | * LocaleConfig Interface
8 | */
9 | export interface LocaleConfig {
10 | direction?: string;
11 | separator?: string;
12 | weekLabel?: string;
13 | applyLabel?: string;
14 | cancelLabel?: string;
15 | clearLabel?: string;
16 | customRangeLabel?: string;
17 | daysOfWeek?: string[];
18 | monthNames?: string[];
19 | firstDay?: number;
20 | format?: string;
21 | displayFormat?: string;
22 | }
23 | /**
24 | * DefaultLocaleConfig
25 | */
26 | export const DefaultLocaleConfig: LocaleConfig = {
27 | direction: 'ltr',
28 | separator: ' - ',
29 | weekLabel: 'W',
30 | applyLabel: 'Apply',
31 | cancelLabel: 'Cancel',
32 | clearLabel: 'Clear',
33 | customRangeLabel: 'Custom range',
34 | daysOfWeek: moment.weekdaysMin(),
35 | monthNames: moment.monthsShort(),
36 | firstDay: moment.localeData().firstDayOfWeek(),
37 | };
38 |
--------------------------------------------------------------------------------
/src/app/components/controls/daterangepicker/index.ts:
--------------------------------------------------------------------------------
1 | export { NgxDaterangepickerMd } from './daterangepicker.module';
2 | export { DaterangepickerComponent } from './daterangepicker.component';
3 | export { DaterangepickerDirective } from './daterangepicker.directive';
4 | export { LocaleConfig, LOCALE_CONFIG, DefaultLocaleConfig } from './daterangepicker.config';
5 | export { LocaleService } from './locale.service';
6 |
--------------------------------------------------------------------------------
/src/app/components/controls/daterangepicker/locale.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable, Inject } from '@angular/core';
2 | import { LOCALE_CONFIG, DefaultLocaleConfig, LocaleConfig } from './daterangepicker.config';
3 |
4 | @Injectable()
5 | export class LocaleService {
6 | constructor(@Inject(LOCALE_CONFIG) private _config: LocaleConfig) {}
7 |
8 | get config() {
9 | if (!this._config) {
10 | return DefaultLocaleConfig;
11 | }
12 |
13 | return {... DefaultLocaleConfig, ...this._config};
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/components/controls/daterangepicker/timezone.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import * as _moment from 'moment-timezone';
3 | const moment: any = _moment;
4 |
5 | @Pipe({name: 'timeZone'})
6 | export class TimeZonePipe implements PipeTransform {
7 | transform(value, type) {
8 | if (type === 'region') {
9 | value = value.substr(0, value.indexOf('/'));
10 | } else if (type === 'location'){
11 | value = value.substr(value.indexOf('/') + 1);
12 | } else if (type === 'offset') {
13 | value = moment.tz(value).format('Z z');
14 | }
15 | return value;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/components/controls/flow-tooltip/flow-tooltip.component.scss:
--------------------------------------------------------------------------------
1 | .flow-tooltip {
2 | position: absolute;
3 | background-color: rgba(255, 255, 255, 0.9);
4 | padding: 5px;
5 | border: 1px solid #ddd;
6 | border-radius: 4px;
7 | z-index: 1000000;
8 | font-size: 12px !important;
9 | display:flex;
10 | flex-direction: column;
11 | box-shadow: 0px 10px 50px -35px #000;
12 |
13 | td {
14 | border-bottom: 1px solid #aaa;
15 | }
16 | }
17 | .flow-alias-image {
18 | max-height:150px;
19 | }
--------------------------------------------------------------------------------
/src/app/components/controls/flow-tooltip/flow-tooltip.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { FlowTooltipComponent } from './flow-tooltip.component';
4 |
5 | @NgModule({
6 | imports: [
7 | CommonModule
8 | ],
9 | declarations: [FlowTooltipComponent],
10 | exports: [FlowTooltipComponent]
11 | })
12 | export class FlowTooltipModule { }
13 |
--------------------------------------------------------------------------------
/src/app/components/controls/index.ts:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/app/components/controls/loading-circle/loading-circle.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/components/controls/loading-circle/loading-circle.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-loading-circle',
5 | templateUrl: './loading-circle.component.html',
6 | styleUrls: ['./loading-circle.component.scss']
7 | })
8 | export class LoadingCircleComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit(): void {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/components/controls/loki-results/moment.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import moment from 'moment';
3 |
4 | @Pipe({
5 | name: 'moment',
6 | pure: false
7 | })
8 |
9 | export class MomentPipe implements PipeTransform {
10 | transform(timestamp, format) {
11 | return moment(timestamp).format(format)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/app/components/controls/modal-resizable/modal-resizable.model.ts:
--------------------------------------------------------------------------------
1 | export interface TouchPosition {
2 | x: number,
3 | y: number
4 | }
5 | export interface WinSize {
6 | height: number,
7 | width: number
8 | }
9 | export interface WinPositon {
10 | x: number,
11 | y: number,
12 | h: number
13 | }
14 |
15 | export interface ModalCoordinates {
16 | x: number;
17 | y: number;
18 | width: number;
19 | height: number;
20 | isFullPage: boolean;
21 | }
22 | export interface DetailDialogStateModel {
23 | modal: ModalCoordinates;
24 | tab: string;
25 | }
26 | export const defaultX = 23;
27 | export const defaultY = 9;
28 | export const defaultWidth = 1400;
29 | export const defaultHeight = 600;
--------------------------------------------------------------------------------
/src/app/components/controls/modal-resizable/window/window.component.html:
--------------------------------------------------------------------------------
1 |
3 |
4 |
--------------------------------------------------------------------------------
/src/app/components/controls/modal-resizable/window/window.component.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/app/components/controls/modal-resizable/window/window.component.scss
--------------------------------------------------------------------------------
/src/app/components/controls/modal-resizable/window/window.service.ts:
--------------------------------------------------------------------------------
1 | import { Observable, BehaviorSubject } from 'rxjs';
2 | import { Injectable } from '@angular/core';
3 |
4 | @Injectable({
5 | providedIn: 'root'
6 | })
7 | export class WindowService {
8 | subject = new BehaviorSubject({});
9 | constructor() { }
10 | get listen(): Observable {
11 | return this.subject.asObservable();
12 | }
13 | setMousePosition(evt) {
14 | this.subject.next(evt);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/app/components/controls/transaction-filter/transaction-filter.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { BehaviorSubject, Observable } from 'rxjs';
3 |
4 | @Injectable({
5 | providedIn: 'root'
6 | })
7 | export class TransactionFilterService {
8 | subject = new BehaviorSubject({});
9 | constructor() {
10 | }
11 | get listen(): Observable {
12 | return this.subject.asObservable();
13 | }
14 | setFilter(filterData) {
15 | this.subject.next(filterData);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/components/controls/update-alert/update-alert.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{ message || 'Upgrade..' }}
3 |
4 |
10 |
11 |
--------------------------------------------------------------------------------
/src/app/components/controls/update-alert/update-alert.component.scss:
--------------------------------------------------------------------------------
1 | .update-alert {
2 | position: fixed;
3 | left: 0;
4 | right: 0;
5 | bottom: 0;
6 | z-index: 9999;
7 | background: lightgreen;
8 | padding: 0.5rem;
9 | display: flex;
10 | flex-direction: row;
11 | align-items: center;
12 | justify-content: space-between;
13 | }
--------------------------------------------------------------------------------
/src/app/components/controls/update-alert/update-alert.service.spec.ts:
--------------------------------------------------------------------------------
1 | /* tslint:disable:no-unused-variable */
2 |
3 | import { TestBed, async, inject } from '@angular/core/testing';
4 | import { UpdateAlertService } from './update-alert.service';
5 |
6 | describe('Service: UpdateAlert', () => {
7 | beforeEach(() => {
8 | TestBed.configureTestingModule({
9 | providers: [UpdateAlertService]
10 | });
11 | });
12 |
13 | it('should ...', inject([UpdateAlertService], (service: UpdateAlertService) => {
14 | expect(service).toBeTruthy();
15 | }));
16 | });
17 |
--------------------------------------------------------------------------------
/src/app/components/controls/update-alert/update-alert.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 | import { VERSION } from '../../../../VERSION';
6 |
7 | @Injectable({
8 | providedIn: 'root'
9 | })
10 | export class UpdateAlertService {
11 | private url = `${environment.apiUrl}/version/ui/check/`;
12 |
13 | constructor(private http: HttpClient) { }
14 |
15 | check(): Observable {
16 | // const testVersion = '9.0.1'; // '10.0.1'
17 | return this.http.get(`${this.url}${VERSION}`);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/app/components/controls/webshark/html.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import { DomSanitizer } from '@angular/platform-browser';
3 |
4 | @Pipe({
5 | name: 'html'
6 | })
7 | export class HtmlPipe implements PipeTransform {
8 |
9 | constructor(private sanitizer: DomSanitizer) { }
10 |
11 | public transform(value: any) {
12 | return this.sanitizer.bypassSecurityTrustHtml(`${value}`);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/components/dashboard/add-dashboard-dialog/url-warning-dialog/url-warning-dialog.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Warning
4 |
It is recommended to add URL in URL field on creation, however you can add it later in dashboard settings
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/app/components/dashboard/add-dashboard-dialog/url-warning-dialog/url-warning-dialog.component.scss:
--------------------------------------------------------------------------------
1 | .alarm {
2 | font-size: 54pt;
3 | color: orange;
4 | height: 71px;
5 | width: 71px;
6 | }
--------------------------------------------------------------------------------
/src/app/components/dashboard/add-dashboard-dialog/url-warning-dialog/url-warning-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';
2 | import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
3 |
4 | @Component({
5 | selector: 'app-url-warning-dialog',
6 | templateUrl: './url-warning-dialog.component.html',
7 | styleUrls: ['./url-warning-dialog.component.scss'],
8 | changeDetection: ChangeDetectionStrategy.OnPush
9 | })
10 | export class UrlWarningDialog {
11 |
12 | constructor(
13 | public dialogRef: MatDialogRef,
14 | @Inject(MAT_DIALOG_DATA) public data: any) {}
15 |
16 | onNoClick(): void {
17 | this.dialogRef.close();
18 | }
19 | }
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/app/components/dashboard/add-dialog/add-dialog.component.scss:
--------------------------------------------------------------------------------
1 |
2 | .title {
3 | margin: -1.5rem -1.5rem 0rem -1.5rem;
4 | width: initial !important;
5 | display: flex;
6 | justify-content: space-between;
7 | }
8 | .sub-title {
9 | border-bottom: 1px solid grey;
10 | width: 100%;
11 | height: 50px;
12 | display: flex;
13 | align-content: center;
14 | align-items: center;
15 | justify-content: center;
16 | font-size: larger;
17 | //font-weight: 500;
18 | }
19 | .setting-btn-ok {
20 | background: #009cbf !important ;
21 | padding: 3px 6px !important;
22 | border-radius: 3px ;
23 | margin: 10px;
24 | color: white !important;
25 | cursor: pointer;
26 | line-height: 14px;
27 | }
--------------------------------------------------------------------------------
/src/app/components/dashboard/delete-dialog/delete-dialog.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{'dashboard.deleteDialog.title' | translate}}
4 |
{{'dashboard.deleteDialog.warning' | translate}}
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/app/components/dashboard/delete-dialog/delete-dialog.component.scss:
--------------------------------------------------------------------------------
1 | .alarm {
2 | font-size: 54pt;
3 | color: orange;
4 | height: 71px;
5 | width: 71px;
6 | }
--------------------------------------------------------------------------------
/src/app/components/dashboard/delete-dialog/delete-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';
2 | import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
3 | import { TranslateService } from '@ngx-translate/core'
4 |
5 | @Component({
6 | selector: 'app-delete-dialog',
7 | templateUrl: './delete-dialog.component.html',
8 | styleUrls: ['./delete-dialog.component.scss'],
9 | changeDetection: ChangeDetectionStrategy.OnPush
10 | })
11 | export class DeleteDialogComponent {
12 |
13 | constructor(
14 | public dialogRef: MatDialogRef,
15 | public translateService: TranslateService,
16 | @Inject(MAT_DIALOG_DATA) public data: any) {
17 | translateService.addLangs(['en'])
18 | translateService.setDefaultLang('en')
19 | }
20 |
21 | onNoClick(): void {
22 | this.dialogRef.close();
23 | }
24 | }
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/app/components/dashboard/edit-dialog/edit-dialog.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | width: initial !important;
3 | display: flex;
4 | justify-content: space-between;
5 | }
6 | ::ng-deep .mat-mdc-select-panel {
7 | max-height: unset;
8 | }
--------------------------------------------------------------------------------
/src/app/components/dashboard/index.ts:
--------------------------------------------------------------------------------
1 | export * from './add-dashboard-dialog/add-dashboard-dialog.component';
2 | export * from './add-dialog/add-dialog.component';
3 | export * from './delete-dialog/delete-dialog.component';
4 | export * from './edit-dialog/edit-dialog.component';
5 | export * from './share-qr-dialog/share-qr-dialog.component';
6 | export * from './add-dashboard-dialog/url-warning-dialog/url-warning-dialog.component';
7 | export * from './add-dashboard-dialog/add-dashboard-dialog.component';
8 |
--------------------------------------------------------------------------------
/src/app/components/dashboard/share-qr-dialog/img/hepic_qr_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/app/components/dashboard/share-qr-dialog/img/hepic_qr_logo.png
--------------------------------------------------------------------------------
/src/app/components/dashboard/share-qr-dialog/share-qr-dialog.component.scss:
--------------------------------------------------------------------------------
1 | .link-container {
2 | display: flex;
3 | justify-content: space-between;
4 | align-items: center;
5 | }
6 | .qr-logo {
7 | position: absolute;
8 | top: 48%;
9 | left: 44%;
10 | }
11 | .linktext {
12 | background: #fafafa;
13 | border-radius: 3px;
14 | padding: 6px;
15 | border: 1px solid lightgrey;
16 | }
17 | .linktext:focus {
18 | outline: none;
19 | border: none;
20 | }
21 | .unshare {
22 | opacity:.15;
23 | -webkit-touch-callout: none; /* iOS Safari */
24 | -webkit-user-select: none; /* Safari */
25 | -khtml-user-select: none; /* Konqueror HTML */
26 | -moz-user-select: none; /* Old versions of Firefox */
27 | -ms-user-select: none; /* Internet Explorer/Edge */
28 | user-select: none;
29 | transition:.2s all;
30 | }
31 | .shared-btn {
32 | background: #e23030;
33 | color: white;
34 | padding: 3px 6px;
35 | font-size: 12px;
36 | font-weight: bold;
37 | border-radius: 3px;
38 | cursor: pointer;
39 | text-transform: uppercase;
40 | box-shadow: 1px 1px 2px lightgrey;
41 | transition: .2s all;
42 | }
43 | .shared-btn:hover {
44 | opacity: .75;
45 | }
--------------------------------------------------------------------------------
/src/app/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './controls/alert/alert.component';
2 | export * from './login/login.component';
3 | export * from './dashboard/dashboard.component';
4 | export * from './preference/preference.component';
5 | export * from './controls/modal-resizable/modal-resizable.component';
6 | export * from './search-grid-call/search-grid-call.component';
7 | export * from './controls/flow-tooltip/flow-tooltip.component';
8 | export * from './controls/custom-table/custom-table.component';
9 | export * from './preference/pages/page-api-doc/page-api-doc.component';
10 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/active-cell/active-cell.component.html:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
10 | {{ item.item[column | lowercase] ? options.option1 : options.option2 }}
11 |
12 | |
13 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/active-cell/active-cell.component.scss:
--------------------------------------------------------------------------------
1 |
2 | .online {
3 | background: #72ad6422;
4 | color: #72ad64;
5 | border-radius: 3px;
6 |
7 | font-weight: bold;
8 | text-transform: uppercase;
9 | text-align: center;
10 | font-size: 12px;
11 | line-height: 3;
12 | }
13 |
14 |
15 | .offline {
16 | height: 36px;
17 | background: #e6513722;
18 | color: #e65137;
19 | border-radius: 3px;
20 | font-weight: bold;
21 | text-transform: uppercase;
22 | text-align: center;
23 | font-size: 12px;
24 | line-height: 3;
25 | }
26 | td.mat-mdc-cell {
27 | padding-left: 5px;
28 | text-overflow: ellipsis;
29 | overflow: hidden;
30 | white-space: nowrap;
31 | word-break: break-all;
32 | }
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/active-cell/active-cell.component.ts:
--------------------------------------------------------------------------------
1 |
2 | import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';
3 | import { MatColumnDef, MatTable } from '@angular/material/table';
4 | import { TranslateService } from '@ngx-translate/core'
5 | @Component({
6 | selector: 'app-active-cell',
7 | templateUrl: './active-cell.component.html',
8 | styleUrls: ['./active-cell.component.scss']
9 | })
10 | export class ActiveCellComponent implements OnInit {
11 | @Input() column;
12 | @Input() columnName = 'Status';
13 |
14 | @Input() options: {
15 | option1: string;
16 | option2: string;
17 | };
18 | @ViewChild(MatColumnDef) columnDef: MatColumnDef;
19 |
20 | constructor(public table: MatTable,
21 | private cdr: ChangeDetectorRef,
22 | public translateService: TranslateService) {
23 | translateService.addLangs(['en'])
24 | translateService.setDefaultLang('en')
25 | }
26 |
27 | ngOnInit() {
28 | if (this.table) {
29 | this.cdr.detectChanges();
30 | this.table.addColumnDef(this.columnDef);
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/data-cell/data-cell.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{'LINK.data' | translate}}
4 | |
5 |
6 |
10 | |
11 |
12 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/data-cell/data-cell.component.scss:
--------------------------------------------------------------------------------
1 | .dataBtn {
2 | background: transparent;
3 | padding: 6px 12px;
4 | border-radius: 3px;
5 | border: none;
6 | cursor: pointer;
7 | transition: .3s all;
8 |
9 | & fa-icon {
10 | color: rgb(186, 186, 186);
11 | transition: .2s all;
12 | font-size: 16px;
13 | }
14 |
15 | &:hover {
16 | background: #475faf22;
17 |
18 | & fa-icon {
19 | color: #475faf;
20 | }
21 | }
22 | }
23 | td.mat-mdc-cell {
24 | padding-left: 5px;
25 | text-overflow: ellipsis;
26 | overflow: hidden;
27 | white-space: nowrap;
28 | word-break: break-all;
29 | }
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/data-cell/data-cell.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
2 | import { MatColumnDef, MatTable } from '@angular/material/table';
3 | import { TranslateService } from '@ngx-translate/core'
4 | @Component({
5 | selector: 'app-data-cell',
6 | templateUrl: './data-cell.component.html',
7 | styleUrls: ['./data-cell.component.scss']
8 | })
9 | export class DataCellComponent implements OnInit {
10 | @Output() settingDialog: EventEmitter = new EventEmitter();
11 | @Input() column;
12 | @ViewChild(MatColumnDef) columnDef: MatColumnDef;
13 |
14 | constructor(
15 | public table: MatTable,
16 | private cdr: ChangeDetectorRef,
17 | public translateService: TranslateService
18 | ) {
19 | translateService.addLangs(['en'])
20 | translateService.setDefaultLang('en')
21 | }
22 |
23 | ngOnInit() {
24 | if (this.table) {
25 | this.cdr.detectChanges();
26 | this.table.addColumnDef(this.columnDef);
27 | }
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/db-stats-cell/db-stats-cell.component.scss:
--------------------------------------------------------------------------------
1 | .dbstats {
2 | background: transparent;
3 | padding: 6px 12px;
4 | border-radius: 3px;
5 | border: none;
6 | cursor: pointer;
7 | transition: .3s all;
8 |
9 | & fa-icon {
10 | color: rgb(186, 186, 186);
11 | transition: .2s all;
12 | font-size: 16px;
13 | }
14 |
15 | &:hover {
16 | background: #475faf22;
17 |
18 | & fa-icon {
19 | color: #475faf;
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/db-stats-cell/db-stats-cell.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';
2 | import { MatColumnDef, MatTable } from '@angular/material/table';
3 |
4 | @Component({
5 | selector: 'app-db-stats-cell',
6 | templateUrl: './db-stats-cell.component.html',
7 | styleUrls: ['./db-stats-cell.component.scss']
8 | })
9 | export class DbStatsCellComponent implements OnInit {
10 | @Input() column;
11 | @ViewChild(MatColumnDef) columnDef: MatColumnDef;
12 |
13 | constructor(public table: MatTable, private cdr: ChangeDetectorRef) { }
14 |
15 | ngOnInit() {
16 | if (this.table) {
17 | this.cdr.detectChanges();
18 | this.table.addColumnDef(this.columnDef);
19 | }
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/expire-cell/expire-cell.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{ column }} |
4 |
7 | {{ formatDate(item[column])}}
9 |
10 |
11 | {{ formatDate(item[column])}}
12 |
13 |
14 | |
15 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/expire-cell/expire-cell.component.scss:
--------------------------------------------------------------------------------
1 | td.mat-mdc-cell {
2 | padding-left: 5px;
3 | text-overflow: ellipsis;
4 | overflow: hidden;
5 | white-space: nowrap;
6 | word-break: break-all;
7 | }
8 | .expired{
9 | color:orangered;
10 | text-decoration: line-through;
11 | }
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/expire-cell/expire-cell.component.ts:
--------------------------------------------------------------------------------
1 | import {
2 | ChangeDetectorRef,
3 | Component,
4 | Input,
5 | OnInit,
6 | ViewChild,
7 | } from '@angular/core';
8 | import { MatColumnDef, MatCellDef, MatTable } from '@angular/material/table';
9 | import moment from 'moment';
10 | @Component({
11 | selector: 'app-expire-cell',
12 | templateUrl: './expire-cell.component.html',
13 | styleUrls: ['./expire-cell.component.scss'],
14 | })
15 |
16 | export class ExpireCellComponent implements OnInit {
17 | @Input() column;
18 | @Input() timeFormat;
19 | @ViewChild(MatColumnDef) columnDef: MatColumnDef;
20 | @ViewChild(MatCellDef) cellDef: MatCellDef;
21 | dateFormat;
22 | constructor(
23 | public table: MatTable,
24 | private cdr: ChangeDetectorRef
25 | ) { }
26 |
27 | ngOnInit() {
28 |
29 | if (this.table) {
30 | this.cdr.detectChanges();
31 | this.table.addColumnDef(this.columnDef);
32 | }
33 | }
34 | expired(t) {
35 | const now = moment().unix();
36 | const record = moment(t).unix();
37 | if(now && record){
38 | return now > record
39 | } else { return false }
40 | }
41 |
42 | formatDate(item) {
43 | return moment(item).format(this.timeFormat);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/generic-cell/generic-cell.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ column }} |
6 |
7 | {{ item[column] }}
8 | |
9 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/generic-cell/generic-cell.component.scss:
--------------------------------------------------------------------------------
1 | td.mat-mdc-cell {
2 | padding-left: 5px;
3 | text-overflow: ellipsis;
4 | overflow: hidden;
5 | white-space: nowrap;
6 | word-break: break-all;
7 | }
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/generic-cell/generic-cell.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';
2 | import { MatColumnDef, MatTable } from '@angular/material/table';
3 |
4 | @Component({
5 | selector: 'app-generic-cell',
6 | templateUrl: './generic-cell.component.html',
7 | styleUrls: ['./generic-cell.component.scss']
8 | })
9 | export class GenericCellComponent implements OnInit {
10 | @Input() column;
11 | @ViewChild(MatColumnDef) columnDef: MatColumnDef;
12 |
13 | constructor(public table: MatTable, private cdr: ChangeDetectorRef) { }
14 |
15 | ngOnInit() {
16 | if (this.table) {
17 | this.cdr.detectChanges();
18 | this.table.addColumnDef(this.columnDef);
19 | }
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/index.ts:
--------------------------------------------------------------------------------
1 | export * from './active-cell/active-cell.component';
2 | export * from './data-cell/data-cell.component';
3 | export * from './db-stats-cell/db-stats-cell.component';
4 | export * from './generic-cell/generic-cell.component';
5 | export * from './tool-cell/tool-cell.component';
6 | export * from './last-error-cell/last-error-cell.component';
7 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/last-error-cell/last-error-cell.component.html:
--------------------------------------------------------------------------------
1 |
2 |
4 | {{'cellTypes.lastError' | translate}}
5 | |
6 |
7 |
9 |
10 |
11 | {{'cellTypes.noDatabaseErrors'| translate}}
12 |
13 |
14 |
17 |
18 |
19 | {{element.item.last_error}}
20 |
21 |
22 | |
23 |
24 |
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/last-error-cell/last-error-cell.component.scss:
--------------------------------------------------------------------------------
1 | td.mat-mdc-cell {
2 | padding-left: 5px;
3 | text-overflow: ellipsis;
4 | overflow: hidden;
5 | white-space: nowrap;
6 | word-break: break-all;
7 | }
8 | .lastError {
9 | background: orange;
10 | padding: 3px;
11 | border-radius: 3px;
12 | margin: 10px;
13 | cursor: pointer;
14 |
15 | & fa-icon {
16 | color: white;
17 | font-size: 14px;
18 | }
19 | }
20 |
21 | .noError {
22 | background: #72ad6422;
23 | padding: 3px;
24 | border-radius: 3px;
25 | margin: 10px;
26 | height: 36px;
27 | line-height: 2;
28 | cursor: pointer;
29 |
30 | & fa-icon {
31 | color: #72ad64;
32 | font-size: 14px;
33 |
34 | }
35 | }
--------------------------------------------------------------------------------
/src/app/components/preference/cell-types/last-error-cell/last-error-cell.component.ts:
--------------------------------------------------------------------------------
1 |
2 | import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';
3 | import { MatColumnDef, MatTable } from '@angular/material/table';
4 | import { TranslateService } from '@ngx-translate/core'
5 | @Component({
6 | selector: 'app-last-error-cell',
7 | templateUrl: './last-error-cell.component.html',
8 | styleUrls: ['./last-error-cell.component.scss']
9 | })
10 | export class LastErrorCellComponent implements OnInit {
11 | @Input() column;
12 | @ViewChild(MatColumnDef) columnDef: MatColumnDef;
13 |
14 | constructor(public table: MatTable,
15 | private cdr: ChangeDetectorRef,
16 | public translateService: TranslateService
17 | ) {
18 | translateService.addLangs(['en'])
19 | translateService.setDefaultLang('en')
20 | }
21 |
22 | ngOnInit() {
23 | if (this.table) {
24 | this.cdr.detectChanges();
25 | this.table.addColumnDef(this.columnDef);
26 | }
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-advanced/dialog-advanced.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 | ::ng-deep .mat-mdc-input-element:disabled {
25 | color: black;
26 | }
27 | /*TODO(mdc-migration): The following rule targets internal classes of form-field that may no longer apply for the MDC version.*/
28 | /*TODO(mdc-migration): The following rule targets internal classes of form-field that may no longer apply for the MDC version.*/
29 | ::ng-deep .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline {
30 | background-image: unset;
31 | background-color: rgba(0,0,0,.42);
32 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-agentsub/dialog-agentsub.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-authkey/dialog-authkey.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 | .authkey-cont {
25 | display:flex;
26 | align-items:center;
27 | min-height:100px;
28 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-authtoken-display/dialog-authtoken-display.component.html:
--------------------------------------------------------------------------------
1 |
2 |
{{ 'preference.authtoken.displayDialog.description' | translate }}
3 |
{{ 'preference.authtoken.displayDialog.description' | translate }}
4 |
{{token}}
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-authtoken-display/dialog-authtoken-display.component.scss:
--------------------------------------------------------------------------------
1 | .alarm {
2 | font-size: 54pt;
3 | color: red;
4 | height: 71px;
5 | width: 71px;
6 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-db-selector/dialog-db-selector.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 |
5 | .title {
6 | margin: -1.5rem -1.5rem 2rem -1.5rem;
7 | width: initial !important;
8 | font-size: 14px;
9 | display: flex;
10 | justify-content: space-between;
11 | text-transform: uppercase;
12 | //font-weight: 400;
13 | letter-spacing: 1px;
14 | }
15 |
16 | .example-container {
17 | display: flex;
18 | flex-direction: column;
19 |
20 | &>* {
21 | width: 100%;
22 | }
23 | }
24 |
25 | .hide {
26 | display: none !important;
27 | }
28 |
29 | .sync-opt>* {
30 |
31 | text-transform: none !important;
32 |
33 |
34 | }
35 |
36 | .blink_me {
37 | animation: blinker 2s linear infinite;
38 | }
39 |
40 | @keyframes blinker {
41 | 50% {
42 | opacity: 0;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-delete-alert/dialog-delete-alert.component.html:
--------------------------------------------------------------------------------
1 |
2 |
error_outline
3 |
4 | {{ 'preference.deleteDialog.title' | translate: {
5 | 'message': message,
6 | 'page': page
7 | }
8 |
9 | }}
10 |
{{'preference.deleteDialog.warningTitle' | translate }}
11 |
{{ 'preference.deleteDialog.warning' | translate }}
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-delete-alert/dialog-delete-alert.component.scss:
--------------------------------------------------------------------------------
1 | $delete: red;
2 | $reset: orange;
3 |
4 | .alarm-delete {
5 | font-size: 54pt;
6 | color: $delete;
7 | height: 71px;
8 | width: 71px;
9 | }
10 | .alarm-reset {
11 | font-size: 54pt;
12 | color: $reset;
13 | height: 71px;
14 | width: 71px;
15 | }
16 |
17 |
18 | .reset {
19 | background: $reset;
20 | color:white;
21 | }
22 | .delete{
23 | background: $delete;
24 | color:white;
25 | }
26 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-hepsub/dialog-hepsub.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 |
25 | ::ng-deep .mat-mdc-input-element:disabled {
26 | color: black;
27 | }
28 | /*TODO(mdc-migration): The following rule targets internal classes of form-field that may no longer apply for the MDC version.*/
29 | /*TODO(mdc-migration): The following rule targets internal classes of form-field that may no longer apply for the MDC version.*/
30 | ::ng-deep .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline {
31 | background-image: unset;
32 | background-color: rgba(0,0,0,.42);
33 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-mapping/dialog-mapping.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 |
5 | .title {
6 | margin: -1.5rem -1.5rem 2rem -1.5rem;
7 | width: initial !important;
8 | font-size: 14px;
9 | display: flex;
10 | justify-content: space-between;
11 | text-transform: uppercase;
12 | font-weight: 400;
13 | letter-spacing: 1px;
14 | }
15 |
16 | .example-container {
17 | display: flex;
18 | flex-direction: column;
19 |
20 | &>* {
21 | width: 100%;
22 | }
23 | }
24 |
25 | .hide {
26 | display: none !important;
27 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-scripts/dialog-scripts.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 |
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-user-settings/dialog-user-settings.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 |
5 | .example-container {
6 | display: flex;
7 | flex-direction: column;
8 | & > * {
9 | width: 100%;
10 | }
11 | }
12 | .hide {
13 | display: none !important;
14 | }
15 |
16 |
17 | ::ng-deep .mat-mdc-input-element:disabled {
18 | color: black;
19 | }
20 | /* TODO(mdc-migration): The following rule targets internal classes of form-field that may no longer apply for the MDC version. */
21 | /* TODO(mdc-migration): The following rule targets internal classes of form-field that may no longer apply for the MDC version. */
22 | ::ng-deep .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline {
23 | background-image: unset;
24 | background-color: rgba(0,0,0,.42);
25 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/dialog-users/dialog-users.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 |
5 | .example-container {
6 | display: flex;
7 | flex-direction: column;
8 | & > * {
9 | width: 100%;
10 | }
11 | }
12 | .hide {
13 | display: none !important;
14 | }
15 |
16 | .input-copy-warning {
17 | color:red;
18 | font-weight: bold;
19 | }
20 | .copy-warning {
21 | padding:5px;
22 | background: #ff000022;
23 | color:red;
24 | width:100%;
25 |
26 | }
27 | .stats-label {
28 | display: inline-block;
29 | font-weight: 500;
30 | padding: 10px;
31 | }
32 | .stats-data {
33 | display: inline-block;
34 | }
--------------------------------------------------------------------------------
/src/app/components/preference/dialogs/index.ts:
--------------------------------------------------------------------------------
1 | export * from './dialog-advanced/dialog-advanced.component';
2 | export * from './dialog-alias/dialog-alias.component';
3 | export * from './dialog-authkey/dialog-authkey.component';
4 | export * from './dialog-delete-alert/dialog-delete-alert.component';
5 | export * from './dialog-authtoken-display/dialog-authtoken-display.component';
6 | export * from './dialog-hepsub/dialog-hepsub.component';
7 | export * from './dialog-agentsub/dialog-agentsub.component';
8 | export * from './dialog-mapping/dialog-mapping.component';
9 | export * from './dialog-scripts/dialog-scripts.component';
10 | export * from './dialog-user-settings/dialog-user-settings.component';
11 | export * from './dialog-users/dialog-users.component';
12 | export * from './dialog-db-selector/dialog-db-selector.component';
13 |
14 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './page-about/page-about.component';
2 | export * from './page-advanced-settings/page-advanced-settings.component';
3 | export * from './page-agent-subscriptions/page-agent-subscriptions.component';
4 | export * from './page-api-auth/page-api-auth.component';
5 | export * from './page-hepsub/page-hepsub.component';
6 | export * from './page-mapping/page-mapping.component';
7 | export * from './page-reset/page-reset.component';
8 | export * from './page-scripts/page-scripts.component';
9 | export * from './page-system-overview/page-system-overview.component';
10 | export * from './page-user-settings/page-user-settings.component';
11 | export * from './page-users/page-users.component';
12 | export * from './page-admin/page-admin.component';
13 | export * from './page-alias/page-alias.component';
14 | export * from './page-api-doc/page-api-doc.component';
15 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-about/page-about.component.scss:
--------------------------------------------------------------------------------
1 | .about-content {
2 |
3 | height: 100%;
4 | padding:20px;
5 | margin:0 auto;
6 |
7 | }
8 | .about-content img{
9 | padding-left: 20px;
10 |
11 |
12 |
13 | }
14 | .about-content h4 {
15 | margin-top:20px;
16 | margin-bottom:20px;
17 | font-size: 14px;
18 | font-weight: bold;
19 |
20 | line-height:32px;
21 | color:grey;
22 | max-width:650px;
23 | text-align: left;
24 | }
25 |
26 | .about-body {
27 | text-align: left;
28 | margin-top: 20px;
29 | max-width:650px;
30 | font-size: 13px;
31 | padding: 15px;
32 | background: #fafafa;
33 | color: grey;
34 | border-radius: 3px;
35 | border: 1px solid lightgray;
36 | height:70%;
37 | overflow-y: auto;
38 | }
39 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-about/page-about.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
2 |
3 | import { PreferenceVersionService } from '@app/services/preferences/version.service';
4 | import { VERSION } from 'src/VERSION';
5 |
6 | @Component({
7 | selector: 'app-page-about',
8 | templateUrl: './page-about.component.html',
9 | styleUrls: ['./page-about.component.scss'],
10 | changeDetection: ChangeDetectionStrategy.OnPush
11 | })
12 | export class PageAboutComponent implements OnInit {
13 | uiVersion = VERSION;
14 | apiVersion: any;
15 | constructor(private _pvs: PreferenceVersionService) { }
16 |
17 | async ngOnInit() {
18 | this.apiVersion = this._pvs.getApiVersion();
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-advanced-settings/page-advanced-settings.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-agent-subscriptions/page-agent-subscriptions.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-alias/page-alias.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-api-auth/page-api-auth.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-api-doc/page-api-doc.component.html:
--------------------------------------------------------------------------------
1 |
2 |
{{page | titlecase}}
3 | {{ 'preference.' + pageID + '.description' | translate }}
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-api-doc/page-api-doc.component.scss:
--------------------------------------------------------------------------------
1 | .api-container {
2 | width:100%;
3 | height: 90%;
4 | overflow: auto;
5 | }
6 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-api-doc/page-api-doc.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input, OnInit } from '@angular/core';
2 | import { environment } from '@environments/environment';
3 | import { SwaggerUIBundle } from 'swagger-ui-dist';
4 |
5 | // declare const SwaggerUIBundle: any;
6 | @Component({
7 | selector: 'app-page-api-doc',
8 | templateUrl: './page-api-doc.component.html',
9 | styleUrls: ['./page-api-doc.component.scss']
10 |
11 | })
12 |
13 | export class PageApiDocComponent implements OnInit {
14 | @Input() page: string;
15 | @Input() pageID: string;
16 | private url = new URL(environment.apiUrl);
17 | constructor() {
18 |
19 | }
20 | ngOnInit(): void {
21 | const ui = SwaggerUIBundle({
22 | dom_id: '#swagger-ui',
23 | layout: 'BaseLayout',
24 | presets: [
25 | SwaggerUIBundle.presets.apis,
26 | SwaggerUIBundle.SwaggerUIStandalonePreset
27 | ],
28 | url: this.url.origin + '/doc/api/json',
29 | docExpansion: 'none',
30 | operationsSorter: 'alpha'
31 | });
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-hepsub/page-hepsub.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-mapping/page-mapping.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-scripts/page-scripts.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-system-overview/page-system-overview.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-user-settings/page-user-settings.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/pages/page-users/page-users.component.scss:
--------------------------------------------------------------------------------
1 |
2 | td.mat-mdc-cell {
3 | padding-left: 5px;
4 | text-overflow: ellipsis;
5 | overflow: hidden;
6 | white-space: nowrap;
7 | word-break: break-all;
8 | }
9 | table {
10 | width: 100%;
11 | }
12 | .page-wrapper {
13 | background-color: #fff;
14 | flex: 1;
15 | padding: 2rem;
16 | overflow-y: auto
17 | }
18 | .tab-name {
19 | text-align: left;
20 | padding: 20px;
21 | padding-left: 0px;
22 |
23 | & h3 {
24 | font-size: 1.25em;
25 | font-weight: bold;
26 | color: grey;
27 | padding-bottom: 5px;
28 | margin-bottom: 0px;
29 | line-height: 0.75em;
30 | }
31 |
32 | & small {
33 | color: grey;
34 | }
35 | }
36 |
37 | .mat-mdc-form-field {
38 | font-size: 14px;
39 | width: 100%;
40 | }
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/app/components/preference/service-dialogs/dialog-export/dialog-export.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{pageId}} import
3 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
14 |
--------------------------------------------------------------------------------
/src/app/components/preference/service-dialogs/dialog-export/dialog-export.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 |
--------------------------------------------------------------------------------
/src/app/components/preference/service-dialogs/dialog-export/dialog-export.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Inject, ChangeDetectionStrategy, ViewChild } from '@angular/core';
2 | import { FormControl, Validators } from '@angular/forms';
3 | import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
4 | import { AuthenticationService } from '@app/services';
5 |
6 | @Component({
7 | selector: 'app-dialog-export',
8 | templateUrl: './dialog-export.component.html',
9 | styleUrls: ['./dialog-export.component.scss'],
10 | changeDetection: ChangeDetectionStrategy.OnPush
11 | })
12 | export class DialogExportComponent {
13 | pageId: string = 'users';
14 |
15 |
16 | constructor(
17 | @Inject(MAT_DIALOG_DATA) public data: any){
18 | this.pageId = data.pageId;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/app/components/preference/service-dialogs/dialog-import/dialog-import.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | font-size: 14px;
8 | display: flex;
9 | justify-content: space-between;
10 | text-transform: uppercase;
11 | //font-weight: 400;
12 | letter-spacing: 1px;
13 | }
14 | .example-container {
15 | display: flex;
16 | flex-direction: column;
17 | & > * {
18 | width: 100%;
19 | }
20 | }
21 | .hide {
22 | display: none !important;
23 | }
24 | .file-upload-container {
25 | position: relative;
26 | & > .fileselect {
27 | align-items: center;
28 | background-color: #eee;
29 | border-radius: 1rem;
30 | border-style: dashed;
31 | color: #999;
32 | cursor: pointer;
33 | display: flex;
34 | height: 150px;
35 | justify-content: center;
36 | margin: 0;
37 | min-width: 200px;
38 | padding: 1rem;
39 | &::before {
40 | content: "Drop CSV file here or click to upload";
41 | }
42 | &.drugOver {
43 | background-color: #ccc;
44 | }
45 | }
46 | & > input[type="file"] {
47 | position: absolute;
48 | top: 0;
49 | left: 0;
50 | width: 100%;
51 | height: 100%;
52 | bottom: 0;
53 | right: 0;
54 | cursor: pointer;
55 | opacity: 0;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/app/components/preference/service-dialogs/index.ts:
--------------------------------------------------------------------------------
1 |
2 | export * from './dialog-export/dialog-export.component';
3 | export * from './dialog-import/dialog-import.component';
--------------------------------------------------------------------------------
/src/app/components/preference/setting-button/setting-button.component.html:
--------------------------------------------------------------------------------
1 |
2 |
6 |
10 |
14 |
--------------------------------------------------------------------------------
/src/app/components/preference/setting-button/setting-button.component.scss:
--------------------------------------------------------------------------------
1 | .setting-button-container {
2 | display: flex;
3 | margin-top: 0px;
4 | margin-bottom: 21px;
5 |
6 | & .setting-btn {
7 | height: 35px;
8 | background: #009cbf22 !important;
9 | color: #009cbf;
10 | margin-right: 7px;
11 |
12 | &:disabled,
13 | &[disabled] {
14 | background: lightgray !important;
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/components/preference/setting-button/setting-button.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-setting-button',
5 | templateUrl: './setting-button.component.html',
6 | styleUrls: ['./setting-button.component.scss']
7 | })
8 | export class SettingButtonComponent implements OnInit {
9 | @Input() isAccess: any;
10 | @Output() addDialog: EventEmitter = new EventEmitter();
11 | @Output() importDialog: EventEmitter = new EventEmitter();
12 | @Output() exportDialog: EventEmitter = new EventEmitter();
13 | constructor() { }
14 |
15 | ngOnInit(): void {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-callinfo/html.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import { DomSanitizer } from '@angular/platform-browser';
3 |
4 | @Pipe({
5 | name: 'html'
6 | })
7 | export class HtmlPipe implements PipeTransform {
8 |
9 | constructor(private sanitizer: DomSanitizer) { }
10 |
11 | public transform(value: any) {
12 | return this.sanitizer.bypassSecurityTrustHtml(value);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-events/tab-events.component.css:
--------------------------------------------------------------------------------
1 | h1 {
2 | padding: 2rem;
3 | text-align: center;
4 | color: grey;
5 | }
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-events/tab-events.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-events/tab-events.module.ts:
--------------------------------------------------------------------------------
1 | import { TabEventsComponent } from './tab-events.component';
2 | import { NgModule } from '@angular/core';
3 | import { CommonModule } from '@angular/common';
4 | import { NgxJsonViewerModule } from 'ngx-json-viewer';
5 |
6 | @NgModule({
7 | imports: [
8 | CommonModule,
9 | NgxJsonViewerModule
10 | ],
11 | declarations: [
12 | TabEventsComponent
13 | ],
14 | exports: [TabEventsComponent]
15 | })
16 | export class TabEventsModule { }
17 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-flow/tab-flow.module.ts:
--------------------------------------------------------------------------------
1 | import { FlowItemComponent } from './flow-item/flow-item.component';
2 | import { NgModule } from '@angular/core';
3 | import { CommonModule } from '@angular/common';
4 | import { TabFlowComponent } from './tab-flow.component';
5 | // import { VirtualScrollerModule } from 'ngx-virtual-scroller';
6 | import { TranslateModule } from '@ngx-translate/core'
7 | import { MatIconModule } from '@angular/material/icon';
8 | import { MatButtonModule } from '@angular/material/button';
9 | import { ScrollingModule } from '@angular/cdk/scrolling';
10 | import { MatTooltipModule } from '@angular/material/tooltip';
11 | @NgModule({
12 | imports: [
13 | CommonModule,
14 | // VirtualScrollerModule,
15 | ScrollingModule,
16 | TranslateModule,
17 | MatIconModule,
18 | MatButtonModule,
19 | MatTooltipModule
20 | ],
21 | declarations: [
22 | TabFlowComponent,
23 | FlowItemComponent,
24 | ],
25 | exports: [TabFlowComponent]
26 |
27 | })
28 | export class TabFlowModule { }
29 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-hepsub/moment.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import moment from 'moment';
3 |
4 | @Pipe({
5 | name: 'moment',
6 | pure: false
7 | })
8 |
9 | export class MomentPipe implements PipeTransform {
10 | transform(timestamp, format) {
11 | return moment(timestamp).format(format)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-hepsub/tab-hepsub.component.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/app/components/search-grid-call/detail-dialog/tab-hepsub/tab-hepsub.component.scss
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-logs/tab-logs.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-logs/tab-logs.component.scss:
--------------------------------------------------------------------------------
1 | .red-container {
2 | padding: 0.5rem;
3 | background-color: rgb(255, 236, 236);
4 | }
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-qos/tab-qos.module.ts:
--------------------------------------------------------------------------------
1 | import { ChartsModule } from '@xirenec/ng2-charts';
2 | import { FormsModule } from '@angular/forms';
3 | import { HomerMaterialModule } from '@app/app.material-module';
4 | import { NgModule } from '@angular/core';
5 | import { CommonModule } from '@angular/common';
6 | import { TabQosComponent } from './tab-qos.component';
7 |
8 | @NgModule({
9 | imports: [
10 | CommonModule,
11 | HomerMaterialModule,
12 | FormsModule,
13 | ChartsModule,
14 | ],
15 | declarations: [TabQosComponent],
16 | exports: [TabQosComponent]
17 | })
18 | export class TabQosModule { }
19 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-sub/tab-sub.component.css:
--------------------------------------------------------------------------------
1 | .agent-container {
2 | padding: 20px;
3 | }
4 | .no-agents h3 {
5 | text-align: center;
6 | font-weight: bold;
7 | padding-top: 20px;
8 | }
9 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-sub/tab-sub.component.html:
--------------------------------------------------------------------------------
1 |
2 |
Agents
3 |
4 |
5 |
6 |
7 |
8 |
9 |
No Agents Active
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-sub/tab-sub.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-tab-sub',
5 | templateUrl: './tab-sub.component.html',
6 | styleUrls: ['./tab-sub.component.css'],
7 | changeDetection: ChangeDetectionStrategy.OnPush
8 | })
9 | export class TabSubComponent {
10 | @Input() dataItem: any;
11 | }
12 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/detail-dialog/tab-sub/tab-sub.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { TabSubComponent } from './tab-sub.component';
4 | import { NgxJsonViewerModule } from 'ngx-json-viewer';
5 |
6 | @NgModule({
7 | imports: [
8 | CommonModule,
9 | NgxJsonViewerModule
10 | ],
11 | declarations: [TabSubComponent],
12 | exports: [TabSubComponent]
13 | })
14 | export class TabSubModule { }
15 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/export-dialog/export-dialog.component.scss:
--------------------------------------------------------------------------------
1 | .type-selector-radio {
2 | display: flex;
3 | flex-direction: column;
4 | margin: 15px 0;
5 | }
6 | .chack-list {
7 | margin-right: 1.3rem;
8 | }
9 |
10 | .title {
11 | width: initial !important;
12 | display: flex;
13 | justify-content: space-between;
14 | }
15 |
16 | .example-container {
17 | display: flex;
18 | flex-direction: column;
19 | & > * {
20 | width: 100%;
21 | }
22 | }
23 | mat-form-field {
24 | width: 100%;
25 | }
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/filters/index.ts:
--------------------------------------------------------------------------------
1 | export * from './status-filter/status-filter.component';
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/filters/status-filter/status-filter.component.html:
--------------------------------------------------------------------------------
1 |
2 |
9 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/filters/status-filter/status-filter.component.scss:
--------------------------------------------------------------------------------
1 | .container {
2 | width: 167px;
3 | display: flex;
4 | flex: 1 1 auto;
5 | align-items: center;
6 | line-height: normal;
7 | position: relative;
8 | padding: 16px 12px;
9 | }
10 |
11 | input {
12 | border-radius: unset;
13 | height: 40px;
14 | background: transparent;
15 | padding-bottom: 8px;
16 | border-width: 0;
17 | border-bottom: 2px solid;
18 | border-bottom-color: var(--ag-border-color, #e2e2e2);
19 | color: var(--ag-foreground-color, rgba(0, 0, 0, 0.87));
20 | padding-bottom: 8px;
21 | }
22 | input:focus {
23 | border-bottom: 2px solid;
24 | border-bottom-color: var(--ag-material-primary-color, #3f51b5);
25 | box-shadow: unset;
26 | }
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/grid-settings-dialog/grid-settings-dialog.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 |
5 | .title {
6 | width: initial !important;
7 | display: flex;
8 | justify-content: space-between;
9 | }
10 |
11 | .example-container {
12 | display: flex;
13 | flex-direction: column;
14 | & > * {
15 | width: 100%;
16 | }
17 | .example-list .pos-sticky {
18 | position: sticky;
19 | top: 0;
20 | }
21 | }
22 | .radio-group {
23 | display: flex;
24 | flex-direction: column;
25 | margin: 15px 0;
26 | }
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/index.ts:
--------------------------------------------------------------------------------
1 | export * from './detail-dialog/detail-dialog.component';
2 | export * from './detail-dialog/tab-callinfo/tab-callinfo.component';
3 | export * from './detail-dialog/tab-sub/tab-sub.component';
4 | export * from './detail-dialog/tab-events/tab-events.component';
5 | export * from './detail-dialog/tab-export/tab-export.component';
6 | export * from './detail-dialog/tab-flow/tab-flow.component';
7 | export * from './detail-dialog/tab-logs/tab-logs.component';
8 | export * from './detail-dialog/tab-messages/tab-messages.component';
9 | export * from './detail-dialog/tab-hepsub/tab-hepsub.component';
10 | export * from './detail-dialog/tab-qos/tab-qos.component';
11 | export * from './grid-chart-dialog/grid-chart-dialog.component';
12 | export * from './grid-settings-dialog/grid-settings-dialog';
13 | export * from './message-content/message-safe-html.component';
14 | export * from './message-content/message-content.component';
15 | export * from './renderer/index';
16 | export * from './export-dialog/export-dialog.component';
17 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/message-content/message-safe-html.component.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import {DomSanitizer} from "@angular/platform-browser";
3 |
4 | /**
5 | * Generated class for the SafeHtmlPipe pipe.
6 | *
7 | * See https://angular.io/api/core/Pipe for more info on Angular Pipes.
8 | */
9 | @Pipe({
10 | name: 'safeHtml',
11 | })
12 | export class MessageSafeHtmlPipe implements PipeTransform {
13 |
14 | constructor(private sanitizer:DomSanitizer){}
15 |
16 | transform(html) {
17 | return this.sanitizer.bypassSecurityTrustHtml(html);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/renderer/column-alias-renderer/column-alias-renderer.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{ip.name}}
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/app/components/search-grid-call/renderer/index.ts:
--------------------------------------------------------------------------------
1 | export * from './column-action-renderer.component';
2 | export * from './column-callid-renderer.component';
3 | export * from './column-uuid-renderer.component';
4 | export * from './column-method-renderer.component';
5 | export * from './header-action-renderer.component';
6 | export * from './loki-highlight-renderer.component';
7 | export * from './column-mos-renderer.component';
8 | export * from './column-country-renderer.component';
9 | export * from './column-alias-renderer/column-alias-renderer.component';
10 | export * from './generic-cell-renderer.component';
--------------------------------------------------------------------------------
/src/app/components/widgets/IWidget.ts:
--------------------------------------------------------------------------------
1 | import { OnInit, OnDestroy, EventEmitter } from '@angular/core';
2 |
3 | export interface IWidget extends OnInit, OnDestroy {
4 | id: string;
5 | config?: any;
6 | changeSettings?: EventEmitter;
7 | openDialog(): void;
8 | setConfig?(config: any): void;
9 | refresh?(): void;
10 | doSearchResult?(): void;
11 | }
12 |
13 | export interface IWidgetMetaData {
14 | category: string;
15 | title: string;
16 | description: string;
17 | indexName?: string;
18 | strongIndex?: string;
19 | advancedName?: string;
20 | subCategory?: string;
21 | enable?: boolean;
22 | componentClass?: any;
23 | settingWindow?: boolean;
24 | className?: string;
25 | submit?: boolean;
26 | minWidth?: number;
27 | minHeight?: number;
28 | deprecated?: boolean;
29 | }
30 |
--------------------------------------------------------------------------------
/src/app/components/widgets/ace-editor-widget/ace-editor-widget.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
--------------------------------------------------------------------------------
/src/app/components/widgets/ace-editor-widget/ace-editor-widget.component.scss:
--------------------------------------------------------------------------------
1 | .scrollable{
2 | display: block;
3 | height: 100%;
4 | overflow-y: auto;
5 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/ace-editor-widget/settings-ace-editor-widget.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | width: initial !important;
3 | display: flex;
4 | justify-content: space-between;
5 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/alert-widget/alert-widget.component.html:
--------------------------------------------------------------------------------
1 |
13 |
14 |
17 |
--------------------------------------------------------------------------------
/src/app/components/widgets/alert-widget/alert-widget.component.scss:
--------------------------------------------------------------------------------
1 | .alertWidget{
2 | height: calc(100% - 10px);
3 | width: calc(100% - 10px);
4 | margin-left: 5px;
5 | border-radius: .25rem;
6 | padding: .75rem 1.25rem;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/src/app/components/widgets/alert-widget/snack-bar.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{ data.alertMessage }}
3 |
--------------------------------------------------------------------------------
/src/app/components/widgets/alert-widget/snack-bar.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';
2 | import { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';
3 |
4 | @Component({
5 | selector: 'snack-bar',
6 | templateUrl: 'snack-bar.component.html',
7 | styles: [`
8 | .snack-bar {
9 | box-sizing: border-box;
10 | display:block;
11 | width:calc(100% + 34px);
12 | height:calc(100% + 28px);
13 | margin: -14px -17px;
14 | border-radius: 4px;
15 | padding: 14px 16px;
16 | }
17 | `],
18 | changeDetection: ChangeDetectionStrategy.OnPush
19 | })
20 | export class SnackBarComponent {
21 | constructor(
22 | @Inject(MAT_SNACK_BAR_DATA) public data: any
23 | ) { }
24 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/clock-widget/clock-widget.component.html:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/src/app/components/widgets/clock-widget/clock-widget.component.scss:
--------------------------------------------------------------------------------
1 | .box.clock-widget > h2,
2 | .box.clock-widget > h3,
3 | .box.clock-widget > h5,
4 | .box.clock-widget > p {
5 | text-align: center;
6 | }
7 | .box {
8 | &.clock-widget {
9 | height: 100%;
10 | }
11 | }
12 | .analog-clock {
13 | position: relative;
14 | margin: 30px auto 0;
15 | width: 200px;
16 | height: 200px;
17 | background-color: aliceblue;
18 | border-radius: 50%;
19 | }
20 | .hand {
21 | position: absolute;
22 | left: 50%;
23 | width: 1px;
24 | height: 50%;
25 | transform-origin: 100% 100%;
26 | }
27 | .hour {
28 | background-color: #f44336;
29 | }
30 | .minute {
31 | background-color: #3f51b5;
32 | }
33 | .second {
34 | background-color: #9e9e9e;
35 | }
36 | .center-circle {
37 | position: absolute;
38 | top: 50%;
39 | left: 50%;
40 | transform: translate3d(-50%, -50%, 0);
41 | width: 14px;
42 | height: 14px;
43 | background-color: black;
44 | border-radius: 50%;
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/src/app/components/widgets/clock-widget/setting-clock-widget.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | width: initial !important;
3 | display: flex;
4 | justify-content: space-between;
5 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/general-iframe-widget/general-iframe-widget.component.html:
--------------------------------------------------------------------------------
1 |
3 |
4 |
7 |
--------------------------------------------------------------------------------
/src/app/components/widgets/general-iframe-widget/general-iframe-widget.component.scss:
--------------------------------------------------------------------------------
1 | iframe {
2 | width: 100%;
3 | height: calc(100% - 1rem);
4 | border: 0;
5 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/general-iframe-widget/setting-general-iframe-widget.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | margin: -1.5rem -1.5rem 2rem -1.5rem;
3 | width: initial !important;
4 | display: flex;
5 | justify-content: space-between;
6 | }
7 | .example-container {
8 | & > * {
9 | width: 100%;
10 | }
11 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/grafana-widget/grafana-widget.component.html:
--------------------------------------------------------------------------------
1 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/src/app/components/widgets/grafana-widget/grafana-widget.component.scss:
--------------------------------------------------------------------------------
1 | iframe {
2 | width: 100%;
3 | height: calc(100% - 1rem);
4 | border: 0;
5 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/grafana-widget/setting-grafana-widget.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | margin: -1.5rem -1.5rem 2rem -1.5rem;
3 | width: initial !important;
4 | display: flex;
5 | justify-content: space-between;
6 | }
7 | .example-container {
8 | & > * {
9 | width: 100%;
10 | }
11 | }
12 | .login-error {
13 | background:#ff440033;
14 | border:1px solid #ff4400;
15 | color:#ff4400;
16 | padding:10px;
17 | font-size: 13px;
18 | text-align: center;
19 | border-radius:4px;
20 | margin:3px 0px;
21 | display:flex;
22 | align-items: center;
23 | justify-content: center;
24 | mat-icon {
25 | font-size: 15px;
26 | height:16px;
27 | width:16px;
28 | margin-right:2px;
29 | }
30 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/influxdbchart-widget/influxdbchart-widget.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
No Data
7 |
14 |
15 |
16 |
17 |
20 |
--------------------------------------------------------------------------------
/src/app/components/widgets/influxdbchart-widget/influxdbchart-widget.component.scss:
--------------------------------------------------------------------------------
1 | .chart-container {
2 | position: relative;
3 | height:100%;
4 | width:100%;
5 | }
6 | .loading {
7 | height:100%;
8 | width:100%;
9 | position: absolute;
10 | left: 0;
11 | right: 0;
12 | top: 0;
13 | bottom: 0;
14 | background-color: rgba(255,255,255,0.6);
15 | display: flex;
16 | justify-content: center;
17 | align-content: center;
18 | align-items: center;
19 | z-index: 9999999;
20 | }
21 | .fill-container {
22 | height:100%;
23 | width:100%;
24 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/influxdbchart-widget/setting-influxdbchart-widget.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 | .title {
5 | margin: -1.5rem -1.5rem 2rem -1.5rem;
6 | width: initial !important;
7 | display: flex;
8 | justify-content: space-between;
9 | }
10 | .example-container {
11 | display: flex;
12 | flex-direction: column;
13 | & > * {
14 | width: 100%;
15 | }
16 | & > div {
17 | & > .mat-mdc-form-field {
18 | padding-right: 0.5rem;
19 | }
20 | }
21 | blockquote {
22 | display: inline-block;
23 | margin: 4px;
24 | background-color: bisque;
25 | font-family: monospace;
26 | padding: 0 5px;
27 | border-radius: 4px;
28 | }
29 | }
30 | .custom-mat-chip {
31 | min-height: 26px;
32 | padding-left: 10px !important;
33 | padding-right: 4px !important;
34 | }
35 | .chips-container {
36 | position: absolute;
37 | z-index: 9999;
38 | }
39 | .chips-container-selector {
40 | ::ng-deep {
41 | /* TODO(mdc-migration): The following rule targets internal classes of select that may no longer apply for the MDC version. */
42 | /* TODO(mdc-migration): The following rule targets internal classes of select that may no longer apply for the MDC version. */
43 | .mat-select-value {
44 | opacity: 0;
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/app/components/widgets/pcap-uploader-widget/pcap-uploader-widget.component.scss:
--------------------------------------------------------------------------------
1 | .file-upload-container {
2 | position: relative;
3 | height: 100%;
4 |
5 | &>.fileselect {
6 | align-items: center;
7 | background-color: #eee;
8 | border-radius: 1rem;
9 | border-style: dashed;
10 | color: #999;
11 | cursor: pointer;
12 | display: flex;
13 | height: 100%;
14 | justify-content: center;
15 | margin: 0;
16 | min-width: 200px;
17 | padding: 1rem;
18 |
19 | &::before {
20 | content: "Drop PCAP file here";
21 | }
22 |
23 | &.drugOver {
24 | background-color: #ccc;
25 | }
26 | }
27 |
28 | &>input[type="file"] {
29 | position: absolute;
30 | top: 0;
31 | left: 0;
32 | width: 100%;
33 | height: 100%;
34 | bottom: 0;
35 | right: 0;
36 | cursor: pointer;
37 | opacity: 0;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/app/components/widgets/pcap-uploader-widget/pcap-uploader.service.ts:
--------------------------------------------------------------------------------
1 | import { HttpClient } from '@angular/common/http';
2 | import { Observable } from 'rxjs';
3 | import { Injectable } from '@angular/core';
4 | import { environment } from '@environments/environment';
5 |
6 | @Injectable({
7 | providedIn: 'root'
8 | })
9 | export class PcapUploaderService {
10 | private url = `${environment.apiUrl}/import/data/pcap`;
11 | constructor(private http: HttpClient) { }
12 |
13 | postFile(fileToUpload: File, isDataTimeNow): Observable {
14 | const formData: FormData = new FormData();
15 | formData.append('fileKey', fileToUpload, fileToUpload.name);
16 | const url = isDataTimeNow ? this.url + '/now' : this.url;
17 | return this.http.post(url, formData);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/app/components/widgets/prometheus-widget/prometheus-widget.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
No Data
7 |
14 |
15 |
16 |
17 |
20 |
--------------------------------------------------------------------------------
/src/app/components/widgets/prometheus-widget/prometheus-widget.component.scss:
--------------------------------------------------------------------------------
1 | .chart-container {
2 | position: relative;
3 | height:100%;
4 | width:100%;
5 | }
6 | .loading {
7 | height:100%;
8 | width:100%;
9 | position: absolute;
10 | left: 0;
11 | right: 0;
12 | top: 0;
13 | bottom: 0;
14 | background-color: rgba(255,255,255,0.6);
15 | display: flex;
16 | justify-content: center;
17 | align-content: center;
18 | align-items: center;
19 | z-index: 9999999;
20 | }
21 | .fill-container {
22 | height:100%;
23 | width:100%;
24 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/protosearch-widget/chips-input/chips-input.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 | {{item.name}}
6 | cancel
7 |
8 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/app/components/widgets/protosearch-widget/chips-input/chips-input.component.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/app/components/widgets/protosearch-widget/chips-input/chips-input.component.scss
--------------------------------------------------------------------------------
/src/app/components/widgets/protosearch-widget/drag-drop-list/drag-drop-list.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Inactive
4 |
11 |
{{item && item.name || '\{skipped on Mapping\}'}}
12 |
13 |
14 |
15 |
16 |
Active
17 |
24 |
{{item && item.name || '\{skipped on Mapping\}'}}
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/app/components/widgets/protosearch-widget/ps-fields/multi-select-field/READ-ME.MD:
--------------------------------------------------------------------------------
1 | How to use this
2 | ===============
3 | ```ts
4 | import { MultiSelectFieldModule } from './ps-fields/multi-select-field/multi-select-field.module';
5 | @NgModule({
6 | imports: [
7 | MultiSelectFieldModule,
8 | . . .
9 | ]
10 | })
11 | export class AppModule { }
12 | ```
13 |
14 | ```ts
15 | property1: string[] = [ "!=aaa", "||bbb", "&&google.com", "ffff.net" ];
16 | dataList: string[] = [
17 | 'fist-host_name',
18 | '127.0.0.1',
19 | 'other-host',
20 | 'second.host.com'
21 | ];
22 | ```
23 |
24 | ```html
25 |
29 | ```
30 |
--------------------------------------------------------------------------------
/src/app/components/widgets/protosearch-widget/ps-fields/multi-select-field/multi-select-field.module.ts:
--------------------------------------------------------------------------------
1 | import { MatMenuModule } from '@angular/material/menu';
2 | import { MatTooltipModule } from '@angular/material/tooltip';
3 | import { MatInputModule } from '@angular/material/input';
4 | import { MatIconModule } from '@angular/material/icon';
5 | import { MatButtonModule } from '@angular/material/button';
6 | import { NgModule } from '@angular/core';
7 | import { CommonModule } from '@angular/common';
8 | import { MultiSelectFieldComponent } from './multi-select-field.component';
9 | import { MatFormFieldModule } from '@angular/material/form-field';
10 | import { FormsModule, ReactiveFormsModule } from '@angular/forms';
11 | import { MatAutocompleteModule, } from '@angular/material/autocomplete';
12 |
13 | @NgModule({
14 | imports: [
15 | CommonModule,
16 | MatButtonModule,
17 | MatIconModule,
18 | MatInputModule,
19 | MatFormFieldModule,
20 | MatTooltipModule,
21 | FormsModule,
22 | MatAutocompleteModule,
23 | ReactiveFormsModule,
24 | MatMenuModule
25 | ],
26 | declarations: [
27 | MultiSelectFieldComponent
28 | ],
29 | exports: [MultiSelectFieldComponent]
30 | })
31 | export class MultiSelectFieldModule { }
32 |
--------------------------------------------------------------------------------
/src/app/components/widgets/result-chart-widget/result-chart-widget.component.html:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/src/app/components/widgets/result-chart-widget/setting-result-chart-widget.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{'LINK.settings' | translate}}
3 |
6 |
7 |
8 |
9 |
10 | {{'LINK.title' | translate}}
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/app/components/widgets/result-chart-widget/setting-result-chart-widget.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | width: initial !important;
3 | display: flex;
4 | justify-content: space-between;
5 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/result-chart-widget/setting-result-chart-widget.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';
2 | import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
3 | import { TranslateService } from '@ngx-translate/core'
4 | @Component({
5 | selector: 'app-setting-result-chart-widget-component',
6 | templateUrl: 'setting-result-chart-widget.component.html',
7 | styleUrls: ['./setting-result-chart-widget.component.scss'],
8 | changeDetection: ChangeDetectionStrategy.OnPush
9 | })
10 |
11 | export class SettingResultChartWidgetComponent {
12 | constructor(
13 | public dialogRef: MatDialogRef,
14 | public translateService: TranslateService,
15 | @Inject(MAT_DIALOG_DATA) public data: any
16 | ) {
17 | translateService.addLangs(['en'])
18 | translateService.setDefaultLang('en')
19 | }
20 |
21 | isInvalid: boolean;
22 | validate(event) {
23 | event = event.trim();
24 | if (event === '' || event === ' ') {
25 | this.isInvalid = true;
26 | } else {
27 | this.isInvalid = false;
28 | }
29 | }
30 | onNoClick(): void {
31 | this.dialogRef.close();
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/app/components/widgets/result-widget/result-widget.component.html:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/src/app/components/widgets/result-widget/result-widget.component.scss:
--------------------------------------------------------------------------------
1 | .widget-container {
2 | overflow-y: auto;
3 | height: 100%;
4 | }
5 | .loading {
6 | position: absolute;
7 | left: 0;
8 | right: 0;
9 | top: 0;
10 | bottom: 0;
11 | background-color: rgba(255,255,255,0.6);
12 | display: flex;
13 | justify-content: center;
14 | align-content: center;
15 | align-items: center;
16 | z-index: 9999999;
17 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/result-widget/setting-result-widget.component.html:
--------------------------------------------------------------------------------
1 |
2 | {{'LINK.settings' | translate}}
3 |
6 |
7 |
8 |
9 |
10 | {{'LINK.title' | translate}}
11 |
12 |
13 |
14 |
15 | {{ 'widgets.resultWidget.settings.autoRefresh' | translate }}
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/app/components/widgets/result-widget/setting-result-widget.component.scss:
--------------------------------------------------------------------------------
1 | .title {
2 | width: initial !important;
3 | display: flex;
4 | justify-content: space-between;
5 | }
6 | .slide-toggle {
7 | display: block;
8 | font-size: .8em !important;
9 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/result-widget/setting-result-widget.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';
2 | import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
3 | import { TranslateService } from '@ngx-translate/core'
4 | @Component({
5 | selector: 'app-setting-result-widget-component',
6 | templateUrl: 'setting-result-widget.component.html',
7 | styleUrls: ['./setting-result-widget.component.scss'],
8 | changeDetection: ChangeDetectionStrategy.OnPush
9 | })
10 | export class SettingResultWidgetComponent {
11 | constructor(
12 | public dialogRef: MatDialogRef,
13 | public translateService: TranslateService,
14 | @Inject(MAT_DIALOG_DATA) public data: any
15 | ) {
16 | translateService.addLangs(['en'])
17 | translateService.setDefaultLang('en')
18 | }
19 | isInvalid: boolean;
20 | validate(event) {
21 | event = event.trim();
22 | if (event === '' || event === ' ') {
23 | this.isInvalid = true;
24 | } else {
25 | this.isInvalid = false;
26 | }
27 | }
28 | onNoClick(): void {
29 | this.dialogRef.close();
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/code-style-field/code-style-field.component.html:
--------------------------------------------------------------------------------
1 | LogQL
2 |
3 |
12 |
13 |
14 |
15 |
16 |
17 | Error connecting to datasource: Data source connected, but no labels received. Verify that Loki and Promtail is configured properly.
18 |
19 |
20 |
21 |
22 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/code-style-field/code-style-field.component.scss:
--------------------------------------------------------------------------------
1 | .div-field {
2 | padding: 5px 0;
3 | margin-bottom: 12px;
4 | border-bottom: 1px solid rgba(0,0,0,0.4);
5 | outline: none;
6 | //font-weight: bold;
7 | font-family: "Roboto Mono", monospace;
8 | font-size: 12px;
9 |
10 |
11 | // margin-bottom: 1.25em;
12 | //min-height: 28px;
13 | // max-height: 28px;
14 | }
15 | .menu-title {
16 | background: rgba(0,0,0,0.1);
17 | margin: 0;
18 | padding: 4px 1rem;
19 | font-size: 0.9em;
20 | }
21 | .error {
22 | align-items: center;
23 | display: flex;
24 | font-size: 0.9em;
25 | color: red;
26 | background-color: #fdd;
27 | padding: 1rem;
28 | border-radius: 0.3rem;
29 | margin-bottom: 1rem;
30 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/code-style-field/code-style-field.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { CodeStyleFieldComponent } from './code-style-field.component';
4 | import { MatMenuModule } from '@angular/material/menu';
5 | import { MatFormFieldModule } from '@angular/material/form-field';
6 | import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
7 | import { fas } from '@fortawesome/free-solid-svg-icons';
8 | import { fab } from '@fortawesome/free-brands-svg-icons';
9 | import { far } from '@fortawesome/free-regular-svg-icons';
10 |
11 | @NgModule({
12 | imports: [
13 | CommonModule,
14 | MatMenuModule,
15 | MatFormFieldModule,
16 | FontAwesomeModule
17 | ],
18 | declarations: [CodeStyleFieldComponent],
19 | exports: [CodeStyleFieldComponent]
20 | })
21 | export class CodeStyleFieldModule {
22 |
23 | constructor(library: FaIconLibrary) {
24 | library.addIconPacks(fas as any, fab as any, far as any);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/code-style-prometheus-field/code-style-prometheus-field.component.html:
--------------------------------------------------------------------------------
1 |
2 | Query
3 |
4 |
13 |
14 |
15 |
16 |
17 |
18 | Error connecting to datasource: Data source connected, but no labels received. Verify that Loki and Promtail is configured properly.
19 |
20 |
21 |
22 |
23 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/code-style-prometheus-field/code-style-prometheus-field.component.scss:
--------------------------------------------------------------------------------
1 | .div-field {
2 | padding: 0.2rem 0;
3 | border-bottom: 1px solid rgba(0,0,0,0.54);
4 | outline: none;
5 | font-family: monospace;
6 | font-size: 14px;
7 | background-color: rgb(253, 255, 226);
8 | margin-bottom: 1.25em;
9 | min-height: 28px;
10 | // max-height: 28px;
11 | }
12 | .menu-title {
13 | background: rgba(0,0,0,0.1);
14 | margin: 0;
15 | padding: 4px 1rem;
16 | font-size: 0.9em;
17 | }
18 | .error {
19 | align-items: center;
20 | display: flex;
21 | font-size: 0.9em;
22 | color: red;
23 | background-color: #fdd;
24 | padding: 1rem;
25 | border-radius: 0.3rem;
26 | margin-bottom: 1rem;
27 | }
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/rsearch-widget.component.html:
--------------------------------------------------------------------------------
1 |
28 |
--------------------------------------------------------------------------------
/src/app/components/widgets/rsearch-widget/rsearch-widget.component.scss:
--------------------------------------------------------------------------------
1 | .example-container {
2 | display: grid;
3 | grid-template-columns: 1fr;
4 | column-gap: 10px;
5 | padding: 20px;
6 | & > * {
7 | font-size: 13px;
8 | line-height: 13px;
9 | letter-spacing: 1px;
10 | }
11 | }
12 | .search-btn {
13 | background: #749ad6;
14 | color: white;
15 |
16 | }
17 | .clear-btn {
18 | background-color: #fafafa;
19 | color: #8a8a8a;
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/src/app/components/widgets/smart-input-widget/code-proto-selector/code-proto-selector.component.html:
--------------------------------------------------------------------------------
1 | Select Protocol
2 |
--------------------------------------------------------------------------------
/src/app/components/widgets/smart-input-widget/code-proto-selector/code-proto-selector.component.scss:
--------------------------------------------------------------------------------
1 | .proto-selector {
2 | display: flex;
3 | color: grey;
4 | border: 1px solid lightgray;
5 | border-radius: 3px 3px 3px 3px;
6 | margin-right:3px;
7 | height: 28px;
8 | line-height: 14px;
9 | font-size: 12px;
10 | cursor: pointer;
11 | background: #fafafa;
12 | // width:105px;
13 | width: 100%;
14 | text-overflow: ellipsis;
15 |
16 | &:focus {
17 | outline: none;
18 |
19 | }
20 |
21 | .proto-button {
22 | background: #fafafa;
23 | cursor: pointer;
24 | height: 100%;
25 | display: inline-block;
26 | padding: 6px;
27 |
28 | }
29 |
30 | .menu-button {
31 | font-size: 14px;
32 | line-height: 21px;
33 | padding: 3px;
34 | padding-left: 0px;
35 | background: #fafafa;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/app/components/widgets/smart-input-widget/query-history.service.ts:
--------------------------------------------------------------------------------
1 | import { setStorage, getStorage } from '@app/helpers/functions';
2 | export class QueryHistoryService {
3 | id_widget;
4 |
5 | constructor(id_widget: string) {
6 | this.id_widget = id_widget;
7 | }
8 | get key() {
9 | return 'smart-query-history-' + this.id_widget;
10 | }
11 | private setFormat(record) {
12 | return { timestamp: new Date().getTime(), record };
13 | }
14 |
15 | addRecord(record) {
16 | console.log('addRecord::', record);
17 | const records: any[] = getStorage(this.key) || [];
18 |
19 | if (
20 | !records.find(i => JSON.stringify(i.record) === JSON.stringify(record)) &&
21 | !record?.record?.match(/^\s+$/g) &&
22 | record?.record !== ''
23 | ) {
24 | records.unshift(this.setFormat(record));
25 | }
26 |
27 | setStorage(this.key, records.filter(({record}) => !record?.match(/^\s*$/g)).slice(0, 12));
28 | }
29 | getRecords(): any[] {
30 | return (getStorage(this.key) || []).map(({ record }) => record).filter(record => !record?.match(/^\s*$/g));
31 | }
32 | removeHistory() {
33 | localStorage.removeItem(this.key);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/components/widgets/smart-input-widget/setting-smart-input-widget.component.scss:
--------------------------------------------------------------------------------
1 | .chack-list {
2 | margin-right: 1.3rem;
3 | }
4 |
5 | .title {
6 | width: initial !important;
7 | display: flex;
8 | justify-content: space-between;
9 | }
10 |
11 | .field-row-collection {
12 | display: flex;
13 | width: 100%;
14 | flex-direction: row;
15 | }
16 |
17 | .c-box {
18 | flex: 0;
19 | min-width: 0rem;
20 | margin: 1rem;
21 | }
22 |
23 | .example-container {
24 | display: flex;
25 | flex-direction: column;
26 |
27 | &>* {
28 | width: 100%;
29 | }
30 | }
31 |
32 | .float-right {
33 | position: absolute;
34 | right: -2rem;
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/guards/auth.guard.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
3 | import { AuthenticationService } from '@app/services';
4 |
5 | @Injectable({ providedIn: 'root' })
6 | export class AuthGuard implements CanActivate {
7 | constructor(
8 | private router: Router,
9 | private authenticationService: AuthenticationService
10 | ) {}
11 |
12 | canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
13 | const currentUser = this.authenticationService.currentUserValue;
14 | if (currentUser) {
15 | return true;
16 | }
17 |
18 | this.router.navigate([{
19 | outlets: { primary: null, system: 'login'}
20 | }], {
21 | queryParams: {
22 | returnUrl: state.url
23 | }
24 | });
25 | return false;
26 | }
27 | }
--------------------------------------------------------------------------------
/src/app/guards/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth.guard';
--------------------------------------------------------------------------------
/src/app/helpers/email-validator.directive.ts:
--------------------------------------------------------------------------------
1 | import { ValidatorFn, AbstractControl } from '@angular/forms';
2 |
3 | export function emailValidator(): ValidatorFn {
4 | return (control: AbstractControl): {[key: string]: any} | null => {
5 | const nameRe: RegExp = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
6 | const valid = nameRe.test(control.value);
7 | return !valid ? {'forbiddenName': {value: control.value}} : null;
8 | };
9 | }
--------------------------------------------------------------------------------
/src/app/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './error.interceptor';
2 | export * from './jwt.interceptor';
3 |
--------------------------------------------------------------------------------
/src/app/helpers/jwt.interceptor.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { AuthenticationService } from '@app/services';
6 |
7 | @Injectable()
8 | export class JwtInterceptor implements HttpInterceptor {
9 | constructor(private authenticationService: AuthenticationService) {}
10 |
11 | intercept(request: HttpRequest, next: HttpHandler): Observable> {
12 | // add authorization header with jwt token if available
13 | const currentUser = this.authenticationService.currentUserValue;
14 | if (currentUser && currentUser.token) {
15 | request = request.clone({
16 | setHeaders: {
17 | Authorization: `Bearer ${currentUser.token}`
18 | }
19 | });
20 | }
21 |
22 | return next.handle(request);
23 | }
24 | }
--------------------------------------------------------------------------------
/src/app/helpers/widget.ts:
--------------------------------------------------------------------------------
1 | import { IWidgetMetaData, IWidget } from '@app/components/widgets/IWidget';
2 |
3 | export const WidgetArray: Array = [];
4 | export const WidgetArrayInstance: { [key: string]: IWidget } = {};
5 |
6 | export function Widget(metaData: IWidgetMetaData): ClassDecorator {
7 | return function ( constructor: any ) {
8 | metaData.componentClass = constructor;
9 | metaData.enable = true;
10 | metaData.strongIndex = metaData.className;
11 | metaData.settingWindow = metaData.settingWindow === null || metaData.settingWindow === undefined ? true : metaData.settingWindow;
12 | WidgetArray.push(metaData);
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/src/app/hep-tooltip/hep-tooltip.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HepTooltipDirective } from '@app/helpers/hep-tooltip.directive';
3 |
4 |
5 |
6 | @NgModule({
7 | declarations: [HepTooltipDirective],
8 | exports: [HepTooltipDirective]
9 | })
10 | export class HepTooltipModule { }
11 |
--------------------------------------------------------------------------------
/src/app/models/CallIDColor.model.ts:
--------------------------------------------------------------------------------
1 | export interface CallIDColor {
2 | callID: string;
3 | backgroundColor: string;
4 | decompiledColor: {
5 | hue: number;
6 | saturation: number;
7 | lightness: number;
8 | alpha: number;
9 | };
10 | textColor: string;
11 | }
--------------------------------------------------------------------------------
/src/app/models/agent-request-model.ts:
--------------------------------------------------------------------------------
1 | export interface AgentRequestModel {
2 | protocol: string;
3 | host: string;
4 | port: number;
5 | path: string;
6 | type?: string;
7 | node: string;
8 | }
9 |
--------------------------------------------------------------------------------
/src/app/models/alert.model.ts:
--------------------------------------------------------------------------------
1 | export interface AlertMessage {
2 | isTranslation?: boolean;
3 | message: string;
4 | fullObject?: string | Object;
5 | translationParams?: Object;
6 | }
7 | export interface AlertSubject {
8 | type: 'success' | 'error' | 'warning' | 'notice';
9 | text: AlertMessage['message'];
10 | object?: AlertMessage['fullObject'];
11 | }
12 | export interface AlertProper extends AlertSubject {
13 | timeout: ReturnType;
14 | isOpen: boolean;
15 | }
16 | export interface AlertMessage {
17 | isTranslation?: boolean;
18 | message: string;
19 | fullObject?: string | Object;
20 | translationParams?: Object;
21 | }
22 | export const MessageTimer = 5000; // 5 seconds
--------------------------------------------------------------------------------
/src/app/models/dashboard-content.model.ts:
--------------------------------------------------------------------------------
1 | export interface DashboardContentModel {
2 | id?: string;
3 | cols: number;
4 | rows: number;
5 | y: number;
6 | x: number;
7 | component?: any;
8 | name: string;
9 | title?: string;
10 | config?: object;
11 | output?: any;
12 | strongIndex?: string;
13 | minItemCols?: number;
14 | minItemRows?: number;
15 | minHeight?: number;
16 | minWidth?: number;
17 | isWarning?: boolean;
18 | isDismissed?: boolean;
19 | tabGroup?: string;
20 | activeTab?: boolean;
21 | layerIndex?: number;
22 | }
23 |
--------------------------------------------------------------------------------
/src/app/models/dashboard.model.ts:
--------------------------------------------------------------------------------
1 | import { DashboardContentModel } from './dashboard-content.model';
2 |
3 | export interface DashboardModel {
4 | // id: number;
5 | // username: string;
6 | dashboard: Array;
7 |
8 | category: string;
9 | create_date: string;
10 | data: any;
11 | id: number;
12 | param: string;
13 | partid: number;
14 | username: string;
15 | owner: string;
16 | widgets?: any;
17 | }
--------------------------------------------------------------------------------
/src/app/models/flow-item-type.model.ts:
--------------------------------------------------------------------------------
1 | export enum FlowItemType {
2 | SIP = 'SIP',
3 | SDP = 'SDP',
4 | RTP = 'RTP',
5 | RTCP = 'RTCP',
6 | DTMF = 'DTMF',
7 | LOG = 'LOG'
8 | }
9 |
--------------------------------------------------------------------------------
/src/app/models/index.ts:
--------------------------------------------------------------------------------
1 | export * from './user.model';
2 | export * from './widget.model';
3 | export * from './dashboard-content.model';
4 | export * from './dashboard.model';
5 | export * from './user-settings.model';
6 | export * from './search-call.model';
7 | export * from './search-method.model';
8 | export * from './const-value.model';
9 | export * from './preference-scripts.model';
10 | export * from './preference-advanced.model';
11 | export * from './preference-alias.model';
12 | export * from './preference-ip-alias.model';
13 | export * from './preference-authkey.model';
14 | export * from './preference-hepsub.model';
15 | export * from './preference-interception.model';
16 | export * from './preference-agentsub.model';
17 | export * from './preference-mapping.model';
18 | export * from './preference-mapping-field.model';
19 | export * from './preference-mapping-protocol.model';
20 | export * from './preference-users.model';
21 | export * from './preference-user-settings.model';
22 | export * from './statistic-database.model';
23 | export * from './dictionary.model';
24 |
--------------------------------------------------------------------------------
/src/app/models/preference-advanced.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceAdvanced {
2 | category: string;
3 | data: any;
4 | guid: string;
5 | param: string;
6 | partid: number;
7 | }
8 |
--------------------------------------------------------------------------------
/src/app/models/preference-agentsub.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceAgentsub {
2 | version: string,
3 | uuid: string;
4 | gid: number;
5 | host: string;
6 | port: number;
7 | protocol: string;
8 | path: string;
9 | node: string;
10 | type: string;
11 | ttl: number;
12 | create_date: string;
13 | expire_date: string;
14 | active: number;
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/models/preference-alias.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceAlias {
2 | id: number;
3 | guid: string;
4 | uuid: string;
5 | version: number;
6 | alias: string;
7 | ip: string;
8 | port: number;
9 | mask: number;
10 | captureID: string;
11 | status: boolean;
12 | }
--------------------------------------------------------------------------------
/src/app/models/preference-authkey.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceAuthKey {
2 | active: boolean;
3 | create_date: string;
4 | creator_guid: string;
5 | expire_date: string;
6 | guid: string;
7 | ip_address: string;
8 | lastusage_date: string;
9 | limit_calls: number;
10 | name: string;
11 | usage_calls: number;
12 | user_object: Object;
13 | usergroup: string;
14 | version: number;
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/models/preference-hepsub.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceHepsub {
2 | guid: string;
3 | profile: string;
4 | hepid: number;
5 | hep_alias: string;
6 | version: number;
7 | mapping: any;
8 | }
9 |
--------------------------------------------------------------------------------
/src/app/models/preference-interception.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceInterception {
2 | version:number;
3 | uuid: string;
4 | gid: number;
5 | liid: number;
6 | search_callee: string;
7 | search_caller: string;
8 | search_ip: string;
9 | delivery: string; // JSON object
10 | create_date: Date;
11 | modify_date: Date;
12 | start_date: Date;
13 | stop_date: Date;
14 | description:string;
15 | status: boolean;
16 | }
17 |
--------------------------------------------------------------------------------
/src/app/models/preference-ip-alias.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceIpAlias {
2 | uuid: string;
3 | alias: string;
4 | group: string;
5 | mask: number;
6 | ip: string;
7 | ipobject: string;
8 | port: number;
9 | ipv6: boolean;
10 | servertype: string;
11 | shardid: string;
12 | type: number;
13 | version: number;
14 | status: boolean;
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/models/preference-mapping-field.model.ts:
--------------------------------------------------------------------------------
1 |
2 | interface FormDefault {
3 | name:string
4 | value:any;
5 | color?:string
6 | }
7 | //fields with default options
8 | type MappingIndex = 'none' | 'wildcard' | 'secondary';
9 | type MappingType = 'string' | 'integer' | 'array' | 'array_string' | 'nested_integer' | 'nested_string' | 'nested_float';
10 | type MappingFormType = 'input' | 'integer' | 'input_multi_select' | 'multiselect' | 'select'
11 |
12 | export interface PreferenceMappingFieldModel {
13 | // default fields params
14 | id:string;
15 | type:MappingType;
16 | name:string;
17 | alias:string;
18 | form_type:MappingFormType;
19 | index:MappingIndex;
20 | skip:boolean;
21 | hide:boolean;
22 | position:number;
23 | // optional fields params
24 | virtual?:boolean;
25 | parent?:string;
26 | _form_default?:Array;
27 | form_api?:string;
28 | system_param?:string;
29 | mapping?:string;
30 | sid_type?:string;
31 | vdata?:string;
32 | grid?:string;
33 | transform?:string;
34 | }
35 |
--------------------------------------------------------------------------------
/src/app/models/preference-mapping-protocol.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceMappingProtocol {
2 | guid: string;
3 | data?: any;
4 | }
5 |
--------------------------------------------------------------------------------
/src/app/models/preference-mapping.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceMapping {
2 | guid: string;
3 | profile: string;
4 | hepid: number;
5 | hep_alias: string;
6 | partid: number;
7 | version: number;
8 | retention: number;
9 | table_name: string;
10 | apply_ttl_all: boolean;
11 | partition_step: number;
12 | create_index: any;
13 | create_table: string;
14 | correlation_mapping: any;
15 | fields_mapping: any;
16 | fields_settings: any;
17 | schema_mapping: any;
18 | schema_settings: any;
19 | }
20 |
--------------------------------------------------------------------------------
/src/app/models/preference-scripts.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceScripts {
2 | uuid: string;
3 | version: number;
4 | data: string;
5 | profile: string;
6 | hepid: number;
7 | hep_alias: string;
8 | partid: number;
9 | type: string;
10 | status: boolean;
11 | }
12 |
--------------------------------------------------------------------------------
/src/app/models/preference-user-settings.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceUsersSettings {
2 | category: string;
3 | data: any;
4 | setting: string;
5 | guid: string;
6 | id: number;
7 | param: string;
8 | partid: number;
9 | username: string;
10 | }
11 |
--------------------------------------------------------------------------------
/src/app/models/preference-users.model.ts:
--------------------------------------------------------------------------------
1 | export interface PreferenceUsers {
2 | username: string;
3 | partid: number;
4 | email: string;
5 | password?: string;
6 | firstname: string;
7 | lastname: string;
8 | department: string;
9 | usergroup: string;
10 | guid: string;
11 | version?: number;
12 | params?: any;
13 | }
14 |
--------------------------------------------------------------------------------
/src/app/models/preferences-kw-mapping.ts:
--------------------------------------------------------------------------------
1 | export class PreferencesContentMapping{
2 |
3 | constructor(){}
4 |
5 | static get keyWordsOnHeaderMapping():Object {
6 | return {
7 | 'ip alias' : "IP Aliases" ,
8 | 'agentsub' : "Agent subscriptions",
9 | 'advanced' : "Advanced Settings",
10 | 'system overview' : "System Overview",
11 | 'user settings' : 'User Settings',
12 | 'auth token' : 'API authentication tokens',
13 | 'hepsub' : "HEPSub",
14 | }
15 | };
16 |
17 |
18 | static get keyWordsOnPreferencesMapping():Object {
19 | return {
20 | 'ip alias' :'IP ALIASES',
21 | 'agentsub' : 'AGENT SUBSCRIPTIONS',
22 | 'advanced' :'ADVANCED SETTINGS',
23 | 'auth token' :'API AUTH',
24 | }
25 | };
26 |
27 | }
--------------------------------------------------------------------------------
/src/app/models/search-call.model.ts:
--------------------------------------------------------------------------------
1 | export interface SearchCallOne {
2 | name: string;
3 | value: number;
4 | type: string;
5 | hepid: number;
6 | profile: string;
7 | }
8 |
9 | export interface SearchCallModel {
10 | param: {
11 | transaction: { };
12 | limit: number;
13 | orlogic: boolean;
14 | archive: boolean;
15 | search?: {},
16 | location: { };
17 | timezone: {
18 | value: number;
19 | name: string;
20 | }
21 | };
22 | timestamp: {
23 | from: number;
24 | to: number;
25 | };
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/models/search-method.model.ts:
--------------------------------------------------------------------------------
1 | export interface SearchMethod {
2 | }
3 |
--------------------------------------------------------------------------------
/src/app/models/statistic-database.model.ts:
--------------------------------------------------------------------------------
1 | export interface StatsDb {
2 | database_name: string;
3 | database_version: string;
4 | db_stats: {
5 | idle: number;
6 | inUse: number;
7 | maxIdleClosed: number;
8 | maxOpenConnections: number;
9 | openConnections: number;
10 | waitCount: number;
11 | waitDuration: number;
12 | };
13 | db_error_count: number;
14 | db_error_log: Array<{
15 | critical: boolean;
16 | error: string;
17 | time: string;
18 | }> | null;
19 | last_check: string;
20 | last_error: string;
21 | latency_avg: number;
22 | latency_max: number;
23 | latency_min: number;
24 | online: boolean;
25 | }
26 |
--------------------------------------------------------------------------------
/src/app/models/user-settings.model.ts:
--------------------------------------------------------------------------------
1 | import { WidgetModel } from './widget.model';
2 |
3 | export interface UserSettings {
4 | guid?: string;
5 | uuid?: string;
6 | username: string;
7 | partid: number;
8 | category: string;
9 | param: string;
10 | data: {
11 | id: string;
12 | name: string;
13 | alias: string;
14 | selectedItem: string;
15 | title: string;
16 | weight: number;
17 | widgets: Array;
18 | config: {
19 | margins: Array;
20 | columns: string;
21 | pushing: boolean;
22 | draggable: {
23 | handle: string;
24 | };
25 | resizable: {
26 | enabled: boolean;
27 | handles: Array;
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/app/models/user.model.ts:
--------------------------------------------------------------------------------
1 | export interface User {
2 | firstname: string;
3 | lastname: string;
4 | username: string;
5 | email: string;
6 | partid: number;
7 | usergroup: string;
8 | department: string;
9 | id?: number;
10 | guid?: string;
11 | scope?: string;
12 | token?: string;
13 | user?: {
14 | admin: boolean;
15 | force_password: boolean;
16 | username: string;
17 | isExternal?: boolean
18 | }
19 | }
20 | export interface UserProfile {
21 | admin: boolean
22 | avatar: string
23 | department: string
24 | color: string
25 | displayname: string
26 | external_auth: boolean
27 | external_profile: string
28 | group: string
29 | username: string
30 | guid: string
31 | }
32 | export interface UserJWT {
33 | avatar: string
34 | displayname: string
35 | exp: number
36 | externalauth: boolean
37 | externaltype: string
38 | force_password: boolean
39 | guid: string
40 | partid: number
41 | useradmin: boolean
42 | usergroup: string
43 | username: string
44 | }
--------------------------------------------------------------------------------
/src/app/models/widget.model.ts:
--------------------------------------------------------------------------------
1 | export interface WidgetModel {
2 | name: string;
3 | identifier: string;
4 | reload?: boolean;
5 | frameless?: boolean;
6 | title?: string;
7 | group?: string;
8 | description?: string;
9 | templateUrl?: string;
10 | controller?: string;
11 | controllerAs?: string;
12 | sizeX?: number;
13 | sizeY?: number;
14 | config?: {};
15 | edit?: {};
16 | row?: number;
17 | col?: number;
18 | api?: {};
19 | uuid?: string;
20 | }
21 |
--------------------------------------------------------------------------------
/src/app/models/worker-commands.module.ts:
--------------------------------------------------------------------------------
1 | export enum WorkerCommands {
2 | // transaction service / parsing transaction
3 | FLOW_PARSING,
4 | MEDIA_REPORT_PARSING,
5 | TRANSACTION_SERVICE_TRNS,
6 | TRANSACTION_SERVICE_DTMF,
7 | TRANSACTION_SERVICE_QOS,
8 | TRANSACTION_SERVICE_LOG,
9 | TRANSACTION_SERVICE_FULL,
10 | TRANSACTION_SERVICE_ONE_WAY_AUDIO,
11 | // clickhouse chart widget
12 | CLICKHOUSE_PARSE_DATA,
13 | CLICKHOUSE_PREPARE_RENDER_DATA
14 | }
15 |
--------------------------------------------------------------------------------
/src/app/pipes/colorOffset.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { ColorOffsetPipe } from '@app/pipes/colorOffset.pipe';
4 |
5 | @NgModule({
6 | imports: [
7 | CommonModule,
8 | ],
9 | declarations: [
10 | ColorOffsetPipe
11 | ],
12 | exports: [ColorOffsetPipe]
13 | })
14 | export class ColorOffsetModule {}
15 |
--------------------------------------------------------------------------------
/src/app/pipes/colorOffset.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 |
3 | @Pipe({
4 | name: 'colorOffset',
5 | pure: false
6 | })
7 |
8 | export class ColorOffsetPipe implements PipeTransform {
9 | transform(hsl, hue, saturation, lightness, transparency) {
10 | if (hsl === 'transparent') {
11 | return hsl;
12 | }
13 | const offsets = [hue, saturation, lightness, transparency];
14 | if (transparency && transparency !== 1 && !hsl.includes('hsla')) {
15 | hsl = hsl.replace('hsl', 'hsla');
16 | }
17 | const colorOffset = hsl.split(',').map((val, i) => {
18 | if (offsets[i] === '0') {
19 | return val;
20 | }
21 | return val.replace(/\d+/, offsets[i]).replace(/\s/, '')
22 | }
23 | ).join(', ');
24 | return colorOffset;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/pipes/filter.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 |
3 | @Pipe({
4 | name: 'filter',
5 | pure: false
6 | })
7 |
8 | export class FilterPipe implements PipeTransform {
9 | transform(value: any[], filterBy: string): any[] {
10 | filterBy = filterBy ? filterBy.toLocaleLowerCase() : null;
11 | return filterBy ? value.filter((item: any) =>
12 | item.name.toLocaleLowerCase().indexOf(filterBy) !== -1) : value;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/app/pipes/html.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import { DomSanitizer } from '@angular/platform-browser';
3 |
4 | @Pipe({
5 | name: 'html'
6 | })
7 | export class HtmlPipe implements PipeTransform {
8 |
9 | constructor(private sanitizer: DomSanitizer) { }
10 |
11 | public transform(value: any) {
12 | return this.sanitizer.bypassSecurityTrustHtml(value);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/pipes/moment.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import moment from 'moment';
3 |
4 | @Pipe({
5 | name: 'moment',
6 | pure: false
7 | })
8 |
9 | export class MomentPipe implements PipeTransform {
10 | transform(timestamp, format) {
11 | return moment(timestamp).format(format)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/app/pipes/preferences.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import { PreferencesContentMapping } from '@app/models/preferences-kw-mapping';
3 |
4 | @Pipe({
5 | name: 'preferences',
6 | pure: false
7 | })
8 |
9 | export class PreferencesPipe implements PipeTransform {
10 | transform(value:string,type:string) {
11 | return type === 'header' ? PreferencesContentMapping.keyWordsOnHeaderMapping[value]:
12 | type === 'preferences' ? PreferencesContentMapping.keyWordsOnPreferencesMapping[value]:
13 | "";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/pipes/safe.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 | import { DomSanitizer } from '@angular/platform-browser';
3 |
4 | @Pipe({
5 | name: 'safe'
6 | })
7 | export class SafePipe implements PipeTransform {
8 |
9 | constructor(private sanitizer: DomSanitizer) { }
10 |
11 | public transform(value: any) {
12 | return this.sanitizer.bypassSecurityTrustResourceUrl(value);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/services/call/hep-log.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { environment } from '@environments/environment';
4 |
5 | @Injectable({
6 | providedIn: 'root'
7 | })
8 | export class HepLogService {
9 | private url = `${environment.apiUrl}/call/report/log`;
10 |
11 | constructor(private http: HttpClient) { }
12 |
13 | getLog(data: any) {
14 | return this.http.post(`${this.url}`, data);
15 | }
16 | }
17 |
18 |
19 | // /**
20 | // * TODO:
21 | // * transaction dialog / logs / HEPSUB:"test-endpoint"/ cdr
22 | // * as on HOMER [domain:port-1]/dashboard/home
23 | // * [domain:port-2]/api/v3/agent/type/cdr
24 | // */
25 |
--------------------------------------------------------------------------------
/src/app/services/call/report.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 | import { map } from 'rxjs/operators';
6 | import { WorkerService } from '../worker.service';
7 | import { WorkerCommands } from '../../models/worker-commands.module';
8 |
9 | @Injectable({
10 | providedIn: 'root'
11 | })
12 | export class CallReportService {
13 | private url = `${environment.apiUrl}/call/report`;
14 |
15 | constructor(private http: HttpClient) { }
16 |
17 | // Return call report qos
18 | postQOS(postData: any): Observable {
19 | return this.http.post(`${this.url}/qos`, postData).pipe(map(
20 | async qosData => qosData && qosData.data ? await WorkerService.doOnce(WorkerCommands.TRANSACTION_SERVICE_QOS, qosData) : qosData
21 | ));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/app/services/call/transaction.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 | import { map } from 'rxjs/operators';
6 | import { PreferenceIpAliasService } from '../preferences';
7 | import { WorkerService } from '../worker.service';
8 | import { WorkerCommands } from '@app/models/worker-commands.module';
9 |
10 | @Injectable({
11 | providedIn: 'root'
12 | })
13 | export class CallTransactionService {
14 | private url = `${environment.apiUrl}/call`;
15 |
16 | constructor(private http: HttpClient, private _ipalias: PreferenceIpAliasService) { }
17 |
18 | getTransaction(data: any): Observable {
19 | return this.http.post(`${this.url}/transaction`, data).pipe(map(async transactionData => {
20 | let ipAliasesData: any = null;
21 | // try {
22 | // ipAliasesData = await this._ipalias.getAll().toPromise();
23 | // } catch (err) { }
24 |
25 | return await WorkerService.doOnce(WorkerCommands.TRANSACTION_SERVICE_TRNS, {
26 | transactionData, ipaliases: ipAliasesData?.data?.map(d => d.ipobject)
27 | });
28 | }));
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/app/services/copy.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable, Subject } from 'rxjs';
3 | import { AlertMessage } from '.';
4 |
5 | @Injectable({
6 | providedIn: 'root'
7 | })
8 | export class CopyService {
9 |
10 | private subject = new Subject();
11 | constructor() { }
12 |
13 | copy(data: any, notification: AlertMessage) {
14 | this.subject.next({data:data, notification: notification});
15 | }
16 |
17 | getData(): Observable {
18 | return this.subject.asObservable();
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/app/services/hepsub.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 | import { PreferenceHepsub } from '@app/models';
6 |
7 | @Injectable({
8 | providedIn: 'root'
9 | })
10 | export class HepsubService {
11 |
12 | private url = `${environment.apiUrl}/hepsub`;
13 |
14 | constructor(private http: HttpClient) {
15 | console.log("HepsubService:super()");
16 | }
17 |
18 | // Hepsub protokols
19 | getProtokols(): Observable {
20 | return this.http.get(`${this.url}/protocols`);
21 | }
22 |
23 | // Hepsub fields
24 | getFields(): Observable {
25 | return this.http.get(`${this.url}/fields`);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/app/services/modules.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpGetBuffer } from '@app/helpers/http-get-buffer';
3 | import { environment } from '@environments/environment';
4 | import { lastValueFrom } from 'rxjs';
5 |
6 |
7 | export interface Modules {
8 | data: Data;
9 | message: string;
10 | }
11 | interface Data {
12 | loki: Loki;
13 | }
14 | interface Loki {
15 | enable: boolean;
16 | template: string;
17 | }
18 |
19 |
20 | @Injectable({
21 | providedIn: 'root'
22 | })
23 | export class ModulesService {
24 |
25 | private url = `${environment.apiUrl}`;
26 | constructor(private http: HttpGetBuffer) { }
27 | // HOMER external applications: i.e. Loki, Prometheus, etc.
28 | getModules(): Promise {
29 | return lastValueFrom(this.http.get(`${this.url}/modules/status`, 120 * 1000));
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/app/services/preferences/admin.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient, HttpHeaders } from '@angular/common/http';
3 | import { environment } from '@environments/environment';
4 |
5 | enum Stream {
6 | rtpagent,
7 | picserver,
8 | homerapp
9 | }
10 | export type StreamType = keyof typeof Stream;
11 |
12 | @Injectable({
13 | providedIn: 'root'
14 | })
15 | export class AdminService {
16 |
17 | private url = `${environment.apiUrl}/export/action/`;
18 |
19 | constructor(private http: HttpClient) { }
20 |
21 | public getFile() {
22 | return this.http.get(`${this.url}logs`, {
23 | responseType: 'blob',
24 | observe: 'response',
25 | headers: new HttpHeaders().append('Content-Type', 'application/octect-stream')
26 | }).toPromise();
27 | }
28 |
29 | // /export/action/active
30 | dumpRequest(type: StreamType) {
31 | return this.http.get(`${this.url}${type}`).toPromise();
32 | }
33 |
34 | checkIsActive() {
35 | return this.http.get(`${this.url}active`).toPromise();
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/app/services/preferences/alias.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { environment } from '@environments/environment';
4 | import { PreferenceAlias } from '@app/models';
5 | import { Functions } from '@app/helpers/functions';
6 |
7 | @Injectable({
8 | providedIn: 'root'
9 | })
10 | export class PreferenceAliasService {
11 |
12 | private url = `${environment.apiUrl}/alias`;
13 |
14 | constructor(private http: HttpClient) { }
15 |
16 | getAll() {
17 | return this.http.get(`${this.url}`);
18 | }
19 |
20 | add(pa: PreferenceAlias) {
21 | pa.guid = Functions.newGuid();
22 | pa.version = Date.now();
23 | pa.captureID = String(pa.captureID);
24 | return this.http.post(`${this.url}`, pa);
25 | }
26 |
27 | update(pa: PreferenceAlias) {
28 | pa.captureID = String(pa.captureID);
29 | pa.version = Date.now();
30 | const guid = pa.guid;
31 | // delete pa.guid;
32 | return this.http.put(`${this.url}/${guid}`, pa);
33 | }
34 |
35 | delete(guid: string) {
36 | return this.http.delete(`${this.url}/${guid}`);
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/src/app/services/preferences/hepsub.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { environment } from '@environments/environment';
4 | import { PreferenceHepsub } from '@app/models';
5 | import { Functions } from '@app/helpers/functions';
6 |
7 | @Injectable({
8 | providedIn: 'root'
9 | })
10 | export class PreferenceHepsubService {
11 |
12 | private url = `${environment.apiUrl}/hepsub/protocol`;
13 |
14 | constructor(private http: HttpClient) { }
15 |
16 | getAll() {
17 | return this.http.get(`${this.url}`);
18 | }
19 |
20 | add(ph: PreferenceHepsub) {
21 | ph.version = 1;
22 | ph.guid = Functions.newGuid();
23 | return this.http.post(`${this.url}`, ph);
24 | }
25 |
26 | update(ph: PreferenceHepsub) {
27 | return this.http.put(`${this.url}/${ph.guid}`, ph);
28 | }
29 |
30 | delete(guid) {
31 | return this.http.delete(`${this.url}/${guid}`);
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/app/services/preferences/index.ts:
--------------------------------------------------------------------------------
1 | export * from './advanced.service';
2 | export * from './alias.service';
3 | export * from './authkey.service';
4 | export * from './hepsub.service';
5 | export * from './agentsub.service';
6 | export * from './mapping-protocol.service';
7 | export * from './user-settings.service';
8 | export * from './scripts.service';
9 | export * from './user.service';
10 | export * from './ipalias.service';
11 |
--------------------------------------------------------------------------------
/src/app/services/preferences/scripts.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from "@angular/core";
2 | import { HttpClient } from "@angular/common/http";
3 | import { environment } from "@environments/environment";
4 | import { PreferenceScripts } from "@app/models";
5 | import { Functions } from "@app/helpers/functions";
6 |
7 | @Injectable({
8 | providedIn: "root",
9 | })
10 | export class PreferenceScriptsService {
11 | constructor(private http: HttpClient) {}
12 |
13 | private url = `${environment.apiUrl}/script`;
14 |
15 | getAll() {
16 | return this.http.get(`${this.url}`);
17 | }
18 | add(script: PreferenceScripts) {
19 | script.uuid = Functions.newGuid();
20 | script.version = Date.now();
21 |
22 | return this.http.post(`${this.url}`, script);
23 | }
24 | update(script: PreferenceScripts) {
25 | script.version = Date.now();
26 | let uuid = script.uuid;
27 | return this.http.put(`${this.url}/${uuid}`, script);
28 | }
29 | delete(uuid: string) {
30 | return this.http.delete(`${this.url}/${uuid}`);
31 | }
32 |
33 | export(file) {
34 | return this.http.post(`${this.url}/export`, file);
35 | }
36 |
37 | import(file) {
38 | return this.http.post(`${this.url}/import`, file);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/app/services/preferences/version.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 |
4 | import { environment } from '@environments/environment';
5 |
6 | @Injectable({ providedIn: 'root' })
7 | export class PreferenceVersionService {
8 | apiUrl = environment.apiUrl;
9 | constructor(private http: HttpClient) {}
10 | async getApiVersion() {
11 | try {
12 | let data: any = await this.http
13 | .get(`${this.apiUrl}/version/api/info`)
14 | .toPromise();
15 | if (data?.data?.version) {
16 | return data.data?.version;
17 | }
18 | return;
19 | } catch (err) {
20 | // console.log(err);
21 | return;
22 | }
23 | }
24 | getUiVersion() {
25 | return this.http.get(`${this.apiUrl}/version/ui/info`);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/app/services/prometheus.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 |
6 | @Injectable({
7 | providedIn: 'root'
8 | })
9 | export class PrometheusService {
10 |
11 | private url = `${environment.apiUrl}/prometheus`;
12 |
13 | constructor(private http: HttpClient) { }
14 |
15 | getLabel(): Observable {
16 | return this.http.get(`${this.url}/labels`);
17 | }
18 |
19 | getLabels(id: string): Observable {
20 | return this.http.get(`${this.url}/label/${id}`);
21 | }
22 |
23 | getValue(data: any): Observable {
24 | return this.http.post(`${this.url}/value`, data);
25 | }
26 | }
27 | // /api/v3/prometheus/label/net_contntrack_dialer_conn_failed_total
--------------------------------------------------------------------------------
/src/app/services/search/call.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 | import { SearchCallModel } from '../../models/search-call.model';
6 | import { map } from 'rxjs/operators';
7 |
8 | @Injectable({
9 | providedIn: 'root'
10 | })
11 | export class SearchCallService {
12 |
13 | private url = `${environment.apiUrl}/search/call`;
14 |
15 | constructor(private http: HttpClient) { }
16 |
17 | // Return search call message
18 | getMessage(data: any): Observable {
19 | return this.http.post(`${this.url}/message`, data);
20 | }
21 |
22 | // Return search call data
23 | getData(searchConfig: SearchCallModel): Observable {
24 | return this.http.post(`${this.url}/data`, searchConfig);
25 | }
26 |
27 | // Return search call export data
28 | getExportData(): Observable {
29 | return this.http.get(`${this.url}/export/data`);
30 | }
31 |
32 | getDecodedData(searchConfig: SearchCallModel) {
33 | return this.http.post(`${this.url}/decode/message`, searchConfig);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/services/search/remote.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 |
6 | @Injectable({
7 | providedIn: 'root'
8 | })
9 | export class SearchRemoteService {
10 |
11 | private url = `${environment.apiUrl}/search/remote`;
12 |
13 | constructor(private http: HttpClient) { }
14 |
15 | // Return search remote data
16 | getData(data: any): Observable {
17 | return this.http.post(`${this.url}/data`, data);
18 | }
19 |
20 | // Return search remote message
21 | getMessage(): Observable {
22 | return this.http.get(`${this.url}/message`);
23 | }
24 |
25 | // v3/search/remote/label?
26 | getLabel(server: string): Observable {
27 | return this.http.get(`${this.url}/label?server=${server}`);
28 | }
29 |
30 | // v3/search/remote/values?label=method&server=http://127.0.0.1:3100
31 | getValues(label: string, server: string): Observable {
32 | return this.http.get(`${this.url}/values?server=${server}&label=${label}`);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/app/services/search/smart.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { HttpClient } from '@angular/common/http';
4 | import { environment } from '@environments/environment';
5 |
6 | @Injectable({
7 | providedIn: 'root'
8 | })
9 | export class SmartService {
10 | constructor(private http: HttpClient) { }
11 |
12 | getLabelByUrl(url: string, text: string = ''): Observable {
13 | return this.http.get(`${environment.apiUrl}${url}?query=${encodeURIComponent(JSON.stringify({data: text}))}`);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/services/upload.service.ts:
--------------------------------------------------------------------------------
1 | import {
2 | HttpClient,
3 | HttpEvent,
4 | HttpHeaders,
5 | HttpErrorResponse,
6 | HttpEventType,
7 | } from '@angular/common/http';
8 | import { Injectable } from '@angular/core';
9 | import { environment } from '@environments/environment';
10 |
11 | @Injectable({
12 | providedIn: 'root',
13 | })
14 |
15 | export class UploadService {
16 | url = environment.apiUrl;
17 | endopoint = `${this.url}`;
18 | constructor(private http: HttpClient) {}
19 | public upload(formData, type, isReplace, isHomer2) {
20 | return this.http.post(`${this.endopoint}/${type}/import${isHomer2 ? '/h2' : ''}${isReplace ? '/replace' : ''}`, formData, {
21 | responseType: 'json',
22 | headers: new HttpHeaders()
23 | .append('enctype', 'multipart/form-data')
24 | .append('Accept', 'application/json'),
25 | reportProgress: true,
26 | observe: 'events',
27 | });
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/app/services/window.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 |
3 | @Injectable({
4 | providedIn: 'root'
5 | })
6 | export class WindowService {
7 | currentWindow: string = '';
8 | windowList: Map = new Map();
9 | closeTimeout: any;
10 | constructor() {}
11 | close(id) {
12 | clearTimeout(this.closeTimeout)
13 | this.closeTimeout = setTimeout(() => {
14 | this.currentWindow = '';
15 | this.windowList.delete(id);
16 | const arrFromMap = [...this.windowList];
17 | if(arrFromMap.length > 0) {
18 | arrFromMap.sort((a,b) =>
19 | a[1] - b[1]
20 | )
21 | this.currentWindow = arrFromMap.pop()[0];
22 | }
23 | }, 50);
24 |
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/workers/transaction.worker.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import { TransactionProcessor } from '@app/helpers/parser';
4 |
5 | const tp = new TransactionProcessor();
6 |
7 | addEventListener('message', ({ data }) => {
8 | const { metaData, srcdata } = JSON.parse(data);
9 | if (metaData && metaData.workerCommand) {
10 | const outputData = tp.transactionData(srcdata, metaData.workerCommand);
11 | const response = JSON.stringify(outputData);
12 | postMessage(response);
13 | } else {
14 | postMessage(JSON.stringify({ error: 'metaData.workerCommand is undefined' }));
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/src/assets/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/.gitkeep
--------------------------------------------------------------------------------
/src/assets/fonts/MaterialIcons-Regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/MaterialIcons-Regular.eot
--------------------------------------------------------------------------------
/src/assets/fonts/MaterialIcons-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/MaterialIcons-Regular.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/MaterialIcons-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/MaterialIcons-Regular.woff
--------------------------------------------------------------------------------
/src/assets/fonts/MaterialIcons-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/MaterialIcons-Regular.woff2
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Black.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-BlackItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-BlackItalic.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Bold.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-BoldItalic.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Italic.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Light.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-LightItalic.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-MediumItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-MediumItalic.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-Thin.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Roboto-ThinItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/fonts/Roboto-ThinItalic.ttf
--------------------------------------------------------------------------------
/src/assets/images/baseline_room_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/baseline_room_black_18dp.png
--------------------------------------------------------------------------------
/src/assets/images/chart-samples/area.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/chart-samples/area.png
--------------------------------------------------------------------------------
/src/assets/images/homerseven.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/homerseven.png
--------------------------------------------------------------------------------
/src/assets/images/vis/addNodeIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/addNodeIcon.png
--------------------------------------------------------------------------------
/src/assets/images/vis/backIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/backIcon.png
--------------------------------------------------------------------------------
/src/assets/images/vis/connectIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/connectIcon.png
--------------------------------------------------------------------------------
/src/assets/images/vis/cross.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/cross.png
--------------------------------------------------------------------------------
/src/assets/images/vis/deleteIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/deleteIcon.png
--------------------------------------------------------------------------------
/src/assets/images/vis/downArrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/downArrow.png
--------------------------------------------------------------------------------
/src/assets/images/vis/editIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/editIcon.png
--------------------------------------------------------------------------------
/src/assets/images/vis/leftArrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/leftArrow.png
--------------------------------------------------------------------------------
/src/assets/images/vis/minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/minus.png
--------------------------------------------------------------------------------
/src/assets/images/vis/plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/plus.png
--------------------------------------------------------------------------------
/src/assets/images/vis/rightArrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/rightArrow.png
--------------------------------------------------------------------------------
/src/assets/images/vis/upArrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/upArrow.png
--------------------------------------------------------------------------------
/src/assets/images/vis/zoomExtends.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/images/vis/zoomExtends.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/exchange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/exchange.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/pbx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/pbx.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/phone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/phone.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/sbc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/sbc.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/scanner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/scanner.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/sipgateway.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/sipgateway.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/sipproxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/sipproxy.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/unknown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/unknown.png
--------------------------------------------------------------------------------
/src/assets/img/gateways/useragent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/img/gateways/useragent.png
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Black/Roboto-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Black/Roboto-Black.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Black/Roboto-Black.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Black/Roboto-Black.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Black/Roboto-Black.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Black/Roboto-Black.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/BlackItalic/Roboto-BlackItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/BlackItalic/Roboto-BlackItalic.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/BlackItalic/Roboto-BlackItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/BlackItalic/Roboto-BlackItalic.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/BlackItalic/Roboto-BlackItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/BlackItalic/Roboto-BlackItalic.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Bold/Roboto-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Bold/Roboto-Bold.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Bold/Roboto-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Bold/Roboto-Bold.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Bold/Roboto-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Bold/Roboto-Bold.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/BoldItalic/Roboto-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/BoldItalic/Roboto-BoldItalic.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/BoldItalic/Roboto-BoldItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/BoldItalic/Roboto-BoldItalic.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/BoldItalic/Roboto-BoldItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/BoldItalic/Roboto-BoldItalic.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Italic/Roboto-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Italic/Roboto-Italic.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Italic/Roboto-Italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Italic/Roboto-Italic.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Italic/Roboto-Italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Italic/Roboto-Italic.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Light/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Light/Roboto-Light.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Light/Roboto-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Light/Roboto-Light.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Light/Roboto-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Light/Roboto-Light.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/LightItalic/Roboto-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/LightItalic/Roboto-LightItalic.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/LightItalic/Roboto-LightItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/LightItalic/Roboto-LightItalic.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/LightItalic/Roboto-LightItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/LightItalic/Roboto-LightItalic.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Medium/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Medium/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Medium/Roboto-Medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Medium/Roboto-Medium.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Medium/Roboto-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Medium/Roboto-Medium.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/MediumItalic/Roboto-MediumItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/MediumItalic/Roboto-MediumItalic.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/MediumItalic/Roboto-MediumItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/MediumItalic/Roboto-MediumItalic.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/MediumItalic/Roboto-MediumItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/MediumItalic/Roboto-MediumItalic.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Regular/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Regular/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Regular/Roboto-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Regular/Roboto-Regular.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Regular/Roboto-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Regular/Roboto-Regular.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Thin/Roboto-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Thin/Roboto-Thin.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Thin/Roboto-Thin.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Thin/Roboto-Thin.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/Thin/Roboto-Thin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/Thin/Roboto-Thin.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/ThinItalic/Roboto-ThinItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/ThinItalic/Roboto-ThinItalic.ttf
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/ThinItalic/Roboto-ThinItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/ThinItalic/Roboto-ThinItalic.woff
--------------------------------------------------------------------------------
/src/assets/roboto/fonts/ThinItalic/Roboto-ThinItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/assets/roboto/fonts/ThinItalic/Roboto-ThinItalic.woff2
--------------------------------------------------------------------------------
/src/assets/roboto/roboto.scss:
--------------------------------------------------------------------------------
1 | @import "sass/variables";
2 | @import "sass/mixins";
3 | @import "sass/Thin";
4 | @import "sass/ThinItalic";
5 | @import "sass/Light";
6 | @import "sass/LightItalic";
7 | @import "sass/Regular";
8 | @import "sass/Italic";
9 | @import "sass/Medium";
10 | @import "sass/MediumItalic";
11 | @import "sass/Bold";
12 | @import "sass/BoldItalic";
13 | @import "sass/Black";
14 | @import "sass/BlackItalic";
15 |
16 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Black.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Black */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Black");
5 | font-weight: 900;
6 | font-style: normal;
7 | }
8 | /* END Black */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_BlackItalic.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Black Italic */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "BlackItalic");
5 | font-weight: 900;
6 | font-style: italic;
7 | }
8 | /* END Black Italic */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Bold.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Bold */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Bold");
5 | font-weight: 700;
6 | font-style: normal;
7 | }
8 | @font-face {
9 | font-family: Roboto;
10 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Bold");
11 | font-weight: bold;
12 | font-style: normal;
13 | }
14 | /* END Bold */
15 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_BoldItalic.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Bold Italic */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "BoldItalic");
5 | font-weight: 700;
6 | font-style: italic;
7 | }
8 | @font-face {
9 | font-family: Roboto;
10 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "BoldItalic");
11 | font-weight: bold;
12 | font-style: italic;
13 | }
14 | /* END Bold Italic */
15 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Italic.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Italic */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Italic");
5 | //font-weight: 400;
6 | font-style: italic;
7 | }
8 | @font-face {
9 | font-family: Roboto;
10 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Italic");
11 | font-weight: normal;
12 | font-style: italic;
13 | }
14 | /* END Italic */
15 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Light.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Light */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Light");
5 | font-weight: 300;
6 | font-style: normal;
7 | }
8 | /* END Light */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_LightItalic.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Light Italic */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "LightItalic");
5 | font-weight: 300;
6 | font-style: italic;
7 | }
8 | /* END Light Italic */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Medium.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Medium */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Medium");
5 | font-weight: 500;
6 | font-style: normal;
7 | }
8 | /* END Medium */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_MediumItalic.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Medium Italic */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "MediumItalic");
5 | font-weight: 500;
6 | font-style: italic;
7 | }
8 | /* END Medium Italic */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Regular.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Regular */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Regular");
5 | font-weight: 400;
6 | font-style: normal;
7 | }
8 | @font-face {
9 | font-family: Roboto;
10 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Regular");
11 | font-weight: normal;
12 | font-style: normal;
13 | }
14 | /* END Regular */
15 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_Thin.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Thin */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "Thin");
5 | font-weight: 100;
6 | font-style: normal;
7 | }
8 | /* END Thin */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_ThinItalic.scss:
--------------------------------------------------------------------------------
1 | /* BEGIN Thin Italic */
2 | @font-face {
3 | font-family: Roboto;
4 | @include fontdef-woff($FontPath, $FontName, $FontVersion, "ThinItalic");
5 | font-weight: 100;
6 | font-style: italic;
7 | }
8 | /* END Thin Italic */
9 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_mixins.scss:
--------------------------------------------------------------------------------
1 | @mixin fontdef-woff($FontPath, $FontName, $FontVersion:"1.0.0", $FontType:"Regular") {
2 | src: url('#{$FontPath}/#{$FontType}/#{$FontName}-#{$FontType}.woff2?v=#{$FontVersion}') format('woff2'),
3 | url('#{$FontPath}/#{$FontType}/#{$FontName}-#{$FontType}.woff?v=#{$FontVersion}') format('woff');
4 | }
5 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/_variables.scss:
--------------------------------------------------------------------------------
1 | $FontPath: "../fonts" !default;
2 | $FontName: "Roboto" !default;
3 | $FontVersion: "2.137" !default;
4 |
--------------------------------------------------------------------------------
/src/assets/roboto/sass/roboto.scss:
--------------------------------------------------------------------------------
1 | @import "variables";
2 | @import "mixins";
3 |
4 | @import "Thin";
5 | @import "ThinItalic";
6 | @import "Light";
7 | @import "LightItalic";
8 | @import "Regular";
9 | @import "Italic";
10 | @import "Medium";
11 | @import "MediumItalic";
12 | @import "Bold";
13 | @import "BoldItalic";
14 | @import "Black";
15 | @import "BlackItalic";
16 |
--------------------------------------------------------------------------------
/src/browserslist:
--------------------------------------------------------------------------------
1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
2 | # For additional information regarding the format and rule options, please see:
3 | # https://github.com/browserslist/browserslist#queries
4 | #
5 | # For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed
6 |
7 | > 0.5%
8 | last 2 versions
9 | Firefox ESR
10 | not dead
11 | not IE 9-11
--------------------------------------------------------------------------------
/src/environments/environment.dev.ts:
--------------------------------------------------------------------------------
1 | import { VERSION } from '../VERSION';
2 |
3 | declare const self: any;
4 |
5 | let _environment: any = {
6 | production: true,
7 | environment: VERSION,
8 | isHomerAPI: true,
9 | apiUrl: location.protocol + '//' + (location.host) + '/api/v3',
10 | };
11 | if (typeof self?.GLOBAL_CONFIG == "object") {
12 | const { PREFIX, API_PATH } = self?.GLOBAL_CONFIG || {};
13 | if (API_PATH) {
14 | _environment.apiUrl = API_PATH;
15 | } else if (PREFIX) {
16 | _environment.apiUrl = location.protocol + '//' + (location.host) + PREFIX + 'api/v3';
17 | }
18 | }
19 | export const environment = _environment;
20 |
--------------------------------------------------------------------------------
/src/environments/environment.prod-noenv.ts:
--------------------------------------------------------------------------------
1 | import { VERSION } from '../VERSION';
2 |
3 | export const environment = {
4 | production: true,
5 | environment: VERSION,
6 | isHomerAPI: true,
7 | apiUrl: location.protocol + '//' + (location.host) + '/api/v3',
8 | };
9 |
--------------------------------------------------------------------------------
/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | import { VERSION } from '../VERSION';
2 |
3 | declare const self: any;
4 |
5 | let _environment: any = {
6 | production: true,
7 | environment: VERSION,
8 | isHomerAPI: true,
9 | apiUrl: location.protocol + '//' + (location.host) + '/api/v3',
10 | };
11 |
12 | if (typeof self?.GLOBAL_CONFIG == "object") {
13 | const { PREFIX, API_PATH } = self?.GLOBAL_CONFIG || {};
14 | if (API_PATH) {
15 | _environment.apiUrl = API_PATH;
16 | } else if (PREFIX) {
17 | _environment.apiUrl = location.protocol + '//' + (location.host) + PREFIX + 'api/v3';
18 | }
19 | }
20 |
21 | export const environment = _environment;
22 |
--------------------------------------------------------------------------------
/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sipcapture/homer-ui/cba6c308e70b4fd79b981a60e83813d1ab98d6ea/src/favicon.ico
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
23 |
24 | HomerUi
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
2 |
3 | import { AppModule } from './app/app.module';
4 |
5 |
6 | platformBrowserDynamic().bootstrapModule(AppModule)
7 | .catch(err => console.error(err));
8 |
--------------------------------------------------------------------------------
/src/test.ts:
--------------------------------------------------------------------------------
1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files
2 |
3 | import 'zone.js/dist/zone-testing';
4 | import { getTestBed } from '@angular/core/testing';
5 | import {
6 | BrowserDynamicTestingModule,
7 | platformBrowserDynamicTesting
8 | } from '@angular/platform-browser-dynamic/testing';
9 |
10 | declare const require: any;
11 |
12 | // First, initialize the Angular testing environment.
13 | getTestBed().initTestEnvironment(
14 | BrowserDynamicTestingModule,
15 | platformBrowserDynamicTesting()
16 | );
17 | // Then we find all the tests.
18 | const context = require.context('./', true, /\.spec\.ts$/);
19 | // And load the modules.
20 | context.keys().map(context);
21 |
--------------------------------------------------------------------------------
/src/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/spec",
5 | "types": [
6 | "jasmine",
7 | "node"
8 | ]
9 | },
10 | "files": [
11 | "test.ts",
12 | "polyfills.ts"
13 | ],
14 | "include": [
15 | "**/*.spec.ts",
16 | "**/*.d.ts"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/src/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "no-bitwise": false,
4 | "directive-selector": [
5 | true,
6 | "attribute",
7 | "app",
8 | "camelCase"
9 | ],
10 | "quotemark": [
11 | true,
12 | "single"
13 | ],
14 | "component-selector": [
15 | true,
16 | "element",
17 | "app",
18 | "kebab-case"
19 | ],"deprecation": {
20 | "severity": "error"
21 | },
22 | "no-unused-variable": {
23 | "severity": "error"
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | declare var $ENV: Env;
2 |
3 | interface Env {
4 | ENVIRONMENT: string;
5 | apiUrl: string;
6 | }
--------------------------------------------------------------------------------
/src/upgrade.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Upgrade...
6 |
7 |
8 |
9 |
10 |
11 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */
2 | {
3 | "extends": "./tsconfig.json",
4 | "compilerOptions": {
5 | "outDir": "./out-tsc/app",
6 | "types": []
7 | },
8 | "files": [
9 | "src/main.ts",
10 | "src/polyfills.ts"
11 | ],
12 | "include": [
13 | "src/**/*.d.ts"
14 | ],
15 | "exclude": [
16 | "src/**/*.spec.ts",
17 | "src/test.ts",
18 | "src/app/helpers/ErrorCodes.ts",
19 | "src/environments/environment.prod.ts",
20 | "src/environments/environment.dev.ts",
21 | "src/environments/environment.webapp.ts",
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */
2 | {
3 | "extends": "./tsconfig.json",
4 | "compilerOptions": {
5 | "outDir": "./out-tsc/spec",
6 | "types": [
7 | "jasmine"
8 | ]
9 | },
10 | "files": [
11 | "src/test.ts",
12 | "src/polyfills.ts"
13 | ],
14 | "include": [
15 | "src/**/*.spec.ts",
16 | "src/**/*.d.ts"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/tsconfig.worker.json:
--------------------------------------------------------------------------------
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */
2 | {
3 | "extends": "./tsconfig.json",
4 | "compilerOptions": {
5 | "outDir": "./out-tsc/worker",
6 | "lib": [
7 | "es2018",
8 | "webworker"
9 | ],
10 | "types": []
11 | },
12 | "include": [
13 | "src/**/*.worker.ts"
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------