├── .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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
-------------------------------------------------------------------------------- /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 |
5 | 6 | 8 | 9 |
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 | 5 | {{columnName}} 6 | 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 |
2 |
3 | 4 |
5 |
-------------------------------------------------------------------------------- /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 | 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 |
5 | 6 |

7 | {{ this._config.alertMessage }}

8 | 9 |
11 |         {{ displayMessage }}
12 |
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 |
2 |
{{ desc }}
3 |

{{ objDate }}

4 |

{{ objTime }}

5 |
6 |
7 |
8 |
9 |
10 |
11 |
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 | 13 | 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 | 13 | 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 |
2 | 8 |
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 |
2 |
3 |
4 |
5 | 6 | 8 | 9 | 10 | 11 | Limit 12 | 17 | 18 |
19 |
20 | 23 | 26 |
27 |
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 | --------------------------------------------------------------------------------